add other function

This commit is contained in:
sqzhang 2019-04-28 18:59:53 +08:00
parent b02624841e
commit 7289adf1d8
8 changed files with 328 additions and 167 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,22 @@
# -*- coding:utf-8 -*-
# 对qrsig进行基本的加密该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数将其改写成python版本
def hash33_token(t):
e, n = 0, len(t)
for i in range(0,n):
e += (e << 5) + ord(t[i])
return 2147483647 & e
# 对skey进行基本的加密该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数将其改写成python版本
def hash33_bkn(skey):
e = skey
t = 5381
for n in range(0,len(e)):
t += (t << 5) + ord(e[n])
return 2147483647 & t

233
9.updating/qq_group.py Normal file
View File

@ -0,0 +1,233 @@
# -*- coding:utf-8 -*-
# 引用自定义库
from element_encrypt import hash33_token
from element_encrypt import hash33_bkn
from url_request import get_html
from url_request import post_html
# 引用第三方库
import requests
import time
import json
from platform import system
# 引入打开文件所用的库
# Window与Linux和Mac OSX有所不同
# lambda用来定义一个匿名函数可实现类似c语言的define定义
if('Windows' in system()):
# Windows
from os import startfile
open_file_by_system = lambda x : startfile(x)
elif('Darwin' in system()):
# MacOSX
from subprocess import call
open_file_by_system = lambda x : call(["open", x])
else:
# Linux
from subprocess import call
open_file_by_system = lambda x: call(["xdg-open", x])
class QQGroup(object):
"""
QQ群对象用于获取指定QQ号的群信息及群成员信息
同时该接口可获取指定QQ的所有好友分组但是获取的好友数据仅包含备注名和QQ号
"""
def __init__(self):
self.is_login = False
self.cookies_merge_dict = ''
# 访问网页为了获取参数pt_login_sig
login_url = 'http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&s_url=http://qun.qq.com/member.html'
html = get_html(login_url, '')
# 对返回的cookies进行转化为dict类型方便处理
cookies_back_dict1 = requests.utils.dict_from_cookiejar(html.cookies)
pt_login_sig = cookies_back_dict1['pt_login_sig']
# 访问网页为了获取参数ptqrtoken
qrcode_url = 'https://ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=3&d=72&v=4&t=0.39550762134604156'
html = get_html(qrcode_url, '')
# 对返回的cookies进行转化为dict类型方便处理
cookies_back_dict2 = requests.utils.dict_from_cookiejar(html.cookies)
qrsig = cookies_back_dict2['qrsig']
ptqrtoken = hash33_token(qrsig)
# 将登录二维码写到本地,并自动打开,让用户扫描
with open('qrcode.png', "wb") as f:
f.write(html.content)
# 调用系统默认打开方式,打开该二维码
open_file_by_system('qrcode.png')
# 对返回的两个cookies进行合并作为提交cookies
cookies_merge_dict = {}
cookies_merge_dict.update(cookies_back_dict1)
cookies_merge_dict.update(cookies_back_dict2)
print(u'当前cookies:{}'.format(cookies_merge_dict))
# 实时检测二维码状态
while (True):
# 目标网址
target_url = 'http://ptlogin2.qq.com/ptqrlogin?u1=http%3A%2F%2Fqun.qq.com%2Fmember.html&' + 'ptqrtoken=' + str(
ptqrtoken) + '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-1499652067577&js_ver=10224&js_type=1&login_sig=' + str(
pt_login_sig) + '&pt_uistyle=40&aid=549000912&'
# 登录需要带上访问cookies
html = get_html(target_url, cookies_merge_dict)
# 返回的响应码为200说明二维码没过期
if (html.status_code):
if ('二维码未失效' in html.text):
print(u'当前二维码未失效,请你扫描二维码进行登录')
elif ('二维码认证' in html.text):
print(u'扫描成功,正在认证中')
elif ('登录成功' in html.text):
self.is_login = True
print(u'登录成功')
break
if ('二维码已经失效' in html.text):
print(u'当前二维码已失效,请重启本软件')
exit()
# 延时
time.sleep(2)
# 登录成功后把返回的cookies合并进去
cookies_back_dict = requests.utils.dict_from_cookiejar(html.cookies)
cookies_merge_dict.update(cookies_back_dict)
print(u'当前cookies:{}'.format(cookies_merge_dict))
# 登录成功后会返回一个地址需要对该地址进行访问以便获取新的返回cookies
data_list = (html.text.replace("')", '')).split("',")
url = (data_list[2])[1:]
# print(url, nick_name)
# 这里需要注意的是需要禁止重定向才能正确获得返回的cookies
html = requests.get(url, cookies=cookies_merge_dict, allow_redirects=False)
# 把返回的cookies合并进去
cookies_back_dict = requests.utils.dict_from_cookiejar(html.cookies)
cookies_merge_dict.update(cookies_back_dict)
print(u'当前cookies:{}'.format(cookies_merge_dict))
self.cookies_merge_dict = cookies_merge_dict
def get_group(self):
# 获取所有群基本信息
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(self.cookies_merge_dict['skey'])
submit_data = {'bkn': bkn}
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_group_list', self.cookies_merge_dict, submit_data)
group_info = json.loads(html.text)
print(group_info)
return group_info['join']
def get_members_in_group(self,group_number):
# 获取某个群的群成员
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(self.cookies_merge_dict['skey'])
# 由于接口限制每次最多获取20个成员的信息所以我们先获取一遍得到群成员的数量再在后面重复获取几次
submit_data = {'gc': group_number, 'st': '0', 'end': '0', 'sort': '0', 'bkn': bkn, }
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/search_group_members', self.cookies_merge_dict, submit_data)
group_member = json.loads(html.text)
group_count = group_member['count']
# print(group_count)
now_count = 0
members_in_group_list = []
while(now_count <= group_count):
if(now_count <= group_count - 20):
submit_data = {'gc': group_number, 'st': str(now_count), 'end': str(now_count + 20), 'sort': '0', 'bkn': bkn, }
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/search_group_members', self.cookies_merge_dict, submit_data)
group_member = json.loads(html.text)
# print('end_count:{}'.format(now_count+20))
# print(group_member['mems'])
#将群成员数据合并到原有的列表中
members_in_group_list += group_member['mems']
now_count += 20
else:
submit_data = {'gc': group_number, 'st': str(now_count), 'end': str(group_count), 'sort': '0', 'bkn': bkn, }
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/search_group_members', self.cookies_merge_dict, submit_data)
group_member = json.loads(html.text)
# print('end_count:{}'.format(group_count))
# print(group_member['mems'])
#将群成员数据合并到原有的列表中
members_in_group_list += group_member['mems']
now_count += 20
print(members_in_group_list)
time.sleep(2)
# 对得到的群成员列表进行去重操作
tmp_list = []
for member in members_in_group_list:
if member not in tmp_list:
tmp_list.append(member)
members_in_group_list = tmp_list
return members_in_group_list
def get_all_friends_in_qq(self):
# 获取所有qq好友基本信息
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(self.cookies_merge_dict['skey'])
submit_data = {'bkn': bkn}
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list', self.cookies_merge_dict, submit_data)
friend_info = json.loads(html.text)
# print(friend_info['result'])
return friend_info['result']
def get_info_in_qq_friend(self,qq_number):
# 获取某个qq好友的详细信息
# 需要提交的数据
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(self.cookies_merge_dict['skey'])
submit_data = {'keyword':str(qq_number), 'ldw': str(bkn), 'num':'20', 'page':'0', 'sessionid':'0', 'agerg':'0', 'sex':'0', 'firston':'0', 'video':'0', 'country':'1', 'province':'65535', 'city':'0', 'district':'0', 'hcountry':'1', 'hprovince':'0', 'hcity':'0', 'hdistrict':'0', 'online':'0'}
# 需要提交的cookies
# cookies = {'uin':self.cookies_merge_dict['uin'], 'skey':self.cookies_merge_dict['skey'], 'ptisp':self.cookies_merge_dict['ptisp'], 'RK':self.cookies_merge_dict['RK'], 'ptcz':self.cookies_merge_dict['ptcz']}
# 设置请求头,模拟人工
header = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'http://find.qq.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer':'http://find.qq.com/'
}
# 屏蔽https证书警告
requests.packages.urllib3.disable_warnings()
# 网页访问,post方式
html = requests.post('http://cgi.find.qq.com/qqfind/buddy/search_v3', data=submit_data, cookies=self.cookies_merge_dict, headers=header, verify=False)
# 将好友信息解析为python对象
friend_info = json.loads(html.text)
print(friend_info)
return friend_info['result']['buddy']['info_list'][0]
def get_profile_picture(self, qq_number, size=100):
# 获取指定qq的头像size的值可为40、100、140默认为100
# 屏蔽https证书警告
requests.packages.urllib3.disable_warnings()
# 网页访问,get方式
# https://q4.qlogo.cn/g?b=qq&nk=10000&s=140
html = requests.get('https://q4.qlogo.cn/g?b=qq&nk=' + str(qq_number) + '&s=' + str(size), verify=False)
return html.content

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 B

View File

@ -1,189 +1,57 @@
# -*- coding:utf-8 -*-
import requests
from platform import system
# 引用自定义库
from qq_group import QQGroup
import element_encrypt
# 引用第三方库
import time
import json
# 引入打开文件所用的库
# Window与Linux和Mac OSX有所不同
# lambda用来定义一个匿名函数可实现类似c语言的define定义
if('Windows' in system()):
# Windows
from os import startfile
open_file_by_system = lambda x : startfile(x)
elif('Darwin' in system()):
# MacOSX
from subprocess import call
open_file_by_system = lambda x : call(["open", x])
else:
# Linux
from subprocess import call
open_file_by_system = lambda x: call(["xdg-open", x])
import random
# get访问网页
def get_html(url,submit_cookies):
# 设置请求头,模拟人工
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer' : 'http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&s_url=http://qun.qq.com/member.html'
}
# 屏蔽https证书警告
requests.packages.urllib3.disable_warnings()
# 网页访问,get方式
html = requests.get(url, cookies = submit_cookies, headers=header, verify=False)
return html
# post访问网页
def post_html(url,submit_cookies,submit_data):
# 设置请求头,模拟人工
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer' : 'https://qun.qq.com/member.html'
}
# 屏蔽https证书警告
requests.packages.urllib3.disable_warnings()
# 网页访问,post方式
html = requests.post(url, data=submit_data, cookies = submit_cookies, headers=header, verify=False)
return html
# 对qrsig进行基本的加密该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数将其改写成python版本
def hash33_token(t):
e, n = 0, len(t)
for i in range(0,n):
e += (e << 5) + ord(t[i])
return 2147483647 & e
# 对skey进行基本的加密该加密函数由抓包获得需要具备一定抓包知识才能找到该加密函数
# 根据javascript版的加密函数将其改写成python版本
def hash33_bkn(skey):
e = skey
t = 5381
for n in range(0,len(e)):
t += (t << 5) + ord(e[n])
return 2147483647 & t
if __name__ == "__main__":
# 创建一个群对象
qq_group = QQGroup()
# 访问网页为了获取参数pt_login_sig
login_url = 'http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&s_url=http://qun.qq.com/member.html'
html = get_html(login_url,'')
# 对返回的cookies进行转化为dict类型方便处理
cookies_back_dict1 = requests.utils.dict_from_cookiejar(html.cookies)
pt_login_sig = cookies_back_dict1['pt_login_sig']
# 访问网页为了获取参数ptqrtoken
qrcode_url = 'https://ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=3&d=72&v=4&t=0.39550762134604156'
html = get_html(qrcode_url,'')
# 对返回的cookies进行转化为dict类型方便处理
cookies_back_dict2 = requests.utils.dict_from_cookiejar(html.cookies)
qrsig = cookies_back_dict2['qrsig']
ptqrtoken = hash33_token(qrsig)
# 将登录二维码写到本地,并自动打开,让用户扫描
with open('qrcode.png', "wb") as f:
f.write(html.content)
# 调用系统默认打开方式,打开该二维码
open_file_by_system('qrcode.png')
# # 获取群信息
# group_dict = qq_group.get_group()
# print(group_dict)
#
#
# # 获取某个群的群成员信息
# for group in group_dict:
# print(qq_group.get_members_in_group(str(group['gc'])))
# # 经测试,频繁获取将会被封该功能,正在解决
# time.sleep(5)
#
#
# # 获取所有qq好友的备注名和qq号
# print(qq_group.get_all_friends_in_qq())
#
# # 查找指定qq详细信息
# print(qq_group.get_info_in_qq_friend(10000))
# 对返回的两个cookies进行合并作为提交cookies
cookies_merge_dict1 = {}
cookies_merge_dict1.update(cookies_back_dict1)
cookies_merge_dict1.update(cookies_back_dict2)
print(u'当前cookies:{}'.format(cookies_merge_dict1))
# 实时检测二维码状态
while (True):
# 目标网址
target_url = 'http://ptlogin2.qq.com/ptqrlogin?u1=http%3A%2F%2Fqun.qq.com%2Fmember.html&' + 'ptqrtoken=' + str(ptqrtoken) + '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-1499652067577&js_ver=10224&js_type=1&login_sig=' + str(pt_login_sig) + '&pt_uistyle=40&aid=549000912&'
# 获取指定qq的头像
qq_group.get_profile_picture(10000)
# 登录需要带上访问cookies
html = get_html(target_url,cookies_merge_dict1)
# 返回的响应码为200说明二维码没过期
if(html.status_code):
if('二维码未失效' in html.text):
print(u'当前二维码未失效,请你扫描二维码进行登录')
elif('二维码认证' in html.text):
print(u'扫描成功,正在认证中')
elif('登录成功' in html.text):
print(u'登录成功')
break
if ('二维码已经失效' in html.text):
print(u'当前二维码已失效,请重启本软件')
exit()
# 延时
time.sleep(2)
# 登录成功后把返回的cookies合并进去
cookies_back_dict = requests.utils.dict_from_cookiejar(html.cookies)
cookies_merge_dict1.update(cookies_back_dict)
print(u'当前cookies:{}'.format(cookies_merge_dict1))
# 登录成功后会返回一个地址需要对该地址进行访问以便获取新的返回cookies
data_list = (html.text.replace("')",'')).split("',")
url = (data_list[2])[1:]
nick_name = ((data_list[len(data_list)-1])[1:])
# print(url, nick_name)
# 这里需要注意的是需要禁止重定向才能正确获得返回的cookies
html = requests.get(url, cookies=cookies_merge_dict1, allow_redirects=False)
# 把返回的cookies合并进去
cookies_back_dict = requests.utils.dict_from_cookiejar(html.cookies)
cookies_merge_dict1.update(cookies_back_dict)
print(u'当前cookies:{}'.format(cookies_merge_dict1))
# 获取群信息
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(cookies_merge_dict1['skey'])
submit_data = {'bkn': bkn}
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_group_list', cookies_merge_dict1, submit_data)
group_info = json.loads(html.text)
print(group_info['join'])
for i in group_info['join']:
print(i)
# 获取qq好友信息
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(cookies_merge_dict1['skey'])
submit_data = {'bkn': bkn}
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list', cookies_merge_dict1, submit_data)
friend_info = json.loads(html.text)
# print(friend_info['result'])
for friend_group in friend_info['result'].keys():
print(friend_info['result'][friend_group])
print('\n')
# 获取某个群的群成员
# bkn由参数skey通过另一个加密函数得到
bkn = hash33_bkn(cookies_merge_dict1['skey'])
submit_data = {'gc':'958751361', 'st':'0', 'end':'20', 'sort':'0', 'bkn': bkn, }
html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/search_group_members', cookies_merge_dict1, submit_data)
group_member = json.loads(html.text)
print(group_member)
print(group_member['count'])
# qq推广https://shang.qq.com/v3/index.html
# qq个人中心https://id.qq.com/index.html#index
# 亲密度排行榜 https://rc.qzone.qq.com/myhome/friends
# 近期加你好友的人 https://rc.qzone.qq.com/myhome/friends/center
# 成为QQ好友的天数https://user.qzone.qq.com/981469881/friendship?via=ic
# 成为qq好友的天数https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/friendship/cgi_friendship?activeuin=3257179914&passiveuin=928255652&situation=1&isCalendar=1&g_tk=138378367&qzonetoken=8b160efd39b85efd4ffeba1a4f8501c063e6ff850976285b9f5f6d20cafc8163b55db14b65ce4f2edb5c&g_tk=138378367
# 最近一年删除的好友或者退群的数量https://huifu.qq.com/recovery/index.html?frag=1

38
9.updating/url_request.py Normal file
View File

@ -0,0 +1,38 @@
# -*- coding:utf-8 -*-
# 引用第三方库
import requests
# get访问网页
def get_html(url,submit_cookies):
# 设置请求头,模拟人工
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer' : 'http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&s_url=http://qun.qq.com/member.html'
}
# 屏蔽https证书警告
requests.packages.urllib3.disable_warnings()
# 网页访问,get方式
html = requests.get(url, cookies = submit_cookies, headers=header, verify=False)
return html
# post访问网页
def post_html(url,submit_cookies,submit_data):
# 设置请求头,模拟人工
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer' : 'https://qun.qq.com/member.html'
}
# 屏蔽https证书警告
requests.packages.urllib3.disable_warnings()
# 网页访问,post方式
html = requests.post(url, data=submit_data, cookies = submit_cookies, headers=header, verify=False)
return html