Send message from Viber bot to subscribed user
Asked Answered
W

2

9

I'm trying to send the message from the Viber bot to subscribed user. I can get the subscribed User ID, however when I send the message, I get 500 error.

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)

Request message send code:

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'
)

Error message:

Cfklv9HOJ6bXZcHMaTl9Gw==
192.168.1.1 - - [15/Mar/2019 08:44:02] "POST / HTTP/1.1" 500 - Traceback (most recent call last):   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)   File "E:\Docs\learn_py\viberbot\app.py", line 21, in incoming
    TextMessage(text="thanks for subscribing!!!!!")   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\viberbot\api\api.py", line 72, in send_messages
    to, self._bot_configuration.name, self._bot_configuration.avatar, message, chat_id)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\viberbot\api\message_sender.py", line 27, in send_message
    return self._post_request(BOT_API_ENDPOINT.SEND_MESSAGE, payload)   File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\viberbot\api\message_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

UPDATE: As suggested by mingaleg I've added viber.set_webhook('https://xxx.xxx.xxx.xxx:yyyy') to the incoming() function and now getting another error:

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

The certificate was generated as suggested in this answer:

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

Winder answered 15/3, 2019 at 6:49 Comment(2)
you aren't supposed to use self-signed certificate. I can recommend LetsEncrypt service as convenient and free way to get an SSL certificate for your domain.Neutretto
Or you can use ngrok for local development or deploy it to Heroku (it gives HTTPS domain for free).Neutretto
H
2

Since you have an webhookNotSet error message you should configure your bot to have one:

...
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 should be the one your flask server is reachable by.

Hunk answered 17/3, 2019 at 15:37 Comment(4)
Exception: failed with status: 1, message: Result[HttpRequest[POST HTTP/1.1]@6992828d > HttpResponse[null 0 null]@554955e3] java.util.concurrent.TimeoutException: Total timeout elapsedWinder
You should provide webhook_url reachable from the internet, although it doesn't look like itHunk
If I set webhook in the place you provided, then it is trying to set the hook before the server starts. I've moved it to the incominng() function as the first statement (what's the right place for that? Anyway after I moved there I've got certificate error: Exception: failed with status: 1, message: Result[HttpRequest[POST / HTTP/1.1]@7ba1c887 > HttpResponse[null 0 null]@5c94ba77] javax.net.ssl.SSLHandshakeException: General SSLEngine problemWinder
@DmitrijKultasev you aren't supposed to use self-signed certificate. I can recommend LetsEncrypt service as convenient and free way to get an SSL certificate for your domain.Hunk
N
2

You aren't supposed to use self-signed certificate.
I can recommend Let's Encrypt service as convenient and free way to get an SSL certificate for your domain.

Or you can use ngrok for local development or deploy it to Heroku (it gives HTTPS domain for free).

Neutretto answered 5/8, 2020 at 13:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.