从Viber bot发送消息给订阅用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Viber bot发送消息给订阅用户相关的知识,希望对你有一定的参考价值。

我正在尝试将消息从Viber bot发送给订阅用户。我可以获得订阅的用户ID,但是当我发送消息时,我得到500错误。

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

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():
    user_id = viber.get_account_info()['members'][0]['id']
    print(user_id)
    viber.send_messages(user_id, [
        TextMessage(text="thanks for subscribing!!!!!")
    ])
    return Response(status=200)


if __name__ == "__main__":
    context = ('E:\Docs\learn_py\viberbot\cert.pem',
               'E:\Docs\learn_py\viberbot\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'

requests.post(
    webhook_url, data=json.dumps({"text": "Hello World"}),
    headers={'Content-Type': 'application/json'},
    verify='E:\Docs\learn_py\viberbot\cert.pem'
)

错误信息:

Cfklv9HOJ6bXZcHMaTl9Gw==
192.168.1.1 - - [15/Mar/2019 08:44:02] "POST / HTTP/1.1" 500 - Traceback (most recent call last):   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 2295, in wsgi_app
    response = self.handle_exception(e)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflask\_compat.py", line 35, in reraise
    raise value   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflask\_compat.py", line 35, in reraise
    raise value   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)   File "E:Docslearn_pyviberbotapp.py", line 21, in incoming
    TextMessage(text="thanks for subscribing!!!!!")   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesviberbotapiapi.py", line 72, in send_messages
    to, self._bot_configuration.name, self._bot_configuration.avatar, message, chat_id)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesviberbotapimessage_sender.py", line 27, in send_message
    return self._post_request(BOT_API_ENDPOINT.SEND_MESSAGE, payload)   File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesviberbotapimessage_sender.py", line 53, in _post_request
    raise Exception(u"failed with status: {0}, message: {1}".format(result['status'], result['status_message'])) Exception: failed with status: 10, message: webhookNotSet  * Detected change in 'E:\Docs\learn_py\viberbot\app.py', reloading

更新:正如mingaleg所建议的,我已将viber.set_webhook('https://xxx.xxx.xxx.xxx:yyyy')添加到incoming()函数中,现在又出现了另一个错误:

Exception: failed with status: 1, message: Result[HttpRequest[POST / HTTP/1.1]@2c67393 > HttpResponse[null 0 null]@72391ae] javax.net.ssl.SSLHandshakeException: General SSLEngine problem

证书是按照this answer的建议生成的:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

答案

由于你有一个webhookNotSet错误消息,你应该配置你的机器人有一个:

...
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'
))
viber.set_webhook(webhook_url)
...

webhook_url应该是你的烧瓶服务器可以到达的那个。

以上是关于从Viber bot发送消息给订阅用户的主要内容,如果未能解决你的问题,请参考以下文章

从 Viber bot 向 botbuilder-viber 发送消息时出现错误 ERR_INVALID_ARG_TYPE

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

如何使用 discord.js 从 discord bot 向特定用户发送消息

Viber REST API,如何找到唯一的 Viber 用户 ID?

作为Microsoft团队usig图形api的bot通道中的bot发送给用户的消息

使用 Bot Framework 代表用户发送消息