前言

11月是一个伤感的月份,又悲又离,故想要保留与她有关的缩影,就像快照,在此爬取我当时QQ上的一切状态:QQ创号信息、QQ好友信息、QQ群信息,希望能将这些连带着我对她的记忆,封存在计算机冰冷的二进制中…
(PS:本期博文不发布任何代码,需要者可以私信交流一下。)

第一部分:创号时长爬取

20周年QQ个人轨迹 这是一个手机访问页面,电脑上只会出现用手机扫描二维码,这算是整个爬取过程中最特别的一处了,这里需要Fiddler或其他抓包工具来调试访问该页面,使用Fiddler抓包工具的方法参见手把手带你用Python爬取反爬策略的网站这篇文章,要想抓取手机上的包,需要在打开手机所连接wifi的代理,设置为电脑IP和Fiddler上打开的端口:

抓包esp_python

抓包esp_爬虫_02


然后手机上返回保存。这样手机上浏览过程就会被电脑上的Fiddler捕捉到。

很快就确定了必须的请求头参数:HostAcceptQ-UA2Q-GUIDQ-QIMEIQIMEI36Q-AuthUser-Agent,带上cookies就能get到手机上显示的网页源代码了!

不过总不能每次爬取都抓包手机吧,这样直接记录数据得了。所以经过我的多次尝试,从QQ各大官网cookies尝试,最终确定此处的cookies可以用QQ群cookies代替。

正确返回后,不要着急解析整个页面,在我视察整个页面之后,我发现存在**“window.syncData”数据于页面其中一个script标签中,这就是数据源,这可比解析整个页面简单又方便多了~
解析出来是一个数据字典,其中
“register_time”就是自身QQ的注册时间戳,registerTime_date是时间戳代表的具体日期时间,用今天减去就再除以60 * 60 * 24能知道自己创号多少天了。里面还有其他数据,比如qq_days**就是注册多少天,qq_lvl就是QQ等级,vec_packets就是好友分组,very_close_friend就是亲密度排行第一的好友,feed_count就是说说数量,msg_count就是留言数量。当然里面还有其他数据,有兴趣的可以慢慢研究。

第二部分:所有QQ好友爬取

这一部分只需要不断去QQ空间好友部分尝试、观察,总能发现一些特殊的请求地址与请求参数,这里就不多做介绍,附上一些可能用到的爬取接口地址,按需爬取即可:

好友统计

URL = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/potential/potentialpy_homepage.cgi?uin=XXX博主QQXXX&page=1&num=50&rd=0.5115880292300372&fupdate=1&g_tk=1898469524&g_tk=1898469524"
url = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/potential/potentialpy_homepage.cgi"
parameters = """
uin: XXX博主QQXXX
page: 1
num: 50
rd: 0.5115880292300372
fupdate: 1
g_tk: 1898469524
"""

亲密度关系

URL2 = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=XXX博主QQXXX&do=1&rd=0.9145717705240268&fupdate=1&clean=1&g_tk=1898469524&g_tk=1898469524"
url2 = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi"
parameters2 = """
uin: XXX博主QQXXX
do: 1
rd: 0.9145717705240268
fupdate: 1
clean: 1
g_tk: 1898469524
"""

最多前200位好友,多了也不必在乎;special_flag为特别关心。

好友分组信息

URL3 = "https://h5.qzone.qq.com/proxy/domain/base.qzone.qq.com/cgi-bin/right/get_entryright.cgi?uin=XXX博主QQXXX&rd=0.24837735638159453&ver=1&fupdate=1&g_tk=1898469524"
url3 = "https://h5.qzone.qq.com/proxy/domain/base.qzone.qq.com/cgi-bin/right/get_entryright.cgi"
parameters3 = """
uin: XXX博主QQXXX
rd: 0.24837735638159453
ver: 1
fupdate: 1
g_tk: 1898469524
"""

所有好友信息

URL4 = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_show_qqfriends.cgi?uin=XXX博主QQXXX&follow_flag=0&groupface_flag=0&fupdate=1&g_tk=1898469524&g_tk=1898469524"
url4 = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_show_qqfriends.cgi"
parameters4 = """
uin: XXX博主QQXXX
follow_flag: 0
groupface_flag: 0
fupdate: 1
g_tk: 1898469524
"""

单独好友详细信息

