大作发布!QQ自动聊天机器人(含协议讲解)
金坷居士2012/11/29软件综合 IP:河南
前一段时间,在一个群里(好多萝莉哦),我感觉气氛比较冷,人气少,于是准备用AI活跃一下气氛。但是我发现网上的QQ聊天机器人无法满足卖萌的需求,然后和社主商量后决定写一个QQ自动聊天机器人。

首先如何登陆QQ?普通QQ?WebQQ?3GQQ?
普通首先被否定了,本来想用Windows API来控制QQ2012的,用Spy++试着取得句柄后,彻底傻眼了,神马按钮、文本框根本没有句柄!谈何控制!
3GQQ的资料太少、
WebQQ有一些资料,是WebQQ2.0的资料,我试验了下,不能用了,上网查资料发现,原来WebQQ在今年年中升级3.0版本,密码加密算法和各种都变了。。。怪不得。。。

但是为了不辜负社长,我决定自己破解WebQQ3.0的登陆。研究了几天,用WireShark把WebQQ各种的接口找到了,但是发现密码加密算法和以前不一样了,这下怎么整?还好我在网上找到一段C#代码,可以计算出最新的加密方式,这下各种东西都齐全了,开始动工!

语言、选择最喜欢的Visual Basic 2010,.Net很强大。WebQQ登陆需要频繁使用HTTP的Post和Get,于是我找了个C#的代码,可以实现Http\Https的Post和Get,封装成了函数,非常方便使用。

大家可以下载我的源代码

attachment icon WebQQ_Interface.zip 2.82MB ZIP 175次下载
随便改、随便复制,只要不是非法用途就行~

这个是工程的大体构架,其中带点的是我们需要编写的:
How_It_Work.png

打开我的源文件(需要VS2010或者VB2010 Express,VB2010Express不能看到WebQQ的加密算法和被封装的Http访问函数的部分,不过没关系,不影响理解算法)
HTTP:这是包含Http访问的C#代码,来源于互联网,感谢作者,Http访问的部分我稍微修改了一下,修复了丢Cookie的Bug
QQ_Encypt:QQ最新的加密算法,来自互联网
Platform_Test:这个是主程序,为控制台界面(我比较懒),为AI模块提供平台,对AI模块提供发送信息的方法和收到信息的事件等功能。
Rin:这个是AI模块,模拟镜音リン,就是我的头像上那只。这部分主要是识别人话,然后根据数据库内容回复,同时具备学习能力。
QQ_Encypt_Test:这个是个演示程序,实际不包含在解决方案里,就是演示QQ登陆时需要的秘文的计算。

由于抓包过程就像抓带有放射性物质的小强一样,这里省略,只分享结果!
好了,下面介绍WebQQ的各种接口,大家认真看啦!

注意:Http操作会返回cookie,应妥善收藏
Public cookies As New XXXXXXokieCollection
这些cookie用于在每一次Http操作时验证此次操作的计算机是否和上次是一台、
以后每次提交Http操作的时候就把这些cookie都附带上就好啦

第一步、搞定验证码
首先确定登陆时是否需要验证码,用Get访问下
XXXXXXXXXXXXXXXXXXXXXX/check?uin=qq号&appid=1003903&r=0.23301555978693034
其中uin是qq号,appid是应用程序编号,不可以变,据我观察r是个随机数,变不变问题都不大,为了简单干脆不变,用rnd()函数产生也行,这一步注意收集cookie实例代码:
With XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeateGetHttpResponse("XXXXXXXXXXXXXXXXXXXXXX/check?" + "uin=" + QQ_Number + "&appid=1003903&r=0.23301555978693034", -1, "", cookies)
            Verify_Code = New XXXXXXXXXXXXreamReader(.GetResponseStream()).ReadToEnd
            XXXXXXXXXXd(.Cookies)
End With

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeateGetHttpResponse就是之前说的C#写的Http访问方法,这个进行Get,用法很简单,参数分别是访问地址、超时、模拟的浏览器(一般写""就好)和要提交的Cookie

