沒穿方服

索引

顯示╱隱藏內文

惱人的自動重整

在 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'],
      div[aria-label='Reels'][role='region'],
      div[aria-label='Reel'][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 才真正執行登入

需求類似內建的「影像」→「剪裁出內容」,但不是移除透明部分,而是針對具有上下黑邊(letterbox)甚至有視窗標題 UI 元素的圖片,偵測黑邊再裁掉。

圖片剪裁前(左圖)後(右圖)

第一次用 GIMP 做自動化,官方文件好像就 Gimp Python Documentation 一篇(25 年前的文章?),四處做功課終於兜起來,但也發現可能已成孤兒。

GIMP 2 外掛的過時風險

目前用的穩定版 GIMP 2.10.38(2024/5/5 釋出),內嵌 python 版本是早就 EOL 的 2.7(新作業系統都升到 3 了,兩版共存時期是一場惡夢); 雖然 GIMP 3 仍會使用 python,但舊的 pygimp API 早已在開發分支刪除,所以現在是很尷尬的狀態,查文件也困難,投身其中要自求多福。


目錄

  1. Python-fu 外掛安裝方式
  2. 指令碼內容與功能
  3. 使用 BIMP 進行批次處理
  4. 參考資料

Python-fu 外掛安裝方式

一開始有點混亂為什麼有 Script-fu 和 Python-fu,又為什麼有「外掛程式」和「命令稿」資料夾。 最後理解 Script-fu 和「命令稿」是比較早發展的功能,用 Scheme 語言寫的東西。 雖然直覺 python 寫的東西也是 script,但裝到錯的目錄就什麼也不會發生,要自己小心避開。

假設已經取得指令碼 xxx.py,具體安裝步驟為:

  1. 找出外掛資料夾。
    選單「編輯」→「偏好設定」→ 左邊樹狀選單「資料夾」→「外掛程式」, Windows 預設在 %USERPROFILE%\AppData\Roaming\GIMP\2.10\plug-ins
    可以按右邊按鈕用檔案瀏覽器打開,預設應該是空資料夾。
    外掛資料夾
  2. 把指令碼放進外掛資料夾。
    指令碼在 Windows 檔案總管中的樣子
  3. 結束 GIMP 再重開。
  4. 成功的話,選單會出現新項目。
    出現在選單哪個位置是程式內容指定的,我這支是寫在「濾鏡」→「Python-fu」→「剪裁外框黑邊」。
    一開始無法點選,要先用 GIMP 開啟圖片,才可以使用。
    選單中的新項目,但在還沒開啟圖片時,是不能點選的
    如果選單沒成功新增,可能載入時有錯誤。 我還未找到好的除錯方法,但 Windows 在 GIMP 啟動捷徑加上 --verbose --console-messages 會多顯示一些訊息。

指令碼內容與功能

程式碼放在 gist → https://gist.github.com/bootleq/88341006e04

運作原理是從畫面頂端開始,往下找出黑色的像素,當連續出現 N 個黑色時,就判斷為黑邊,最後一個黑色像素就是黑邊的終點。

為了減少誤判,找到終點時,會在相同水平位置上再取另一個點,確認它也是黑色,否則就不算,要重找。
實際上重找的寫法沒有很嚴謹,目前只會用水平 25、50、75% 的點做有限度的嘗試。

頂端向下找完,同樣邏輯由底端向上找,就能取得上下邊了。

可以調整的參數有兩個:

選項參數與預設值
  1. 黑邊的最小厚度(像素)

    例如連續偵測到 30 個黑色像素時,才認定為黑邊。

  2. 搜尋不到黑邊時的停損比例(例:50 只會搜尋到圖片高的一半)

    當程式找不到黑邊時,繼續掃描每個像素很浪費時間。
    這個選項假設黑邊不會佔據圖片太大比例,例如設為 5 的話,在由頂端往下的搜尋中,只走圖片高度 %5 的距離就會停止了(放棄,當作找不到),若 5% 以下其實還有黑邊,那部分就不會被裁掉。


使用 BIMP 進行批次處理

GIMP 好像沒有內建批次功能,所以還要裝 BIMP 這個外掛來處理。

  1. 「檔案」→「Batch Image Manipulation...」→ 操作列表「+ Add」→「其他 GIMP 操作...」。
  2. 在「搜尋」欄中輸入 letter 篩出 python-fu-crop-letterbox-edges,點選後可以在右邊調整參數,調完按 OK 套用。
    在 BIMP 對話框中調整 python-fu-crop-letterbox-edges 選項
  3. 選好輸入和輸出檔案後,按「Apply」就會開始跑了。

參考資料

一路從官方文件、ChatGPT 甚至到 GIMP 原始碼,覺得很不親切,最後還是只留兩篇人類寫的文章吧。

用手機點 www. 開頭的 momo 連結,會自動跳到手機版網址(m. 開頭); 但如果在桌面環境點手機版連結,就不會轉換,而是停在手機版,用起來很不舒服。

雖然網頁底部有「電腦版」連結(如圖紅色箭頭處),但它竟然是連到首頁,而不是現在頁面的「電腦版」。
你自己把網址的 m 改成 www,也沒用!因為兩邊網址不能直接對應,又會跳回首頁。

momo 手機版畫面,上圖是一進去的樣子,下圖是網頁底部

這個問題年代已久,網路可以找到一些自救方法,例如 user script Google搜尋顯示桌面版網站,或 Chrome 擴充功能 momo購物轉址

我要的功能比較像那個 Chrome 套件,但需要跨瀏覽器,所以另外寫了一支 user script,
放在 Greasy Fork → momoshop.com.tw 切換手機/電腦版
原始碼也有放在 Github

目前只支援「搜尋」和「商品」兩種頁面。
單純偵測網址,然後顯示一顆「切換至桌面版」按鈕,長相如下圖:

生效中的畫面