2019年11月9日 星期六

FB粉絲專頁機器人開發 - 股票抽籤小秘書

今年財運很好, 11個月下來合計抽到4次股票, 不過我家的人雖然都知道抽股票幾乎無風險又好賺, 可是常常抽個幾次就忘了繼續抽, 所以幾乎沒什麼中獎過, 這樣真的很可惜...。 所以上禮拜忽然想到, 不然我來寫個會自動通知有股票抽籤的服務程式好了,  最後決定做的就是FB粉絲專頁機器人: 股票抽籤小秘書(助理), 以下是成果:



粉絲專頁網址:
https://www.facebook.com/%E8%82%A1%E7%A5%A8%E6%8A%BD%E7%B1%A4%E5%B0%8F%E5%8A%A9%E7%90%86-115560563215006

功能:
  1. 後端程式會每小時去證交所查詢是否有新的可抽籤股票, 如果有的話會自動發布新的抽籤資訊文章。
  2. 提供訂閱服務聊天機器人, 後端程式會在新股票可抽籤的那天發送抽籤訊息給訂閱用戶, 使用說明如下:
    1. 訂閱股票抽籤通知, 請發送訊息: "我要訂閱 FB個人頁面網址:[https://www.facebook.com/OOOXXX]"
    2. 取消訂閱通知, 請發送訊息: "取消訂閱"
    3. 取得目前可抽籤的股票資訊, 請發送訊息: "最新消息"


繪圖:  還在等我哥生出來, 先用櫻花莊的寵物女孩的女僕醬擋著先!!!


再來就是開發心得啦!! 首先要查有沒有抽籤資訊很簡單, 直接寫個爬蟲定時去證交所抓資料就好(目前設定是每個小時上去抓一次):

證交所公開申購網址: https://www.twse.com.tw/zh/page/announcement/publicForm.html

然後過濾掉央債就OK了, 至於要怎麼通知, 腦中浮現的想法有以下幾個:

1. 寄E-Mail通知: 
這個基本上最好做, 可是不可行, 因為我想我家的人應該不會天天檢查電子郵件, 所以XX。

2. LINE機器人:
當初原本覺得做LINE機器人應該是個好選項, 不過既然要做當然會希望作的這個服務能不只服務特定人, 而是所有想要這服務的人都可以訂閱, 可是研究了下發現LINE機器人有個大限制, 就是"主動發通知要錢", 如果是開發模式雖然可以不用錢發通知, 可是最多上限只能加50個人, 所以還是XX。

3. FB粉絲專頁:
最終決定就是做粉絲專頁了, 雖然已經有類似的粉絲專頁了, 不過他的訂閱服務必須下載他的手機APP, 而我想做的是直接用FB訊息通知, 並且會自動PO股票抽籤的訊息文, 不過因為我完全不想花時間經營粉絲團, 所以這粉絲團會全自動讓後端去做PO文還有發送通知訊息的服務, 我唯一的工作就是確保Server工作正常還有修bug。


決定好要做什麼之後, 再來就是實作啦!!  因為這兩樣功能基本很簡單, 所以基本功能我其實上周末兩天假日就做好了, 只是沒想到整合FB API時遇到了不少問題...。

1. 要使用FB的API, 就必須申請FB應用程式上架, 雖然說是應用程式不過其實也只是為了使用FB的API去作設定跟取得權限而已, 這個其實是很智障的事..., 因為我有帳號有Cookie, 那照理說我就能做到任何事, 用FB的API也只是為了更方便寫自動化的機器人, 為什麼還要針對各種API去取得權限, 簡直不可理喻...。要取得權限得申請隱私權文件網址, 編寫你的應用程式服務使用情境說明, 然後提供讓FB測試人員測試, 還要拍影片讓FB知道你的服務是如何運行, 超級無敵麻煩的阿!!!

因為超麻煩, 所以我一開始完全不想搞上面那些東西, 發送訊息跟PO文都不用FB API, 直接打個模擬的https request就好, 可是接受訊息就沒轍了, 因為要確認有沒有人傳訊息給粉絲頁, 我不可能讓Server一直polling FB server去問有沒有新訊息, 一定得註冊FB的webhook功能, 讓FB主動通知我的server有人傳訊息給我, 所以最後還是沒辦法, 只能乖乖走申請權限, 申請FB應用程式的流程...。