如果返回的是类似ptui_checkVC('0','!OSC','\x00\x00\x00\x00\x5c\xa4\x73\x8a');的字符串,就说明不需要输入验证码,根据第一个参数来看,0表示不需要,第二个参数是验证码,会以!开头,需要记住(记作Verify_Code),第三个东西没用,把第三个家伙里面的\x去掉,再用计算器从十六进制转成十进制,你会看到一个熟悉的数字。。。如果第一个参数是1,则说明需要验证码,第二个参数要用来获取验证码,设法下载“XXXXXXXXXXXXXXXXXXXXX/getimage?aid=1003903&&uin=qq号&vc_type=第二个参数” 这个地址为一个图片(可用用XXXXXXXXXXXXXXXXXXXXXXwnloadFile下载),然后让用户手动输入里面的验证码,然后记下来(同样是Verify_Code变量)。如果谁能实现验证码识别就可以实现完全自动了~

第二步、连接服务器
计算密文:Encrypt_Code = QQ.QQMd5.Encrypt(QQ_Number, QQ_Password, Verify_Code)
使用GET来访问这个地址:XXXXXXXXXXXXXXXXXXXXXX/login?u=qq号码&p=计算出来的密文&verifycode=验证码&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%XXXXXXXXXXXXX%XXXXXXXXXXXXXXXml%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=2-17-7145&mibao_css=m_webqq&t=1&g=1,注意不要搞错,后面那长串不要搞错!附带cookie!一定要!这次的cookie要返回一个ptwebqq的值,要记住,登陆时需要用。

如果一切没有错会返回类似:
ptuiCB('0','0','XXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXml?login2qq=1&webqq_type=10','0','登录成功!', '无敌高氯酸');
如果计算的密文算法不对,会出现这个:
ptuiCB('7','0','','0','很遗憾,网络连接出现异常,请您稍后再试。(3064988208)', '1554281354');

对于成功那个,最后会返回用户昵称(这里是无敌高氯酸),前面一个参数是登陆信息,比如成功登陆,再前面一个没用,是给webqq指示要跳转的页面。

到此为止,我们可以简单测试下,打开IE浏览器,输入第一步的网址,会返回一个check文件,打开就是结果,记下验证码,如果需要就获取图片。打开我的那个工程,把QQ_Encypt_Test设为启动项目,运行了输入相关信息,计算出密文,然后用这些信息结合第二部的地址输到刚才那个IE页面的地址栏里然后导航,会下载一个login文件,打开后就是结果,如果看到登陆成功的字样,那就说明成功了。怎么样?不难吧。有人可能会问,我们在IE里没有啥保存cookie的操作,为啥能成功?因为IE会自动保存cookie然后每一次全部提交。

本段参考代码:
    Public Function Connect() As Boolean
        Encrypt_Code = QQ.QQMd5.Encrypt(QQ_Number, QQ_Password, Verify_Code)    'Calculate the weird encrypt code
        With XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeateGetHttpResponse("XXXXXXXXXXXXXXXXXXXXXX/login?u=" + QQ_Number + "&p=" + Encrypt_Code + "&verifycode=" + Verify_Code + "&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%XXXXXXXXXXXXX%XXXXXXXXXXXXXXXml%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=2-17-7145&mibao_css=m_webqq&t=1&g=1", -1, "", Cookies)
            XXXXXXXXXXd(.Cookies)
            UserName = New XXXXXXXXXXXXreamReader(.GetResponseStream()).ReadToEnd()
            If XXXXXXXXXXXartsWith("ptuiCB('0") Then
                UserName = UserName.Split(",")(5).Replace(");", "").Replace("'", "").Trim()
                ptwebqq = Cookies("ptwebqq").Value
                Return True
            Else
                Return False
            End If
        End With
   End Function

第三步、登录
第二布的连接成功还没有完,这次才算是真正的登录,第三部如果成功会把已经在线的WebQQ或者普通QQ踢下线。我们要做的就是给“XXXXXXXXXXXXXXXXXXXX/channel/login2”Post一个JSON结构(什么是JSON?这是一种轻量级的数据交换格式,和xml有相似功能,里面可以内嵌属性、数组、多层JSON结构,不熟悉Java的同学比如我都比较陌生,JSON可以画成树形的,好理解点)的字符串:
{"status":"",
"ptwebqq":"上面cookie里ptwebqq的值",
"passwd_sig":"",
"clientid","这里随便来个数就可以了最好是1000000级别的"}
把以上做为r,Post到那个地址里,注意附带之前收集的cookie,注意UTF8的编码,这次要加referer为"XXXXXXXXXXXXXXXXXXXX/XXXXXXXXml?v=20110331002&callback=1&id=3"!这三点切记!以后每次Post操作都要记着这三点!后面不再提示了!
这次Post会返回cookie,注意收集;和一个JSON结构,这时JSON解析就要上场,获取里面的psessionid和vfwebqq,以后获取好友列表、收发消息等操作都需要用到

