叙述
接口是用的别人发现的,很多粉丝都知道我还懂点易语言,不错 已经有大神写过易语言版的了,自己看过,看的一脸蒙蔽,因此自己利用Python写个简单版的方便小白学习 !
获取任意qq历史头像的关键是先获得一个临时的skey和对应的uin。uin就是需要你提前登陆的qq账号,这个东西可以通过浏览器F12开发者工具获取或者使用Fiddler工具抓包。
步骤:
1、手动登陆这个网址:
并输入你的qq号和密码(实在不放心也可以登陆自己的小号)实现获取skey和uin。
2、然后会跳转到快速登陆qq空间这个页面 ,此时在浏览器中按下F12并按下F5刷新,接着点击network选项及network下方的doc,再点击左方的qzone.qq.com
3、然后你就发现skey和uin就存储在cookie中
这个skey不是一劳永逸的,只有几个小时左右的有效期,意味着我们不能在代码中将它写死,这也是难点之一。
我曾试过单纯使用python模拟登陆并获取,发现要post的参数太多 (反正就是不会,如果有人会,我必虚心请教 )导致 无法登陆成功,于是只好结合使用selenium并使用Chrome浏览器的无头模式(说简单就是没有界面的浏览器 )登陆并抓取 cookie,模拟登陆并抓取的。
代码如下:
from selenium import webdriver
import time
import requests
#设置无头模式
opt=webdriver.ChromeOptions()
opt.add_argument('--headless')
b=webdriver.Chrome(options=opt)
#打开目标网址并输入正确的qq和密码
b.get('https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030902&daid=70&pt_no_auth=0&s_url=http://qzone.qq.com')
b.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
b.find_element_by_xpath('//*[@id="u"]').send_keys('你的QQ')
b.find_element_by_xpath('//*[@id="p"]').send_keys('你的密码')
b.find_element_by_xpath('//*[@id="login_button"]').click()
#使用sleep防止还未跳转就抓取cookie,具体时间根据自己网速写
time.sleep(2)
#使用replace方法去掉uin最前面的字符 'o'得到正确的uin
my_uin=str(b.get_cookie('uin')['value']).replace('o','')
my_skey=b.get_cookie('skey')['value']
b.quit()
uin='uin=%s'%my_uin
skey='skey=%s'%my_skey
qq=input('输入查询QQ:')
#将上面获取到的uin和skey写入headers中获取返回的json数据
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400',
'Cookie':uin+skey
}
# 使用try方法 因服务器繁忙获取不到 ,偶尔会发生并抛出异常
try:
resp = requests.get('http://qlist.qlogo.cn/file_list?src=1&uin=%s&md5=&start_idx=1&end_idx=500'%qq,headers=headers)
final_data=resp.json()
print('共%d张'%final_data['total_num'])
#获取每个头像的地址及对应时间戳(可以转换为本地时间,自行发挥)
for a in final_data["file_list"]:
print(a['base_url']+'140',a['timestamp']) #url后面+140即获取小头像,640为大头像,防止获取不到
except KeyError:
print('貌似开小差了,请重试! ')
最后利用python的requests库(强烈推荐使用这个库,简单粗暴)获取就OK了!
效果如图:
附图:
雏形就是以上了,需要做下载图片功能或者封装成函数反复查询的的请自行发挥,太懒了,不想写了 。