微信群有人发广告?用 Python 写自动化机器人消灭他!

本文介绍了一种使用Python和pynput库识别微信群内广告号的方法。通过模拟鼠标和键盘操作,作者实现了对群成员微信ID、名称和头像的检查,以筛选潜在的广告账号。

作者 | 刘早起

来源 | 早起Python( ID:zaoqi-python )

序幕

微信群牛皮癣,指的是在微信群里毫无下限的群发小广告的用户,是微信群主最痛恨的一波人。如果熟悉早起的读者可以知道我有一个技术交流群,但是自从建群以来就饱受小广告的困扰。他们伪装成正常人混进群然后不停的发送广告轰炸,严重的打乱了群内的技术交流气氛。

或者是一声不吭的去骚扰每一个群成员。

虽然不清楚是什么能够驱使他们这样不折不扣的努力成为最强微信群牛皮癣(可能是钞能力),但在经历太多次的骚扰之后,我开始思考是否可以用Python消灭他们。


第一回合

其实一开始的思路很简单,总共分两步,首先成功识别出这些人再用Python将他们踢出去即可。

但是这两步,每一步都不简单,先来说说第一步如何准确的识别这些用户,网上没有数据也没有一个好的鉴别标准,只能用我的大脑完成特征识别。经过这几个月,近百份发广告用户的样本训练,我这个“人工智能”基本可以判断一个非正常用户至少满足下面几条中的三条以上:

  • 没有设置微信号

  • 头像为网红女生

  • 微信名为特殊符号或者表情

  • 没发过朋友圈

  • 没有朋友圈背景图

  • 通过后不会有除进群申请外的其它回复

并且根据历史数据,符合1、3条的用户有极大概率为小广告爱好者,那么接下来要做的就是用Python写代码找出微信里面的这些人。在总结出这一规律后很乐观的认为实现这一需求并不困难,因为我在几年前就曾拿过Python研究微信好友,不论是wxpy还是itchat操作起来应该都不复杂,但是事实确证明我还是太年轻了。

不知从何时起,虽然这些库还能安装使用但是微信基本已经禁止了大部分人的网页版微信登陆权限,因此当我使用多个微信号分别扫完登陆微信的二维码之后,无一例外的提示我:

<error><ret>1203</ret><message>为了你的帐号安全,此微信号已不允许登录网页微信。
你可以使用Windows微信或Mac微信在电脑端登录。</message></error>

这就让人头疼了,总不能手动的去一个一个check我的几千个微信好友吧,于是我开始思考是否有其他的解决办法。

第二回合

如果你经常写Python爬虫,那么你会知道在有些情况下,与其使用Requests对付一些恶心的反爬措施,不如Selenium操作起来方便。所以在发现想使用基于微信API的思路失效后,我将目光转向了相对笨一点的方法————pynput。

pynput是一款使用Python来控制和监控电脑鼠标、键盘的第三方库,说到这里你大概明白我想怎么做了,直接用API取数据搞不定,那么我就像Selenium一样,模拟点击一个一个好友来实现我想要的操作。

下面简单说一下这个库,因为没有太多依赖库所以安装起来很简单,直接pip install pynput即可,使用起来也很简单,对于鼠标操作只依赖坐标,看个demo。

就像上面GIF演示的一样,先导入pynput并实例一个鼠标控制器,接着将微信在状态栏的位置提交给mouse.position,这样鼠标就会移动到该位置,再使用mouse.press来模拟鼠标点击即可自动打开微信。那么问题来了,如何获得我想要的位置的坐标?总不能一点一点试吧!

pynput除了使可以使用Controller来控制鼠标,也可以监控鼠标,比如使用下面的代码就可以记录下程序启动后鼠标的每一个点击操作所在的位置。

from pynput import mouse
def on_move(x, y ): print('鼠标移动至 {0}'.format(  (x,y)))
def on_click(x, y , button, pressed): print('{0} 在坐标 {1}'.format('鼠标点击' if pressed else '鼠标释放', (x, y))) if not pressed:  return False
while True: with mouse.Listener(on_move = on_move,on_click = on_click) as listener:  listener.join()

那么接下来的任务就简单了,我们只需要保持微信窗口不移动,在记录下每一个关键位置的坐标(微信图标位置,群聊窗口位置,单个群成员头像位置)之后,比如我们想对上面说的第一条规则进行判断即获取每一个群成员微信号是否设置,就可以按照模拟以下操作实现:

  • 点击微信app

  • 点击需要的群聊

  • 依次点击每一个群成员头像

  • 移动到微信号的位置

  • 双击该微信号

  • 复制该微信号判断是否为初始微信号

在上面的过程中,值得说的是最后一步,复制我们可以使用pynput中的键盘控制器,在双击选中对应微信号之后通过下面的代码实现模拟键盘输入Command + C完成复制操作:

from pynput.keyboard import Keyfrom pynput.keyboard import Controller as Controller1keyboard = Controller1()
with keyboard.pressed(Key.cmd):    keyboard.press('c')    keyboard.release('c')

