To process incoming messages, you should:
- Verify the request signature using
viber.verify_signature() to ensure the request is actually from Viber. - Parse the raw request data using
viber.parse_request(data) to get a request object. - Use
isinstance() to check the type of the request (e.g., ViberMessageRequest, ViberSubscribedRequest, ViberFailedRequest) and respond accordingly.
Example using Flask:
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
from viberbot.api.viber_requests import ViberMessageRequest, ViberSubscribedRequest, ViberFailedRequest
app = Flask(__name__)
viber = Api(BotConfiguration(
name='PythonSampleBot',
avatar='http://site.com/avatar.jpg',
auth_token='YOUR_AUTH_TOKEN_HERE'
))
@app.route('/', methods=['POST'])
def incoming():
# Verify signature
if not viber.verify_signature(request.get_data(), request.headers.get('X-Viber-Content-Signature')):
return Response(status=403)
# Parse request
viber_request = viber.parse_request(request.get_data())
if isinstance(viber_request, ViberMessageRequest):
message = viber_request.message
# Echo back the message
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):
print(f"Client failed receiving message: {viber_request}")
return Response(status=200)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=443, ssl_context=('server.crt', 'server.key'))