适用于WhatsApp API的Azure Flask Webhook设置问题-接收和管理事件负载

mccptt67  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(122)

各位开发者好,
希望你们都过得很好。我目前正在开发一个项目,使用Python,Flask服务器和WATI API创建WhatsApp机器人。当涉及到在Azure上使用Flask实现webhook服务器以从WATI接收事件有效负载时,我面临着挑战。
Webhook功能:
每当用户向与我的机器人相关联的WhatsApp号码发送消息时,就会触发webhook。当这种情况发生时,会收到一个有效负载,它可以帮助我提取消息的文本内容。根据消息的内容,我的机器人应该执行各种操作。
挑战:
为了在WATI中触发webhook,我需要提供一个HTTPS链接,并在Python Flask路由代码中定义了一个端点。在过去,我尝试使用Railway,它会自动生成URL,但我在Azure上很难实现同样的结果。我尝试创建Azure Function和Web App,但似乎都无法接收来自WATI的webhook请求。
以下是在Railway上部署的流程链接:Webhook设置
我正在联系社区,希望有在Azure上构建webhook服务器经验的人可以提供一些指导或见解。你的意见将不胜感激。
下面是我通过Visual Studio创建函数应用程序时生成的代码。不幸的是,我无法在Azure的日志流中看到任何输出:

import azure.functions as func
import logging 
import json 
import WATI as wa
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="HttpExample", methods=['POST']) 

def HttpExample(req: func.HttpRequest) -> func.HttpResponse: 
        logging.info('Python HTTP trigger function processed a request.')
    name = req.params.get('name')
    if not name:
        try:
            print("1")
            req_body = req.get_json()
        except ValueError:
            pass
     else:
        print("2")
        name = req_body.get('name')
    
    if name:
        print("1")
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
            "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
            status_code=200
        )
um6iljoc

um6iljoc1#

当这种情况发生时,会收到一个有效负载,它可以帮助我提取消息的文本内容。根据消息的内容,我的机器人应该执行各种操作。
您可以使用Azure Function Http触发器代码,通过自定义逻辑从消息中提取文本内容,如下所示:

function_app.py:-

import azure.functions as func
import logging

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="http_trigger")
def main(req: func.HttpRequest) -> func.HttpResponse:
    # Check if the request method is POST
    if req.method == 'POST':
        try:
            req_body = req.get_json()
            event_type = req_body.get("eventType")
            
            # Check if the eventType is "templateMessageSent"
            if event_type == "templateMessageSent":
                # Extract relevant data from the payload
                message_id = req_body.get("whatsappMessageId")
                template_name = req_body.get("templateName")
                text = req_body.get("text")
                wa_id = req_body.get("waId")
                
                # Perform actions based on the message content
                if text:
                    # Your logic to process the message content
                    # For example, you can send a response back to the user
                    response_message = f"Received a template message with ID: {message_id}, from {wa_id}. Template name: {template_name}, Message: {text}"
                    return func.HttpResponse(response_message, status_code=200)
                else:
                    return func.HttpResponse("Message content is missing.", status_code=400)
            else:
                return func.HttpResponse("Ignoring unknown event type.", status_code=200)  # You can change the status code as needed
        except ValueError:
            return func.HttpResponse("Invalid JSON payload.", status_code=400)
    else:
        return func.HttpResponse("Method not allowed", status_code=405)

输出:-
我从这个WATI Webhook示例消息模板发送一个示例JSON在这里-Webhooks (wati.io)作为POST请求的请求体中的消息. 我发送POST请求后,消息体的函数被触发. 你可以实现你的逻辑,而不是JSON示例我使用它来提取Whatsapp消息的内容后,其接收.

Json作为请求主体的示例,取自WATI webhooks示例:

{
  "eventType": "templateMessageSent",
  "id": "xxxx538bf0845a0ba0",
  "whatsappMessageId": "abcdefghi_jklmnop",
  "templateId": "xxxxg8h9i10j",
  "templateName": "shipping_template",
  "created": "2022-10-13T07:20:11.3921095Z",
  "conversationId": "xxxg7h8i9j10",
  "ticketId": "xxx3p4q5r6s7t8u9v10",
  "text": "Hi! Your order is out for delivery",
  "operatorEmail": "[email protected]",
  "waId": "911234567890",
  "type": "template",
  "statusString": "SENT",
  "sourceType": "WEB"
}

当地:-
在Postman Http POST请求中复制此Http URL:-

** Postman :-**

  • 您可以在Function应用中部署此Function,然后在WATI Jmeter 板中添加以下Function API URL> Webhooks > Add Webhook> Add a new Webhook > URL(Add Function URL)> Template Message Sent > Status Enabled > Trigger sample callback*,以便在收到消息时检索消息。

创建一个Python Function app并在Function应用程序中部署代码,如下所示,您可以将以下URL作为WATI Jmeter 板中的Webhook URL添加进去:

如果URL在部署后不可见,请从Azure Portal和相同的函数应用复制URL以将其添加到webhook中:

在Azure Portal中:-

  • 点击测试/运行在正文中添加了示例模板消息json,并收到以下响应:-*

在 Postman :-

与Twilio类似的参考:-

easonlai/azure_function_python_sample_01: Azure Function (Python) sample to call API, comparing previously state and send alert message over WhatsApp via Twilio. (github.com)

相关问题