Skip to content

Latest commit

 

History

History
137 lines (97 loc) · 10.6 KB

technical-information.md

File metadata and controls

137 lines (97 loc) · 10.6 KB

Shadowban Scannerの技術情報

これは、Shadowban Scannerの判定処理などの技術情報についてのドキュメントです。

正確性を期すため、このドキュメントで使用する言葉を次のとおり定義します。

  • シャドウバン:ツイートが検索結果やおすすめに表示されにくくなったり、それらにまったく表示されなくなったりする状態の総称。Twitter公式の定義ではなく、一般的に用いられる定義
  • 事実:Shadowban Scannerの実装など、確実に正しいといえる内容
  • 断定:いくつかの事実や調査から、正しいと判断できる内容
  • 推定:いくつかの事実や調査から、正しい可能性が高いと判断できる内容

データの取得方法

Shadowban Scannerでは現在、外部サーバーのAPIやTwitterの内部API等にはアクセスせずに情報を取得しています。これは、ツイートごとに判定結果を表示するという仕様上、APIへのアクセス頻度が高くなり、サーバーに負荷をかけてしまうのを防ぐためです。また、プライバシーやセキュリティーの観点での利点もあります。(事実)

Shadowban ScannerはAPIにアクセスする代わりに、TwitterのWebクライアントのReact Propsを取得しています。React Propsには、Twitterの内部APIの応答結果が格納されているため、これを利用することでAPIへアクセスせずに情報を取得できます。(事実)

判定方法

次のデータは、ツイートのReact Propsのうち、重要な部分を抜粋してTypeScriptのinterfaceとして表現したものです。(断定)

interface TweetProps {
    possibly_sensitive?: boolean | null;
    possibly_sensitive_editable?: boolean | null;
    user: {
        possibly_sensitive?: boolean | null;
        screen_name: string;
        profile_interstitial_type: "" | "sensitive_media" | "fake_account" | "offensive_profile_content" | "timeout";
        withheld_in_countries: string[]
    };
}

アカウントのシャドウバン判定

Shadowban Scannerでは、アカウントのシャドウバンをTweetProps.user.possibly_sensitiveの値で判定しています。この値がtrueの場合、Shadowban Scannerは、アカウントがシャドウバンされているかセンシティブフラグが付与されているとみなします。(事実)

TweetProps.user.possibly_sensitiveプロパティーが存在しない場合や、nullの場合は、混乱を防ぐためにシャドウバンされていないと表示します。(事実)

TweetProps.user.possibly_sensitiveはアカウント単位のセンシティブフラグです。このフラグがtrueの場合、たいていはツイートが検索結果に表示されないシャドウバン状態にあります。ただし、まれにtrueでもシャドウバンされていなかったり、falseなのにシャドウバンされていることもあります。いずれにしても、シャドウバンの状態にかかわらず、このフラグがtrueの場合はTwitterによってセンシティブなアカウントとしてみなされていることを示します。(断定・Twitterの検索結果の調査により判断)

フラグがtrueでもシャドウバンされていない場合、「ぎりぎりシャドウバンはされていないがセンシティブなアカウントとしてみなされている」と考えられます。(推定)

プロフィールのメディアのセンシティブ判定

Shadowban Scannerでは、TweetProps.user.profile_interstitial_typesensitive_mediaoffensive_profile_contentの場合、プロフィールのメディアがセンシティブ判定を受けていると表示します。(事実)

TweetProps.user.profile_interstitial_typeはプロフィールに関するフラグです。このフラグの値がsensitive_mediaoffensive_profile_contentの場合、プロフィールのメディアがセンシティブとみなされていることを示します。また、プロフィールのメディアはアイコンやヘッダー画像を指していると考えられます。(推定)

フラグの値がsensitive_mediaoffensive_profile_contentの場合、[ポストするメディアをセンシティブな内容を含むものとして設定する]という設定項目が変更できなくなります。また、投稿するすべてのメディアに対し、強制的にセンシティブフラグが付与されます。(断定・当該設定を変更できないと主張する複数のアカウントを調査した結果により判断)

推定の根拠

2023年9月17日時点では、任意のアカウントのプロフィールを表示した際にhttps://abs.twimg.com/responsive-web/client-web-legacy/bundle.UserProfile.58f1422a.jsが読み込まれます。次のコードは、その重要な部分とその周辺の抜粋です。(事実)

