訂閱 Facebook Group 的訊息:自建 RSS 伺服器

訂閱 Facebook Group 的訊息:自建 RSS 伺服器

feedly 是一款 Web RSS 訂閱服務,自從 Google Reader 2013 年停止服務後,我就一直使用它,但隨著社群媒體像 Facebook 或 Twitter 流行,訊息的樣貌也改變很多,最痛苦的就是在 Facebook 跟人互動,結果這些訊息都要透過 Facebook 動態來 Follow,等同於變相洗版,何況 Facebook 有自己的演算法,會篩掉它認為你沒興趣的訊息。

這幾天被 Facebook 洗版洗到受不了,外加漏掉一則重要訊息,終於忍無可忍決定找一個新的訂閱方式,但偏偏 Facebook 本身不提供 RSS 訂閱服務,只好土法煉鋼,自己想辦法。

本文會用 tweeper + GCP + feedly 來完成對 Facebook 公開頁面的訂閱。讓這些消息能更好地被管理。

Fetch RSS

要訂閱消息,就要有消息來源,我們用 tweeper 來抓取 Facebook 並轉換成 RSS,這是一款 Linux 工具,首先安裝

sudo apt-get install tweeper

使用方式非常簡單,在後面跟著 Facebook 的公開頁面

tweeper https://www.facebook.com/groups/cloudnative.tw/

然後在 stdout 中,就能看到抓取的資料

<?xml version="1.0"?>
<rss version="2.0" xml:base="https://facebook.com">
    <channel>
    <generator>Tweeper</generator>
    <title>Biz</title>
...

RSS 使用 XML 格式來發佈消息,這個消息文件稱為 RSS feed。RSS Reader 就是抓取這些 feeds 的 URL 來訂閱。

Install Apache

抓取下來的 feed 要給外網存取,因此需要有個網頁伺服器,我們使用最常見的 apache

sudo apt-get install apache2

安裝好後,apache 會用 80 port 提供 HTTP 服務,相關的文檔放在

/var/www/

在瀏覽器中輸入對應 IP,可以看到 apache 的畫面

當現在有一份文件需要對外提供時,可以放到 /var/www 中,外部就能得到這份文件。

Register a Domain Name

因為資安考量,我們不希望將內網曝露到外網中,想在外部架設新的 Server 來提供服務,為了方便 RSS Reader 能找到 Server Address,還需要有個 Domain Name,也就是平常說的網址,這個網址能對應到自行架設的 Server Address。Domain Name 可以向供應商購買,像 Google Domains 就有提供這個服務,價格是 20$/Year

但我們先用免費的 Domain 來測試,交大有無償提供這項服務

註冊並登入後,在網域管理的標籤下,可以新增子網域,輸入自定義的網域名稱

並在 DNS 管理中新增紀錄,輸入名稱與 IP,即可完成申請。如果已經有 GCP 的,可以在 IP 填入 GCP 的 External Address,如果還沒有,先進行下一步,取得 GCP 的 IP。

Set GCP

申請好網域後,就是要架 Server 了。外部 Server 可以用 GCP 架設,具體流程是進入 GCP,開好 VM,安裝需要的軟體,如果不知道怎麼使用 GCP,可以參考前面的文章,GCP 也有提供 apache 的安裝說明

開通 VM 時,要記得將 Firewalls 的 Allow HTTP traffic、Allow HTTPS traffic 兩項打勾,GCP 才能提供 HTTP 跟 HTTPS 的服務。

VM 設完來建立工作目錄。在家目錄底下建一個 rssfeed 資料夾,將輸出的 RSS feed 放到這個資料夾中。接著到 /var/www/html 下創建一個連結到 rssfeed,這樣一來,即使沒有管理者權限,也能在家目錄下管理檔案

mkdir rssfeed && cd rssfeedtweeper https://www.facebook.com/groups/cloudnative.tw > cloudnative.tw.xmlcd /var/www/htmlsudo ln -s ~/rssfeed ./rssfeed

完成後還要修改網路設定,到網路服務點選 Cloud DNS

建立區域,將 DNS 名稱,就是前面步驟申請的網域名填入

外部就可以用 URL 來使用 GCP 的服務了。

Subscribe RSS

現在用 feedly 訂閱剛剛製作完成的 RSS feed,打開 feedly,點選側欄的「+」號,進入探索頁面

在搜尋欄中填入 RSS 的網路位置,例如

http://example.nctu.me/rssfeed/cloudnative.tw.xml

就能在 FEEDS 的訂閱項目中看到訊息啦

是不是很有成就感!

Update RSS Periodically

雖然能用 feedly 訂閱 RSS 了,但 RSS 需要定期更新,feedly 才有最新的資料能抓。我們這邊利用 Linux 的自動執行程序 cron 來做這件事。

先將執行的指令寫成腳本,打開 GCP 的 VM,輸入

mkdir cronscript && cd cronscript
vi update_fb_group.sh

內容是

tweeper https://www.facebook.com/groups/cloudnative.tw > ~/rssfeed/cloudnative.tw.xml

然後要讓 VM 能依照排程,自動執行這支腳本,因此需要使用 cron

crontab -e

打開 crontab 後有範例,依照設定定期執行的時間後,就會定期執行預設的腳本

# m h  dom mon dow   command
0 */1 * * * /home/ken/cronscript/update_fb_group.sh

第一行的 0 表示 0 分時執行,第二行的 */1 表示每小時執行,最後的 command 表示需要執行的指令。

如此一來,服務架設完成,我們有正式的 RSS feeds 了。

小結

讓我們來看看 feedly 抓資料的速度

