我有一個物件偵測的line 對話機器人要部署到Google 雲端(GCF),經指點,才知道要將flask 改成 functions framework. 我原始的code是(參考一),想改成的code是(參考二)。
目前的盲點是:
1.參考一中分成兩部分,line platform接收訊息的那塊除了第一部份的request, 好像也可以經由第二部分event接收(而且line-bot-sdk可以讓我直接表示是圖檔),但因為參考二,在request 中指定接收是文字,並用json.load(body)處理轉換,可是因為我處理圖檔,因為沒像line-bot-sdk 可以告知說現在接的是圖檔,在沒有這樣的宣告下,轉變成的function framework, 我要如何處理呢?
針對這想求解,謝謝!
參考一:原始Code
app = Flask(__name__)
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=ImageMessage)
def handle_message(event):
message_content = line_bot_api.get_message_content(event.message.id)
user = line_bot_api.get_profile(event.source.user_id)
.
for chunk in message_content.iter_content(): #Line Platform 接收終端使用者傳輸的圖片
...
blob.upload_from_string(data) #上傳終端使用者的圖片至儲存空間
...
reply_arr=[]
line_bot_api.reply_message( #回覆訊息給終端使用者
event.reply_token,
messages=reply_arr
)
if __name__ == "__main__":
app.run()
參考二:目標Code
def linebot(request):
try:
body = request.get_data(as_text=True)
json_data = json.loads(body)
line_bot_api = LineBotApi(access_token)
handler = WebhookHandler(secret)
signature = request.headers['X-Line-Signature']
handler.handle(body, signature)
rMsseg = json_data['events'][0]['message']['text']
rtoken = json_data['events'][0]['replyToken']
line_bot_api.reply_message(rtoken,TextSendMessage( rMsseg))
print( rMsseg, rtoken)
except:
print(request.args)
return 'OK'
```
line platform接收訊息的那塊除了第一部份的request, 好像也可以經由第二部分event接收
才不是這樣,callback裡面有個
handler.handle(body, signature)
這句就是負責將linebot的資訊傳到handle_message裡的。
@handler.add(MessageEvent, message=ImageMessage)
def handle_message(event):
...
這邊是把handle_message這個函式註冊到WebhookHandle,看你的event type和message type去處理。並不是第二部分也可以,而是傳的訊息從callback傳到handle_message。
你就照參考一貼到目標就行了。
function framework 好像也是flask改來的。