iT邦幫忙

0

如何使用function framework 接收圖檔並上傳至儲存空間

  • 分享至 

  • xImage

我有一個物件偵測的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'
    ```
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
froce
iT邦大師 1 級 ‧ 2022-12-10 02:05:13
最佳解答

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改來的。

原來是這樣的傳輸過程。測試已經成功! Force 大 精闢入理的解惑。實在令人茅舍頓開!

我要發表回答

立即登入回答