-
Notifications
You must be signed in to change notification settings - Fork 0
/
52pj_1880212_QqQun.py
301 lines (284 loc) · 11.2 KB
/
52pj_1880212_QqQun.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# source: https://www.52pojie.cn/thread-1880212-1-1.html
import requests
import json
import time
import datetime
import re
import random
from PIL import Image
import os
class QqQun(object):
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/73.0.3683.75 Safari/537.36',
'referer': 'https://qun.qq.com/member.html',
'origin': 'https://qun.qq.com'
}
def __init__(self):
self.bkn = None
self.qun = None
self.token = None
self.qrsig = None
self.cookies = None
self.skey = None
def login(self):
if os.path.exists('cookie.txt'):
with open('cookie.txt', 'r') as f:
cookies = f.read().replace("'", '"')
d = json.loads(cookies)
self.cookies = d
self.skey = d.get('skey')
self.get_bkn()
url = 'https://qun.qq.com/cgi-bin/qun_mgr/get_group_list'
data = {'bkn': self.bkn}
r = requests.post(url, headers=self.headers, data=data, cookies=self.cookies)
js_data = json.loads(r.content.decode())
if js_data.get('ec') == 4:
print('cookie已过期,需要重新扫码')
self.img_get()
elif js_data.get('ec') == 0:
print('登入成功')
self.find_qun()
else:
print('出现了一点小状况....')
else:
print('第一次用吧?来来来,扫个码')
self.img_get()
def get_bkn(self):
e = str(self.skey)
t = 5381
n = 0
o = len(e)
while n < o:
t += (t << 5) + ord(e[n])
n += 1
self.bkn = t & 2147483647
def get_token(self):
n = len(self.qrsig)
i = 0
e = 0
while n > i:
e += (e << 5) + ord(self.qrsig[i])
i += 1
self.token = 2147483647 & e
# 二维码图片
def img_get(self):
url = 'https://ssl.ptlogin2.qq.com/ptqrshow?'
params = {
'appid': '715030901',
'e': '2',
'l': 'M',
's': '3',
'd': '72',
'v': '4',
't': random.random(),
'daid': '73',
'pt_3rd_aid': '0'
}
r = requests.get(url, params=params)
qrsig = requests.utils.dict_from_cookiejar(r.cookies).get('qrsig')
with open('qr.jpg', 'wb') as f:
f.write(r.content)
r.close()
img = Image.open('qr.jpg')
img = img.resize((350, 350))
img.show()
self.qrsig = qrsig
self.get_token()
self.get_state()
# 扫码状态
def get_state(self):
while True:
url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqun.qq.com%2Fmanage.html%23click&ptqrtoken=' + str(
self.token) + '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-' + str(
time.time()) + '&js_ver=20032614&js_type=1&login_sig=&pt_uistyle=40&aid=715030901&daid=73&'
cookies = {'qrsig': self.qrsig}
r = requests.get(url, cookies=cookies)
r1 = r.text
if '二维码未失效' in r1:
print('二维码未失效', time.strftime('%Y-%m-%d %H:%M:%S'))
elif '二维码认证中' in r1:
print('二维码认证中', time.strftime('%Y-%m-%d %H:%M:%S'))
elif '二维码已失效' in r1:
print('二维码已失效', time.strftime('%Y-%m-%d %H:%M:%S'))
else:
print('登录成功', time.strftime('%Y-%m-%d %H:%M:%S'))
os.remove('qr.jpg')
cookies = requests.utils.dict_from_cookiejar(r.cookies)
uin = requests.utils.dict_from_cookiejar(r.cookies).get('uin')
regex = re.compile(r'ptsigx=(.*?)&')
sigx = re.findall(regex, r.text)[0]
url = 'https://ptlogin2.qun.qq.com/check_sig?pttype=1&uin=' + uin + '&service=ptqrlogin&nodirect=0' \
'&ptsigx=' + sigx + \
'&s_url=https%3A%2F%2Fqun.qq.com%2Fmanage.html&f_url=&ptlang=2052&ptredirect=101&aid=715030901' \
'&daid=73&j_later=0&low_login_hour=0®master=0&pt_login_type=3&pt_aid=0&pt_aaid=16&pt_light=0' \
'&pt_3rd_aid=0 '
r2 = requests.get(url, cookies=cookies, allow_redirects=False)
self.cookies = requests.utils.dict_from_cookiejar(r2.cookies)
with open('cookie.txt', 'w') as f:
f.write(str(self.cookies))
self.skey = requests.utils.dict_from_cookiejar(r2.cookies).get('skey')
self.get_bkn()
self.find_qun()
r.close()
r2.close()
break
time.sleep(3)
# 时间戳转时间
def get_time(self, t):
timeValue = time.localtime(t)
tempDate = time.strftime("%Y-%m-%d %H:%M:%S", timeValue)
tm = datetime.datetime.strptime(tempDate, "%Y-%m-%d %H:%M:%S")
return tm
# 修改群成员名称
def revise_card(self):
url = 'https://qun.qq.com/cgi-bin/qun_mgr/set_group_card'
qq = input('请输入你要修改的群成员QQ:')
msg = input('请输入修改后的群昵称:')
data = {
'gc': self.qun,
'u': qq,
'name': msg,
'bkn': self.bkn
}
r = requests.post(url, headers=self.headers, data=data, cookies=self.cookies)
js_data = json.loads(r.content.decode())
print('不出意外的话应该修改成功了!(如果你是管理的话)')
r.close()
# 一个到三个月未发言的群员
def inactive(self):
url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
data = {
'gc': self.qun,
'st': 0,
'end': 20,
'sort': 0,
'last_speak_time': '2592000 | 7776000',
'bkn': self.bkn
}
r = requests.post(url, headers=self.headers, data=data, cookies=self.cookies)
js_data = json.loads(r.content.decode())
r.close()
if js_data.get('mems') == None:
print('未发现一个月到三个月未发言的群成员')
else:
qq_list = []
print('------以下为一个月到三个月未发言的群成员(一次显示最多20个)------')
for i in js_data.get('mems'):
t = self.get_time(int(i['join_time']))
t1 = self.get_time(int(i['last_speak_time']))
qq_list.append(i['uin'])
print(f"QQ号:{i['uin']}\t群名称:{i['card']}\t入群时间:{t}\t最后发言:{t1}")
while True:
choose = input('是否要全部踢出群(y/n):')
if choose == 'y':
print('收到,您选择y,程序开始执行....')
for qq in qq_list:
self.del_qq(qq)
print('程序执行完毕,建议重新查询不活跃群成员(一次最多只显示20人)')
break
elif choose == 'n':
print('收到,您选择n,不踢出群')
break
else:
print('只能输入y或者n')
# 查看群
def find_qun(self):
url = 'https://qun.qq.com/cgi-bin/qun_mgr/get_group_list'
data = {'bkn': self.bkn}
r = requests.post(url, headers=self.headers, data=data, cookies=self.cookies)
js_data = json.loads(r.content.decode())
qun_list = []
data_list = []
if js_data.get('create') is not None:
data_list.extend(js_data['create'])
if js_data.get('manage') is not None:
data_list.extend(js_data['manage'])
if js_data.get('join') is not None:
data_list.extend(js_data['join'])
for x, i in enumerate(data_list, 1):
qun_list.append(i['gc'])
print(f"{x}.群号:{i['gc']}\t群名称:{i['gn']}\t群主:{i['owner']}")
r.close() # 关闭访问
while True:
qun = int(input('请输入需要操作的群(填序号):'))
if qun <= len(qun_list):
self.qun = qun_list[qun - 1]
print(f'操作群:{qun_list[qun - 1]}')
self.main()
break
else:
print('是不是群号输错了?')
# 查找群成员
def find_qun_members(self):
msg = input('请输入搜索的关键字(QQ号/昵称):')
url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
data = {
'gc': self.qun,
'key': msg,
'bkn': self.bkn
}
r = requests.post(url, headers=self.headers, data=data, cookies=self.cookies)
js_data = json.loads(r.content.decode())
if 'mems' in js_data:
jd = js_data['mems'][0]
t = self.get_time(int(jd['join_time']))
t1 = self.get_time(int(jd['last_speak_time']))
print(f"QQ号:{jd['uin']}\t群名称:{jd['card']}\t入群时间:{t}\t最后发言:{t1}")
else:
print('没有符合筛选条件的群成员')
r.close()
# 踢人
def del_qq(self, qq):
url = 'https://qun.qq.com/cgi-bin/qun_mgr/delete_group_member'
data = {
'gc': self.qun,
'ul': qq,
'flag': '0',
'bkn': self.bkn
}
r = requests.post(url, headers=self.headers, data=data, cookies=self.cookies)
js_data = json.loads(r.content.decode())
if js_data['ec'] == 0:
if 'ul' in js_data:
print(f'已将QQ{js_data["ul"][0]}踢出本群!')
else:
print(f'QQ[{qq}]地位与你同级或大于你的权限,无法进行操作!')
else:
print(f'未在本群查找到此{qq}')
r.close()
def main(self):
while True:
print("""
---注意:有些需要管理员或者群主权限---
1.查找群成员
2.移除群成员
3.查看不活跃群员
4.修改群昵称
5.切换群
6.退出系统
""")
choose = input('请选择操作序号:')
if choose == '1':
self.find_qun_members()
input('按回车键继续操作......')
elif choose == '2':
qq = input('请输入要操作的QQ号:')
self.del_qq(qq)
input('按回车键继续操作......')
elif choose == '3':
self.inactive()
input('按回车键继续操作......')
elif choose == '4':
self.revise_card()
input('按回车键继续操作......')
elif choose == '5':
self.find_qun()
elif choose == '6':
print('欢迎下次使用')
break
else:
print('请输入正确的序号!')
if __name__ == '__main__':
q = QqQun()
q.login()