正直に白状すると、私はずっとブックマークレットを軽く見ていました。「javascript: から始まる古い書き方」「モダンじゃない」——そんなイメージで、選択肢から外していたんです。
ところが最近、その認識がすっかり変わりました。きっかけは、X(旧Twitter)で「片思い」を一括フォロー解除するツールを作ったこと。そしてもうひとつ、ブログの商品リンクを API依存から「手入力+ブックマークレット」に切り替えたことです。
この記事は、その2つの実体験を通して「ブックマークレット、案外いいぞ」と再評価した記録です。ニッチな話ですが、同じように APIの仕様変更に振り回されている人 には刺さるはず。まさに「誰得?」なテーマですが、少なくとも私は得しました。
作ったもの:X片思い一括フォロー解除ブックマークレット作成ツール
まず成果物から。Xのアカウント名を入力すると、片思い(自分はフォローしているが相手にフォローされていないアカウント)を一括解除するブックマークレットを生成するツールを作りました。
X(旧Twitter)で片思いを一括フォロー解除するブックマークレット作成ツール
使い方はシンプルです。
- 自分のXアカウント名を入力
- 生成された「🩷 片思い削除」ボタンをブックマークバーにドラッグして登録
- Xのフォロー中ページを開いて、ブックマークを1回クリック
- 確認ダイアログで「OK」→ 片思いを順に自動解除
なぜ作ったのか:API有料化で「片思い削除ツール」が全滅した
昔は「片思い削除ツール」のようなWebサービスがいくつもありました。ところが今、検索しても古くて動かないツールしか出てきません。
理由は明白で、Twitter/X の API が有料化・仕様変更されたからです。これらのツールは API 経由でフォロー関係を取得・操作していたので、APIが閉じられた瞬間に軒並み動かなくなりました。
「じゃあ、APIを使わずに実現するには?」——その答えが、ブラウザ上でXの画面を直接操作するブックマークレットでした。APIを一切使わず、画面をスクロールして「フォロー中」ボタンを機械的にクリックしていく。原始的ですが、APIの都合に一切左右されません。
仕組み:APIを使わず「画面を操作する」
ブックマークレットの中核は、たったこれだけの発想です。
- Xのフォロー中ページで、「フォロー中」ボタンを XPath で探す
- 見つけたら クリック → 出てきた「フォロー解除」確認を クリック
- 見つからなければ 少しスクロール して、また探す
- 最後までスクロールしたら完了
コードの要点を、読みやすい形で抜き出すとこんな感じです(実際に生成されるのは1行に圧縮したもの)。
function loop(prevScroll) {
const html = document.querySelector("html");
// 「フォロー中」かつ「フォローされています」でない要素を探す
const node = getByXPath(TARGET_XPATH);
if (node) {
node.scrollIntoView({ behavior: "smooth", block: "center" });
node.click(); // フォロー解除を実行
setTimeout(() => {
clickConfirmButton(); // 確認ダイアログの「フォロー解除」を押す
setTimeout(() => loop(0), 500); // 次を探す
}, 500);
} else {
html.scrollBy({ top: 0.8 * window.innerHeight, behavior: "smooth" });
if (prevScroll !== html.scrollTop) {
setTimeout(loop, 400, html.scrollTop); // まだスクロールできる→続行
} else {
alert("フォロー解除が完了しました"); // 最下部→終了
}
}
}「フォローされています」の表示があるアカウント(相互フォロー)は対象から除外しているので、外れるのは片思いだけ。ツール側では、この中のアカウント名の箇所だけを入力値で差し替えてブックマークレットを生成しています。
ハマったポイント:ブックマークレットは「ページ遷移で死ぬ」
作る過程で、ブックマークレットの本質的な制約に2つぶつかりました。ここが今回いちばんの学びです。
1. 別ページからの「全自動1クリック」はできない
最初は「どのページからクリックしても、自動でXのフォロー中ページに移動して、そのまま解除まで走る」を目指しました。ところがこれは原理的に不可能でした。
ブックマークレットは、クリックした瞬間のそのページ上でだけ動くコードです。location.href でXへ移動した瞬間、ページごとコードが消滅し、移動先に自分を注入し直すことはできません。だから「移動」と「解除」で2クリック必要になります。
そこで割り切って、動線を整理しました。
- フォロー中ページで押す → 確認 → 1クリックで解除開始(これを主動線に)
- 別ページで押す → 確認して自動移動 → ダイアログに「移動後もう一度押してください」と明記
「押したのに何も起きない?」という迷いをなくすのがポイントです。
2. 削除前の確認を入れる
一括解除は取り消せません。誤爆すると相互以外が全部外れてしまう。なので、解除を始める直前に必ず confirm() を挟み、OKを押さない限り何も起きないようにしました。地味ですが、破壊的な操作には必須のガードです。
本題:ブックマークレット、案外いいぞ
ここからが、この記事で一番言いたいことです。実際に使ってみて、ブックマークレットの強みを見直しました。
API非依存 ── これが最大の武器
今回の片思い削除ツールがまさにそうですが、APIの有料化・仕様変更・レート制限の影響を受けません。画面を直接操作するので、公式APIがどうなろうと動きます。
実はつい最近、ブログの商品リンクでも同じ乗り換えをしました。以前は API 連携で商品情報を取得していた [amazon] [rakuten] [yshopping] の3ショートコードを、「手入力+ブックマークレット」方式に統一したんです。商品ページでブックマークレットを押すと、ASINやタイトルを拾ってショートコードを組み立ててくれる。APIキーの管理も、仕様変更への追従も不要になりました。
Rinkerが重い・面倒な人へ|商品リンクをショートコード+ブックマークレットで爆速で貼る方法
サーバー不要 ── 壊れる要素が少ない
ブックマークレットはフロントだけで完結します。バックエンドもホスティングも要りません。
これは地味に大きくて、サーバーサイドの仕組みは「動かす環境」自体がトラブルの温床になります(私も別件で、共用サーバー上のAPIが落ちて半日復旧に費やしたばかりです)。ブックマークレットには、そもそも落ちるサーバーがありません。構成要素が少ない=壊れる箇所が少ない、というシンプルな強さです。
速い・ゼロインストール
登録はブックマークバーにドラッグするだけ。インストール不要、審査不要、即実行。Chrome拡張のようにストア掲載やレビュー対応をする必要もありません。動作も、余計なレイヤーがないぶん軽快です。
透明性が高い
中身のコードがすべて見えるのも安心材料です。javascript: 以降を読めば、そのブックマークレットが何をするか誰でも確認できる。ブラックボックスなツールより、むしろ信頼できます。
正直に:弱点もある
いいことばかり書きましたが、弱点も明記しておきます。
画面(DOM)の構造変更に弱い ── これが唯一にして最大の弱点です。今回の片思い削除ブックマークレットは、「フォロー中」「フォロー解除」「フォローされています」という日本語UIの文言や、Xのボタン構造に依存しています。X側がUIを変えれば、動かなくなります。
とはいえ、これは「壊れたら中身を少し直せばいい」レベルの話。サーバーが落ちる・APIが有料化するといった、こちらでコントロールできない事態に比べれば、はるかに扱いやすいリスクです。
まとめ
ブックマークレットは、派手さはありません。javascript: から始まる見た目も、正直モダンとは言い難い。でも、
- API非依存で、仕様変更に振り回されない
- サーバー不要で、壊れる要素が少ない
- 速くて、インストール不要
- 中身が透明
という「枯れているぶん確実」な強さがあります。今回、片思い削除ツールと商品リンクの2つで実感しました。
「誰得?」な話に付き合ってくれてありがとうございました。派手な新技術も楽しいですが、こういう古くて確実な道具を引き出しに一つ持っておくと、いざという時に効きます。よかったら、片思い削除ツールも試してみてください。
関連記事
X(旧Twitter)で片思いを一括フォロー解除するブックマークレット作成ツール
Rinkerが重い・面倒な人へ|商品リンクをショートコード+ブックマークレットで爆速で貼る方法