示例代码:
    Public Sub Logon()
        Dim Login_Info As IDictionary(Of String, String) = New Dictionary(Of String, String)()
        Dim Json_Login_str As String
        Login_XXXXXXXd("r", "{" + Chr(34) + "status" + Chr(34) + ":" + Chr(34) + Chr(34) + "," + Chr(34) + "ptwebqq" + Chr(34) + ":" + Chr(34) + ptwebqq + Chr(34) + "," + Chr(34) + "passwd_sig" + Chr(34) + ":" + Chr(34) + Chr(34) + "," + Chr(34) + "clientid" + Chr(34) + ":" + Chr(34) + Clientid + Chr(34) + "}")
        With XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeatePostHttpResponse("XXXXXXXXXXXXXXXXXXXX/channel/login2", Login_Info, -1, "", System.Text.Encoding.UTF8, Cookies, "XXXXXXXXXXXXXXXXXXXX/XXXXXXXXml?v=20110331002&callback=1&id=3")
            XXXXXXXXXXd(.Cookies)
            Json_Login_str = New XXXXXXXXXXXXreamReader(.GetResponseStream()).ReadToEnd()
        End With
        Dim Json_Login As XXXXXXXXXXXXXXXXXXXXXXXbject = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXserializeObject(Json_Login_str)
        psessionid = Json_Login("result")("psessionid")
        vfwebqq = Json_Login("result")("vfwebqq")
    End Sub



第四步、获取好友列表
使用Post方法访问XXXXXXXXXXXXXXXXXXXX/api/get_user_friends2可以获得好友列表,注意附带Cookie、Referer要设置正确、UTF8编码!最后一次提示!
Post的唯一一个r参数是这样的:
{"h","hello",
"vfwebqq":"之前获取的vfwebqq的值"}
同样这次还返回一个JSON结构,同样解析之:
{
  "retcode": 0,
  "result": {
    "friends": [
      {
        "flag": 0,
        "uin": 1771529444,
        "categories": 0
      },
      {
        "flag": 0,
        "uin": 3898920339,
        "categories": 0
      }
    ],
    "marknames": [],
    "categories": [
      {
        "index": 1,
        "sort": 1,
        "name": "朋友"
      },
      {
        "index": 2,
        "sort": 2,
        "name": "家人"
      },
      {
        "index": 3,
        "sort": 3,
        "name": "同学"
      }
    ],
    "vipinfo": [
      {
        "vip_level": 5,
        "u": 1771529444,
        "is_vip": 1
      },
      {
        "vip_level": 0,
        "u": 3898920339,
        "is_vip": 0
      }
    ],
    "info": [
      {
        "face": 303,
        "flag": 13107814,
        "nick": "1080P·人格",
        "uin": 1771529444
      },
      {
        "face": 402,
        "flag": 294126146,
        "nick": "特斯拉的接班人",
        "uin": 3898920339
      }
    ]
  }
}

这个JSON比较长,结构也比较复杂,retcode表示操作是否成功,0是成功,其他非0的就是失败,如果是失败还有个errmsg,里面是错误信息,但一般是空的。如果成功了,会返回一个result,result里面的东西主要需要friends、categories和info(vipinfo表示用户的vip等级,marknames是备注名称),这几个都是数组(JArray):
info里面包含所有的好友,nick是好友名称,uin是临时分配的序列号,不是QQ号,这个需要记住,以后对这个好友操作时候有用!
categories里包含分组信息,index是组的编号,sort是排列顺序,name是分组名称
最后从friends跟据uin获取该用户所属的组,就这样~

代码见WebQQ_Client.vb的Grab_Friend_List()函数


第五步、取得群列表
相信看了上面的讲解,可能已经对WebQQ是如何工作的有一定了解了吧,就是各种Get和Post,表明身份,告诉正确的地址你需要什么就行了。
取得群列表比取得好友列表简单,只需要把r参数等于{"vfwebqq":"之前取得的vfwebqq的值"} Post给"XXXXXXXXXXXXXXXXXXXX/api/get_group_name_list_mask2"就好了。注意附带Cookie、Referer要设置正确、UTF8编码!最后一次提示!

