(pythonQQ群管理)通过selenium 自动批量删除QQ群成员

看完本文你将可以

  • 通过selenium 自动批量删除QQ群成员
  • 借鉴代码获取所有群成员的QQ号、昵称、备注等信息

一年一度录取季,新生群又双叒叕要满了,眼看群里两千多人的坑位已经不多了,这时候作为一个资深的 管理员/群主自然要开始重新建一个群清理那些潜水摸鱼的群友啦!

一般的群管理就是在pc端qq进入成员管理页面,然后一个个的点击删除。
在这里插入图片描述
想快一点的就要进入网页端高级管理中进行条件筛选然后删除。
在这里插入图片描述
上面这两种方法对正常情况已经够用了
但是总感觉不是很适合,比如说不能筛选出来进群就从没有说话的(通常这样的要等到好几个月才能在网页端管理页面筛选出来)、也要自己一个个的点,非常费手不方便。于是就想到了通过网页操控网页端的管理页面来达到自动化筛选并选中的目的。

原材料:

  1. 一个qq群(自己要有管理员或者群主账号,没有的话就别想了叫群主来搞 )
  2. 一个可以跑的python环境(这不废话嘛)
  3. selenium 模块,还有你要用的浏览器的驱动driver。
    驱动不会找的宝看下面:
    • Chrome浏览器驱动:chromedriver
    • Firefox浏览器驱动:geckodriver
    • Edge浏览器驱动:MicrosoftWebDriver
    • IE浏览器驱动:IEDriverServer
    • Opera浏览器驱动:operadriver
    • PhantomJS浏览器驱动:phantomjs
    注意要下载和你浏览器相同版本号的驱动,不然会报错!
    如我的微软的Edge浏览器
    在这里插入图片描述
    然后访问上面的链接下载对应版本就行啦
    在这里插入图片描述
    下载和你浏览器相符的驱动就行了(如win 64位下x64的,应该没有32位的电脑了吧),将驱动随便放什么位置都可以,你自己找得到路径就行。。。。一般放在源码目录
    在这里插入图片描述
  4. python的pynput模块,直接pip install pynput安装就行,用于快捷键设置,也可以用其他模块替代或者不用也可以。。。。

开搞

首先通过qq的pc客户端进入网页端高级群管理页面,然后复制链接备用

链接像这种https://qun.qq.com/member.html#gid=<群号>
或者直接把你们的群号放上面也可以,不过用电脑登录qq后续比较好授权

然后复制下面代码:

#!usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2021/7/22 0:35
# @Author  : Fandes
# @FileName: 清理群成员.py
# @Software: PyCharm
import threading
import time
from pynput import keyboard
from selenium import webdriver

tips = "手动登录后,(设置其他筛选条件)按alt+s可以自动下滑加载全部成员页面(也可以自己划下去)," \
       "加载完页面后,按alt+z筛选(没有加载的页面将不会处理),会先筛选出所有符合条件的人," \
       "然后以20/批量选中并弹出删除按钮(qq只允许同一批量删除最多20人)" \
       "手动确认后按F4键继续选中下一批...一一确认即可" \
       "然后手动确认删除"
print(tips)
browser = webdriver.Edge(executable_path="msedgedriver.exe")  # 需要下载浏览器驱动!现在是微软Edge浏览器的驱动!!!,executable_path里面是你上面下载的驱动程序的路径
browser.get('上面复制的你的群管理链接')
num = 0
n = 8  # 32个线程,根据电脑性能来..
obj = []


class Checkthread(threading.Thread):
    """ 线程类,人数太多时不开多线程选中会很慢,可以到改上面线程数n为1对比一下就知道了"""
    def __init__(self, cids):
        super().__init__()
        self.cids = cids

    def run(self):
        global obj
        global num
        for e in self.cids:
            tds = e.find_elements_by_tag_name("td")
            if tds[-2].text == tds[-4].text:  # 入群时间和最后发言时间相同
                name = e.find_element_by_class_name("group-card").text
                print("入群时间{}和最后发言时间{}相同,{}/{}".format(tds[-2].text, tds[-4].text, name, tds[-7].text))
                # if "21" in name or "20" in name or "19" in name or "18" in name or "17" in name or "16" in name or "15" in name:#筛选名片年级
                #     continue
                obj.append(e)
                num += 1

        return


def checked(obj):  # 勾选,使用js来勾选比直接使用selenium的元素定位要快得多(而且可以并行处理)
    browser.execute_script("arguments[0].setAttribute(arguments[1],arguments[2])",
                           obj.find_element_by_class_name("check-input"), "checked", 1)


def listen():  # 快捷键设置
    print("listen")

    def on_search():  # 开始查找所有符合条件的人并创建线程池处理
        print('<alt>+z pressed')
        global num
        num = 0
        els = browser.find_elements_by_class_name("mb")
        l = len(els)
        threads = []
        for i in range(n):  # 平均分配检测量
            thread = Checkthread(els[(i * l) // n:((i + 1) * l) // n])
            thread.start()
            print("{}->{}线程启动".format((i * l) // n, ((i + 1) * l) // n))
            threads.append(thread)
        for thread in threads:
            thread.join()  # 线程等待
        print("共有{}人符合条件,开始以20/批量选中".format(num))
        i = 0
        for e in obj:
            if i == 0:
                e.find_element_by_class_name("check-input").click()
            else:
                checked(e)
            i += 1
            print("{}.选中{}".format(i, e.find_element_by_class_name("group-card").text))

            def on_press(k):
                if k == keyboard.Key.f4:
                    kbl.stop()  # 按键监听停止
                    print("继续")

            if i == 20 or e == obj[-1]:
                print("手动确认后按F4键继续")  # 手动确认删除比较安全
                browser.find_element_by_class_name("del-member").click()
                kbl = keyboard.Listener(on_press=on_press)
                kbl.start()
                kbl.join()
                i = 0

    def on_end():  # 滚动到底部
        print("scroll to end")
        i = 1
        while True:
            check_height = browser.execute_script("return document.body.scrollHeight;")
            for r in range(5):
                time.sleep(0.1)
                browser.execute_script("window.scrollBy(0,1000)")
                print("滚动中...")
            time.sleep(0.3)
            check_height1 = browser.execute_script("return document.body.scrollHeight;")
            print(str(check_height) + '**************' + str(check_height1))
            if check_height == check_height1:
                break

    hotkey = keyboard.GlobalHotKeys({
        '<alt>+z': on_search,
        '<alt>+s': on_end,
    })

    hotkey.start()
    hotkey.wait()
    hotkey.join()
    print("end")


listen()

注意填充你的群管理链接和浏览器驱动路径就可以开始运行了!
在这里插入图片描述
运行之后电脑如果登录了qq可以直接点击头像授权,或者用手机qq扫码登录
在这里插入图片描述
进入页面后按下alt+s键自动往下滚(看上面源码),或者自己手动往下滚动加载完。
然后按下alt+z根据条件筛选,源码里的筛选条件是筛选入群时间和最后发言时间相同的人(即进群没说话的人),也可以自己设其他条件,如筛选群名片是不是符合条件啊这些(源码注释里有一个筛选年级的例子)
等都筛选完之后就会自动分20/批弹出窗口让你确认删除,因为qq每次只能删除20个人,所以一次只会选中二十人,点击删除后按下F4键会自动再选出要踢掉的20个人,然后弹窗确认删除。。。直到删完符合条件的人。。
在这里插入图片描述

结束!
本文对应GitHub项目链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fandes_F

饿饿~饭饭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值