技術筆記-Line Messaging Api 的基本用法

更新於 發佈於 閱讀時間約 9 分鐘

Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告在此

raw-image

之前試著 測試 Discord 的訊息功能,但用了幾個月後,發現它的「延遲」問題有點嚴重,有的甚至到半小時以上!因此,還是回來研究一下 Line 的解決方案。官方建議是用 Messaging Api,高手們請直接轉檯官方文件,本人只是把最基本的功能測通,做一些紀錄。

準備工作

首先必須建立一個發訊息的身份。從前用 Line Notify 發訊息,其身份是一個統一的系統角色,藉著把這位 Line Notify 邀進各個群組,就可以製作各種應用,但將來已經不行了,這個圖示應該在三月底後成為絕響了吧:

raw-image


以 Line 的服務架構看來,「Provider」是最底層的單位,管理的介面稱為 Line Developer Console,先建立一個 Provider,代表一個提供服務的公司,組織,或開發者:

raw-image


在 Provider 裡面,建立 Channel,從以下得知還有好幾種 Channel,我們選 Messaging API。

raw-image


欲建立 Messaging API Channel,系統提示,它必須依附於一個「官方帳號」而存在,從另一個介面建立,進去後發現要填的東西有點多,因此不能很浮濫的建立:

raw-image


建立官方帳號時,必須設定 Provider,之後就不能改了。進到官方帳號的管理介面,發現裡面的功能非常豐富:

raw-image

這些功能主要是提供給「業主」經營管理使用的,身為「開發者」還是回到 developer console,完成程式呼叫的最重要設定:access token,設定位置在此頁的最下方:

raw-image

以上設定就告一段落,拿著這個 access token,就可以開始寫程式了。

廣播訊息(broadcast)

原始的 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 的邏輯不同,因為有此官方帳號的群組,也不會收到訊息,對訊息對象的控制比較精確;這對官方非常有好處,因為「計費」也更精確了,可以依據傳送的則數計算費用。

特定對象(push)

與廣播不同之處,在於多一個參數「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,除此以外,無處可以取得:

raw-image

至於傳給其他人,比如說某位加入官方帳號為好友的人,就沒那麼容易了,必須先搞定以下部分:接收並解析訊息。之後才能夠處理「回覆」,或是任何智能運算的部分。

接收訊息(webhook)

這是藉著 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 欄位:

raw-image

如此 linebot 的服務就正式上線了,以下就是請朋友隨便傳一個訊息給我的官方帳號,系統轉傳給我的資料:

raw-image

將這段 json 字串 decode 後,顯示出清晰表達的資訊,其中 userId 終於現身了:

raw-image

有了 userId 就可以用 push 的方式,傳送一對一的訊息了。當然也可以用 reply 的方式,Line 官方尚有許多功能可以使用,使用方法都大同小異,就不一一展開了:

raw-image


以上已經大致掌握了 Line Messaging Api 的主要用法,四月之後就非用不可了,只是要省著點用,因為免費額度只有每月 200 則而已。


Newman 2025/3/1


導覽頁:紐曼的技術筆記-索引

參考連結:




留言
avatar-img
留言分享你的想法!
avatar-img
newman的沙龍
25會員
128內容數
漫步是一種境界。
newman的沙龍的其他內容
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2024/12/15
「通知」這種功能現在已經非常稀鬆平常了,三不五時手機跳出訊息或聲音,不勝其擾!但不要因噎廢食,對於「真正重要的事件」,即時通知還是非常必需的。像是刷卡通知,應該沒有人會關掉吧!所以對於一個交易系統而言,牽涉到金錢的進出,通知功能是一定要的啦。有 line notify 相伴的年代,輕鬆愉快:
Thumbnail
2024/12/15
「通知」這種功能現在已經非常稀鬆平常了,三不五時手機跳出訊息或聲音,不勝其擾!但不要因噎廢食,對於「真正重要的事件」,即時通知還是非常必需的。像是刷卡通知,應該沒有人會關掉吧!所以對於一個交易系統而言,牽涉到金錢的進出,通知功能是一定要的啦。有 line notify 相伴的年代,輕鬆愉快:
Thumbnail
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
感謝所有訂閱的朋友們, 在個人因健康、工作、出國、雜務等諸多因素, 無法定期更新的情況下, 仍然願意訂閱, 在此表達萬分感謝。
Thumbnail
感謝所有訂閱的朋友們, 在個人因健康、工作、出國、雜務等諸多因素, 無法定期更新的情況下, 仍然願意訂閱, 在此表達萬分感謝。
Thumbnail
👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻 +81 70-9259-1826 or+81 70-9220-0945(請使用imessage) 我會透過方格子回應喔🙌🏻一日會員限定
Thumbnail
👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻👇🏻 +81 70-9259-1826 or+81 70-9220-0945(請使用imessage) 我會透過方格子回應喔🙌🏻一日會員限定
Thumbnail
感謝所有支持的訂閱戶, 自5月重啟專欄以來, 獲利約45元, 均有前後文可稽。
Thumbnail
感謝所有支持的訂閱戶, 自5月重啟專欄以來, 獲利約45元, 均有前後文可稽。
Thumbnail
Line:@mqy0772c (加入並私訊我!!) https://liff.line.me/1645278921-kWRPP32q/?accountId=mqy0772c
Thumbnail
Line:@mqy0772c (加入並私訊我!!) https://liff.line.me/1645278921-kWRPP32q/?accountId=mqy0772c
Thumbnail
Line:@mqy0772c (加入並私訊我!!) https://liff.line.me/1645278921-kWRPP32q/?accountId=mqy0772c
Thumbnail
Line:@mqy0772c (加入並私訊我!!) https://liff.line.me/1645278921-kWRPP32q/?accountId=mqy0772c
Thumbnail
大家好,好久沒更新,最近教學論命繁忙,這邊有所耽擱,真的抱歉。 最近也有跟設計師在討論要架官網,時間真的是不夠用了,因此方格子這邊我會先暫停一下,架好官網之後會將文章轉移到官網,至於會不會有收費文章,這邊我還再思考當中。 如果想看我最新的貼文,可以轉到我的社群上面去。目前是每周二晚上八點發放貼文
Thumbnail
大家好,好久沒更新,最近教學論命繁忙,這邊有所耽擱,真的抱歉。 最近也有跟設計師在討論要架官網,時間真的是不夠用了,因此方格子這邊我會先暫停一下,架好官網之後會將文章轉移到官網,至於會不會有收費文章,這邊我還再思考當中。 如果想看我最新的貼文,可以轉到我的社群上面去。目前是每周二晚上八點發放貼文
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News