然後申請的過程其實很好笑, 我只有申請聊天機器人訊息收/發的權限, 然後測試步驟就寫:
發送"最新消息"或是"訂閱", 我的聊天機器人會回覆什麼資訊這樣, 然後拍個簡單的影片上傳。

結果送件後半天就收到回覆, 直接被退件了, 退件理由是服務太差, 機器人太智障, 然後提供的測試畫面則是: FB測試人員傳送:"what's news", "subscribe"訊息, 這樣當然我的後端當然看不懂只會回覆固定NPC台詞啊!!! 台股抽籤機器人根本沒有處理英文訊息的需求阿阿!!!

之後我就把"what's news", "subscribe"多加進if判斷, 然後再送件一次, 之後就通過了...。 這讓我深深覺得FB做這種事情只是想跟申請人說: "雖然看起來很智障, 可是我們真的有在審核喔, 要求權限是很麻煩的喔, 所以不要給我亂搞喔鳩咪", 根本只是過個水在刁難人而已...。



上架通過後我的粉絲頁就能跟我的後端溝通自動回覆訊息了, 至於自動PO文的部分如果要使用FB的API就還要在申請PO的權限, webhook我是真的沒辦法一定得申請, 自動PO文我就不想再走一次智障流程, 所以我就不用FB的PO文API, 自己在程式加cookie打個模擬的request就好~。

到這裡照理說功能都做完了, 不過其實還有個問題, FB的訊息API服務有個很大的限制, 俗稱24+1 policy, 為了避免粉絲頁惡意騷擾傳送一堆廣告訊息給使用者, FB規定當使用者傳訊息給粉絲頁後, 如果超過24小時使用者沒有在互動, 那之後最多只能再送一筆訊息, 更之後送的訊息都會被擋住, 只有符合某些規格的訂閱服務不受24+1的限制。

由於我的訂閱服務是未來有新股可抽籤時就會傳送訊息, 所以24+1限制基本上就是判死刑了, 雖然我想我也可以申請FB訂閱服務, 可是這個功能也會在明年一月終止掉, 明年一月後能不受24+1限制的只有新聞類型的專頁, 所以我就算申請也只能用到明年一月...超蝦。

既然這樣該怎麼解決呢, 後來看下文件加上簡單的POC, 確定24+1限制只針對FB的聊天機器人API, 一般人工發送訊息是不受限的, 這樣就好解決啦, 我一樣用打模擬request的方式搞定就好了XD

後來POC了下發現還是不可行, 因為FB webhook api收到的訊息的發件人id都是聊天機器人api專屬的id, 並不是那個用戶的真實id, 那個發件人id會受到24+1的限制, 用那個id打發送訊息的api或手動聊天的request只要過24小時就沒用了。

最後沒辦法, 只能請使用者在申請訂閱服務的時候, 請他們一併提供自己的個人頁面網址, 我在用那個網址去取得那個使用者的fb id, 在用那個fb id打模擬的request, 這樣就不會受到24+1 policy的限制了。

這種方式也會衍生一個問題, 因為那個網址是隨使用者填的, 那有人惡意幫其他人註冊的話怎麼辦?  幸好FB是有限制粉絲專頁是不能主動發送訊息給用戶的, 只有用戶在主動發訊息給粉絲頁時, 粉絲頁才可以發送訊息回去, 所以如果有人幫其他人惡意註冊, 我的後端程式也沒辦法發送訊息過去, 就是我的DB會多些garbage data, 不過也沒辦法就是了...。

這次的side project差不多就是這樣啦, 之後這個粉絲團就是完全自動化, 希望沒bug能一直順利運轉下去~。

4 則留言:

  1. 今年只有抽一次上海商銀
    抽到一張..^_^

    回覆刪除
  2. 明天可以抽國泰金了...^_^

    回覆刪除
    回覆
    1. 祝中獎~~我剛剛也有收到粉絲頁訂閱通知, 超方便XD

      刪除