但是粘贴则不需要使用pynput通过模拟command+c来粘贴到另一个编辑中复杂过程,我们可以使用第三方库pyperclip,直接通过下面两行代码即可将复制好的文字转为字符串

import pyperclippyperclip.paste()

在将群成员的微信号转换为字符串后,不论我们是通过判断字符串的长度还是用正则表达式或者是其他的方法都可以轻松的判断该成员的微信号是否为初始微信号,实现规则1的判断,下面的代码与动态图就是获取第一个群成员微信号的完整过程:

from pynput.mouse import Button, Controllerimport timefrom pynput.keyboard import Keyfrom pynput.keyboard import Controller as Controller1import pyperclip
mouse = Controller()
# 点击微信mouse.position = (1046.14453125, 4.546875)time.sleep(2)mouse.press(Button.left)mouse.release(Button.left)
#点击头像mouse.position = (1194.140625, 441.05859375)time.sleep(1)mouse.press(Button.left)mouse.release(Button.left)
# 点击选中文本mouse.position = (965.60546875, 284.0390625)time.sleep(1)mouse.click(Button.left, 2)
keyboard = Controller1()
with keyboard.pressed(Key.cmd):    keyboard.press('c')    keyboard.release('c')    time.sleep(1)
wechatid = pyperclip.paste()print(f"微信号{wechatid}疑似广告号" if len(wechatid) > 20 else f"微信号{wechatid}不是广告号")

可以看到成功将早小起的微信从广告号中排除:

那么接下来只需要记录下每两个群成员之间间隔的坐标距离,之后循环去模拟滚动或者下拉来实现上述过程,就可以将群里所有成员的微信号根据规则1进行判断,找到异常的那些成员单独进行判断。

可以看到最终是找到了6个疑似广告号的微信,接下来通过其他规则的手动判断最终将两个用户判定为广告高风险用户并移除。

写在最后

通过上面的操作,虽然成功的踢出了两个疑似广告号,但总体来说还是败了。因为依旧很难去判断是否真的踢对了人,如果踢错了,那么则粉丝-1,同时也可以发现想用Python准确找到群里的牛皮癣还是非常困难的,使用pynput最多可以完成微信名、微信号及头像(使用识图API)的判断,但是朋友圈隐藏的更多信息却很难提取挖掘。

同时pynput有着和selenium同样的缺点,那就是由于模拟真人操作而导致的速度慢,并且它的定位方式仅支持坐标,所以还需要保证在操作的过程中微信窗口不可以被移动,否则之前记录的元素将全部失效,此处建议开发者可以升级更多的定位方式。

如果你有好的思路可以在留言区和我交流,如果你想看更详细的pynput讲解,不要忘记给个三连。


