Blogger 自動發文

需求很簡單,希望餵個標題跟內容,就自動產生文章貼到 Blogger 上,但弄的跌跌撞撞的,紀錄一下,留給麵包屑給未來的自己和有需要的人。

先來看一下官方作法 - 新增 Post 的做法,可以透過 Restful Web API 或是官方提供的 Java Library 來完成。理想上是這樣,看起來很間單,那為什麼我會跌的狗吃屎?

Restful Web API 的方式,參考指南這一篇,才發現 HTTP Header 還要填入 Authorization: /* OAuth 2.0 token here */,基本上就還是要透過 OAuth 2.0 的方式得到 token 才走的下去。那換成官方提供的 Java Library,反正連 Sample Code 都有了應該很簡單,貼上去才發現範例中的 OAuth2Native 根本沒有,需要自己實作。

做到這邊我心已死,成功之路沒有捷徑,只好去翻這兩份文件來看:

大概的問題就是想辦法通過 OAuth 2.0 取得 Token,再來拿這個 Token,看是要用 Restful Web API 還是 Java Library 來新增 Post 都可。步驟如下:
  1. 到 https://console.developers.google.com/ 下的 API 和驗證>API 把 Blogger API 啟用。
  2. 到 https://console.developers.google.com/ 下的 API 和驗證>同意畫面 把該填的資訊填一填。
  3. 到 https://console.developers.google.com/ 下的 API 和驗證>憑證>OAuth 建立用戶端 ID,類型選取已安裝的應用程式(我的 APP 是一個桌面執行程式)。
  4. 此時會得到用戶端 ID,用戶端密碼。
  5. 修改官方範例碼如下:
當執行這段範例碼時,在 Po 文之前,瀏覽器會自動打開,告知使用者有應用程式嘗試要存取你的 Blogger ,使用者同意之後就會自動 Po 文。

但實際上這段程式碼還是需要人為介入(在瀏覽器上同意),其實在 https://console.developers.google.com/ 下的 API 和驗證>憑證>OAuth 建立用戶端 ID,有一個類型叫做服務帳戶(Service Account)可以自動通過 OAuth 認證,但因為 Blogger 平台不支援用服務帳戶來發文,所以我們會得到 HTTP 403 授權失敗的錯誤。

PS: Google 關於通過 OAuth 的範例程式碼

建立自己的 Docker Registry

官方已經提供了很方便的 Docker Hub,讓我們能把做好的 Docker 映像檔分享,就像我們在 GitHub 分享程式碼專案一樣,但上面的映像檔都是公開的,所以我們需要建立自己的 Docker Registry。本文最下方直接提供了安裝和測試的相關步驟。



官方直接提供了 Docker Registry 的 Docker 映像檔,直接找台有安裝 Docker 的實體機器把這個映像檔跑起來就建立好一個自己的 Docker Registry。以上圖解釋,我在140.96.101.235這台電腦上裝了 Docker 也跑了一個 Docker Registry 的 Docker 容器(映像檔執行起來的實體就叫 Docker 容器),電腦1就能把映像檔上傳至 Docker Registry,電腦2就能從 Docker Registry 下載映像檔。



而實際上,畫得更詳細一些,140.96.101.235 是一台 Linux 主機,上面跑了個 Docker 容器(裏頭執行 Docker Registry),這個 Docker 容器的 port 5000 綁定實體機器的 port 5000,所以外部連到140.96.101.235:5000 的流量就會導到這個 Docker 容器的 port 5000。另外,這個 Docker 容器將儲存映像檔的路徑,與實體機器的 /home/vagrant/docker/registry 這個資料夾同步,如此不用進入 Docker 容器就能在實體機器上看到大家上傳的映像檔,也方便管理者可以用平常備份的方式替映像檔做備份。

本月關於 Docker 的三篇文章分別說明了為何要用 Docker、如何安裝 Docker、建立私有的 Docker Registry,看完的人可以開始試看看用 Docker 複製上線專案的正式/測試環境,或是試著用 Docker 建立新技術/新框架的開發環境。

為何要用 Docker

因為工作內容比較偏向程式開發這塊,當初接觸 Docker 也是很不能了解這跟一般的虛擬機器差在哪裡,就程式部署上去就好,幹嘛那麼麻煩?仔細回想過去一些覺得很麻煩的問題,答案就呼之欲出了!

  • 想要玩個新技術,但要先裝環境和函式庫,都弄好半天又過去了,還沒玩到新技術心就涼了。
  • 上述環境在公司弄好了,回家也想要玩,又要再弄一次。
  • 上述環境不小心裝壞了,比如說 mac 上同時裝 python 2 和 python 3,搞到自己原本的環境都爛了。
  • 整個專案要在自己的電腦,測試環境跑過,在上正式環境,部署之前把環境都弄成一模一樣就飽了。
  • 安裝時都有乖乖寫安裝手冊,過了半年要裝新的環境,卻發現半年前的函式庫抓不到了。
  • 設備移機...

以上問題只要使用 VM 就可以解決了,做好第一次安裝苦工,做成映像檔,以後就是利用映像檔複製出新的 VM。

那為什麼要用 Vagrant,因為第一次安裝用 VM 還是要走一次安裝流程(找 ubuntu.iso > 安裝 > 設定),更多的時候我只是要一個純命令列的 linux 環境再加個 SDK 和 Framework,透過 Vagrant 你可以在 http://www.vagrantbox.es/ 上找到別人做好的環境,不到三分鐘就可以做你真正想要做的事情,而不是一直在裝環境。

那為什麼要用 Docker,相較於 Vagrant 實際上是建立在 VMware / VirtualBox 上的虛擬化工具,Docker 是屬於作業系統層級的虛擬化,白話就是 Docker 更加輕量化的虛擬化工具,開啟速度快,吃的資源少(一台主機能開更多個 Docker 產生的虛擬機器),而且實際用起來跟 Vagrant 一樣好用。

個人不負責任白話解釋:
  • VMware / VirtualBox:第一次安裝還是要花時間,但裝完至少匯出映像檔可以重複利用。
  • Vagrant:用官方/別人分享的映像檔快速安裝環境,實際上還是會利用 VMware / VirtualBox 建立新的 VM。
  • Docker:用官方/別人分享的映像檔快速安裝環境,而且更快,更小。不用安裝 VMware / VirtualBox。
以下圖來舉例,若我突然要用 Tomcat 來寫 Java Web 專案,直接先找別人做好的 Docker 映像檔(ubuntu + JAVA SDK + tomcat),利用映像檔產生 Docker 容器(想成是一個 VM 即可),你可以連進 Docker 容器就像用 SSH 一樣進去下指令,透過 tomcat 網頁部署 jar 檔,開發到最後還能把整個 Docker 容器再做成一個新的映像檔,其他人只要有安裝 Docker,就能馬上在自己的電腦上把環境包含你寫的 Java Web 專案跑起來!超級方便!

Docker 應用場景

接下來會試著安裝自己的 Docker Registry(想成自己的 GitHub),模擬企業內部會採用的使用模式,RD 把應用程式跟環境包成映像檔上傳至 Registry,測試/部署人員直接在 Docker Registry 下載映像檔,複製出一樣的環境。