2017-07-01 15 views
1

私はFacebookのボットで画像を送信しようとしています。私はテキストをうまく送ることができますが、メッセージを送信しようとすると、エラーが発生します:TypeError:0x7f34a2fe8b70で 'plot.jpg'、モード 'rb'を開くとJSONシリアライズ可能ではありません。私はボットのためにフラスコとherokuを使用しています。Facebook Messenger Bot Python画像を送信する

これは私のコードです:

def send_message(recipient_id, message_text): 

    log("sending message to {recipient}: {text}".format(recipient=recipient_id, text=message_text)) 

    params = { 
     "access_token": os.environ["PAGE_ACCESS_TOKEN"] 
    } 
    headers = { 
     "Content-Type": "application/json" 
    } 
    log(os.getcwd()) 
    data = json.dumps({ 
     'recipient': { 
      'id': recipient_id 
     }, 
     'message': { 
      'attachment': { 
       'type': 'image', 
       'payload': {} 
      } 
     }, 
     'filedata': (os.path.basename('plot.jpg'), open('plot.jpg', 'rb')) 
    }) 
    r = requests.post("https://graph.facebook.com/v2.6/me/messages", params=params, headers=headers, data=data) 
    if r.status_code != 200: 
     log(r.status_code) 
     log(r.text) 
+1

それは_contents_代わりにファイル_object_?、すなわち 'オープン( 'plot.jpg'、 'RB')のファイルを期待しています。(読み) ' –

+0

ありがとう!その提案は間違いなく私を正しい軌道に立たせた。 .encode( 'base64')を追加してファイルを読み取らなければなりませんでした。 "、": "OAuthException"、 "code":100 "、"タイプ ":"タイプ ":"エラー ":{"メッセージ ":"(100) 、 "error_subcode":2018005、 "fbtrace_id": "CgQWOrVTm5H"}} 何が起こっているのか分かりますか? – Kevin

+0

おそらく 'filedata'は2つの部分からなるタプルの代わりにファイルの内容であると仮定されていますか?ちょうど野生の推測。 –

答えて

0

私は同じ問題を持って、私は代わりに、あなたはペイロードをエンコードマルチパートするrequests-toolbelt-0.8.0からMultipartEncoderを使用することができますjson.dumps()を使用してペイロード全体を符号化する、multipart/form-dataを使用して、それを解決しました。

注 - FacebookのグラフAPIは、いくつかの不明な理由でpngイメージのみを受け入れています。以下の例では、pngというファイルを使用しています。

*編集コード(冗長終わり括弧)たぶん

import json 

import requests 
from requests_toolbelt import MultipartEncoder 

def send_message(recipient_id, message_text): 

    log("sending message to {recipient}: {text}".format(recipient=recipient_id, text=message_text)) 

    params = { 
     "access_token": os.environ["PAGE_ACCESS_TOKEN"] 
    } 
    log(os.getcwd()) 
    data = { 
     # encode nested json to avoid errors during multipart encoding process 
     'recipient': json.dumps({ 
      'id': recipient_id 
     }), 
     # encode nested json to avoid errors during multipart encoding process 
     'message': json.dumps({ 
      'attachment': { 
       'type': 'image', 
       'payload': {} 
      } 
     }), 
     'filedata': (os.path.basename('plot.png'), open('plot.png', 'rb'), 'image/png') 
    } 

    # multipart encode the entire payload 
    multipart_data = MultipartEncoder(data) 

    # multipart header from multipart_data 
    multipart_header = { 
     'Content-Type': multipart_data.content_type 
    } 

    r = requests.post("https://graph.facebook.com/v2.6/me/messages", params=params, headers=multipart_header, data=multipart_data) 
    if r.status_code != 200: 
     log(r.status_code) 
     log(r.text) 
関連する問題