iT邦幫忙

0

[LINE Bot] 如何從外部傳資料給Line Bot?

  • 分享至 

  • xImage

應用情境
想透過另一個外部程式發送以JSON格式發送資料給 Line Bot,
Line Bot接收到後再以 Push Message的方式傳給使用者。

遇到問題
目前我的(Python)LINE bot是佈署在 Heroku上,
我的外部程式(C#)能夠成功發送 Post Request 到 LINE Bot 的 callback webhook,
而LINE Bot接收到了也能夠成功解析資料並發送資訊給使用者。
但是在Heroku的Log紀錄裡面,總是會出現 400 Bad Request
想請問是不是有哪裡不對?或是本來就無法從外部傳送資料呢?

Python端程式碼"

from application import app, handler
from flask import request, abort
from linebot.exceptions import InvalidSignatureError
from application import line_bot_api
import json
from linebot.models import TextSendMessage


@app.route("/callback", methods=['POST'])
def callback():
    
    signature = request.headers['X-Line-Signature']
    print(signature)
    body = request.get_data(as_text=True)
    load_body = json.loads(body)  #Json字串 轉 Json dic
    print("傳入訊息資料型別為: " + str(type(load_body['events'][0]['message']['text'])))  
    # print(body)
    line_bot_api.push_message("使用者ID",  TextSendMessage(text=load_body['events'][0]['message']['text']))
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    
    return 'OK'

因為目前電腦不在身邊,C#外部程式發送Request的程式碼明天會再另外補充

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
Han
iT邦研究生 1 級 ‧ 2022-03-06 23:43:27
最佳解答

建議是把 webhook 和 你外部要呼叫的 api 分開比較好
callback 這個 route 就專職於處理 Line Webhook
而另外開一個 for C# 呼叫的就等待被呼叫,再去使用 push 進行訊息推送

因為 line 的 python sdk 底層會去驗證此請求是否為 line 提供的 webhook event
所以基本上你自己捏一包類似的事件是無法偽裝成正常事件來觸發

詳細可以看一下官方文件

edwang iT邦新手 4 級 ‧ 2022-03-07 10:46:40 檢舉

To Han大:

看完你的回覆瞬間懂了,
之前想太多反而忽略了Webhook驗證這件事...
還以為在Request header加上LINE Bot的 access toke 跟 channel secret就能work,
原來在前段就先用錯方法了,
目前已另建一個route,可以成功發送資料給使用者而不收到Bad Request了,
謝謝Han大!

Han iT邦研究生 1 級 ‧ 2022-03-07 10:59:10 檢舉

不客氣,有解答到你就好~

我要發表回答

立即登入回答