更多精彩推荐
☞英雄会被表彰,这些技术与代码也将载入史册!
☞苹果秋季发布会于9月16日召开;华为搜索业务将在国内亮相;Android 11正式版发布 | 极客头条
☞腾讯微博即将关停,十年了,你用过吗?
☞Cognitive Inference:认知推理下的常识知识库资源、常识推理测试评估与中文实践项目索引
☞超详细 | 21张图带你领略集合的线程不安全
☞腾讯云区块链邀您参加2020腾讯全球数字生态大会
点分享点点赞点在看
<think> 首先,用户的问题是基于之前的引用内容。引用[1]提到搭建QQ机器人需要Python、go-cqhttp和nonebot。引用[2]和[3]讨论微信机器人,使用wxauto库或wxpy库来实现微信自动化。 用户的问题是:“我想查找使用Python微信机器人所需的软件包。请问使用Python微信机器人需要的软件包。” 从引用[2]中,提到了wxauto库,用于微信自动化操作。引用[3]则提到了wxpy库,用于实现微信机器人功能。 所以,核心软件包是wxauto或wxpy。另外,引用[2]还提到了langchain用于调用AI大模型提供智能回复。 我需要整理出所需的软件包: 1. **wxauto**:用于微信自动化操作。 2. **langchain**:用于集成AI模型,提供智能回复(可选,取决于功能需求)。 3. **其他依赖**:如pyecharts用于数据可视化(在引用[3]中用于生成图表),但这可能不是必需的,除非用户有类似需求。 用户的问题焦点是“编微信机器人所需的软件包”,所以我应该列出核心包。 从引用[2]: “我们成功运用了 Python 的 wxauto 自动化库,实现了微信的自动化操作...” 和 “该案例通过 langchain 调用 AI 大模型”。 从引用[3]: “from wxpy import *” 和 “from pyecharts import Pie”。 wxpy和wxauto可能不同。wxpy是另一个库,但引用[2]明确提到wxauto。 我应该检查一致性。引用[2]说“wxauto”,而引用[3]用“wxpy”。它们可能是不同的库,但都用于微信自动化。 在回答中,我需要基于引用提供准确信息。 引用[2]标题是“Python 实现功能 --- 微信机器人”,使用了wxauto。 引用[3]也是“Python 实现功能 --- 微信机器人”,使用了wxpy。 所以,两者都是可行的选项。 核心包: - 对于基本微信自动化:wxauto 或 wxpy。 - 可选:langchain 用于AI功能。 用户可能不需要所有,所以我应该列出主要包。 回答结构: - 系统级指令要求使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 在引用的段落末尾添加引用标识,如[^1]。 - 生成相关问题。 - 确保回答真实可靠。 第一步:确认用户的问题。用户想知道使用Python微信机器人所需的软件包。 第二步:从引用中提取信息。 从引用[2]:使用 wxauto 库。 从引用[3]:使用 wxpy 库。 所以,我可以说有多种选择。 主要软件包: 1. **wxauto**:一个微信自动化库,用于控制微信客户端。 2. **wxpy**:另一个库,提供类似功能。 3. **langchain**:如果用户需要智能回复,可以集成AI模型。 4. **其他**:如pyecharts、webbrowser等,用于辅助功能,但非核心。 在回答中,我应该优先使用引用[2]的信息,因为它更详细地描述了实现。 引用[2]说:“我们成功运用了 Python 的 wxauto 自动化库”,并实现了聊天机器人。 所以,核心包是 wxauto。 安装方法:用户可能需要pip安装。 pip install wxauto pip install langchain (可选) 第三步:组织回答。 - 直接回答所需软件包。 - 解释每个包的作用。 - 添加引用标识。 - 最后生成相关问题。 格式:使用中文。 最终回答结构: 1. 介绍所需软件包。 2. 列出包并简要描述。 3. 添加引用。 4. 生成相关问题。 相关问题:基于系统级指令,在末尾生成相关问题。 例如: - 如何安装wxauto库? - wxpy和wxauto有什么区别? - 如何实现微信机器人的基本功能? </think>基于您查询的关于使用Python微信机器人所需的软件包,我从站内引用中提取了相关信息。微信机器人的实现主要依赖于微信自动化库来实现消息收、好友管理等功能,同时可结合其他包(如AI模型集成)增强智能回复能力。以下是核心软件包的总结和说明: ### 核心软件包列表 根据引用内容,编微信机器人的核心软件包包括: 1. **wxauto**:这是一个Python库,专门用于微信自动化操作,包括送/接收消息、管理好友列表、群聊控制等。它是实现微信机器人基础功能的关键工具。引用[2]中提到,使用wxauto库只需少量代码就能实现微信的自动化操作,例如构建聊天机器人\[^2\]。 2. **langchain**(可选,用于智能回复):如果您希望机器人具备AI驱动的智能聊天功能(如上下文记忆、自然语言处理),可以集成langchain库。它用于调用大型语言模型(如GPT系列),提供更自然的对话体验。引用[2]中的案例展示了如何通过langchain添加智能回复功能\[^2\]。 ### 其他辅助软件包 根据具体功能需求,您可能还需要以下包: - **pyecharts**:用于数据可视化,例如生成好友性别比例或地域分布图表(如引用[3]中的示例)。但这不是机器人核心功能必需的\[^3\]。 - **webbrowser**:Python标准库,用于自动打开生成的HTML文件(如可视化报告),无需额外安装\[^3\]。 - **其他依赖**:如requests(处理网络请求)或pandas(数据处理),但这些通常是通用包,非微信专属。 ### 安装方法 通过pip安装核心包: ```bash pip install wxauto # 安装微信自动化库 pip install langchain # 可选,安装AI集成库 ``` - 确保您的Python环境已配置(建议Python 3.6+)。 - wxauto库依赖于微信桌面客户端的运行,使用时需保持微信登录状态\[^2\]。 ### 简单示例代码 以下是一个基于wxauto的基本微信机器人代码片段(源自引用[2]的简化版本),实现消息自动回复: ```python from wxauto import WeChat # 导入wxauto库 # 初始化微信机器人 bot = WeChat() bot.start() # 启动微信客户端 # 监听消息并回复 @bot.register() def handle_message(msg): if msg.sender == '好友昵称': # 针对特定好友 bot.send_msg('自动回复: 你好!', msg.sender) # 送回复 # 保持机器人运行 bot.run() ``` 此代码展示了如何使用wxauto实现基础的消息处理。如果需要更高级的AI功能,可以集成langchain调用模型\[^2\]。 ### 注意事项 - **兼容性**:wxauto库主要支持Windows系统,且需要微信桌面版。其他平台或移动端可能需要替代方案。 - **安全性**:使用自动化库时,请遵守微信的使用条款,避免滥用导致账号限制。 - **引用依据**:以上信息基于站内引用,其中引用[2]详细描述了使用wxauto和langchain构建微信机器人的过程,而引用[3]提供了wxpy库的替代示例(但wxpy目前已较少维护,推荐优先使用wxauto)\[^2\]\[^3\]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值