同样返回的是JSON结构,不过简单多,同样,retcode表示操作是否成功,0是成功,其他非0的就是失败,如果是失败还有个errmsg,里面是错误信息,但一般是空的。如果成功了,会返回一个result。
我们需要关注gnamelist即可,需要注意的是gnamelist里每个项目的name(名称)、gid(临时群编号,不是群号)和code(群代码)都需要,gid是群发信息时需要的,code是取得群信息要用的:

{
  "retcode": 0,
  "result": {
    "gmasklist": [],
    "gnamelist": [
      {
        "flag": 16777217,
        "name": "Chemistry Fever",
        "gid": 2422023446,
        "code": 2035113860
      },
      {
        "flag": 17826817,
        "name": "⑨次元の苍歌社",
        "gid": 1301755830,
        "code": 2271299603
      }
    ],
    "gmarklist": []
  }
}

上面JSON包含两个群。代码见WebQQ_Client.vb的Grab_Group_list()函数。

第六步、收取信息

好了,现在要介绍最重要的接收信息的方法了!
XXXXXXXXXXXXXXXXXXXX/channel/poll2这个地址Post下面的JSON,做为参数R,同时还要在要Post的参数里添加clientid和psessionid两项,并且赋予他们相应的值,所以一共Post三个值,一个也不可以少!
{"clientid":"之前自定义的clientid的值",
"psessionid",
"之前取得的psessionid的值",
"key":0,
"ids":[]}

这一步比较特殊,由于是持续接受,因此必须循环对服务器发送请求,并且Post的超时要设为无限长,收取信息最好放到单独线程,防止被阻塞,提高收发效率。

实例代码:
    Function Wait_For_MSG() As String
            Dim Rec_Info As IDictionary(Of String, String) = New Dictionary(Of String, String)()
            Rec_XXXXXXXd("r", "{" + Chr(34) + "clientid" + Chr(34) + ":" + Chr(34) + Clientid + Chr(34) + "," + Chr(34) + "psessionid" + Chr(34) + ":" + Chr(34) + psessionid + Chr(34) + "," + Chr(34) + "key" + Chr(34) + ":0," + Chr(34) + "ids" + Chr(34) + ":[]}")
            Rec_XXXXXXXd("psessionid", psessionid)
            Rec_XXXXXXXd("clientid", Clientid)
            With XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeatePostHttpResponse("XXXXXXXXXXXXXXXXXXXX/channel/poll2", Rec_Info, -1, "", System.Text.Encoding.UTF8, Cookies, "XXXXXXXXXXXXXXXXXXXX/XXXXXXXXml?v=20110331002&callback=1&id=3")
                Return New XXXXXXXXXXXXreamReader(.GetResponseStream()).ReadToEnd()
            End With
   End Function

最后还是返回JSON结构的字符串,其中retcode和可能出现的errmsg的含义和之前说的一样,我们还是重点分析result。返回的JSON示例如下:
{
  "retcode": 0,
  "result": [
    {
      "poll_type": "message",
      "value": {
        "msg_id": 36497,
        "from_uin": 3898920339,
        "to_uin": 1554281354,
        "msg_id2": 245833,
        "msg_type": 9,
        "reply_ip": 176722328,
        "time": 1354283752,
        "content": [
          [
            "font",
            {
              "size": 9,
              "color": "000000",
              "style": [
                0,
                0,
                0
              ],
              "name": "宋体"
            }
          ],
          "测了个试 "
        ]
      }
    }
  ]
}

可以看出result是个数组,因为里面包含很多poll(为什么叫poll?这里是推送的意思,不光是好友消息或者群消息,系统消息或者好友状态改变等信息也可能通过这个传送),疼讯服务器不会一次一条给我们发送poll,因此需要循环处理每个poll。
poll_type表示各种推送的类型,value表示该poll的信息,下面分别讲解(value中的内容):
1、message表示好友消息
   from_uin是发送信息的用户,这是临时的用户代号(uid或者uin)而不是QQ号!
   content是发送信息的内容,是个数组,用JArray可以表示
   其他的不用太关心


2、group_message表示群消息
   from_uin是该消息出现的群,同样是群代码(gid)而不是群号
   send_uin是发送信息的用户,是用户代号
   content是发送消息的内容,是个数组,用JArray可以表示
   其他的不用太关心


