爬虫实战--QQ好友空间不可见

前言:输入才有输出,输出倒逼输入。

今天想看一个人的QQ空间发现被屏了,就研究了一段大佬的代码看看还有多少人屏蔽了我。记录一下自己遇到的问题,并学习到的知识。
1.每次输入完QQ就没了,不显示输入密码什么的
原因:通过__import__直接导入的getpass模块在 Pycharm 中不可用。

password = __import__('getpass').getpass('请输入qq密码:')

换到IDLe运行就可以了。会在屏幕显示出密码,打的时候小心点:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200820154651442.png#pic_center
在这里插入图片描述2.查看网页源码 g_tk , ctrl+shift+f 搜索g_tk即可,查看之前点击{},代码更易阅读
在这里插入图片描述
用之前记得pip install xxx 安装好第三方库。

import time
import json
import re
import urllib
import requests
from lxml import etree
import threadpool

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}


def search_cookie():
    if not __import__('os').path.exists('cookie_dict.txt'):
        get_cookie_json()
    with open('cookie_dict.txt', 'r') as f:
        cookie = json.load(f)
    return cookie


def get_cookie_json():  # 无头selenium登陆
    qq_number = input('请输入qq号:')
    password = __import__('getpass').getpass('请输入qq密码:')
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    login_url = 'https://i.qq.com/'
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(options=chrome_options)
    driver.get(login_url)
    driver.switch_to_frame('login_frame')
    driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq_number)
    driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login_button"]').click()
    time.sleep(1)
    cookie_list = driver.get_cookies()
    cookie_dict = {}
    for cookie in cookie_list:
        if 'name' in cookie and 'value' in cookie:
            cookie_dict[cookie['name']] = cookie['value']
    with open('cookie_dict.txt', 'w') as f:
        json.dump(cookie_dict, f)
    return True


def get_g_tk():  # QQ空间的加密算法
    p_skey = cookie['p_skey']
    h = 5381
    for i in p_skey:
        h += (h << 5) + ord(i)
        g_tk = h & 2147483647
    return g_tk


def get_friends_uin(g_tk):  # 获得好友的QQ号信息
    yurl = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?'
    data = {
        'uin': cookie['ptui_loginuin'],
        'do': 1,
        'g_tk': g_tk
    }
    url = yurl + urllib.parse.urlencode(data)
    res = requests.get(url, headers=headers, cookies=cookie)
    r = res.text.split('(')[1].split(')')[0]
    friends_list = json.loads(r)['data']['items_list']
    friends_uin = []
    for f in friends_list:
        friends_uin.append(f['uin'])
    return friends_uin


def get_blacklist(friends):  # 查询被挡好友的QQ号,用小本本记下来!
    access_denied = []  # 拉黑笔记,小本本记下来!
    yurl = 'https://user.qzone.qq.com/'
    for friend in friends:
        print("开始检查:" + str(friend))
        url = yurl + str(friend)
        res = requests.get(url, headers=headers, cookies=cookie)
        tip = etree.HTML(res.text).xpath('/html/body/div/div/div[1]/p/text()')
        if len(tip) > 0:
            # if tip[0][:7] == "主人设置了权限":
            print(str(friend) + "空间不可见!")
            access_denied.append(friend)
    return access_denied


def recording():  # 主函数
    global cookie
    cookie = search_cookie()
    g_tk = get_g_tk()
    friends_uin = get_friends_uin(g_tk)
    access_denied = get_blacklist(friends_uin)
    print(f"一共有{len(access_denied)}空间不可见!")
    with open('access_denied.txt', 'w') as f:
        for a in access_denied:
            f.write(str(a) + '\n')


if __name__ == '__main__':  # 运行
    recording()

参考连接:
详情戳<-_->源码

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值