該筆資料在 2019/12/07 14:58:24 發表,到 2019/12/08 11:17:51 時抓進 feedly,需要快一天,呃,好慢。因為我們的 cron 是每小時更新,速度慢純粹是 feedly 的問題了,依照 feedly 官方的說法,fetcher 是一小時左右抓取一次,可能它有自己的演算法,會再根據每個 feed 的活躍度修改抓取頻率?

且不管速度,至少這樣一來,我們能方便管理訊息了。我統計過,自己一天在 FB 的訊息量大約是 20+,有 feedly 能協助管理訊息後,Facebook 終於可以回歸到乾淨的版面了。

Reference

Read more

從個人貢獻者到管理者:關於領導的反思

從個人貢獻者到管理者:關於領導的反思

某個下雪天,我拖著病體,組裝一套供使用者簡報之用的破爛系統,莎朗進來發現我在操控台前勉強支撐,她便離開了,幾分鐘後,她端著一鍋湯回來,為我倒了一杯,我的精神為之一振。我問她要做的管理工作那麼多,怎麼會有空做這種事,她向我展露她的招牌微笑,說:「湯姆,這就是管理。」 -《Peopleware: Productive Projects and Teams》 有次跟一名職涯顧問聊天。我提到:「我希望透過打造產品來替別人創造價值,如果有很棒的團隊,我相信自己能辦到。」她問:「團隊是必須的嗎?」我愣住了,隨口說:「因為打造產品需要很多不同的職能……還需要可持續性的運作,對,我想團隊是必要的。」事後回想,她的問題很有趣,現代社會好像把「團隊」和「領導」當成是成功的標配,人力市場也一堆團隊主管的職缺,這是一則現代神話嗎?還是某種工業革命時代的遺產? 身為個人貢獻者的管理者 不是說團隊不重要,只是在現代,你會用不同的角度審視完成目標需要的條件。你想想,如果你是個開發者,自己架網站、

By Ken Chen
CDN 的快取失效設計:內容平台場景

CDN 的快取失效設計:內容平台場景

Phil Karlton 有句名言:「計算機科學中只有兩件難事:快取失效和命名。」 想像你在管理網站,因為傳輸速度與伺服器效能問題,網站讀取速度很差,特別是當你的使用者來自地球另外一端,常常需要等待幾秒才能看到畫面,這讓他們的使用體驗大打折扣。身為一名重視使用體驗的開發者,你肯定知道該如何解決這問題,沒錯,答案就是 CDN(內容傳遞網路)。 CDN 可以看成是服務商在全球各地建置伺服器,當你的網站內容(例如圖片、CSS、JavaScript、影片等)流經這些伺服器時,它會保留一份複本(稱為快取),等到下次有人讀取同樣的內容,CDN 會拿出複本給使用者。因為全球各地都有 CDN 節點,美國的使用者可以由美國節點提供,日本的使用者可以由日本節點提供。這樣既加速網路傳遞效率,也降低來源伺服器的效能壓力,可謂一舉兩得。 當然這是有條件的。CDN 會使用網址來判斷快取是否是相同檔案,假設你的內容以圖片為主,通常來說,當你更換圖片,新舊兩張圖片會有不同網址,被當成兩個不同的檔案,新圖使用新快取,舊快取留著也沒差;但如果你的內容是文字,新舊版文字很可能有相同網址,

By Ken Chen
收拾行李搬家去:從 Medium 到 Ghost

收拾行李搬家去:從 Medium 到 Ghost

想搬家想很久,連身邊的朋友都搬完了,我還沒動工。 原因是我懶,我討厭麻煩,每次有人問我吃什麼,我都回答麥當勞。搬家是一件麻煩事,我已經有一份很讚的工作了,全副精神都放在工作上,偶爾才會想起來,反正家什麼時候都能搬,一點也不急,有什麼好急的呢對吧。這樣一拖,就拖到現在。 繼續用 Medium 不好嗎? 跟男女朋友分手一樣,通常被問到:「對方不好嗎?」得到回答是:「也沒有不好啦,只是……(以下開放填空)。」 從優點開始講吧!Medium 的編輯器很棒,它是 WYSIWYG(所見即所得)類型的編輯器,能讓創作者快速發佈內容,也因為它讓內容發佈更容易了,它開始吸引一批優秀的創作者,這批創作者持續創作內容,又吸引來更多讀者,更多讀者激勵創作者產出內容,內容又再吸引讀者……這形成一個增強迴圈。Medium 還能支援多人協作,拜它時尚簡約的風格所賜,科技公司會使用 Medium 來打造品牌形象,例如我前公司的 Tech Blog

By Ken Chen
OpenTelemetry 的可觀察性工程:以 Sentry 為例

OpenTelemetry 的可觀察性工程:以 Sentry 為例

點進 OpenTelemetry 的官方文件,它最先映入眼中的句子是「什麼是 OpenTelemetry」。例如,它是套可觀察性框架,用於檢測、蒐集與導出遙測數據;它是開源且供應商中立,能搭配其他的開源工具,像 Jaeger 或 Prometheus;它能將應用程式與系統儀表化,無關是用 Go 還是 .NET 開發,也無關部署在 AWS 還是 GCP 上。 但是身為一名開發者,當下我們想的是:「公司常開發一些沒人要用的功能,聽說 OpenTelemetry 可以提高可觀察性,也許我們應該放棄開發功能,轉頭建立更好的開發環境。」「AWS 常常要不到需要的數據,也許我們應該改用另一套工具,像是 OpenTelemetry,來解決這件事。」我們想像 OpenTelemetry 「應該」要能解決目前面臨到的一些問題,就像在技術的鏡像中尋找願望一樣。 如果已經有在用 Sentry,還需要導入 OpenTelemetry

By Ken Chen