使用MSN协议运行twisted.words示例的问题

5 投票
2 回答
956 浏览
提问于 2025-04-15 11:14

我现在正在尝试使用Twisted库,特别是其中的twisted words,来和MSN进行互动。不过,当我运行Twisted提供的示例脚本时,出现了一个错误。具体的错误信息可以在这里找到:http://i42.tinypic.com/wl945w.jpg。这个脚本可以在这里查看:http://twistedmatrix.com/projects/words/documentation/examples/msn_example.py

我的操作系统是Vista,使用的是Python 2.6。

补充:完整的输出信息:

Email (passport): mypassport@hotmail.com
Password: ******
2009-04-25 10:52:49-0300 [-] Log opened.
2009-04-25 10:52:49-0300 [-] Starting factory <twisted.internet.protocol.ClientFactory instance at 0x9d87e8c>
2009-04-25 10:52:55-0300 [Dispatch,client] Starting factory <twisted.words.protocols.msn.NotificationFactory instance at 0x9e28bcc>
2009-04-25 10:52:55-0300 [Dispatch,client] Stopping factory <twisted.internet.protocol.ClientFactory instance at 0x9d87e8c>
2009-04-25 10:52:55-0300 [Notification,client] Unhandled Error
    Traceback (most recent call last):
      File "/usr/local/lib/python2.5/site-packages/twisted/python/log.py", line 84, in callWithLogger
        return callWithContext({"system": lp}, func, *args, **kw)
      File "/usr/local/lib/python2.5/site-packages/twisted/python/log.py", line 69, in callWithContext
        return context.call({ILogContext: newCtx}, func, *args, **kw)
      File "/usr/local/lib/python2.5/site-packages/twisted/python/context.py", line 59, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "/usr/local/lib/python2.5/site-packages/twisted/python/context.py", line 37, in callWithContext
        return func(*args,**kw)
    --- <exception caught here> ---
      File "/usr/local/lib/python2.5/site-packages/twisted/internet/selectreactor.py", line 146, in _doReadOrWrite
        why = getattr(selectable, method)()
      File "/usr/local/lib/python2.5/site-packages/twisted/internet/tcp.py", line 460, in doRead
        return self.protocol.dataReceived(data)
      File "/usr/local/lib/python2.5/site-packages/twisted/protocols/basic.py", line 238, in dataReceived
        why = self.lineReceived(line)
      File "/usr/local/lib/python2.5/site-packages/twisted/words/protocols/msn.py", line 651, in lineReceived
        handler(params.split())
      File "/usr/local/lib/python2.5/site-packages/twisted/words/protocols/msn.py", line 827, in handle_USR
        d = _login(f.userHandle, f.password, f.passportServer, authData=params[3])
      File "/usr/local/lib/python2.5/site-packages/twisted/words/protocols/msn.py", line 182, in _login
        reactor.connectSSL(_parsePrimitiveHost(nexusServer)[0], 443, fac, ClientContextFactory())
    exceptions.TypeError: 'NoneType' object is not callable

2009-04-25 10:52:55-0300 [Notification,client] Stopping factory <twisted.words.protocols.msn.NotificationFactory instance at 0x9e28bcc>

2 个回答

2

发生了什么

你遇到的这个错误是因为你试图调用一个值为 None 的对象。看看这个:

>>> a = str
>>> a() # it's ok, a string is a callable class
''
>>> a = None
>>> a() # it fails, None a special Singleton not meant to be called

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    a()
TypeError: 'NoneType' object is not callable

你可以做什么

你不能仅凭猜测来解决这个问题,所以你需要进行一些调试。

显然,最后一行(refactor.connectSSL...)包含了三个对象的调用,而其中一个对象是 None。

如果你不太熟悉调试工具,首先可以对这一行的每个元素进行处理,在每个元素前面加上:

assert object1 is None 
assert object2 is None

这样你就能找到导致错误的源头。之后,检查一下为什么这个对象会被设置为 None。你可能需要查看文档,了解在什么情况下某个可能初始化它的方法会返回 None。

愿力量与你同在...

3

因为MSN需要使用SSL连接,所以你必须安装pyOpenSSL才能使用它。看起来你可能没有安装这个东西。不过,Twisted在报告这个缺失的依赖时的方式不是很好。我建议你在Twisted的问题追踪系统里提交一个建议,帮助他们改进这个报告方式。

撰写回答