3、system_message表示系统消息
   有什么好友申请、加群申请、被T提示等,大家可以自己研究下,设置断点然后查看JSON的字符串即可,这部分不难的~

4、input_notify表示好友正在输入信息

5、buddy_status_change表示好友在线状态改变
   client表示好友的客户端类型,1是电脑,24是IPhoneQQ


要介绍下content了,这是每个好友或者群消息必然包含的部分,是个数组,里面的元素按顺序组合起来就是该条qq消息!
里面可能包含:
1、一个第一个元素是"font"的数组,这个是每个content必须包含的,描述的是该条qq消息的字体(别告诉我你不知道每条qq消息只能有一种字体),第二个元素是个json结构,"name"是字体名称,"size"是尺寸,"color"是颜色,是16进制的数字,"style"貌似是vip字体的样式,我没有搞明白,大家自行研究。。。

2、若干第一个元素是"face"的数组,这个表示一个表情,后面的元素表示表情的编号,如101而不是"101",加引号就不对了,会发不出去

3、若干第一个元素是"offpic"的数组,这个是一个图片,我没研究清楚

4、若干字符串,表示信息的字符部分


第七步、发送消息

发好友消息的接口:XXXXXXXXXXXXXXXXXXXX/channel/send_buddy_msg2
发送群消息的接口:XXXXXXXXXXXXXXXXXXXX/channel/send_qun_msg2

不管发什么消息,需要Post三个东西:clientid,psessionid和r,前两者就是之前我们取得的值,Post的时候注意referer(XXXXXXXXXXXXXXXXXXXX/XXXXXXXXml?v=20110331002&callback=1&id=3)和附带cookie!
下面说下r的内容:
r需要包含clientid和psessionid,就是之前的值
msgid是消息的序号,随机一个6位整数就成
content是发送信息的内容,同介绍接受信息时的content相同
最后说明发送目标,如果是好友消息,则设置to为好友的用户代号(不是QQ号!),如果是群消息,需要设定group_uin为群代号(不是群号)

搞定如上的东西Post一下就好了,服务器会返回一个JSON,如果里面的retcode是0就表明成功了。

代码见WebQQ_Interface.vb里的Post_Complex_MSG函数


经过如上介绍,把WebQQ的基本功能接口都介绍了一遍,这些信息足够作为AI的平台了。实际上,经过第三步后去得了clientid,psessionid和vfwebqq这三个值,其他的一切都简单了,只需要调用相应的接口(Get或者Post)即可。
其他的接口比如获取用户签名、用户信息、用户头像、群成员等,都比较简单,大家可以去探究,我这个因为AI不需要这些功能,所以就没有写了。


如何提高信息收发效率?
答案很简单,使用多线程!如果只使用单线程,发送信息时会阻塞接受消息,严重影响效率。实际我的程序工作时接收在单独进程,接收到后分割成单条的Poll,然后去处理,发送给AI程序,AI程序在新的线程中发送信息,这样接收和发送互不干扰,只要是接收到信息后很短时间内就可以准备迎接下一次的信息!

AI是如何实现的?
上面说的那么多实际上都是WebQQ是如何收发消息的,把上面的封装成平台,即提供On_QQ_Message_Arrive事件和Send_Complex_Message方法,这样AI部分就是处理事件然后发送信息。
我这个AI比较弱智,实际只是比较送来的消息然后比较数据库里的内容然后发送相关结果。
AI部分就不分析了,只涉及些基本的数据库(SQLite)操作和字符串操作。
希望比较懂AI的人再帮忙完善一下


如何使用这个现成的WebQQ登录Dll库(为了方便大家我已经把它封装成库了)
首先实例化一个WebQQ_Interface:
Dim Client as New WebQQ_Interface.WebQQ_Client(QQ_Number, QQ_Password, clientId, CMD_Password)
XXXXXXXXXD_Head = "cmd" '让命令的开始为cmd.    ""表示禁用命令系统
WebQQ_Interface需要被实例化,因此可以实现多个QQ同时登录,一个实例代表一个QQ号,互不冲突~
再使用XXXXXXXXXeck_Verify_Code()检测是否成功获取或者输入验证码
使用XXXXXXXXXnnect()发起连接
使用Client.Logon()开始登陆
使用XXXXXXXXXab_Friend_List()拉取朋友列表和XXXXXXXXXab_Group_list()拉取群列表
以上的函数会返回是否成功,Friend_List和Groups分别是好友列表和组列表的属性
再调用XXXXXXXXXstening_XXXXXXXXXart()开始监听收到的消息
然后AddHandler Client.On_Command_Arrive, AddressOf XXXXXXXXXf_On_Command_Arrive,添加默认cmd命令处理的处理
最后使用Send_Complex_Message和Send_Text_Message发送消息,也可以在处理消息的时候实例化一个QQ_Message_Sender,实例化时提供之前的WebQQ_Client对象、好友代号或者群代号、是否是群这三个东西即可,用该实例的Send方法可以快速发送文字信息
QQ_Message对象有个方法,GetString,是取得消息里的字符串信息的,不包含表情和图片等;from_uin是发送消息的qq或者群,当是群消息时send_uin是发送消息的用户,From_Group指示是否为群消息

