🤔

検索結果トップの「一括ツイ消しツール」を検証してみた

に公開

https://x-delete.github.io/

最近、Xの仕様変更により投稿情報の取得コストが上昇し、従来の「ツイ消しツール」が使えなくなりました。そんな中、アプリ連携を行わずブックマークレット方式で実現した新しいツールが登場し、現在は検索結果のトップに表示されるほど人気です。

本記事では、このツールの仕組みを中立的な視点で解説し、どのように動作しているのか、認証情報の取り扱いに問題がないかを確認します。なお、利用規約では「コードの改変、再配布は禁止」と記載されていますので、一部コードを引用しながら解説を進めます。

ツールの基本動作

1. 初期処理

ツールを起動すると、まずXの画像(https://pbs.twimg.com/media/GNwsHrmbgAEuylL.png)が読み込まれます。一見ノイズのような画像ですが、実はGUI(HTML)やツイート削除処理(JavaScript)が変換された情報が含まれています。
ブックマークレットは、この画像をCanvasなどで処理し、実行可能なコードに変換します。そして、XのHTML下部にbase64エンコードされたJavaScriptを含むscriptタグとして挿入され、そこで定義されたinit関数が呼び出されます。

2. 認証情報とユーザーデータの取得

init関数では、以下の動作が行われます。

  • CSRFトークンの設定:
    ct0クッキーの値をwindow.ct0に格納し、後のAPIリクエストのヘッダーに利用します。

  • ユーザーデータの取得:
    HTML内に存在するSSRされたINITIAL_STATEから、ログイン中ユーザーのscreen_nameを取得します。これにより、利用者自身の投稿一覧を取得するための情報を整えます。

  • GraphQLクエリの事前構築:
    ツイート削除に必要なX内部のGraphQLエンドポイントへ送信するためのクエリを構築し、変数に保持します。

  • GUIの構築:
    最後に、ユーザーが操作しやすいように、CSSとHTMLを利用してダイアログ形式のGUIをbodyに追加します。

削除処理の仕組み

ツールは、先に挿入されたHTML内から呼び出される削除用の関数を通して動作します。削除処理は、init関数内で準備されたGraphQLクエリを利用して行われ、実際のリクエストはXMLHttpRequestを使って送信されます。
その際、最初に格納されたwindow.ct0の情報を利用するため、以下のsetxhr関数が実行されます。

setxhr = (a) => {
  let _ = (b, c) => a.setRequestHeader(b, c);
  _(
    "Authorization",
    "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
  );
  _("x-csrf-token", ct0);
  _("x-twitter-active-user", "yes");
  _("x-twitter-auth-type", "OAuth2Session");
  _("x-twitter-client-language", "ja");
  _("content-type", "application/json");
  a.withCredentials = !0;
};

各機能は、X内部のGraphQLエンドポイントへリクエストを送るJavaScriptコードによってトリガーされ、これにより従来のHTML操作中心のブックマークレットとは異なる形で処理が実行されます。

以下は、本スクリプト内で利用されるエンドポイント一覧です。

"https://x.com/i/api/graphql/" + x + "/DeleteTweet"
"https://x.com/i/api/graphql/" + x + "/CreateList"
"https://x.com/i/api/graphql/" + x + "/ListAddMember"
"https://x.com/i/api/graphql/" + x + "/SearchTimeline"
"https://x.com/i/api/graphql/" + x + "/ListLatestTweetsTimeline"
"https://x.com/i/api/graphql/" + x + "/ListRankedTweetsTimeline"
"https://x.com/i/api/graphql/" + x + "/UserTweets"
"https://x.com/i/api/graphql/" + x + "/UserTweetsAndReplies"

(中央の「x」には、各クエリに応じたqueryIdが入ります。)

上記エンドポイントから分かる通り、実施されるリクエストは主に「ツイート削除」「リスト作成」「ツイート一覧の取得」に関連しており、ツールとして必要な処理が行われています。

ツール利用時の注意点

このツールは、利用者が自分自身の投稿のみを削除することを目的としており、特に不審な動作は確認されていません。
なお、Xのアカウントアクセスに利用される「auth_token」はHttpOnlyクッキーのため、ツール上で直接取得・転送することはできませんが、裏でDMなどの情報を取得する可能性についても注意深く確認されています。今回の検証では、そのような挙動は見受けられませんでした。

ただし、Xの自動化開発ルール(https://help.x.com/ja/rules-and-policies/x-automation)には抵触していることが確認されており、利用規約にある「アカウントが一時的にロックされるか、永久凍結される可能性がある」という注意事項を十分に理解した上で利用する必要があります。

結論

今回検証した結果、

  • ツール自体は利用者が自己責任で利用する範囲で動作しており、不審な情報の送信や個人情報の不正取得は認められませんでした。
  • 一方、Xの自動化開発ルールに抵触する可能性があるため、利用に際しては十分な注意が必要です。

非公式ツールの利用は、ツールの仕組みを理解した上で自己責任で行うことが重要です。

Discussion