分析修正msnp.py小问题的全过程

最近自己准备用python实现一个msn的机器人, google了一下, 找到了msnp.py这个项目. 项目的地址在

http://msnp.sourceforge.net

看了一下最后更新日期, 也已经是2004年1月的事情. 不知道现在还是不是好使! 那就试试吧! 于是按照教程写了一个简单的例子, 于是问题也出现了:P

自己先用帐号A登了一个msn, 然后用另外一个帐号B试例子(两个帐号互为好友). 运行例子. 过了4,5秒后, 从A帐号上看到B帐号登录了, 但就在这同时, 例子程序出现了异常!

从异常信息来看, 是在msnp项目的command.py文件中出现了异常. 异常发生在一个类型转换语句上. 于是开始跟踪, 调试……结果被我发现了问题的所在!

首先从程序的表征上来看. 程序的异常是紧接着登录发生的, 而从msn上的帐号A来看, B是有成功登录的(当然, 异常发生后帐号B就掉线了). 所以可以大致断定异常发生在登录操作之后, 而且离的比较近. 这个推断可以缩短我们的调试时间:)

然后是通用的跟踪调试了! 根据异常信息, 在报错的语句前加print来打印中间结果. 令人惊讶的时候print出来的结果竟然没有一点异常, 但是异常还是在那个地方发生了! 这是个费解的情况, 看来print中间结果这条路是不好走了. 于是我又祭起了Winpdb这个家伙, 开始单步执行我的程序, 并跟踪到command.py中. 终于, 在其中的一步中, 我从cmd窗口中看到了print的异常结果–一个XML格式的Notification消息. 问题就是这里了!

一般来说, msn登录时候的往返协议消息都是有一定格式的, msnp就是按照这个格式来解析往返的消息. 而根据推断, 这个XML格式的Notification消息应该是在登录过程中没有按照这个格式来发的消息. 从Notification消息的内容来看, 这个消息应该是用来显示msn登录后弹出的那个含有邮件信息和新闻的窗口的. 这个窗口在msn登录后会自动弹出, 而且也在登录过程中.

有了上面的推断, 我就改动了command.py的内容. 我在Command类的parse方法中最前面加入了如下1行:

if str[0] == '<': return

修改之后再次运行我的例子……哈哈, 这次成功登录后没有异常发生了! 看来我的推断是正确的!

继续玩我的msn机器人……

您的支持将鼓励我继续创作