前言
11月是一个伤感的月份,又悲又离,故想要保留与她有关的缩影,就像快照,在此爬取我当时QQ上的一切状态:QQ创号信息、QQ好友信息、QQ群信息,希望能将这些连带着我对她的记忆,封存在计算机冰冷的二进制中…
(PS:本期博文不发布任何代码,需要者可以私信交流一下。)
第一部分:创号时长爬取
20周年QQ个人轨迹 这是一个手机访问页面,电脑上只会出现用手机扫描二维码,这算是整个爬取过程中最特别的一处了,这里需要Fiddler或其他抓包工具来调试访问该页面,使用Fiddler抓包工具的方法参见手把手带你用Python爬取反爬策略的网站这篇文章,要想抓取手机上的包,需要在打开手机所连接wifi的代理,设置为电脑IP和Fiddler上打开的端口:
然后手机上返回保存。这样手机上浏览过程就会被电脑上的Fiddler捕捉到。
很快就确定了必须的请求头参数:Host、Accept、Q-UA2、Q-GUID、Q-QIMEI、QIMEI36、Q-Auth、User-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】