Eks6666 发表于 2024-1-13 19:26

用python管理QQ群

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 += 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 += 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)
                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 = []
      data_list.extend(js_data['create'])
      data_list.extend(js_data['manage'])
      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
                print(f'操作群:{qun_list}')
                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']
            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"]}踢出本群!')
            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()

apany3760 发表于 2024-1-15 13:41


205行data_list.extend(js_data['manage']) 报错提示 KeyError: 'manage', 打印了一下确实没有, 注释这行就好了, 感谢分享

wangzhu3366 发表于 2024-1-13 19:47

原来大牛在这

moruye 发表于 2024-1-13 20:08

Corgibro 发表于 2024-1-13 20:29

厉害,可惜已经不用QQ了,是我真的老了吗

YuYu798 发表于 2024-1-13 20:54

感谢分享

xingwenzhiyuan 发表于 2024-1-13 20:58

支持一下,现在QQ群,只是偶尔看一下了。

CYANCHAOS 发表于 2024-1-13 21:13

还有这种操作

jianghai19 发表于 2024-1-13 21:37

还能这样做,涨见识了

NCGZS 发表于 2024-1-13 21:43

支持一下,但是已经不怎么用QQ了

Rongg 发表于 2024-1-13 22:06

真厉害!{:1_893:}
页: [1] 2 3 4 5 6
查看完整版本: 用python管理QQ群