将myqq的最新协议迁移到Openq(开发进行中、、、)

30 views
Skip to first unread message

ccpaging

unread,
Jan 11, 2010, 2:40:20 AM1/11/10
to openq
想参与Openq的朋友请注意,我将尝试把QQ2009协议的开发过程一步步记录下来,大家有什么问题,请随时跟帖询问。
 
=================================
myqq的最新版本为3.19,见附件。
 
pidgin最新版本为2.6.5,源码下载见:
 
在Openq中增加新的QQ版本号支持:
 
myqq的QQ版本号见qq_def.h
//#define QQ_VERSION 0x1205 //祈福版
//#define QQ_VERSION 0x115b //贺岁版
//#define QQ_VERSION 0x1525 //QQ2009Preview4
#define QQ_VERSION 0x1663 //QQ2009正式版
 
Openq的QQ版本号见qq_define.h
#define QQ_CLIENT_0D55 0x0d55 /* QQ2005 used by openq before */
#define QQ_CLIENT_111D 0x111D /* QQ2007 */
#define QQ_CLIENT_115B 0x115B /* QQ2008 He Sui */
增加:
#define QQ_CLIENT_1663 0x1663 /* QQ2009 Release */
 
修改与
guint16 client_tag;
gint client_version;
相关的程序,在Openq中增加新的版本支持
 
暂时修改缺省协议为qq2008,待qq2009协议完成后,如测试后稳定,即设置缺省协议为qq2009
 
2010-01-11

ccpaging
qq2009-01.rar

enst

unread,
Jan 11, 2010, 5:01:57 AM1/11/10
to op...@googlegroups.com
�õ� ��ע

ƽʱ��twitter�� ������Ϣ����


ccpaging �:
> �����Openq��������ע�⣬�ҽ����԰�QQ2009Э��Ŀ������һ������¼��
> 4�������ʲô���⣬����ʱ����ѯ�ʡ�
> =================================
> myqq�����°汾Ϊ3.19�������
> pidgin���°汾Ϊ2.6.5��Դ�����ؼ�
> http://www.pidgin.im/download/source/
> ��Openq������µ�QQ�汾��֧�֣�
> myqq��QQ�汾�ż�qq_def.h
> //#define QQ_VERSION 0x1205 //�?��
> //#define QQ_VERSION 0x115b //�����
> //#define QQ_VERSION 0x1525 //QQ2009Preview4
> #define QQ_VERSION 0x1663 //QQ2009��ʽ��
> Openq��QQ�汾�ż�qq_define.h


> #define QQ_CLIENT_0D55 0x0d55 /* QQ2005 used by openq before */
> #define QQ_CLIENT_111D 0x111D /* QQ2007 */
> #define QQ_CLIENT_115B 0x115B /* QQ2008 He Sui */

> ��ӣ�


> #define QQ_CLIENT_1663 0x1663 /* QQ2009 Release */

> �޸���
> guint16 client_tag;
> gint client_version;
> ��صij�����Openq������µİ汾֧��
> ��ʱ�޸�ȱʡЭ��Ϊqq2008����qq2009Э����ɺ�����Ժ��ȶ���������ȱʡ
> Э��Ϊqq2009
> 2010-01-11
> ------------------------------------------------------------------------
> ccpaging

Administrator

unread,
Jan 11, 2010, 5:12:29 AM1/11/10
to op...@googlegroups.com
人人网也行阿,干吗非要去国外的网站...囧

On Mon, 2010-01-11 at 18:01 +0800, enst wrote:
好的 关注

平时用twitter吗 发布信息更方便点


ccpaging 写道:
> 想参与Openq的朋友请注意,我将尝试把QQ2009协议的开发过程一步步记录下
> 来,大家有什么问题,请随时跟帖询问。
> =================================
> myqq的最新版本为3.19,见附件。
> pidgin最新版本为2.6.5,源码下载见:
> http://www.pidgin.im/download/source/
> 在Openq中增加新的QQ版本号支持:
> myqq的QQ版本号见qq_def.h
> //#define QQ_VERSION 0x1205 //祈福版
> //#define QQ_VERSION 0x115b //贺岁版
> //#define QQ_VERSION 0x1525 //QQ2009Preview4
> #define QQ_VERSION 0x1663 //QQ2009正式版
> Openq的QQ版本号见qq_define.h
> #define QQ_CLIENT_0D55 0x0d55 /* QQ2005 used by openq before */
> #define QQ_CLIENT_111D 0x111D /* QQ2007 */
> #define QQ_CLIENT_115B 0x115B /* QQ2008 He Sui */
> 增加:
> #define QQ_CLIENT_1663 0x1663 /* QQ2009 Release */
> 修改与
> guint16 client_tag;
> gint client_version;
> 相关的程序,在Openq中增加新的版本支持
> 暂时修改缺省协议为qq2008,待qq2009协议完成后,如测试后稳定,即设置缺省
> 协议为qq2009
> 2010-01-11
> ------------------------------------------------------------------------
> ccpaging

