沒穿方服

封存

顯示╱隱藏內文

惱人的自動重整

在 Facebook 首頁(動態消息),如果離開分頁或閒置一段時間再回來,就有機會碰到自動重新整理,會把原本牆上的東西全部消掉。

動態消息會出現什麼內容是 Facebook 決定的,也沒有順序,所以一旦重刷就很難找回原本在看的文章,至少必須先看它推給你的垃圾。

參考 reddit 討論 How do I turn off auto-refresh on my feed when I click out of my Facebook tab? : r/facebook 有提到一個對策,就是裝 Always Active Window 瀏覽器擴充,讓網頁「偵測 inactive」的各種機制無效。 實測確實有用,不過產品本身不盡完善,例如無法調整開關時機(例如只對 Facebook 開啟),副作用不小。

旁門左道 user script

爬了網頁原始碼,發現某個內部細節可以利用,實測一陣子有效,就放出來記錄。
不過臉書隨時改版就可能壞掉,能撐一天是一天。

Script 放在 Greasy Fork → Facebook 不要自動重新整理
原始碼也有放在 Github

萬一壞掉時的例外處理,會出現如下畫面(網頁左下角的提示框)

例外處理畫面,版本 1.0.0

臉書各種激怒人 UI

Facebook 故意的吧,為了營業目標,讓使用者痛苦也無所謂。

  • 留言被過濾,無法預設顯示「所有留言」

    留言點開時,預設會是「最相關」排序,也就是會被過濾而看不到所有留言。

    介面還會顯示

    你選擇了「最相關」,因此系統可能已過濾掉部分留言。
    不是啊,根本沒得選擇啊!

    留言點開時,顯示已選擇「最相關」所以被過濾 甚至有時明明有 N 則留言,點開卻顯示 0 則

    使用者無法調整,只能每篇文章點開後,再手動改成「所有留言」。

    這樣做 Facebook 可以控制留言的可見性,而每次有人點「所有留言」時,也能拿這些回饋了解使用者行為。

    已知有一些 user script 解方,例如 FB全部留言小幫手FB 預設使用所有留言,基本上都要偵測頁面出現「最相關」之類字眼,再模擬點選「所有留言」的動作。 因為某種「維護起來太苦了」的感受,我目前是沒有使用的。

  • Reels(短影片)沒有控制元件

    短影片沒有進度條可以拉,只能從頭看到完。

    短影音的服務基本上都是這樣,本來就不是要給人方便取得資訊。 對策就是不要看,然而 Facebook 硬推的東西,使用者是無法拒絕的。

    清理垃圾內容的武器,目前看起來比較厲害的是 zbluebugz/facebook-clean-my-feeds,實作也是辛苦地剖析網頁,所以我也還沒嘗試。

    目前只有簡單用 UserCSS 擋一些東西而已:

    @-moz-document domain("www.facebook.com") {
      /* Reels(連續短片和短片)不要顯示(只隱藏內容,標題關不了) */
      div[aria-label='連續短片'][role='region'] {
        outline: 3px solid red;
        display: none;
      }
    
      div[aria-label='限時動態'] {
        display: none;
      }
    }
    

不動已久的 bug #120,滑鼠移到圖片連結時會出現預覽,但預覽衝出天外。

連結在畫面上部,圖片正常顯示 連結在畫面下部,圖片跑出螢幕

作為 workaround 可以用 UserCSS 將預覽圖 top 固定在 2vh 的位置。

@-moz-document url-prefix("https://term.ptt.cc/") {
  /* https://github.com/robertabcd/PttChrome/issues/120 */
  span[type='bbsrow'] + img[src] {
    top: 2vh !important;
  }
}

缺點是圖片垂直位置永遠固定,而不是原設計的跟隨滑鼠指標,在小圖片時會有差。


附現場 DOM 結構參考,可以在 Chrome DevTools 把 mouseout 事件關掉以便觀察。

預覽圖出現時的 DOM 結構

測試可以用 1400 × 900 的視窗,放一張 576 × 1280 的圖片重現。

偵測「請輸入代號……」就自動送帳密,太過方便了,送出敏感資訊時,還是經過人手操作卡一道比較好。

執行畫面

Script 放在 Greasy Fork → PTT 半自動登入
原始碼也有放在 Github


現有的自動登入方案

這邊說的 PTT 是指 https://term.ptt.cc/,採用修改版 PttChrome(登入後按右鍵「關於」就能看到)在網頁上提供類似純文字介面的操作,是官方維護、使用者眾的服務。當年上線消息:[公告] 使用瀏覽器直接連線至批踢踢

BBS 沒有自動登入功能,早期都是靠連線軟體(例如 PCMan)的自動回應,看見「請輸入代號……」就自動回答。

當直接用瀏覽器上站變成主流,需求就落到擴充套件或 user script 上。 參考一些目前解法:

  1. term.ptt autologin by swstar / 2017

    實作是把 window.WebSocket 換掉以便在 open handler 送出帳密。

  2. term.ptt.cc 自動登入 by maple3142 / 2018

    除了登入,還提供自動跳過一些畫面的功能。 實作是捕捉 PttChrome 的 console 輸出(loginfo),解析訊息判斷發生什麼事,再做反應。

  3. PttChrome+term.ptt.cc Add-on by alan23273850 / 2019

    功能眾多,自動登入只是其一。 實作是比對畫面 innerText 做自動回應。

    這幾支 user script 有一個共通限制,就是要把帳密直接寫在 script 裡才能使用。

  4. PTT Auto Login by c910335 / 2021

    這個不是 user script 而是 Chrome 擴充,利用瀏覽器的密碼管理員儲存/取得密碼,終於不必再寫死帳密了。

    但 Firefox 由於未支援 PasswordCredential,所以是不能用的。


新路數

「如果登入表單是一般 HTML <form>,應該就能沿用密碼管理員了吧?」

之前雖然想過,但一直沒試成功,最近用 <dialog> 避開跟 PttChrome 介面打架,場景乾淨之下就試出來了。

不過只有 Firefox 成功,Chrome 就無法讓密碼管理員跳出來(詢問要不要存密碼),所以 Chrome 的話會退回 PasswordCredential 解法。

實際使用上,只要做一次表單登入並儲存密碼,之後每次登入就只要按 Enter 即可。
如果臨時不想登入,也可以把對話框關掉,就回歸一般使用。


特色總結

  • 不要在 script 內文寫明帳號、密碼
  • 使用瀏覽器的密碼管理員
  • 支援 Firefox(測過版本 126.0.1)
  • 按下「送出」或 Enter 才真正執行登入