如何使用AI平台
AI平台是Platform_Test这个工程,AI的工程需要设为类库,需要饮用WebQQ_Interface.dll,里面需要有个类,公开声明的,名称为AI,这个类在平台加载时会被实例化。类里面需要有Public Function Init(_Interface As WebQQ_Client) As String这个函数,_Interface是平台送过来的用于发送接收QQ消息的对象,函数的返回值显示在平台窗口里的内容(服务器启动时的控制台里)
然后把WebQQ_Client存下来,再注册收到信息和命令的事件:
        Client = _Interface
        AddHandler _Interface.On_QQ_Message_Arrive, AddressOf On_QQ_Message_Arrive
        AddHandler _Interface.On_Command_Arrive, AddressOf On_Command_Arrive
然后编写相关事件处理程序就完工
attachment icon QQ.zip 833.11KB ZIP 140次下载
+20  科创币    yanli12321    2012/11/29 膜拜小翠
+50  科创币    vocal@ルカ    2012/11/29 碉堡
+25  科创币    vocal@ミク    2012/11/29 粥X还在坚守C#..........................
+25  科创币    奶酪    2012/11/29 好贴~俺N年前搞过QQ机器人~回头多交流~
+25  科创币    科学人    2012/11/29
+20  科创币    557304    2012/11/29 等楼主发完慢慢研究 顶礼膜拜
+50  科创币    justinpiggy    2012/11/29 带有放射性物质的小强+1
+49  科创币    20!Dopaminor    2012/11/30 求教抓包什么的..
+20  科创币    028    2012/11/30 好东西
+25  科创币    五成熟的牛排    2012/11/30 不明觉厉
+39  科创币    孤独的酒精灯    2012/11/30
+50  科创币    10班陈大葱22号    2012/11/30 虽不明但觉厉...
+200  科创币    任某人    2012/12/01 油小脆你这是干嘛= =让我情何以堪。。
+100  科创币    phpskycn    2012/12/01 高质量发帖
+150  科创币    十九    2012/12/02 代码中看见了些奇怪的东西……
+25  科创币    学术分    2012/12/05 纯给力!
+50  科创币    alex.chen7    2012/12/06 好厉害的样子
+101  科创币    game00over    2013/07/18 才看到,补齐
+25  科创币    9zhmke    2013/09/24 高质量发帖
加载全文
来自:计算机科学 / 软件综合
87
 
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
龙吟·天变
11年3个月前 IP:未同步
497294
回 楼主(金坷居士) 的帖子
…………为毛不是VB而是VB2010啊………………最讨厌.Net了(.Net就是没学啊。。。)
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
sxper
11年3个月前 IP:未同步
498723
好复杂呀。。。   lz辛苦
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷居士作者
11年3个月前 IP:未同步
499372
回 51楼(龙吟·天变) 的帖子
VB早该被淘汰了 10多年了啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
darkcount
11年3个月前 IP:未同步
501641
XXXXXXXXXXXXXXXXXXXXXX/p/atom-qq/
很久以前的一个半成品,android的,楼主有兴趣可以试试
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wzy41718682
11年2个月前 IP:未同步
505133
QQ截图20130305112606.png 老大你是怎么抓包的啊?现在这个不行了?
XXXXXXXXXXXXXXXXXXXXXX/check?uin=417XXXXX&appid=1003903&r=0.23301555978693034 错误额...能不能告诉我怎么抓包的呢。。或者现在可用的。。。[s:273]好想学习
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wzy41718682
11年2个月前 IP:未同步
505137
send  
GET /web2/get_msg_tip?uin=&tp=1&id=0&retype=1&rc=1&lv=1&t=1362454679314 HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: XXXXXXXXXXXXXXXXX/
Content-Type: utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; QQDownload 731; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; TheWorld)
Host: XXXXXXXXXX
Connection: Keep-Alive
Cookie: ptisp=cnc; ac=1,008,014; pt2gguin=o0041718682; pgv_pvid=9792125696; o_cookie=5458163; ptui_loginuin=492017704; uin_cookie=41718682; euin_cookie=893F301012939D534C422C3071346DCABFED36A301548302; pgv_info=pgvReferrer=&ssid=s502514640