-- 
Join us:
op...@googlegroups.com
http://groups.google.com/group/openq

enst

unread,
Jan 11, 2010, 5:56:00 AM1/11/10
to op...@googlegroups.com
嗯 类似的都行 就是个意思

人人API开放得没那么彻底 外围应用没那么多

Administrator 写道:

>> op...@googlegroups.com <mailto:op...@googlegroups.com>
>> http://groups.google.com/group/openq
>>
>

Administrator

unread,
Jan 11, 2010, 6:35:08 AM1/11/10
to op...@googlegroups.com
现在看确实是这样,不过毕竟国产,还在进步嘛
On Mon, 2010-01-11 at 18:56 +0800, enst wrote:
外围应用没那么多

Chunlin Zhang

unread,
Jan 11, 2010, 6:49:19 AM1/11/10
to op...@googlegroups.com
建议协议相关文档可以整理在 google code 的 wiki 页面,这样其他项目参与者也能一起修改。

2010/1/11 ccpaging <ccpa...@gmail.com>:

ccpaging

unread,
Jan 11, 2010, 9:01:48 AM1/11/10
to OpenQ开发者邮件列表
你来做这个整理工作,好吗?

On 1月11日, 下午7时49分, Chunlin Zhang <zhangchun...@gmail.com> wrote:
> 建议协议相关文档可以整理在 google code 的 wiki 页面,这样其他项目参与者也能一起修改。
>

> 2010/1/11 ccpaging <ccpag...@gmail.com>:

Chunlin Zhang

unread,
Jan 11, 2010, 8:06:50 PM1/11/10
to op...@googlegroups.com
有空的话可以啦,但是因为平常比较忙我没办法保证投入的时间,先把我加进去吧

2010/1/11 ccpaging <ccpa...@foxmail.com>:

Flos Lonicerae

unread,
Jan 11, 2010, 9:39:44 PM1/11/10
to op...@googlegroups.com
cc,还是用hg吧,每次都把代码整理是一件很痛苦的事。。

--
Flos

ccpaging

unread,
Jan 11, 2010, 11:09:37 PM1/11/10
to openq
还是补丁会比较习惯。一个人开发,总需要另一个人去检查,这样才能保证大方向不会出错。
 
我只做代码,另外的人来做代码的检查、整理、维护工作。
2010-01-12

ccpaging

发件人: Flos Lonicerae
发送时间: 2010-01-12  10:39:55
收件人: openq
抄送:
主题: Re: [OpenQ-dev] Re: 将myqq的最新协议迁移到Openq(开发进行中、、、)
cc,还是用hg吧,每次都把代码整理是一件很痛苦的事。。
-- 
Flos

Flos Lonicerae

unread,
Jan 13, 2010, 10:50:20 AM1/13/10
to op...@googlegroups.com
ok.
提交了。

2010/1/12 ccpaging <ccpa...@gmail.com>:

--
Flos

ccpaging

unread,
Jan 14, 2010, 2:06:37 AM1/14/10
to openq
Openq连接服务器的过程
 
qq_login,定义在qq.c的“PurplePluginProtocolInfo prpl_info”结构中,由pidgin调用。
qq_login从配置文件中取得各种参数,调用qq_connect_later。
现在QQ客户端连接服务器的过程比较复杂,它需要处理以下问题:
1、QQ服务器是一组服务器通常有6-9个IP地址,可使用UDP和TCP两种协议。
2、通常从服务器组中任选一个连接。
   如果连接不成功(服务器网络较忙时,这种情况有发生),需要先关闭当前连接,然后再从剩下的IP地址中任选一个重新连接。
   如果全部都无法连上,通常意味着客户端存在网络问题,需要做其它检查。
