【问题标题】:How to use Flask app with BaleBot for send message to users如何使用 Flask 应用程序和 BaleBot 向用户发送消息
【发布时间】:2018-12-03 01:16:37
【问题描述】:

我想使用 Flask 应用来获取发送消息的请求 Bale 用户。

此代码有效! BaleBot 响应用户消息和 Flask 应用响应请求。但是def send_to_user 中的bot.send_message 不起作用!

例如,如果我在 Bale 中向我的机器人发送消息(任何东西),他会回复。 如果我向 Flask 发送请求,例如 curl -X POST 127.0.0.1:5000/send/user -d 'bale_id=1533910422&access_hash=6644828719985087310&message=text',Flask 就会响应。

import os

import asyncio
from flask import Flask
from flask import request
from balebot.handlers import *
from balebot.filters import *
from balebot.models.base_models import Peer
from balebot.models.messages import *
from balebot.updater import Updater
from balebot.config import Config
from threading import Thread

import zbxbale_settings

Config.log_level = zbxbale_settings.LOG_LEVEL

updater = Updater(token=zbxbale_settings.bale_key, loop=asyncio.get_event_loop())
# updater = Updater(token=zbxbale_settings.bale_key)
dispatcher = updater.dispatcher
bale_bot = updater.bot


def success(result, err):
    print("success : ", result)
    print("success : ", err)


def failure(result, err):
    print("failure : ", result)


@dispatcher.command_handler("/start")
def start_command(bot, update):
    message = update.get_effective_message()
    bot.respond(update, message, success_callback=success, failure_callback=failure)


@dispatcher.default_handler()
def default_handler(bot, update):
    message = update.get_effective_message()
    message.text += " not recognized"
    bot.respond(update, message, success_callback=success, failure_callback=failure)


app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello"


@app.route("/send/user", methods=['POST'])
def send_to_user():
    bale_id = request.form['bale_id']
    access_hash = request.form['access_hash']
    message = request.form['message']
    p = Peer('User', bale_id, access_hash)
    m = TextMessage(message)
    bale_bot.send_message(m, p, success_callback=success, failure_callback=failure)
    return "Hello World!"


@app.route("/send/group", methods=['POST'])
def send_to_group():
    bale_id = request.form['bale_id']
    access_hash = request.form['access_hash']
    return "Hello World!"


from multiprocessing import Process


p = Process(target=app.run, args=())
q = Process(target=updater.run, args=())

q.start()
p.start()
# q.join()
# p.join()
# app.run()
# updater.run()

p = Peer('User', "1533910422", "6644828719985087310")
m = TextMessage("salam")
updater.bot.send_message(m, p, success_callback=success, failure_callback=failure)

【问题讨论】:

    标签: python bale-messenger balebot


    【解决方案1】:

    @ehsan-barkhordar 的帮助下编写了这段代码并且它是正确的:

    import pykka
    
    import asyncio
    from flask import Flask
    from flask import request
    from balebot.handlers import *
    from balebot.filters import *
    from balebot.models.base_models import Peer
    from balebot.models.messages import *
    from balebot.updater import Updater
    
    updater = Updater(token="token", loop=asyncio.get_event_loop())
    dispatcher = updater.dispatcher
    bale_bot = updater.bot
    
    
    def success(result, err):
        print("success : ", result)
        print("success : ", err)
    
    
    def failure(result, err):
        print("failure : ", result)
    
    
    @dispatcher.command_handler("/start")
    def start_command(bot, update):
        message = update.get_effective_message()
        bot.respond(update, message, success_callback=success, failure_callback=failure)
    
    
    app = Flask(__name__)
    
    
    class ServerActor(pykka.ThreadingActor):
        def __init__(self, flask_app):
            super(ServerActor, self).__init__()
            self.flask_app = flask_app
    
        def on_receive(self, message):
            print(message)
    
        def run(self):
            self.flask_app.run(host='0.0.0.0', port=5050)
    
        def shutdown_server(self):
            func = request.environ.get('werkzeug.server.shutdown')
            if func is None:
                raise RuntimeError('Not running with the Werkzeug Server')
            func()
    
    
    @app.route("/", methods=['GET'])
    def send_to_user():
        message = "hello"
        m = TextMessage(message)
        bale_bot.send_message(m, Peer('User', "1533910422", "6644828719985087310"), success_callback=success,
                              failure_callback=failure)
        return "message sent"
    
    
    # class SMStarter():
    def start(notification_sender, server_actor_ref):
        server_proxy = server_actor_ref.proxy()
        future = server_proxy.run()
        notification_sender.run()
        notification_sender.stop()
    
    
    start(notification_sender=updater, server_actor_ref=ServerActor.start(flask_app=app))
    

    【讨论】:

      【解决方案2】:

      通常您有两种选择。首先,在两个程序之间使用共享数据库,一个获取请求并写入数据库,而另一个读取数据库并发送消息。 其次,如果您不想使用数据库,可以在 pykka 中使用 actor。它在 Thread 中实现演员并使用它们在收到请求时发送消息。 这是一个很好的文档: https://www.pykka.org/en/latest/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多