登录QQ空间查好友信息(selenium登录获取cookies,js2py执行js代码,requests构造请求头)
思路:通过selenium使用chrome无界面方式登录QQ账号,获取cookies。解析获取好友信息的请求头,通过js2py执行js代码获取构造请求头所需要的参数g_tk。
#!/usr/bin/env python # coding:utf-8 # Auther:AllenWoo # Date:2019/3/29 #-----------------------------通过selenium登录账号,获取cookies------------------------------------------------ from selenium import webdriver import time,re opt = webdriver.ChromeOptions()# 创建chrome参数对象 opt.set_headless()# 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数 browser = webdriver.Chrome(options=opt)# 创建chrome无界面对象 # browser = webdriver.Chrome() browser.implicitly_wait(10)#设置隐式等待时间为10秒,默认为0 browser.get('https://qzone.qq.com/') browser.switch_to.frame('login_frame')#确实看到QQ空间的登录框是以一个iframe加载进来的,iframe内是一个独立的document browser.find_element_by_css_selector("#switcher_plogin").click()#点击,切换到用户名、密码登陆界面 browser.find_element_by_css_selector("#u").send_keys('username') browser.find_element_by_css_selector("#p").send_keys('password') browser.find_element_by_css_selector("#login_button").click()#点击进行登录 cookies={} time.sleep(5)#多等待几秒,cookie才完全加载出来? print(len(browser.get_cookies())) for i in browser.get_cookies(): cookies[i.get('name')]=i.get('value') print(cookies) # browser.find_element_by_css_selector("#tab_menu_me").click()#登录成功后,handle已经重新加载了,可以直接选取新的标签对象 # browser.find_element_by_css_selector("#tab_menu_sdc").click() # print(browser.page_source) qzonetoken = re.findall(r'window.g_qzonetoken = \(function\(\){ try{return "(.*?)";}',browser.page_source)[0] print('qzonetoken:',qzonetoken) #-----------------------------使用js2py运行js代码,通过p_skey值获取g_tk的值------------------------------------------------ import js2py js_string = ''' function(e) { var t = 5381; for (var n = 0, r = e.length; n < r; ++n) { t += (t << 5) + e.charCodeAt(n) } return t & 2147483647 } ''' js_function = js2py.eval_js(js_string)#看起来返回的值就是js代码中的最后一个对象 g_tk=js_function(cookies.get('p_skey')) print(g_tk) #-----------------------------使用requests模块,构建请求获取好友信息------------------------------------------------ import requests url = "https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi" querystring = { "uin":cookies.get('ptui_loginuin'), "do":"1", "rd":"0.09717650106996145",#这个应该就是一个随机值而已,先暂时不变吧。。。 "fupdate":"1", "clean":"1", "g_tk":[g_tk,g_tk], "qzonetoken":qzonetoken#这个值账号不同,也应该动态获取 } headers = { 'accept': "*/*", 'accept-encoding': "gzip, deflate, br", 'accept-language': "zh-CN,zh;q=0.9", 'referer': "https://user.qzone.qq.com/%s"%cookies.get('ptui_loginuin'), 'user-agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", } response = requests.request("GET", url, headers=headers, params=querystring,cookies=cookies) import re,json json_str = re.findall(r'\{.*\}',response.text,re.S)[0] obj = json.loads(json_str) for i in obj.get('data').get('items_list'): print(i.get('uin'),i.get('name'))#打印了qq账号和qq昵称