3、连接到第一个服务器后,会调用connect_cb。
   connect_cb清理了连接过程所产生的数据后,并做好下一步的数据准备工作。
   调用qq_request_token向服务器申请令牌。
   这时,客户端才开始正式向服务器发送第一个数据。
   
qq_login函数在qq.c中。其后调用的qq_connect_later、connect_cb等在qq_network.c中。
qq_network.c处理了连接、断开连接、重连、网络数据包收发等功能。
 
 
2010-01-14

ccpaging

发件人: Flos Lonicerae
发送时间: 2010-01-13  23:50:34

ccpaging

unread,
Jan 14, 2010, 4:20:26 AM1/14/10
to OpenQ开发者邮件列表
myqq的登录过程

myqq的连接过程我不太熟悉,目标跟Openq一致,那就是连接到QQ服务器,然后开始发送第一个数据包。

myqq的连接过程结束于qqclient.c的qqclient_login函数。

第一个数据包为(在prot_login.c中):
void prot_login_touch( struct qqclient* qq )
{
static uchar zeros[15]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
prot_login_touch_with_info( qq, zeros, sizeof(zeros) );
}

void prot_login_touch_with_info( struct qqclient* qq, uchar*
server_data, uchar len )
{
qqpacket* p = packetmgr_new_send( qq, QQ_CMD_TOUCH );
if( !p ) return;
bytebuffer *buf = p->buf;
restore_version_data( qq );
randkey( p->key );
memcpy( qq->data.server_data, server_data, MIN(len,sizeof(qq-
>data.server_data)) );
put_word( buf, 0x0001 );
put_data( buf, qq->data.locale, sizeof(qq->data.locale) );
put_data( buf, qq->data.version_spec, sizeof(qq-
>data.version_spec) );
put_data( buf, server_data, sizeof(qq->data.server_data) );
post_packet( qq, p, RANDOM_KEY );
}

On 1月14日, 下午3时06分, "ccpaging" <ccpag...@gmail.com> wrote:
> Openq连接服务器的过程
>
> qq_login,定义在qq.c的"PurplePluginProtocolInfo prpl_info"结构中,由pidgin调用。
> qq_login从配置文件中取得各种参数,调用qq_connect_later。
> 现在QQ客户端连接服务器的过程比较复杂,它需要处理以下问题:
> 1、QQ服务器是一组服务器通常有6-9个IP地址,可使用UDP和TCP两种协议。
> 2、通常从服务器组中任选一个连接。
> 如果连接不成功(服务器网络较忙时,这种情况有发生),需要先关闭当前连接,然后再从剩下的IP地址中任选一个重新连接。
> 如果全部都无法连上,通常意味着客户端存在网络问题,需要做其它检查。
> 3、连接到第一个服务器后,会调用connect_cb。
> connect_cb清理了连接过程所产生的数据后,并做好下一步的数据准备工作。
> 调用qq_request_token向服务器申请令牌。
> 这时,客户端才开始正式向服务器发送第一个数据。
>
> qq_login函数在qq.c中。其后调用的qq_connect_later、connect_cb等在qq_network.c中。
> qq_network.c处理了连接、断开连接、重连、网络数据包收发等功能。
>
> 2010-01-14
>

> ccpaging


>
> 发件人: Flos Lonicerae
> 发送时间: 2010-01-13 23:50:34
> 收件人: openq
> 抄送:
> 主题: Re: [OpenQ-dev] Re: 将myqq的最新协议迁移到Openq(开发进行中、、、)
>
> ok.
> 提交了。

> 2010/1/12 ccpaging <ccpag...@gmail.com>:

> openq@googlegroups.comhttp://groups.google.com/group/openq

Flos Lonicerae

unread,
Jan 17, 2010, 12:51:47 PM1/17/10
to op...@googlegroups.com
我这里几天主要做了以下部分:
在cc的基础上针对update_class增加了UPDCLS类型,把uid的类型定义为UID,以方便对QQ业务层的检查。
见附件,修改已经提交至openq-ng仓库。
先打上cc的qq2009-1补丁,然后打上这个补丁。

2010/1/14 ccpaging <ccpa...@foxmail.com>:

r217_r224.diff

ccpaging