なお、URLの58f1422aはソースコードの変更によって変わる可能性があります。(断定)

Ra = te().cb339f26,
Ua = te().hf06085e,
xa = te().aa959f36,
Oa = te().hf06085e,
Ka = te().jf604336,
Ha = te().c9bfda48,
Wa = te().jf604336,
Va = te().b9a9cbdc,
qa = te().aa959f36,
za = te().i622ef86,
Ga = {
    'default': Ra,
    fake_account: xa,
    offensive_profile_content: Ka,
    sensitive_media: Wa,
    timeout: qa
},
Ya = {
    'default': Ua,
    fake_account: Oa,
    offensive_profile_content: Ha,
    sensitive_media: Va,
    timeout: za
},

sensitive_mediaにはWaVaのいずれかが代入されています。WaVaはそれぞれ、te().jf604336te().b9a9cbdcが代入されています。また、offensive_profile_contentにはKaHaのいずれかが代入されており、KaHaはそれぞれte().jf604336te().c9bfda48が代入されています。(事実)

次のコードは、日本語の翻訳データが含まれるhttps://abs.twimg.com/responsive-web/client-web-legacy/i18n/ja.9d70063a.jsのうち、重要な部分とその周辺の抜粋です。(事実)

なお、URLの9d70063aはソースコードの変更によって変わる可能性があります。(断定)

t('d834ab9c', 'プロフィールを表示する'),
t('cb339f26', '注意: 不審な行為が確認されているアカウントです'),
t('hf06085e', 'このアカウントは不審な行為が確認されています。表示してもよろしいですか?'),
t('aa959f36', '注意: このアカウントは一時的に制限されています'),
t('jf604336', '注意: プロフィールにセンシティブな内容が含まれている可能性のあるアカウントです'),
t(
  'c9bfda48',
  '注意: プロフィールにセンシティブと思われる内容が含まれているアカウントです。センシティブな内容の画像やテキストを投稿している可能性があります。表示してもよろしいですか?'
),
t(
  'b9a9cbdc',
  'センシティブな内容の画像やテキストをツイートしている可能性があります。表示してもよろしいですか?'
),
t('i622ef86', 'Twitterルールに違反している可能性があります。表示してもよろしいですか?'),

このコードのjf604336の部分を見ると、「注意: プロフィールにセンシティブな内容が含まれている可能性のあるアカウントです」と書かれています。(事実)

他のメッセージの主語が「アカウント」なのにもかかわらず、このメッセージはアカウントではなく「プロフィール」について言及しています(事実)。また、sensitive_mediaという名称から、このメッセージはプロフィールのメディアがセンシティブという意味だと考えられます。(推定)

アカウントがブロックされている国の検出

Shadowban Scannerでは、アカウントがブロックされている国をTweetProps.user.withheld_in_countriesの値で判定しています。この値が空の配列でない場合、Shadowban Scannerは、アカウントがブロックされている国があるとみなします。(事実)

TweetProps.user.withheld_in_countriesはアカウントがブロックされている国のリストです。このリストには、アカウントがブロックされている国の国コードが格納されています。(事実)

参考

ツイートのセンシティブ判定と年齢制限判定

Shadowban Scannerでは、ツイートのセンシティブ判定をTweetProps.possibly_sensitiveの値で判定しています。この値がtrueの場合、Shadowban Scannerは、ツイートがセンシティブなツイートとしてみなされていると判定します。(事実)

TweetProps.possibly_sensitiveプロパティーが存在しない場合や、nullの場合は、混乱を防ぐためにセンシティブなツイートではないと表示します。(事実)

TweetProps.possibly_sensitiveはツイート単位のセンシティブフラグです。このフラグがtrueの場合、ツイートがセンシティブなツイートとしてみなされていることを示します。(断定)

TweetProps.possibly_sensitivetrueかつ、TweetProps.possibly_sensitive_editabletrueの場合、そのツイートは[センシティブな内容を含むものを表示しない]設定がオンになっているアカウントの検索結果に表示されなくなります。(推定・Twitterの検索結果の調査により判断)

TweetProps.possibly_sensitivetrueかつ、TweetProps.possibly_sensitive_editablefalseの場合、そのツイートは検索結果に表示されなくなります。また、年齢制限がかかり、未成年者のアカウントや非ログイン状態で閲覧できなくなります。(断定・該当ツイートを非ログイン状態で表示しようとする試みにより判断)