如何使用Python向Viber机器人发送消息?

德米特里·库尔塔瑟夫(Dmitry Kultasev):

我有以下HTTPS服务器:

from flask import Flask, request, Response
from viberbot import Api
from viberbot.api.bot_configuration import BotConfiguration
from viberbot.api.messages import VideoMessage
from viberbot.api.messages.text_message import TextMessage
import logging

from viberbot.api.viber_requests import ViberConversationStartedRequest
from viberbot.api.viber_requests import ViberFailedRequest
from viberbot.api.viber_requests import ViberMessageRequest
from viberbot.api.viber_requests import ViberSubscribedRequest
from viberbot.api.viber_requests import ViberUnsubscribedRequest

logger = logging.getLogger(__name__)
app = Flask(__name__)
viber = Api(BotConfiguration(
    name='PythonSampleBot',
    avatar='http://www.clker.com/cliparts/3/m/v/Y/E/V/small-red-apple-hi.png',
    auth_token='xxx-xxx-xxx'
))


@app.route('/', methods=['POST'])
def incoming():
    logger.debug("received request. post data: {0}".format(request.get_data()))
    # every viber message is signed, you can verify the signature using this method
    if not viber.verify_signature(request.get_data(), request.headers.get('X-Viber-Content-Signature')):
        return Response(status=403)

    # this library supplies a simple way to receive a request object
    viber_request = viber.parse_request(request.get_data())

    if isinstance(viber_request, ViberMessageRequest):
        message = viber_request.message
        # lets echo back
        viber.send_messages(viber_request.sender.id, [
            message
        ])
    elif isinstance(viber_request, ViberSubscribedRequest):
        viber.send_messages(viber_request.get_user.id, [
            TextMessage(text="thanks for subscribing!")
        ])
    elif isinstance(viber_request, ViberFailedRequest):
        logger.warn(
            "client failed receiving message. failure: {0}".format(viber_request))

    return Response(status=200)


def set_webhook(viber_bot):
    viber_bot.set_webhook('https://xxx.xxx.xxx.xxx:4443')
    logging.info("Web hook has been set")


if __name__ == "__main__":
    context = ('certificate.pem', 'key.pem')
    app.run(host='0.0.0.0', port=4443, debug=True, ssl_context=context)

并尝试发送消息:

import json
import requests

webhook_url = 'https://xxx.xxx.xxx.xxx:4443'

data = {
    "receiver": "xxx-xxx-xxx",
    "type": "text",
    "text": "Hello world!"
}

response = requests.post(
    webhook_url, data=json.dumps(data),
    headers={'Content-Type': 'application/json'},
    verify='E:\\Docs\\learn_py\\viberbot\\certificate.pem'
)
if response.status_code != 200:
    raise ValueError(
        'Request returned an error %s, the response is:\n%s'
        % (response.status_code, response.text)
    )

我收到403错误

ValueError:请求返回错误403,响应为:

更新:

403来自:

if not viber.verify_signature(request.get_data(), request.headers.get('X-Viber-Content-Signature')):
        return Response(status=403)
dmulter:

您收到403错误的原因有两个。要模拟来自Viber的Webhook请求,必须发送X-Viber-Content-Signature标头。此外,此值还必须是使用auth令牌和webhook有效负载(如其API文档在Callbacks下所述)计算的SHA256哈希

我相信您在这里有2个选择。如果您只想验证代码是否正确接收到网络钩子,则可以verify_signature()暂时注释掉Viber(或任何Webhook源)不需要验证Webhook请求。通常,开发人员会假设像Viber提供的那样的库可以正确地测试其代码,因此通常无需再次测试其功能。您还可以考虑对函数进行模拟,因为在这种情况下这非常简单。

如果您真的想测试Viber的签名验证,那么您将需要实现我首先提到的两个原因。基本上,这是在测试Webhook发送代码中需要执行的操作。请注意,我仅在下面包括了您需要的新代码,请合并到其他测试代码中。

import json
import hmac
import hashlib

# Compute SHA256 hex digest signature using auth token and payload.
auth_token = 'xxx-xxx-xxx'
signature = hmac.new(
    key=auth_token.encode('ascii'),
    msg=data.encode('ascii'),
    digestmod=hashlib.sha256
).hexdigest()

# Send test webhook request with computed signature in header.
response = requests.post(
    webhook_url,
    data=json.dumps(data),
    headers={
        'X-Viber-Content-Signature': signature,
        'Content-Type': 'application/json'
    },
    verify='E:\\Docs\\learn_py\\viberbot\\certificate.pem'
)

请注意,@ tukan指出了viber-bot-python存储库中_calculate_message_signature()函数,函数显示了如何计算签名。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何向机器人邀请者发送消息

使用机器人框架向 slack 发送主动消息

如何使用我的电报机器人通过用户名向某人发送消息

模拟从url向机器人发送消息

向机器人邀请者发送消息

快速向机器人发送多条消息使其崩溃

机器人如何向每个服务器成员发送消息

当用户加入公会时,如何强制机器人向特定频道发送消息?

使用webhook向Google Hangouts聊天机器人发送简单消息

电报:使用机器人向私人群组发送消息

如何获取机器人发送的消息的消息链接?

如何使我的Python Discord机器人检查消息是否由该机器人本身发送?

如何向机器人发送和接收回复

如何通过名称向机器人发送命令?

如何安排电报机器人发送消息?

如何保存发送到机器人的主动消息?

使用 python-telegram-bot 包向电报机器人发送语音命令

用Python编程Discord机器人-如何使其自动发送消息?

如何让我的不和谐机器人从 .txt 文件(python)发送消息

如何使用 Microsoft Graph 从 Microsoft Teams 机器人发送消息?

您如何使用 Go 驱动程序从机器人发送最重要的直接消息?

如何使用电报内联机器人发送消息

电报机器人发送消息

删除某些消息机器人发送

机器人不发送临时消息

如何仅向与我的电报机器人互动的每个用户发送一次消息

为什么我的 discord.py 机器人向错误消息发送消息?

每当删除消息时都会向频道发送消息的 Discord 机器人。Discord.js

电报聊天机器人如何让电报聊天机器人识别发送到群组的消息而不使用“/”命令