unread,
Jan 17, 2010, 8:23:40 PM1/17/10
to openq
能解释一下:
 
何为业务层?
何为QQ的业务层?
Openq为什么要引进业务层的概念?或者说引进业务层的区隔对Openq的发展有什么优点和缺点?
为何这样修改可以方便对QQ的业务层检查?
将来计划怎样修改Openq以实现业务层概念带来的益处?
 
 
2010-01-18

ccpaging

发件人: Flos Lonicerae
发送时间: 2010-01-18  01:52:00

Flos Lonicerae

unread,
Jan 18, 2010, 3:18:15 AM1/18/10
to op...@googlegroups.com
@cc

何为业务层?
业务层是关于业务流程的一种表现。用来做一些有效性验证的工作,以更好地保证程序运行的健壮性,用于数据填充、修改和查询业务等,尽量保证程序在一个较为稳定的框架里面正常运行。

何为QQ的业务层?
登陆,登出,收发信息等等的协议的基础上对接口数据类型的业务抽象。比如当前QQ实际上用到的一些关键字段,登陆的各类密钥,用户的UID,群的UID,用户资料更新时候的类别,是否存在后续操作等等涉及聊天工具内部对象的抽象。

Openq为什么要引进业务层的概念?或者说引进业务层的区隔对Openq的发展有什么优点和缺点?
举个例子,协议的用户uid类型有改变的话,那么就不得不从各个文件修改uid的数据类型,从guint32改为别的。但把UID代替guint32来定义变量,直观而且方便万一协议修改带来的重复劳动。另外,拿void
qq_request_buddy_memo(PurpleConnection *gc, UID bd_uid, UPDCLS
update_class, guint32
action)为例子,用UID,UPDCLS来替代两个guint32的数据类型,他能够连带让开发者看清楚这个动作涉及的对象是什么,对QQ的请求好友备注这个方法更加容易了解。而且更加容易对从现有的QQ协议中编写出方法的原形。
缺点:需要开发者看看各个类型的typedef是什么。

为何这样修改可以方便对QQ的业务层检查?
我们当前用的很多直接是glib里面的最基础的数据类型,g(u)int8,g(u)int16,g(u)int32,无错这个对于拼凑协议和填充数据是较为方便的。但我觉得如何去真正理解这一大串解密出来的片断的意义以及跟踪协议的改变,会更加有意义。再拿之前的09.02.24的补丁作为例子,当时的update_class的数据类型定义为gint32,但后来发现在获取备注的时候,我们必须keep着好友的uid作为update_class,而update_class无法适应这个新的发展,就导致了数据因为类型不一致而出错。同时也让我知道了update_class这个更新标记应该有更新的含义。倘若当时定义update_class为UPDCLS,配合新分析的协议,只需要在typedef里面对类型进行扩展,解决问题之余还可以保持原有的接口的稳定性。

将来计划怎样修改Openq以实现业务层概念带来的益处?
通过在对协议分析出来的对象加以总结,以分出一个个的类型(type),逐步把协议分析的工作总结为对QQ这一聊天工具的各个对象之间的联系。这样做我希望可以把枯燥的协议分析工作揭开为对他们对象之间的交流。


--
Flos

Russell

unread,
Feb 1, 2010, 12:29:30 AM2/1/10
to OpenQ开发者邮件列表
不知道这个工作进展的怎么样了? 有没有开放的repository可以看看. 如果允许的话, 我也可以来做点贡献

> ccpaging
>
> qq2009-01.rar
> < 1KViewDownload

SHiNE

unread,
Feb 1, 2010, 6:13:34 AM2/1/10
to op...@googlegroups.com
看看pidgin的mtn。

--
~~-~~-~~-~~-~~-~~-~~-~~-~~-~~-~~
First the truth, then the freedom!
~~-~~-~~-~~-~~-~~-~~-~~-~~-~~-~~

ccpaging

unread,
Feb 2, 2010, 3:28:56 AM2/2/10
to openq
欢迎参与。缺人缺时间,难以为继中。需要什么尽管说,知无不言。
2010-02-02

ccpaging

发件人: Russell
发送时间: 2010-02-01  19:12:25
收件人: OpenQ开发者邮件列表
抄送:
主题: [OpenQ-dev] Re: 将myqq的最新协议迁移到Openq(开发进行中、、、)
Reply all
Reply to author
Forward
0 new messages