----------------------------------------------------------------------------------
recv
Content-Type: text/html

{"c":1,"e":""}Connection: keep-alive
Pragma: No-cache
P3P: CP="CAO PSA OUR"
Set-Cookie: confirmuin=41718682; PATH=/; DOMAIN=XXXXXXXXXXXXXXX;
Set-Cookie: ptvfsession=e497c4dc0565eaf5f98680ec730f2dc42b736451393bc7d03a0f8c7a2ea482a51a22c66c94ed8ef9f4642f221bff9301; PATH=/; DOMAIN=XXXXXXXXXXXXXXX;

ptui_checkVC('0','!UPR','\\x00\\x00\\x00\\x00\\x02\\x7c\\x93\\x9a');a');
0

怎么看。。。。求详解
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷居士作者
11年2个月前 IP:未同步
505190
回 56楼(wzy41718682) 的帖子
ptui_checkVC('0','!UPR','\\x00\\x00\\x00\\x00\\x02\\x7c\\x93\\x9a');a');
是返回的消息
这里表示不需要验证码

前面的referer啥的在上面都有
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
nx6320
11年2个月前 IP:未同步
507501
汗, 不懂VB的语法,改不了。

不过想到一个折中的方法,不知道是否可行~
先将主程序使用.NET Reflector反编译成C#,然后再将C#的代码复制到新建的项目中……

有点折腾 [s:275]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
超级大屎哥
11年2个月前 IP:未同步
507914
mark 收藏 [s:274] [s:274] [s:274] [s:274] [s:274]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
炮八平五
10年11个月前 IP:未同步
532779
回 56楼(wzy41718682) 的帖子
没深入HTTP协议, 从这个看上去, 应该就是 LZ搞的 WEBQQ 的登陆部分的核心收发!
至于 ptui_checkVC('0','!UPR','\\x00\\x00\\x00\\x00\\x02\\x7c\\x93\\x9a');a');
第三个参数的内容应该就是 一些数字的 转码!

这些代码,好像硬编码较多,不利于更新,需稍作修改,读INI文件吧!
毕竟这些东西公开了,被发现就会很快更新掉的! 所以,要想快速应对,就要设计模块化,LZ已经考虑到
核心的加解密比分的模块分化!

个人瞎YY一下,练下打字!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
炮八平五
10年11个月前 IP:未同步
532781
大致看了一下LZ的帖子,其实说得也很详细了,
真正要紧的就是那段可以计算出最新的加密方式的代码!
其余都是泡功夫了!
从内容的细致度和技术涵盖范围,可见LZ功力相当!
更让我佩服的就是LZ还懂电子电路,甘拜下风!
再回头看看我去年逆向QQEXE的密码加密算法,跟了差不多一半就放弃了!
不知道LZ是否做过?若有经验,分享一下!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jinifly
10年11个月前 IP:未同步
532805
强贴留名[s:271]
有原理有代码,8错!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jungle
10年11个月前 IP:未同步
532896
ai无耻~ [s:273]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
不离不弃
10年11个月前 IP:未同步
533291
回 15楼(金坷居士) 的帖子
这个深有感觉啊。爆强的AI,直接爆群。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
flion
10年11个月前 IP:未同步
533388
我对找小强的过程比较感兴趣,不知道楼主有没有时间分享一下?[s:274]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小陶
10年11个月前 IP:未同步
533415
回 27楼(金坷居士) 的帖子
感谢楼主分享,解释下其实安软也蛮好玩的,只是其开发工具及过程现在千篇一律的都是傻瓜工具,所以高手往往没兴趣,但有意思的是安软的内核是基于LINX系统,所以了解下嵌入式系统推一反三就能触类旁通!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zw1235
10年11个月前 IP:未同步
533418
你的机器人聊起来靠谱不?
如果问:您贵庚?
它会不会回答成:吃的炸酱面[s:178]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷居士作者
10年11个月前 IP:未同步
538021
回 66楼(小陶) 的帖子
现在软件已经用不了了
因为QQ的加密算法和接口换了
我懒得更新了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
流星街
10年11个月前 IP:未同步
538104
后来的java版的QQjar那个“这是一个正在开发的项目,您可以把页面加入书签随时看看我们的进度,也希望您将来能够来看看我们最终的程序。

