【问题标题】:Sending ICQ messages from outside event handlers in Twisted, Oscar从奥斯卡 Twisted 中的外部事件处理程序发送 ICQ 消息
【发布时间】:2012-09-03 08:57:40
【问题描述】:

我正在为一项服务制作一个 ICQ(以及未来的 XMPP)机器人,它应该发送和接收来自用户的消息。

我正在使用 Python 和 Twisted。我从官方文档的例子开始(这个:http://twistedmatrix.com/documents/current/words/examples/oscardemo.py)

到目前为止,我已成功接收和处理来自 ICQ 联系人的消息。现在我需要发送消息,但不需要回复他们的消息或某些事件。我需要使用事件处理程序从类外部发送带有 Oscar(Twisted 用于 ICQ 消息传递的东西)的消息。我该怎么做?

我很感激任何帮助,因为我没有在谷歌上搜索到任何有用的东西,没有太多关于使用 Oscar 的地方。

【问题讨论】:

    标签: python twisted oscar-protocol


    【解决方案1】:

    当你连接时

    protocol.ClientCreator(reactor, OA, SN, PASS, icq=icqMode).connectTCP(*hostport)
    

    添加Deferred,连接完成时会调用:

    oscar_prot = None
    
    def get_B_instance(b_instance):
        global oscar_prot
        oscar_prot = b_instance
    
    d = Deferred()
    d.addCallback(get_B_instance)
    
    protocol.ClientCreator(reactor, OA, SN, PASS, deferred=d, icq=icqMode).connectTCP(*hostport)
    

    在get_B_instance函数中,可以保留对协议类实例的引用。

    然后您可以在该实例上调用sendMessage。

    oscar_prot.sendMessage(username, message)
    

    【讨论】:

    • 哇,这看起来正是我所需要的!这与我在抓取 API 文档后的最后一个小时一直在尝试做的事情非常接近。非常感谢!
    • 虽然不能这样工作...第一个问题是:BotAuth 实例没有属性“sendMessage”。 BotAuth 是一个 OscarAuthenticator 的孩子,它被传递给 ClientCreator,它包含 BOSClass 这是一个 BOSConnection 的子类。如何获取 BOSConnection 实例?另一个问题是在调用 reactor.run() 之后没有代码被执行,直到我中断脚本执行(我猜直到反应器停止)。是否可以同时运行事件处理引擎并发送这些消息?
    • 1) 我编辑了我的答案(我深入研究了 oscar.py 源代码...)来解决这个问题。这样就可以得到B的实例了。
    • 2) reactor.run() 块。这就是它(扭曲)的工作方式。这在一定程度上取决于您到底要做什么,但是如果您例如想要定期轮询某种服务,您可以使用reactor.callLater(delay, nameOfFunction) 去安排它。
    • PS:目前我手头没有 ICQ 帐户,很抱歉我无法很好地测试代码 :-)
    【解决方案2】:

    没有“内部”或“外部”。编程中的包含隐喻是一个极具破坏性的隐喻。你最好忘记它。

    考虑这个类:

    class Foo(object):
        def bar(self):
            return "Foo.bar says hello"
    
        def baz(self):
            print self.bar()
    

    给定一个名为aFoo 的Foo 实例,考虑以下两种使用方式:

    aFoo.baz()
    print aFoo.bar()
    

    这两种用途的行为有何不同?没有一个,但有一个来自“内部”的呼叫栏和一个来自“外部”的呼叫栏。包含隐喻在这里是无用且无关紧要的,不会根据调用函数的“位置”而改变。

    【讨论】:

    • 我想我明白你想告诉我什么。但是,我仍然可以尝试用不同的词来表达。我发现的 Twisted Words 示例仅涵盖 reactive 行为。如何实现一些 active 行为?当脚本发送消息不是作为对请求的响应,而是自己发送消息时。
    • 没有任何事情是“自行”发生的。你想发送什么信息?您想什么时候发送?
    • 嗯,消息来自网络界面。 python 脚本必须将其发送到用户的 ICQ。我试图弄清楚我如何在这个方案中触发必要的行为。我想我必须使用某种应用程序间消息传递,或者我可能会在循环中检查数据库中的新消息。但无论我选择什么,我都看不到将它与 Twisted 集成的方法。这就是我的问题所在。
    • “应用程序间消息传递”只是“函数调用”的一种令人困惑的说法。在 Web 界面的请求处理程序中,调用函数以发送 ICQ 消息。
    • 是的,但是“发送 ICQ 消息的函数”会是什么样子?我已经启动并运行了 ICQ 机器人脚本,它必须保持在线并响应消息,但除此之外,它还必须发送该消息。整个问题是关于如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2019-01-15
    • 2013-10-04
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多