Ответить на входящие сообщения СМИ | Twilio WhatsApp API | Внутренняя ошибка сервера - PullRequest
0 голосов
/ 11 мая 2019

Я использую Twilio WhatsApp API для ответа на сообщения мультимедиа. Всякий раз, когда кто-то отправляет мне сообщение на whatapp с изображением, Twilio отвечает сообщением «Спасибо за изображение» с изображением собаки, и если кто-то пишет номер twilio, то он отвечает «Отправьте нам изображение!», Снова с изображением собаки. .

Когда я отправляю текстовое сообщение, я получаю изображение собаки с текстом «Отправьте нам изображение», но другая функция не работает. enter image description here

Ошибка, я думаю, на сервере, который я пишу. Потому что он продолжает генерировать ошибки, хотя я следую их официальной документации , но продолжаю получать ошибки.

from flask import Flask, request
import requests
from twilio.twiml.messaging_response import MessagingResponse


app = Flask(__name__)


GOOD_BOY_URL = "https://images.unsplash.com/photo-1518717758536-85ae29035b6d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80"


@app.route("/whatsapp", methods=["GET", "POST"])
def reply_whatsapp():

    num_media = int(request.values.get("NumMedia"))
    response = MessagingResponse()
    if not num_media:
        msg = response.message("Send us an image!")
    else:
        msg = response.message("Thanks for the image(s).")
    msg.media(GOOD_BOY_URL)
    return str(response)


if __name__ == "__main__":
    app.run()

Error

Traceback (most recent call last):
  File "C:\Users\mnauf\Anaconda3\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\mnauf\Anaconda3\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\mnauf\Anaconda3\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\mnauf\Anaconda3\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value
  File "C:\Users\mnauf\Anaconda3\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\mnauf\Anaconda3\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "c:/Users/mnauf/Desktop/IOT/twilio/whatsapp/replyWithMediaToIncomingMsg.py", line 19, in reply_whatsapp
    num_media = int(request.values.get("NumMedia"))
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
127.0.0.1 - - [11/May/2019 10:05:02] "GET /whatsapp HTTP/1.1" 500 -
[2019-05-11 10:06:07,095] ERROR in app: Exception on /whatsapp [GET]

1 Ответ

0 голосов
/ 11 мая 2019

Если я правильно понимаю, это работает, когда вы отправляете только текстовое сообщение, но когда вы отправляете сообщение с прикрепленным изображением, оно не работает.

Учебник Twilio маскирует (размывает) некоторый кодчтобы подчеркнуть изменения между шагами, и мне кажется, что эта функция не работает должным образом, поэтому вам не хватает некоторого кода (части для обработки входящих медиа-вложений).

Полный код приведен ниже, и также необходимо создать папку app_data для хранения входящих мультимедийных файлов.


import mimetypes
import os
from urllib.parse import urlparse

from flask import Flask, request
import requests
from twilio.twiml.messaging_response import MessagingResponse


app = Flask(__name__)


GOOD_BOY_URL = "https://images.unsplash.com/" \
    "photo-1518717758536-85ae29035b6d?" \
    "ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80"


@app.route("/whatsapp", methods=["GET", "POST"])
def reply_whatsapp():

    num_media = int(request.values.get("NumMedia"))
    media_files = []
    for idx in range(num_media):
        media_url = request.values.get(f'MediaUrl{idx}')
        mime_type = request.values.get(f'MediaContentType{idx}')
        media_files.append((media_url, mime_type))

        req = requests.get(media_url)
        file_extension = mimetypes.guess_extension(mime_type)
        media_sid = os.path.basename(urlparse(media_url).path)

        with open(f"app_data/{media_sid}{file_extension}", 'wb') as f:
            f.write(req.content)

    response = MessagingResponse()
    if not num_media:
        msg = response.message("Send us an image!")
    else:
        msg = response.message("Thanks for the image(s).")
    msg.media(GOOD_BOY_URL)
    return str(response)


if __name__ == "__main__":
    app.run()

...