我们目标

    提供一个基于WebQQ协议开发的库,您可以基于这个库让您的程序集成QQ相关的功能
    提供一个即开即用的桌面QQ客户端,风格可能类似于Mac版QQ

项目

    IQQ UI: XXXXXXXXXXXXXXXXXXXXXX/p/iqq/

    IQQ Core: XXXXXXXXXXXXXXXXXXXXXX/p/webqq-core/ ”就是根据这个开发的吧?还是楼主就是开发者。。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ckzx
10年11个月前 IP:未同步
538555
最近也在搞这个QQ登陆。好像现在QQ搞的狠麻烦。按QQ号分批算的结果不一样。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
cs_net
10年10个月前 IP:未同步
545648
曾经我也写过,貌似当初TX使用js先进行了密码3次加密,然后再提交给服务器。  当初做过夜店之王的外挂,首先破解不算,分析返回的数据才是最头大的问题。  为此我专业写了一个过滤器。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zlxy
10年10个月前 IP:未同步
549267
回 10楼(20!不曾存在) 的帖子
sid比这个简单
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
rc452860
10年10个月前 IP:未同步
549299
好东西我也是学c#的学习了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jasion
10年9个月前 IP:未同步
554754
我完全不懂这个,下载了楼主的两个附件不知道怎么让程序运行起来

我没VB
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jasion
10年9个月前 IP:未同步
554787
一运行就卡死了、、、、、、、、、、、、、、、、、、、、、、、
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小冬瓜
10年9个月前 IP:未同步
556176
楼主分析得太详细了,长知识了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
CODELYOKO
10年8个月前 IP:未同步
645568
这个AI的智能不是一般的弱。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
龙之舞
10年7个月前 IP:未同步
645694
看蒙了好复杂啊楼主真是是人才啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
9zhmke
10年7个月前 IP:未同步
645808
赞美一下楼主,但的需要告诉楼主的是,QQ经常都在变换加密方式,以致于我以前准备开发个把QQ群聊天记录转到论坛的朋友无法继续下去了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
丑丑
10年7个月前 IP:未同步
646562
膜拜  我的乖乖
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
slngen
10年1个月前 IP:未同步
681673
看晕了.....慢慢来........
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
slngen
10年1个月前 IP:未同步
681674
感谢分享了......大作啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ufo007sss
10年1个月前 IP:未同步
681755
我的老QQ丢了谁能帮我找回来呢?[s:2]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
码农
9年6个月前 IP:广西
727876
po啊  你这代码我爬的好辛苦 虽然用红门的反编译工具成功把XXXXXt转成C#(然后各种符号修正)
这貌似还有些过期, 比如url和参数跟现在的略有出入
又自己抓了下辐射小强 (不过没泥萌说的那么复杂啊 ChromeF12一下就抓到请求参数了


虽然没能直接帮上, 但是可以参照着重写一个, 先谢了wwww[s::lol]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小乌大龙
9年3个月前 IP:广西
744642
感觉没什么用。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
那抹余辉
8年7个月前 IP:北京
791019
引用 绘梦工坊:
碉堡。。。问题多个ai会不会自激?
其实一直想搞自激玩。。
那是何等美丽啊。。。
最后,它们进化了。。。。。。。。。。。。。。。。。。自己修改代码。。。。。。。。然后碉堡了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
金坷居士
学者 机友 笔友
文章
170
回复
1711
学术分
11
2011/09/23注册,1个月19天前活动

怪哉!灵异的三极管电流流向! 这素一个在仿真的RCC电路,示波器上绿色的是集电极电流红色的是发射极电流。窝萌都知道发射姬电流素集电极电流和基极电流之和,所以讲道理发射极电流一定比集电极略大。可仿真结果刷了三观,Q1集电极电流一部分流经基极,然后流经Q2的C->E。

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}