qq群管理助手(基于web接口)
生活随笔
收集整理的這篇文章主要介紹了
qq群管理助手(基于web接口)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文章基于qun.qq.com接口實現群管理
1. 模擬登錄
(1) 請求登錄框
https://xui.ptlogin2.qq.com/cgi-bin/xlogin
這些參數都是固定的
請求登錄框后會寫幾個cookie
里面有些關鍵的鍵在后面需要攜帶
(2) 接著請求二維碼
https://ssl.ptlogin2.qq.com/ptqrshow參數如下:
js發送請求的代碼如下:
其中appid在第一個請求的中, e, l, s, d, v都是固定的, pt_3rd_aid也是固定的, t = Math.random()
這個請求也會設置一個cookie
(3) 循環發送請求判斷二維碼狀態
https://ssl.ptlogin2.qq.com/ptqrlogin
① 參數
拼裝參數的js代碼如下:
ptqrtoken生成方法
將cookie中的qrsig做一個hash操作, js代碼如下:
使用python改寫:
def hash33(t, e):for n in range(len(t)):e += (e << 5) + ord(t[n])return 2147483647 & eqrsig生成的時候e為0, 后面bkn的生成e為5381(這個后面介紹)
action
生成的js代碼如下
i.action = q.action.join("-") + "-" + +new Dateq.action.join(“-”) + “-” = “0-0-” 這是固定的
末尾加了13位時間戳
經過測試o1vId可以不用攜帶, 初步跟了一下這個應該是瀏覽器環境的校驗值
② 返回值
ptuiCB('67','0','','0','二維碼認證中。(1977641837)', '')二維碼有三種狀態
- 二維碼未失效
- 二維碼已失效
- 二維碼認證中
(4) 登錄成功
如果登錄成功會返回一個跳轉鏈接
請求該鏈接, 會設置用戶信息的cookie
2. 群管理接口
(1) 獲取群列表
http://qun.qq.com/cgi-bin/qun_mgr/get_group_list POST 參數: 'bkn': hash33(skey, 5381) 返回值: ec: 0 em: "" errcode: 0 create: [{gc: 群號gn: 群名owner: 群主qq} ] join: [{gc: 群號gn: 群名owner: 群主qq} ] manage: [{gc: 群號gn: 群名owner: 群主qq} ](2) 獲取好友列表
https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list POST 參數: 'bkn': hash33(skey, 5381) 返回值: ec: 0 em: "" errcode: 0 result: {1: {gid: 分組編號gname: 分組名mems: [{name: 備注名或者昵稱uin: qq號}]} }(3) 獲取群成員
https://qun.qq.com/cgi-bin/qun_mgr/search_group_members POST 參數: 'gc': 群號 'st': 開始下標 'end': 結束下標 'sort': 用于排序, 可以不用考慮, 直接寫0 'bkn': hash33(skey, 5381) 部分關鍵返回值: count: 群員個數 mems: [{uin: qq號card: 群昵稱nick: qq昵稱qage: q齡join_time: 加入時間, 10位時間戳last_speak_time: 最后一次發言時間} ](4) 設置群管理員
https://qun.qq.com/cgi-bin/qun_mgr/set_group_admin POST 參數: gc: 群號 ul: qq號 op: 1 bkn: hash33(skey, 5381) 返回值: ec: 0 em: "" errcode: 0 ul: QQ號(5) 添加群成員
https://qun.qq.com/cgi-bin/qun_mgr/add_group_member POST 參數: gc: 群號 ul: QQ號 bkn: hash33(skey, 5381) 返回值: ec: 0 em: "" errcode: 0(6) 刪除群成員
https://qun.qq.com/cgi-bin/qun_mgr/delete_group_member 參數: gc: 群號 ul: QQ號 flag: 0 flag為1表示不再允許該成員入群 bkn: hash33(skey, 5381) 返回值: ec: 0 em: "" errcode: 0 ul: [被刪除qq列表]其他接口可以上網查一下
3. 代碼實現
import requests from random import random from time import time, sleep import re import jsondef hash33(t, e):for n in range(len(t)):e += (e << 5) + ord(t[n])return 2147483647 & eclass QQGroup:def __init__(self):self.session = self.newSession()def newSession(self):session = requests.session()headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}session.headers.update(headers)return sessiondef qrShow(self):xlogin_url = "https://xui.ptlogin2.qq.com/cgi-bin/xlogin"params = {"pt_disable_pwd": "1","appid":" 715030901","daid": "73","pt_no_auth": "1","s_url": "https://qun.qq.com/"}self.session.headers.update({"Referer": "https://qun.qq.com/"})response = self.session.get(xlogin_url, params=params)qr_url = "https://ssl.ptlogin2.qq.com/ptqrshow"params = {"appid": "715030901","e": "2","l": "M","s": "3","d": "72","v": "4","t": random(),"daid": "73","pt_3rd_aid": "0"}response = self.session.get(qr_url, params=params).contentwith open("qrcode.png", "wb") as f:f.write(response)def qrLogin(self):self.session.headers.update({"Referer": "https://xui.ptlogin2.qq.com/"})login_sig = self.session.cookies.get_dict().get('pt_login_sig', '')qrsig = self.session.cookies.get_dict().get('qrsig', '')login_url = "https://ssl.ptlogin2.qq.com/ptqrlogin"while True:params = {"u1": "https://qun.qq.com/","ptqrtoken": hash33(qrsig, 0),"ptredirect": "1","h": "1","t": "1","g": "1","from_ui": "1","ptlang": "2052","action": '0-0-%d' % round(time() * 1000),"js_ver": "22062417","js_type": "1","login_sig": login_sig,"pt_uistyle": "40","aid": "715030901","daid": "73"}self.session.headers.update({"Referer": "https://xui.ptlogin2.qq.com/"})response = self.session.get(login_url, params=params).content.decode('utf-8')print(response)if '二維碼已失效' in response:self.qrShow()elif '登錄成功' in response:success_url = re.findall(r"(https://ptlogin2.qun.qq.com/check_sig.*?)',", response)[0]self.session.get(success_url)breaksleep(1)def qunManage(self, option, data = {}):self.session.headers.update({'Referer': 'https://qun.qq.com/member.html'})skey = self.session.cookies.get_dict().get('skey', '')url = 'https://qun.qq.com/cgi-bin/qun_mgr/' + optiondata.update({'bkn': hash33(skey, 5381)})response = self.session.post(url, data = data).content.decode('utf-8')return json.loads(response)def getGroupList(self):return self.qunManage('get_group_list')def getFriendList(self):return self.qunManage('get_friend_list')def getGroupMemberList(self, gc):group_member_list = []# 這個接口獲取的好友區間為[st, end], 閉區間# end默認為20, 但是經過測試end最大可以取到40, 也就是取了41個成員num = 0max = -1while True:data = {'gc': gc,'st': str(num),'end': str(num + 40),'sort': '0'}tmp = self.qunManage('search_group_members', data)group_member_list.extend(tmp['mems'])max = tmp['count']if max <= (num+41):breaknum += 41return group_member_listdef run(self):# 首先獲取二維碼self.qrShow()# 開始登錄self.qrLogin()# 獲取群列表并打印group_list = self.getGroupList()if 'create' in group_list:print('我創建的:')for group in group_list['create']:print('群號: %s, 群名: %s, 群主: %s' % (str(group['gc']), group['gn'], str(group['owner'])))if 'manage' in group_list:print('我管理的:')for group in group_list['manage']:print('群號: %s, 群名: %s, 群主: %s' % (str(group['gc']), group['gn'], str(group['owner'])))if 'join' in group_list:print('我加入的:')for group in group_list['join']:print('群號: %s, 群名: %s, 群主: %s' % (str(group['gc']), group['gn'], str(group['owner'])))# 獲取好友列表# friend_list = self.getFriendList()# for group in friend_list['result'].values():# print('分組: %s' % (group.get('gname', '我的好友'),))# for friend in group['mems']:# print('備注(昵稱): %s, qq: %s' % (friend['name'], friend['uin']))# 獲取群成員列表group_member_list = self.getGroupMemberList('783271804')print()def main():qq = QQGroup()qq.run()if __name__ == '__main__':main()發送消息的接口基本上都已經失效了, 不過基于以上功能也可以實現群成員去重等功能
總結
以上是生活随笔為你收集整理的qq群管理助手(基于web接口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis 配置 mysql连接池_
- 下一篇: mongoose --- 建立一个集合