版权声明:该开源开发包,是基于LumaQQ的基于等价移植到.NET平台下,开发者不直接参与QQ协议的分析工作,移植到.NET平台纯粹是为了方便广大.NET开发者学习和研究之用,并且没有产生任何直接的经济效益,并且纯粹是个人的技术学习研究行为,与本人所在单位没有任何关系。此开发包的用户在使用过程产生的效益和涉及的法律责任与本人没有直接关系。如果影响到您或您的公司利益,敬请谅解并且与我联系,本人会第一时间作出处理。本系列章首发且单发于博客园,由于各种原因不欢迎转载本系列文章,如果您转载了该系列文章请自行承担责任并且转载完整版本,包括版权声明。
很兴奋能得到这么多人的支持,这也足于说明大家对于这个开发包也是期盼已久的。在这里,为了感谢这么多支持和期待的朋友,我还是第一时间发布一个预览版吧。在这个版本中,已经实现了QQ的一些基本功能,包括:
- 登录:
使用QQ号码和密码进行登录,在LumaQQ中不支持Email登录的。 - 保持连接与登录状态:
如果长时间没有向服务器发布保持连接包,QQ服务器会认为你已经下线。所以每隔一段时间(2分钟)会向服务器发送保持连接包,同时也有一个功能就是保持本地的Socket对象处理连接状态,断线了则自动重新建立连接 - 接收信息
可以接受来好友或陌生人的信息,但还没有测试能否接收来自网页的临时信息。此项功能也在计划中,因为做QQ机器人还是很需要这个功能的。 - 发送信息
可以向好友或陌生人回复(发送)信息。 - 读取QQ好友
可以从服务器读取好友列表(但没有分组信息,读取好友分组是另一个命令) - 读取在线好友
可以读取当前在线的好友列表(只是好友QQ和一些状态相关的属性) - 读取QQ详细信息
可以根据QQ号码根据该QQ的详细信息(包括自己) - 修改登录状态
可以将自己的登录状态修改为隐身或其它状态 - 接收到状态改变
当一个好友的状态发生改变后,会接收到系统这样的一个通知。 - 接收系统信息
可以接收来自QQ服务器的系统消息,包括广告,好友添加申请等等。 - 处理好友添加申请
当你的帐号设置为需要验证时,会通过系统信息得到好友的验证申请,使用这个功能你可以处理验证申请(接受或拒绝) - 删除好友(未验证)
通过这个功能你可以删除一位好友。 - 把自己从好友列表中删除(未验证)
通过这个功能你可以把自己从好友列表中删除(是不是黑名单功能?) - 添加好友和发布验证信息(有点问题)
通过这个功能可以添加好友,在好友设置为需要添加验证时,会有相应的事件,在这个事件中我们可以发送验证请求。但是不知道什么原因,这个功能却很难通过。首先是发送添加申请的那个包经过没有收到回复,偶尔成功过,但是发送验证请求却不成功。我试了很多遍,极少数情况下可以,使用LumaQQ也经常这种情况,但是它成功的机会还是比较多。包协议本身可以确认应该是没有问题的。有空再好好测试一下。
目前就是这么多功能,不过对于只是想开发QQ机器人的朋友来说,这些功能应该是够用了。我今天也特意测试了一些稳定性,结果还是比较满意的,我使用的是代理上网,而且网络情况也不是很稳定。连接在线已经6个小时了,目前依然在线,没有出现什么问题。
回到QQ.NET使用本身,如果你是直接上网,那么只需要下面这段代码即可登录:
QQUser user = new QQUser(****, "****"); QQ.NET.QQClient client = new QQ.NET.QQClient(user); user.IsUdp = true; client.LoginServerHost = "219.133.62.8"; client.Login();
而如果你代理,则需要设置一下代理服务器地址。注意:目前只需要两个登录方式,如果你直接上网你只能使用UDP登录;如果使用代理上网,那么你就只能使用TCP登录(IsUdp = false)。暂时先忍一下吧。
接口方面,因为QQ本身的功能有很多,我没有像LumaQQ那样把所有的功能都定义在QQClient里面,而是将不同的功能包装到不同的类里面,比如连接功能有ConnectionManager,包发送和处理有PacketManager,而好友处理则放在FriendManager里面等等。这样分别包装一下,应该可以大大方便大家的使用。
在QQ事件方面,每一个QQ事件参数都会有InputPacket和OutPacket两个属性,分别表示收到此包和对应的发送包。在有的情况下,可能只有接收包,而没有发送包。因为有的输入包是由服务器主动发送给我们的,比如好友消息和系统消息。所以要正确区分这两个属性的不同之处。
在包的处理方面,收到包的处理和包的重复发送功能我使用了ThreadPool,而不是Timer。这让我们更容易控制这些功能的运行时机,改天有时间我会专门介绍这个功能。另外就是超时包,超时包并不是真的网络发送时超时,而是在一个包发出去后,在一段时间内没有收到QQ服务器的反馈,会再次发送,当发送次数达到一定数量时,就会触发超时事件,不再重复发送。
这个版本按微软的软件发布阶段来定义的话,相当于第一个CTP阶段。主要是想让大家与我一同测试,找出潜在的BUG,找到改进的办法,所以非常欢迎大家提出各建议。
祝大家使用愉快,
源码和文档下载 (感谢DUDU提供的空间)你也可以从SVN上下载最新代码。
补充:大家可以意见和建议发表到博客园LumaQQ.NET小组