思路:經過selenium使用chrome無界面方式登陸QQ帳號,獲取cookies。解析獲取好友信息的請求頭,經過js2py執行js代碼獲取構造請求頭所須要的參數g_tk。css
#!/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暱稱