登录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昵称
完整代码

 

posted @ 2019-03-31 09:16  雲淡風輕333  阅读(1514)  评论(0编辑  收藏  举报