一键获取QQ好友手机号-学习Python第一个软件
本帖最后由 我来试试 于 2021-2-6 17:58 编辑首先说明,不发接口!不发接口!!不发接口!!!
第一步
获取QQ空间的cookie
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
from time import sleep
import json
import easygui as g# 安装easygui库
msg = "需要关闭网页QQ登录保护,酌情使用!"# 填报提示信息
title = "获取QQ好友电话"# 标题
#偷下懒 密码就不做*号了
fieldNames = ["*QQ", "*QQ密码"]# 内容和格式
fieldValues = []# 拿个空列表装信息
fieldValues = g.multenterbox(msg, title, fieldNames)# 把信息装进去
while True:
if fieldValues == None:
exit()
errmsg = ""
for i in range(len(fieldNames)):
option = fieldNames.strip()
if fieldValues.strip() == "" and option == "*":
errmsg += ("【%s】为必填项 " % fieldNames)
if errmsg == "":
break
fieldValues = g.multenterbox(errmsg, title, fieldNames, fieldValues)
if fieldValues:
chromedriver = 'chromedriver.exe'
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chromedriver,chrome_options=chrome_options)
driver.get('https://user.qzone.qq.com/')
driver.switch_to.frame('login_frame')
#找到账号密码登陆的地方
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys(fieldValues)
driver.find_element_by_id('p').send_keys(fieldValues)
driver.find_element_by_id('login_button').click()
#保存本地的cookie
sleep(1)
cookies = driver.get_cookies()
sleep(1)
if cookies:
cookie_dic = {}
for cookie in cookies:
if 'name' in cookie and 'value' in cookie:
cookie_dic] = cookie['value']
with open('cookie_dict.txt', 'w') as f:
json.dump(cookie_dic, f)
# 关闭chromedriver命令窗口
os.system("taskkill /f /im chromedriver.exe")
os.system('taskkill /im chrome.exe /F')
效果如图
因为刚接触python 还有很多不懂借鉴了不少论坛里大佬的代码:lol
第二步获取QQ空间的一个装好友信息的JS
链接是这个 https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?
里面还缺少了 一个叫 g_tk 的参数 这个是经过一定算法才获取到的,也是搬的大佬的代码
下面直接放源码了
import time
import json
import urllib
import win32api,win32con
import os
from tkinter import *
import requests
import tkinter as tk
#设置header 头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0",
"Accepted-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"referer": "https://user.qzone.qq.com/"
}
def get_gtk():
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_uin():
uin = cookie['ptui_loginuin']
return uin
#找出好友列表
def get_friend():
url_friend = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?'
g_tk = get_gtk()
uin= get_uin()
data = {
'uin': uin,
'do' : 1,
'g_tk': g_tk
}
data_encode = urllib.parse.urlencode(data)
url_friend += data_encode
res = requests.get(url_friend, headers = header, cookies = cookie)
friend_json = re.findall('\((.*)\)',res.text,re.S)
# print(friend_json)
friend_dict = json.loads(friend_json)
friend_result_list = []
#循环将好友的姓名qq号存入字典中
for friend in friend_dict['data']['items_list']:
friend_result_list.append(,friend['uin']])
#得到的好友字典是{name: qqNum}格式的
return friend_result_list
def get_mobile(uin):
url_mobile = "接口?qq={}".format(uin)
try:
mobile_code = requests.get(url_mobile, timeout=5).status_code
if mobile_code == 200 and requests.get(url_mobile).text != '404':
mobile = requests.get(url_mobile).text
if json.loads(mobile)['qq']!= None:
return json.loads(mobile)['qq']
else:
return "未知"
except:
return"获取失败!"
if __name__ == "__main__":
#怕被滥用设置了个时间限制 ###失策了这个时间是电脑时间很容易绕
if time.time()>1612605600:
exit()
import cookie
try:
with open('cookie_dict.txt', 'r') as f:
cookie = json.load(f)
if get_friend():
file = open('通讯录.txt', 'w',encoding='utf-8')
get_friend_result = get_friend()
get_friend_result_len = len(get_friend_result)
window = tk.Tk()
window.title('正在获取')
window.geometry('630x150')
# 设置下载进度条
tk.Label(window, text='获取进度:', ).place(x=50, y=60)
canvas = tk.Canvas(window, width=465, height=22, bg="white")
canvas.place(x=110, y=60)
fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")
x = get_friend_result_len# 未知变量,可更改
n = 465 / x# 465是矩形填充满的次数
for i in range(0,get_friend_result_len):
mobile = get_mobile(get_friend_result)
name = get_friend_result
# print("\r正在获取好友手机号:{}%".format((i)*100/get_friend_result_len), end="", flush=True)
file.write(name+'-'+mobile)
file.write('\n\n')
#进度条
n = n + 465 / x
canvas.coords(fill_line, (0, 0, n, 60))
window.update()
file.close()
os.remove('cookie_dict.txt')
win32api.MessageBox(0, "获取成功!", "提示",win32con.MB_OK)
except:
win32api.MessageBox(0, "QQ帐号或者QQ密码错误!请确保已经关闭网页QQ登录保护!\n 若多次失败,请联系作者!", "提示",win32con.MB_OK)
os.remove('cookie_dict.txt')
最终效果图
新人小白,代码很粗糙,看官们轻喷{:301_999:}
Dumeng 发表于 2021-2-6 17:56
搞了半天 以为能在QQ空间里获得 手机号
哈哈哈开头不是说了嘛 :lol主要就是学习一下模拟登陆的流程和一些进度条类的辅助功能 没有成品吗 楼主啊 我完全不会 也看不懂我可不可把号给你 你帮我看一下。谢谢 搞了半天 以为能在QQ空间里获得 手机号 虚空先森 发表于 2021-2-6 17:41
没有成品吗
成品有点灰色 不能发的哦{:1_924:} DPP 发表于 2021-2-8 07:36
有成品你没接口你也白搭,我抓包了很多接口不知道能发不能 查q绑的
哈哈哈我一开始的接口也是抓包来的 楼主接口报错呀 狂野兔斯基 发表于 2021-2-8 18:12
楼主接口报错呀
嗯,接口需要自己加,我这边不能分享接口 {:1_924:}