我有以下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)
并试图发送消息:
^{pr2}$我有403个错误
ValueError: Request returned an error 403, the response is:
更新:
403来自:
if not viber.verify_signature(request.get_data(), request.headers.get('X-Viber-Content-Signature')):
return Response(status=403)
由于更新,已编辑。您在
verify_signature
上得到一个错误。在{a1}的定义:
你给那里发了一个
request.headers.get('X-Viber-Content-Signature')
作为一个`签名。因此,您的解决方案是检查“计算”消息“签名”(请求“数据”)的结果所需数据=request.get_数据()对你来说。在
^{pr2}$_calculate_message_signature
的定义是:我会检查您的
auth_token
,它在self._bot_configuration.auth_token.encode('ascii')
中使用。它包括非ascii字符吗?如果是,那么你有理由。(例如)尝试比较以下结果:
收件人:
request.headers.get('X-Viber-Content-Signature')
这是不同的,这就是为什么你得到禁止消息。在出现403错误有两个原因。要模拟来自Viber的webhook请求,必须发送
X-Viber-Content-Signature
头。此外,该值必须是使用auth令牌和webhook负载计算的SHA256哈希,如其API文档中在Callbacks下所述。在我相信你有两个选择。如果您只想验证您的代码是否正确地接收到webhook,您可以暂时注释掉
verify_signature()
行。Viber(或任何webhook源)不需要验证webhook请求。通常,开发人员会假设Viber提供的库能够正确地测试代码,因此通常不需要再次测试它们的功能。您还可以考虑模拟函数,因为在本例中这非常简单。在如果您真的想测试Viber的签名验证,那么您需要实现我首先提到的两个原因。下面是您在测试webhook发送代码时需要做的基本操作。请注意,我只包括您需要的新代码下面,请合并到您的其他测试代码。在
注意@tukan指出了viber-bot-pythonrepo中的
_calculate_message_signature()
函数,它显示了签名是如何计算的。在相关问题 更多 >
编程相关推荐