通过Wireshark抓包,QQ空间有个获取全部好友的接口
URL地址
http://m.qzone.com/friend/mfriend_list?g_tk=1399550749&res_uin=[QQ号码]&res_type=normal&format=json&count_per_page=10&page_index=0&page_type=0&mayknowuin=&qqmailstat=
然后把登录QQ空间之后的cookies字符串带上就行,电脑手机的cookies都行
Python代码如下
# -*- coding: UTF-8 -*-
import httplib2
import json
import re
def LongToInt(value): # 由于int+int超出范围后自动转为long型,通过这个转回来
if isinstance(value, int):
return int(value)
else:
return int(value & 0x7fffffff)
def LeftShiftInt(number, step): # 由于左移可能自动转为long型,通过这个转回来
if isinstance((number << step), long):
return int((number << step) - 0x200000000L)
else:
return int(number << step)
def getOldGTK(skey):
a = 5381
for i in range(0, len(skey)):
a = a + LeftShiftInt(a, 5) + ord(skey[i])
a = LongToInt(a)
return a & 0x7fffffff
def getNewGTK(p_skey, skey, rv2):
b = p_skey or skey or rv2
a = 5381
for i in range(0, len(b)):
a = a + LeftShiftInt(a, 5) + ord(b[i])
a = LongToInt(a)
return a & 0x7fffffff
h = httplib2.Http()
url = 'http://m.qzone.com/friend/mfriend_list?g_tk=1536221140&res_uin=[QQ号码]&res_type=normal&format=json&count_per_page=10&page_index=0&page_type=0&mayknowuin=&qqmailstat='
cookieStr = ''
headers = {'Cookie': cookieStr}
if re.search(r'p_skey=(?P<p_skey>[^;]*)', cookieStr):
p_skey = re.search(r'p_skey=(?P<p_skey>[^;]*)', cookieStr).group('p_skey')
else:
p_skey = None
if re.search(r'skey=(?P<skey>[^;]*)', cookieStr):
skey = re.search(r'skey=(?P<skey>[^;]*)', cookieStr).group('skey')
else:
skey = None
if re.search(r'rv2=(?P<rv2>[^;]*)', cookieStr):
rv2 = re.search(r'rv2=(?P<rv2>[^;]*)', cookieStr).group('rv2')
else:
rv2 = None
print getNewGTK(p_skey, skey, rv2)
url = url.replace('1536221140', str(getNewGTK(p_skey, skey, rv2)))
print url
resp, content = h.request(url, 'GET', headers=headers)
print resp
print content
output = json.loads(content) # json字符串转字典
if output['code'] == -3000:
print output['message']
else:
items_list = output['data']['list']
qqlist = set()
for item in items_list:
qqlist.add(item['uin'])
# 打印信息并输出到文件
print '获取QQ号个数'+ str(len(qqlist))
filename = 'qqlist.txt'
fileobj = open(filename, 'w')
result = [str(qq) + '\n' for qq in sorted(qqlist)]
fileobj.writelines(result)
fileobj.flush()
fileobj.close()
print '写入完成'
使用时注意替换掉url中的[QQ号码]和headers中的CookieStr
后记:
20150904更新:由于上一版代码没考虑到g_tk取值的问题,导致代码不能重用,现已更改。