Facebookのタイムラインから、広告(Sponsored)・「Follow」「Join」ボタンが表示されている投稿(フォロー関係にない人の投稿、未参加のパブリックグループの投稿)・Reelsなどのセクションを自動的に非表示にするUserscriptです。
Facebookの「Sponsored」表記は、1文字ずつ <span> に分割し、ダミー文字を混ぜてCSSで隠すという難読化がされています。そのため textContent での文字列一致は機能しません。
本スクリプトは2系統で判定します。
以下のいずれかが投稿内に存在すれば広告と判定します。いずれも通常の投稿には現れません。
| セレクタ | 内容 |
|---|---|
a[href^="/ads/about"] |
「Sponsored」表記のリンク先 |
[data-ad-rendering-role="cta-"] |
CTAボタンの枠 |
[data-ad-video] |
広告動画 |
[data-ad-rendering-role="image"] |
広告画像 |
data-ad-rendering-role は profile_name / story_message / like_button など通常の投稿にも付く属性です。値まで見ないと広告判定には使えません。
innerText はCSSで非表示になった文字を除外するため、ダミー文字を取り除いた実際の表示文字列が得られます。これが「Sponsored」「広告」等と一致する場合も広告と判定します。
data-ad-rendering-role="profile_name"(投稿ヘッダー)は1投稿につき必ず1つだけ存在します。これを1つだけ含む限り親要素へ上がり続け、2つ目が入る直前で停止することで投稿の外枠を決めます。
クラス名(x1fey0fg など)や data-virtualized の有無に依存しないため、Facebook側の変更に比較的強い構造です。
お使いのブラウザに合わせて拡張機能をインストールしてください。
スクリプト内の各リストにラベル文字列を追加することで、非表示対象を拡張できます。英語・日本語UIに対応しています。他言語UIをお使いの場合も同様に追加してください。
const HIDE_LABELS = new Set([
'Follow', 'Join', // 英語UI
'フォロー', '参加', // 日本語UI
]);
const SECTION_LABELS = new Set([
'Reels', 'リール',
'People you may know', '知り合いかも',
'Suggested for you', 'あなたへのおすすめ',
]);
Facebookの構造変更で誤判定が起きた場合、以下で切り分けられます。
スクリプト冒頭の DEBUG を true にすると、非表示にする代わりに赤枠を付けてコンソールに出力します。何が対象になっているかが一目で分かります。
const DEBUG = true;
| コマンド | 内容 |
|---|---|
__fbhideShow() |
非表示にした要素を赤枠付きで再表示し、判定理由(ad / ad-label / follow / section)をログ出力 |
__fbhideLabels() |
難読化ラベルが実際に何と読めているかを一覧表示 |
非表示にした要素には data-fbhide="判定理由" 属性が付きます。DevToolsで [data-fbhide] を検索すれば対象を確認できます。