您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

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

时间:2020-09-09 10:57:45  来源:  作者:

写在前面

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

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

 

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

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

 

虽然不清楚是什么能够驱使他们这样不折不扣的努力成为最强微信群牛皮癣(可能是钞能力),但是在太多次的骚扰之后,我决定拿起Python/ target=_blank class=infotextkey>Python消灭这些小广告。

第一回合

其实实现思路很简单,总共分两步

  • 1.识别广告用户
  • 2.写代码移除之

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

  • 没有设置微信号
  • 头像为网红女生
  • 微信名为特殊符号或者表情
  • 没发过朋友圈
  • 没有朋友圈背景图
  • 通过后不会有除进群申请外的其他回复

并且根据历史数据,符合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

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

 

就像上面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()
微信群总是有人发广告?看我用Python写一个机器人消灭他

 

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

  • 点击微信App
  • 点击需要的群聊
  • 依次点击每一个群成员头像
  • 移动到微信号的位置
  • 双击该微信号
  • 复制该微信号判断是否为初始微信号

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

from pynput.keyboard import Key
from pynput.keyboard import Controller as Controller1
keyboard = Controller1()

with keyboard.pressed(Key.cmd):
    keyboard.press('c')
    keyboard.release('c')

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

import pyperclip
pyperclip.paste()

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

from pynput.mouse import Button, Controller
import time
from pynput.keyboard import Key
from pynput.keyboard import Controller as Controller1
import 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}不是广告号")

 

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

 

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

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

 

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

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

 

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

写在最后

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

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

如果你有好的思路可以在留言区和我交流,如果你想看更详细的pynput讲解,不要忘记给个三连。如果你对本文的代码感兴趣,可以在公众号早起Python中找到!

今天的文章就到这里,为了维护良好的群内交流环境,对抗小广告的路还在继续,拜拜~



Tags:微信群   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
微信的群聊功能,小伙伴们都会创建或加入一些群聊中。作为群聊的创建者或管理员会用到群聊中的一项功能群公告,但群公告中只能输入文字,无法添加图片怎么办呢?现在微信群公告支持...【详细内容】
2022-05-12  Tags: 微信群  点击:(48)  评论:(0)  加入收藏
第一步:准备10到15个微信号,并且全部要实名认证。号的来源:一个人可以在同一个手机号运营商注册5个手机号,也就是5个微信,移动、联通、电信,各5个,就是15个微信号。养号方法:1、关...【详细内容】
2022-04-30  Tags: 微信群  点击:(61)  评论:(0)  加入收藏
由于使用微信、企业微信的人越来越多,这也导致大家的好友数量不断增加。在发送信息的时候,大家就需要发送给多个微信好友。为了对微信好友进行管理,大家会通过类别的划分,建立不...【详细内容】
2022-04-20  Tags: 微信群  点击:(70)  评论:(0)  加入收藏
人与人相处的过程中难免会产生摩擦有的人会妥善处理矛盾有的人则会一时冲动选择利用互联网发泄情绪比如在社交平台上抱怨、谩骂或者在网上散布他人的不实信息那么,这种行为违...【详细内容】
2022-03-30  Tags: 微信群  点击:(105)  评论:(0)  加入收藏
前些天有一位网友咨询我,说他不小心把自己的一个重要微信群聊,从微信聊天记录里给删除了,可是自己又没有把这个群聊保存到微信的通讯录里,然后怎么找也找不到了,问我该怎么办?其实...【详细内容】
2021-11-26  Tags: 微信群  点击:(167)  评论:(0)  加入收藏
本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息。 在使用前,请将你微信的窗口设置为在最前面,这样就便于程序找到...【详细内容】
2021-10-25  Tags: 微信群  点击:(134)  评论:(0)  加入收藏
以借钱还钱、缴纳费用、捐赠爱心的“发红包”,与调节微信群气氛的“你发我抢”的“发红包”是截然不同的,不能想抢就抢。“抢红包”本是一种趣味活动,但是,有的红包如果抢了拒不...【详细内容】
2021-10-20  Tags: 微信群  点击:(81)  评论:(0)  加入收藏
微信为保证用户体验以及防止乱加好友情况的出现,用户在拉取群二维码时都会自动设定一个识别有效期,每个微信群二维码有效期的时间是7天。与此同时还有扫码入群200人数限制。微...【详细内容】
2021-08-04  Tags: 微信群  点击:(388)  评论:(0)  加入收藏
写在前面微信群牛皮癣,指的是在微信群里面恶心群发小广告的用户,是微信群主最痛恨的一波人。如果熟悉早起的读者可以知道我有一个技术交流群,但是自从建群以来就饱受小广告的困...【详细内容】
2020-09-09  Tags: 微信群  点击:(45)  评论:(0)  加入收藏
【公职人员注意,微信群里这些信息不能发】民生视角在微信群里发表重大原则问题不同中央保持一致的言论或发表违背四项基本原则,违背、歪曲党的改革开放决策的言论,严重者将被开...【详细内容】
2020-09-02  Tags: 微信群  点击:(215)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条