登陸QQ空間查好友信息(selenium登陸獲取cookies,js2py執行js代碼,requests構造請求頭)

思路:經過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暱稱
完整代碼
相關文章
相關標籤/搜索