登錄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昵稱
完整代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM