[Python] Flask + Requests 試玩 Line Bot API

Line 的官方 API 好像在 2016 年四月就已經有了,不過那時候有其他事情要做就沒特別去摸,後來暑假去當兵就更沒時間 QQ

現在開學終於有時間玩玩看了~XDDD

 

展示

 

事前準備

  • BOT API Trial Account

先去 BOT API Trial Account 的網站註冊一下,前提是你需要有手機版的 Line 才能登入申請,目前是開放免費申請使用,限制為 50 好友。

 

  • Ubuntu

寫 Python 就是要用 Linux,不要問我怎麼在 Windows 上面弄,我的 Windows 只跑 Visual Studio 、 Office 跟 LOL

 

Python

有 Linux 環境後,建議安裝 pyenv 來建立虛擬 Python 環境,而不會影響原本系統上面的 Python 環境,如果覺得沒差的話可以不用裝。

用來和 LINE API 溝通,提交 POST 超級方便!!之前我是用他來寫 Web Bot ,用來自動填單..XD

接收 LINE 的 POST 用,舉個例子,有人傳訊息給你的 BOT 時,LINE 就會發送一個 POST Request 給你(JSON) ,官方文件有解釋JSON的內容。這好像稱為 callback url,我不是很了解,希望有開發 API 經驗的大大可以補充。Flask 的官方文件看不懂可以看這篇:用 Flask 與 SQLite 架抽籤網站,直接看範例學習比較快(我看這篇學的XD),感謝這些大大的經驗分享!

 

ngrok

開發時我使用 ngork 來作為 callback url 測試,不用獨立IP、不用開Port 就可以有一個網址直通你的電腦,非常方便!

Flask

  • 基本架構

@app.route('/') 為網址根目錄,當使用者瀏覽時,就會執行 index() 函式的內容,得到的就是一串文字 「Hello World」,應該滿好理解的~!

 

  • 接收 POST Request

在 Flask 中,接收任何 Request 需要寫出來,不然是不會同意參數輸入的,由於 LINE 會藉由 callback url 傳送東西給你,以取得使用者傳給 Bot 的資訊:

來自 Line 的 Post Request

來自 Line 的 Post Request

在寫 callback url 的時候,需要另外定義一個 @app.route('/callback'),這樣才有辦法進入這個網址,並執行下面的函式,然後隨便 return 一個 str 結束

request.get_json() :為Line 丟過來的 json 的內容,需要處理一下才能用,這部份我也不是很熟,詳細參考一下這一篇文章「Json概述以及python對json的相關操作

傳訊息給 Bot 後,Line 丟過來的 Json 如下:

decoded[‘result‘][0][‘content‘][‘from‘]:要取值所以要把相對應的 key 寫出來,有點像是陣列的概念,這裡我要的是使用者ID跟純文字內容,Python 真的很方便XD

 

發送訊息

有了那些訊息後就可以把資訊送回去了,這裡我先實做的是原封不動把文字傳回去,所以寫了一個 sendText() 函式:

這裡我用的是 Requests 內的 POST 功能,很方便,直接把資料丟給 Line ~ 用法記得看文件嘿!值得注意的是, "to": [user] 的中括號不能省掉,這是Line 接收的 json 資料格式之一,沒有加的話會錯誤。

完整程式碼就放在 Github 上面了,有興趣的人可以抓下來玩玩,有空的話我再寫成可以部屬在 OpenShift 上面的版本~。

關於 富源

一名台東大學資訊工程學系的學生,這個網站用來紀錄一些不常用,但很重要、會忘記的事情。我的興趣是寫一些實用向的程式,例如 Python 爬蟲之類的東西... 歡迎各位交流!

15 Comments

  1. 想請教一下為什麼你可以不用https呢?
    我做的時候都需要一個 callback url
    他強制要用https
    不過你的code好像不用耶 為什麼呀?
    謝謝您

    1. 因為我用 ngrok , 他有提供 https 的連結,直接丟到 callback url 即可,
      如果要自架實用的話,可以用 nginx 作 proxy 轉發 Port 並配上 SSL 證書~

      1. 我知道你為什麼要部屬在OpenShift 上面了,因為每次ngrok重開都會給不同的網址XD

  2. 再請教 在註冊BOT API Trial Account 時,可以編輯callback url,不知道需要填什麼網址進去

    1. 這就是 Flask 的功能了,用它寫一個頁面,這個網址就是 callback URL。
      當使用者傳給你的 bot 訊息時, Line 的 Server 會 Post 相關資訊 (Json Format)給你的 callback url (Flask),取值後即可進行處理,我是用 ngrok 作為 callback URL ,因為在學校沒有獨立IP可以用,所以就需要ngrok 的 forwarding 功能轉送我的資料

      1. 這樣聽起來難道要填127.0.0.1:5000/callback 進去? 還是說其實不用編輯這個欄位

      2. 請研究一下 ngrok 的功能,這樣才有辦法讓 line 的 server 和你溝通,把127.0.0.1改成 ngrok 給的網址即可

      3. 你好,我現在進度是,用ngrok http 80給的網址(https://49894032.ngrok.io),
        貼給line 的channel – basic information 的callback url,然後我從自己手機發信息給bot,
        可以在自己的localhost:4040 看到line丟過來的result:[… …]。
        請問我應該怎麼執行這份python程式碼,
        或是下一步要怎麼進行才能發信息給bot 讓他回傳重複的字,
        或是我一步有錯要改?

  3. hello,我也在台東,我手邊也有一台當初剩下來的網樂通,我想要改機當區網硬碟使用,但看不太懂,似乎要重灌lunix系統,anyway,可不可以請你吃個飯,好好請教一下怎麼弄,因為看你很會寫程式,分享很多電子的資訊。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *