微信群总是有人发广告?看我用Python写一个机器人消灭他

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

微信群总是有人发广告?看我用Python写一个机器人消灭他

文章插图
 
或者是一声不吭的去骚扰每一个群成员
微信群总是有人发广告?看我用Python写一个机器人消灭他

文章插图
 
虽然不清楚是什么能够驱使他们这样不折不扣的努力成为最强微信群牛皮癣(可能是钞能力),但是在太多次的骚扰之后,我决定拿起Python消灭这些小广告 。
第一回合其实实现思路很简单,总共分两步
  • 1.识别广告用户
  • 2.写代码移除之
但是这两步,每一步都不简单,先来说说第一步如何准确的识别这些用户,网上没有数据也没有一个好的鉴别标准,只能用我的大脑完成特征识别 。经过这几个月,近百份发广告用户的样本训练,基本可以判断一个非正常用户至少满足下面几条中的三条以上:
  • 没有设置微信号
  • 头像为网红女生
  • 微信名为特殊符号或者表情
  • 没发过朋友圈
  • 没有朋友圈背景图
  • 通过后不会有除进群申请外的其他回复
并且根据历史数据,符合1、3条的用户有极大概率为小广告爱好者,那么接下来要做的就是用Python写代码找出微信里面的这些人 。在总结出这一规律后很乐观的认为实现这一需求并不困难,因为我在几年前就曾拿过Python研究微信好友,不论是wxpy还是itchat操作起来应该都不复杂,但是事实却证明我还是太年轻了
【微信群总是有人发广告?看我用Python写一个机器人消灭他】不知从何时起,虽然这些库还能使用但是微信基本已经禁止了大部分人的网页版微信登陆权限,因此当我使用多个微信号分别扫完登陆微信的二维码之后,无一例外的提示我
<error><ret>1203</ret><message>为了你的帐号安全,此微信号已不允许登录网页微信 。你可以使用windows微信或mac微信在电脑端登录 。</message></error>这就让人头疼了,总不能手动的去一个一个check我的几千个微信好友吧,于是我开始思考是否有其他的解决办法 。
第二回合如果你经常写Python爬虫,那么你会知道在有些情况下,与其使用Requests对付一些恶心的反爬措施,不如Selenium操作起来方便 。所以在发现想使用基于微信API的思路失效后,我将目光转向了相对笨一点的方法————pynput
pynput是一款使用Python来控制和监控电脑鼠标、键盘的第三方库,说到这里你大概明白我想怎么做了,直接用API取数据搞不定,那么我就像Selenium一样,模拟点击一个一个好友来实现我想要的操作 。
下面简单说一下这个库,因为没有太多依赖库所以安装起来很简单,直接pip install pynput即可,使用起来也很简单,对于鼠标操作只依赖坐标,看个demo
微信群总是有人发广告?看我用Python写一个机器人消灭他

文章插图
 
就像上面GIF演示的一样,先导入pynput并实例一个鼠标控制器,接着将微信在状态栏的位置提交给mouse.position,这样鼠标就会移动到该位置,再使用mouse.press来模拟鼠标点击即可自动打开微信 。那么问题来了,如何获得我想要的位置的坐标?
pynput除了使可以使用Controller来控制鼠标,也可以监控鼠标,比如使用下面的代码就可以记录下程序启动后鼠标的每一个点击操作所在的位置
from pynput import mousedef 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 Falsewhile True: with mouse.Listener(on_move = on_move,on_click = on_click) as listener:  listener.join()
微信群总是有人发广告?看我用Python写一个机器人消灭他

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


推荐阅读