URL5 = "https://h5.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feeds2_html_friendship_pav?uin=XXX博主QQXXX&end_time=1370329982&count=10&useutf8=1&outputhtmlfeed=1&query=1&offset=0&frienduin=2717057684&applist=2_4_202_311&total=10&instance=0&g_tk=1898469524"
url5 = "https://h5.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feeds2_html_friendship_pav"
parameters5 = """
uin: XXX博主QQXXX
end_time: 1370329982
count: 10
useutf8: 1
outputhtmlfeed: 1
query: 1
offset: 0
frienduin: XXX好友QQXXX
applist: 2_4_202_311
total: 10
instance: 0
g_tk: 1898469524
"""

可获取双向亲密度、加好友日期、加好友天数、共有的群等信息。

单独好友亲密度信息

URL6 = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/friendship/cgi_friendship?activeuin=XXX博主QQXXX&passiveuin=XXX好友QQXXX&situation=1&isCalendar=1&g_tk=1898469524&g_tk=1898469524"
url6 = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/friendship/cgi_friendship"
parameters6 = """
activeuin: XXX博主QQXXX
passiveuin: 2717057684
situation: 1
isCalendar: 1
g_tk: 1898469524
"""

addFriendTime为加好友的时间,可以计算相距天数【相差 + 1】;intimacyScore为亲密度

背景音乐概览

URL7 = "https://u.y.qq.com/cgi-bin/musicu.fcg?data={%22songInfo%22:{%22module%22:%22track_info.UniformRuleCtrlServer%22,%22method%22:%22GetTrackInfo%22,%22param%22:{%22ids%22:[101810957],%22types%22:[2]}}}&platform=yqq&g_tk=531488230"
url7 = "https://u.y.qq.com/cgi-bin/musicu.fcg"
parameters7 = """
data: {"songInfo":{"module":"track_info.UniformRuleCtrlServer","method":"GetTrackInfo","param":{"ids":[101810957],"types":[2]}}}
platform: yqq
g_tk: 531488230
"""

背景音乐详情

URL8 = "https://u.y.qq.com/cgi-bin/musicu.fcg?data={%22url_mid%22:{%22module%22:%22vkey.GetVkeyServer%22,%22method%22:%22CgiGetVkey%22,%22param%22:{%22guid%22:%223122791488%22,%22songmid%22:[%22002juNGg4JZchu%22],%22songtype%22:[0],%22uin%22:%22XXX博主QQXXX%22,%22platform%22:%2223%22}}}&platform=yqq&g_tk=531488230"
url8 = "https://u.y.qq.com/cgi-bin/musicu.fcg"
parameters8 = """
data: {"url_mid":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"3122791488","songmid":["002juNGg4JZchu"],"songtype":[0],"uin":"XXX博主QQXXX","platform":"23"}}}
platform: yqq
g_tk: 531488230
"""

第三部分:所有QQ群爬取

这一部分比爬取QQ好友还容易看出来,毕竟QQ群组成元素就那几个:群列表群成员,最多群分为创建的群管理的群加入的群,不过这可以从群成员分类中分析出具体的分类,以下是我从QQ群官网发现的一些接口:

好友列表

url1 = "https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list"
parameters1 = """
bkn: 1726255507
"""

群列表

url2 = "https://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
parameters2 = """
bkn: 1726255507
"""

群成员

url3 = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
parameters3 = """
gc: 536640287
st: 0
end: 20
sort: 0
bkn: 1726255507
"""

gc参数为群号码
end 最多比 st 大 40,即每次最多获取41个,序号从0开始,0为创建者。
这个接口还包含了排序方案(sort参数):

sort 参数表:(0为没有任何排序)
        Q龄⬆【9】     入群时间⬆【11】        等级(记分)⬆【15】      最后发言⬆【17】
        Q龄⬇【8】     入群时间⬇【10】        等级(记分)⬇【14】      最后发言⬇【16】
    条件筛选:(左0为0,右0无限大,可以灵活调整)
        性别(是女):g: 【0】【1】
        Q龄(年):qage: 【0|1】【1|3】【3-5】【5-7】【7|0】
        入群时长(月):join_time: 【0|1】【1|3】【3-6】【6-12】【12|0】
        等级(levelname):lv: 【1】【2】【3】【4】【5】【6】
            【101】【102】【103】【104】【105】【106】【107】【108】【109】
            【110】【111】【112】【113】【114】【115】【116】【117】【118】
            【197】【198】【199】【10】【11】【12】【13】【14】【15】
        最后发言(月):last_speak_time: 【0|1】【1|3】【3-6】【6-12】【12|0】