Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告在此。
之前試著 測試 Discord 的訊息功能,但用了幾個月後,發現它的「延遲」問題有點嚴重,有的甚至到半小時以上!因此,還是回來研究一下 Line 的解決方案。官方建議是用 Messaging Api,高手們請直接轉檯官方文件,本人只是把最基本的功能測通,做一些紀錄。
首先必須建立一個發訊息的身份。從前用 Line Notify 發訊息,其身份是一個統一的系統角色,藉著把這位 LINE Notify 邀進各個群組,就可以製作各種應用,但將來已經不行了,這個圖示應該在三月底後成為絕響了吧:
以 Line 的服務架構看來,「Provider」是最底層的單位,管理的介面稱為 Line Developer Console,先建立一個 Provider,代表一個提供服務的公司,組織,或開發者:
在 Provider 裡面,建立 Channel,從以下得知還有好幾種 Channel,我們選 Messaging API。
欲建立 Messaging API Channel,系統提示,它必須依附於一個「官方帳號」而存在,從另一個介面建立,進去後發現要填的東西有點多,因此不能很浮濫的建立:
建立官方帳號時,必須設定 Provider,之後就不能改了。進到官方帳號的管理介面,發現裡面的功能非常豐富:
這些功能主要是提供給「業主」經營管理使用的,身為「開發者」還是回到 developer console,完成程式呼叫的最重要設定:access token,設定位置在此頁的最下方:
以上設定就告一段落,拿著這個 access token,就可以開始寫程式了。
原始的 Messaging API 以 Web Endpoint 方式提供,雖然在官方與社群也提供了許多 sdk,但我想原始 api 已經設計的非常好用了,不需要給自己增加一個 dependency,就從最原始和單純的架構開始,只用 python requests 套件來實作:
# 功能一:發送廣播訊息
import requests
import json
token = "...xxxyyy"
url = "https://api.line.me/v2/bot/message/broadcast"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}"
}
data = {
"messages": [
{ "type": "text",
"text": 'test from python'
} ]
}
res = requests.post(url, headers = headers, data = json.dumps(data))
if res.status_code in (200, 204):
print(f"Request fulfilled with response: {res.text}")
else:
print(f"Request failed with response: {res.status_code}-{res.text}")
以上程式會發所給「所有加官方帳號為好友的人」,這樣已經可以達到通知自己的目的了。與 Line Notify 的邏輯不同,因為有此官方帳號的群組,也不會收到訊息,對訊息對象的控制比較精確;這對官方非常有好處,因為「計費」也更精確了,可以依據傳送的則數計算費用。
與廣播不同之處,在於多一個參數「to」,必須填入 User ID:
import requests
url = "https://api.line.me/v2/bot/message/push"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}"
}
data = {
"to": "...xxxyyy02f54e1",
"messages": [
{ "type": "text",
"text": 'personal msg from python'
} ]
}
res = requests.post(url, headers = headers, data = json.dumps(data))
if res.status_code in (200, 204):
print(f"Request fulfilled with response: {res.text}")
else:
print(f"Request failed with response: {res.status_code}-{res.text}")
注意這個 User ID 並不是在 Line App 中看到的 Line ID,無法以簡單的方法取得,所以想要傳給一個非特定對象是很難的。正常取得 User ID 的程序,必須自己寫一個 web api,實際部署到雲端,取得正式服務的網址,然後設定此官方帳號的 webhook。當特定 User 傳送訊息給官方帳號,系統會呼叫 webhook 所設定的網址,然後在自己的程式中接收 Line 系統傳來得參數,解析其中欄位,才能得到那位對象的 User ID。夠麻煩吧!
那有沒有簡單測試的方法?可以的,可在 Line Developer Console 查到自己的 User ID,除此以外,無處可以取得:
至於傳給其他人,比如說某位加入官方帳號為好友的人,就沒那麼容易了,必須先搞定以下部分:接收並解析訊息。之後才能夠處理「回覆」,或是任何智能運算的部分。
這是藉著 Webhook 達成的,當事件發生,Line 系統會把資訊傳送到指定的 Webhook,所以我們必須實作並部署一個 Web Api Service,我用 flask 做一個最簡單的 api:
@app.route("/linebot", methods=['POST'])
def linebot():
try:
data = request.get_json()
if not data:
return {"error": "Invalid JSON"}, 400
crawlService.notify(f'{data}')
return {"message": "Data received", "data": data}
except Exception as e:
return {"error": str(e)}, 500
以上是把 Line 系統發送的資料內容,完整的轉傳出去,可以利用本文稍早提到的 broadcast or push 方式,或暫時還是借用尚未下線的 notify 機制,解開並觀察 post 物件。在 local 測試成功後,必須部署到雲端,把正式網址設定到 Webhook 欄位:
如此 linebot 的服務就正式上線了,以下就是請朋友隨便傳一個訊息給我的官方帳號,系統轉傳給我的資料:
將這段 json 字串 decode 後,顯示出清晰表達的資訊,其中 userId 終於現身了:
有了 userId 就可以用 push 的方式,傳送一對一的訊息了。當然也可以用 reply 的方式,Line 官方尚有許多功能可以使用,使用方法都大同小異,就不一一展開了:
以上已經大致掌握了 Line Messaging Api 的主要用法,四月之後就非用不可了,只是要省著點用,因為免費額度只有每月 200 則而已。
Newman 2025/3/1
導覽頁:紐曼的技術筆記-索引
參考連結: