From 97f3342fb5bf018b515f5049730c04c54c2bb717 Mon Sep 17 00:00:00 2001 From: sqzhang <3257179914@qq.com> Date: Thu, 17 Mar 2022 18:21:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E4=B8=AA=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E7=9A=84qq=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9.一键生成QQ个人历史报告/main.py | 49 ++++++++++---------- 9.一键生成QQ个人历史报告/qq_bot.py | 60 ++++++++++++++----------- 9.一键生成QQ个人历史报告/url_request.py | 10 ++--- 3 files changed, 63 insertions(+), 56 deletions(-) diff --git a/9.一键生成QQ个人历史报告/main.py b/9.一键生成QQ个人历史报告/main.py index a78e8f9..28d49a5 100644 --- a/9.一键生成QQ个人历史报告/main.py +++ b/9.一键生成QQ个人历史报告/main.py @@ -89,7 +89,7 @@ def generate_data(): # 创建一个自己编写的qq bot对象 bot = Bot() - custom_print(u'登录成功,正在获取数据...') + custom_print(u'登录成功!') # 更新一下欲输出的markdown文本 markdown_content = markdown_content.replace('{qq_number}',bot.qq_number) markdown_content = markdown_content.replace('{qq_icon_png}', 'data/qq_icon.png') @@ -98,7 +98,7 @@ def generate_data(): # 获取该登录账户的详细资料 - custom_print(u'正在获取该登录账户的详细数据...') + custom_print(u'正在获取该账户的个人数据...') detail_information = bot.get_detail_information() # content为markdown语法文本 content = '\n

\n' + '## 我的详细资料\n' + '种类|内容\n:- | :-\n' @@ -139,26 +139,22 @@ def generate_data(): - - - - - + # 获取所有好友列表接口已失效 + ''' # 获取所有qq好友的备注名和qq号 - all_qq_friends = bot.get_all_friends_in_qq() - custom_print(u'所有qq好友号码和备注名中...') + custom_print(u'正在获取该账户的好友数据...') + all_qq_friends = bot.get_all_friends_in_qq() # 获取所有好友列表接口已失效 qq_number_list = [] for key, friend_group in all_qq_friends.items(): for info in friend_group['mems']: qq_number_list.append(info['uin']) - + ''' # 获取所有群信息 - custom_print(u'获取该QQ加入的所有群信息...') + custom_print(u'正在获取该账户的所有群信息...') group_list = bot.get_group() - print(group_list) # content为markdown语法文本 content = '\n\n

\n' + '## 我加入的群资料\n' + '序号|群名|群号|群主QQ\n:- | :-| :-| :-\n' # 获取某个群的群成员信息 @@ -179,7 +175,7 @@ def generate_data(): # 获取过去30天内退出的群名单 - custom_print(u'获取过去30天退出的群...') + custom_print(u'正在获取该账户过去30天退出的群...') data = bot.get_quit_of_group() delete_group_count = 0 # content为markdown语法文本 @@ -210,7 +206,7 @@ def generate_data(): # 获取过去364天内删除的好友名单 - custom_print(u'获取过去12个月删除的好友名单...') + custom_print(u'正在获取该账户过去12个月删除的好友名单...') delete_friend_list = bot.get_delete_friend_in_360day() delete_friend_count = len(delete_friend_list) # content为markdown语法文本 @@ -238,7 +234,7 @@ def generate_data(): # 判断此次登录的qq是否为vip或者svip # content为markdown语法文本 content = '\n\n

\n' + '## 财产分析\n' - custom_print(u'判断该QQ是否为高级用户...') + custom_print(u'正在判断该账户是否为VIP...') data = bot.is_vip_svip() isSvip = data['isSvip'] isVip = data['isSvip'] @@ -252,14 +248,14 @@ def generate_data(): content += '此时此刻,我是**QQ VIP**,但不是**QQ SVIP**\n' # 获取qb值 - custom_print(u'获取账户QB值...') + custom_print(u'正在获取该账户的Q币...') qb_value = bot.get_qb() timeArray = time.localtime() otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray) content += '截止到**{}**,我剩余的Q币个数为:**{}**个\n\n'.format(otherStyleTime,qb_value) # 获取代付信息 - custom_print(u'获取代付信息中...') + custom_print(u'正在获取该账户的代付信息...') pay_list = bot.get_pay_for_another() content += '截止到**{}**,我收到的代付信息条数为:**{}**个'.format(otherStyleTime, len(pay_list)) if(len(pay_list) > 0): @@ -283,7 +279,7 @@ def generate_data(): # 亲密度排行榜 谁在意我 - custom_print(u'分析好友亲密度数据-谁在意我...') + custom_print(u'正在分析好友亲密度数据-谁在意我...') # content为markdown语法文本 content = '\n\n

\n' + '## 谁在意我\n' data_list = bot.who_care_about_me() @@ -292,14 +288,15 @@ def generate_data(): n = len(data_list) if (len(data_list) > 0): - content += '序号|头像|QQ|亲密度\n:- | :-| :-| :-\n' + content += '序号|头像|昵称|QQ|亲密度\n:- | :-| :-| :-\n' for index, sub_data in enumerate(data_list[:n]): uin = sub_data['uin'] score = sub_data['score'] + name = sub_data['name'] profile = bot.get_profile_picture(uin, size=40) with open('data/' + str(uin) + '.jpg', 'wb') as f: f.write(profile) - content += '{}|![](data/{}.jpg)|{}|{}\n'.format(index, uin, uin, score) + content += '{}|![](data/{}.jpg)|{}|{}|{}\n'.format(index, uin, name, uin, score) # 更新一下欲输出的markdown文本 markdown_content += content @@ -312,7 +309,7 @@ def generate_data(): # 亲密度排行榜 我在意谁 - custom_print(u'分析好友亲密度数据-我在意谁...') + custom_print(u'正在分析好友亲密度数据-我在意谁...') # content为markdown语法文本 content = '\n\n

\n' + '## 我在意谁\n' data_list = bot.i_care_about_who() @@ -321,14 +318,15 @@ def generate_data(): n = len(data_list) if (len(data_list) > 0): - content += '序号|头像|QQ|亲密度\n:- | :-| :-| :-\n' + content += '序号|头像|昵称|QQ|亲密度\n:- | :-| :-| :-\n' for index, sub_data in enumerate(data_list[:n]): uin = sub_data['uin'] score = sub_data['score'] + name = sub_data['name'] profile = bot.get_profile_picture(uin, size=40) with open('data/' + str(uin) + '.jpg', 'wb') as f: f.write(profile) - content += '{}|![](data/{}.jpg)|{}|{}\n'.format(index, uin, uin, score) + content += '{}|![](data/{}.jpg)|{}|{}|{}\n'.format(index, uin, name, uin, score) # 更新一下欲输出的markdown文本 markdown_content += content @@ -338,11 +336,12 @@ def generate_data(): - # 每个步骤完成后,保存markdown文件,以便防止程序出错时能够保存到最新的数据 with open('{}的个人QQ历史报告.md'.format(bot.qq_number), 'w', encoding='utf-8') as file: file.write(markdown_content) - custom_print(u'所有数据获取完毕, 并生成了一份报告文件:[{}的个人QQ历史报告.md], 该文件为markdown格式文件, 请下载typora软件以便查看该格式文件, 下载地址为https://typora.io/#windows'.format(bot.qq_number)) + + custom_print(u'所有数据获取完毕, 并在当前工作目录下生成了一份报告文件:[{}的个人QQ历史报告.md]'.format(bot.qq_number)) + custom_print(u'该文件为markdown格式, 请下载typora软件以便查看该文件, 下载地址为https://typora.io/') if __name__ == "__main__": diff --git a/9.一键生成QQ个人历史报告/qq_bot.py b/9.一键生成QQ个人历史报告/qq_bot.py index 7cb921f..4ab2764 100644 --- a/9.一键生成QQ个人历史报告/qq_bot.py +++ b/9.一键生成QQ个人历史报告/qq_bot.py @@ -57,7 +57,7 @@ class Bot(object): # 登录qun.qq.com # 访问网页,为了获取参数pt_login_sig - login_url = 'http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&s_url=http://qun.qq.com/member.html' + login_url='https://xui.ptlogin2.qq.com/cgi-bin/xlogin?pt_disable_pwd=1&appid=715030901&daid=73&hide_close_icon=1&pt_no_auth=1&s_url=https%3A%2F%2Fqun.qq.com%2Fmember.html%23' html = get_html(login_url, '') # 对返回的cookies进行转化为dict类型,方便处理 cookies_back_dict = dict_from_cookiejar(html.cookies) @@ -65,7 +65,8 @@ class Bot(object): self.cookies_merge_dict_in_qun_qq_com.update(cookies_back_dict) # 访问网页,为了获取参数ptqrtoken - qrcode_url = 'https://ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=4&d=72&v=4&t=0.39550762134604156' + #qrcode_url = 'https://ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=4&d=72&v=4&t=0.39550762134604156' + qrcode_url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=715030901&e=2&l=M&s=3&d=72&v=4&t=0.055986512113441966&daid=73&pt_3rd_aid=0' html = get_html(qrcode_url, '') # 对返回的cookies进行转化为dict类型,方便处理 cookies_back_dict = dict_from_cookiejar(html.cookies) @@ -81,13 +82,10 @@ class Bot(object): image_label['image'] = image - # 实时检测二维码状态 while (True): # 目标网址 - target_url = 'http://ptlogin2.qq.com/ptqrlogin?u1=http://qun.qq.com/member.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&' + target_url ='https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqun.qq.com%2Fmember.html%23&ptqrtoken={}&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=1-5-1647508149682&js_ver=22030810&js_type=1&login_sig={}&pt_uistyle=40&aid=715030901&daid=73&ptdrvs=zE3Wcrd07f4ZnrPfNLLsdLfVh-6bEh5vNlgIR2dcTfep1pxoywDr2Yw03vvhZswWdGxT2OCdJkA_&sid=2353889993957767859&'.format(ptqrtoken, pt_login_sig) # 登录,需要带上访问cookies html = get_html(target_url, self.cookies_merge_dict_in_qun_qq_com) @@ -119,21 +117,22 @@ class Bot(object): self.qq_number = qq_list[0] + #print(html.text) # 登录成功后,会返回一个地址,需要对该地址进行访问以便获取新的返回cookies - startIndex = (html.text).find('http') + startIndex = (html.text).find('https') endIndex = (html.text).find('pt_3rd_aid=0') url = (html.text)[startIndex:endIndex] + 'pt_3rd_aid=0' # 这里需要注意的是,需要禁止重定向,才能正确获得返回的cookies - html = get(url, cookies=self.cookies_merge_dict_in_qun_qq_com, allow_redirects=False) + # 需要禁止重定向, allow_redirects=False + # 需要关闭SSL验证, verify=False + html = get(url, cookies = self.cookies_merge_dict_in_qun_qq_com, allow_redirects=False, verify=False) # 把返回的cookies合并进去 cookies_back_dict = dict_from_cookiejar(html.cookies) self.cookies_merge_dict_in_qun_qq_com.update(cookies_back_dict) - - def login_qzone_qq_com(self): # 登录qzone.qq.com # 访问网页,为了获取参数pt_login_sig @@ -306,7 +305,6 @@ class Bot(object): submit_data = {'bkn': bkn} html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_group_list', self.cookies_merge_dict_in_qun_qq_com, submit_data) group_info = loads(html.text) - print(group_info) return group_info['join'] @@ -326,14 +324,19 @@ class Bot(object): def get_all_friends_in_qq(self): + ''' # 获取所有qq好友基本信息 # bkn由参数skey通过另一个加密函数得到 bkn = hash33_bkn(self.cookies_merge_dict_in_qun_qq_com['skey']) submit_data = {'bkn': bkn} html = post_html('https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list', self.cookies_merge_dict_in_qun_qq_com, submit_data) friend_info = loads(html.text) - # print(friend_info) return friend_info['result'] + ''' + + # 获取所有好友列表接口已失效 + return None + @@ -662,16 +665,20 @@ class Bot(object): # bkn由参数skey通过另一个加密函数得到 bkn = hash33_bkn(self.cookies_merge_dict_in_qzone_qq_com['p_skey']) - # 获取参数qzonetoken - urllib3.disable_warnings() - target_url = 'https://user.qzone.qq.com/' + self.qq_number - html = get_html(target_url, self.cookies_merge_dict_in_qzone_qq_com) - qzonetoken = re.findall(r'{ try{return "(.+?)";', html.text) - qzonetoken = qzonetoken[0] + # # 获取参数qzonetoken + # urllib3.disable_warnings() + # target_url = 'https://user.qzone.qq.com/' + self.qq_number + # print(target_url) + # html = get_html(target_url, self.cookies_merge_dict_in_qzone_qq_com) + # print(html.text) + # qzonetoken = re.findall(r'{ try{return "(.+?)";', html.text) + # qzonetoken = qzonetoken[0] # 获取谁在意我数据 - target_url = 'https://rc.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=' + self.qq_number + '&do=2&rd=0.32313768189269365&fupdate=1&clean=0&g_tk=' + str(bkn) + '&qzonetoken=' + str(qzonetoken) + '&g_tk=' + str(bkn) + #target_url = 'https://rc.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=' + self.qq_number + '&do=2&rd=0.32313768189269365&fupdate=1&clean=0&g_tk=' + str(bkn) + '&qzonetoken=' + str(qzonetoken) + '&g_tk=' + str(bkn) + target_url = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin={}&do=2&rd=0.6629930546880991&fupdate=1&clean=1&g_tk={}&g_tk={}'.format(self.qq_number, bkn, bkn) + urllib3.disable_warnings() html = get_html(target_url, self.cookies_merge_dict_in_qzone_qq_com) @@ -692,16 +699,17 @@ class Bot(object): # bkn由参数skey通过另一个加密函数得到 bkn = hash33_bkn(self.cookies_merge_dict_in_qzone_qq_com['p_skey']) - # 获取参数qzonetoken - urllib3.disable_warnings() - target_url = 'https://user.qzone.qq.com/' + self.qq_number - html = get_html(target_url, self.cookies_merge_dict_in_qzone_qq_com) - qzonetoken = re.findall(r'{ try{return "(.+?)";', html.text) - qzonetoken = qzonetoken[0] + # # 获取参数qzonetoken + # urllib3.disable_warnings() + # target_url = 'https://user.qzone.qq.com/' + self.qq_number + # html = get_html(target_url, self.cookies_merge_dict_in_qzone_qq_com) + # qzonetoken = re.findall(r'{ try{return "(.+?)";', html.text) + # qzonetoken = qzonetoken[0] # 获取我在意谁数据 - target_url = 'https://rc.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=' + self.qq_number + '&do=1&rd=0.9680629025032721&fupdate=1&clean=1&g_tk=' + str(bkn) + '&qzonetoken=' + str(qzonetoken) + '&g_tk=' + str(bkn) + #target_url = 'https://rc.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin=' + self.qq_number + '&do=1&rd=0.9680629025032721&fupdate=1&clean=1&g_tk=' + str(bkn) + '&qzonetoken=' + str(qzonetoken) + '&g_tk=' + str(bkn) + target_url = 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?uin={}&do=1&rd=0.6629930546880991&fupdate=1&clean=1&g_tk={}&g_tk={}'.format(self.qq_number, bkn, bkn) urllib3.disable_warnings() html = get_html(target_url, self.cookies_merge_dict_in_qzone_qq_com) diff --git a/9.一键生成QQ个人历史报告/url_request.py b/9.一键生成QQ个人历史报告/url_request.py index 2b51419..07db51b 100644 --- a/9.一键生成QQ个人历史报告/url_request.py +++ b/9.一键生成QQ个人历史报告/url_request.py @@ -12,14 +12,14 @@ 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' + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36', + 'Referer': 'http://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&s_url=http://qun.qq.com/member.html' } # 屏蔽https证书警告 urllib3.disable_warnings() # 网页访问,get方式 - html = get(url, cookies = submit_cookies, headers=header, verify=False) + html = get(url, cookies=submit_cookies, headers=header, verify=False) return html @@ -29,13 +29,13 @@ 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', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36', 'Referer' : 'https://qun.qq.com/member.html' } # 屏蔽https证书警告 urllib3.disable_warnings() # 网页访问,post方式 - html = post(url, data=submit_data, cookies = submit_cookies, headers=header, verify=False) + html = post(url, data=submit_data, cookies=submit_cookies, headers=header, verify=False) return html \ No newline at end of file