應用情境
想透過另一個外部程式發送以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的程式碼明天會再另外補充
建議是把 webhook
和 你外部要呼叫的 api
分開比較好callback
這個 route
就專職於處理 Line Webhook
而另外開一個 for C# 呼叫的就等待被呼叫,再去使用 push
進行訊息推送
因為 line 的 python sdk 底層會去驗證此請求是否為 line 提供的 webhook event
所以基本上你自己捏一包類似的事件是無法偽裝成正常事件來觸發
詳細可以看一下官方文件