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

添加描述安全
或者是一声不吭的去骚扰每个群成员👇

添加描述微信
虽然不清楚是什么可以驱使他们这样彻彻底底的努力成为最强微信群牛皮癣(多是钞能力),但在经历太屡次的骚扰以后,我开始思考是否能够用Python消灭他们。
第一回合
其实一开始的思路很简单,总共分两步,首先成功识别出这些人再用Python将他们踢出去便可。
可是这两步,每一步都不简单,先来讲说第一步
如何准确的识别
这些用户,网上没有数据也没有一个好的鉴别标准,只能用个人大脑完成特征识别。通过这几个月,近百份发广告用户的样本训练,我这个
“人工智能”
基本能够判断一个非正经常使用户
至少知足下面几条中的三条以上
:
-
没有设置 微信号
-
头像 为网红女生
-
微信名 为特殊符号或者表情
-
没发过 朋友圈
-
没有 朋友圈背景图
-
经过后不会有除进群申请外的其余回复
而且根据历史数据,
符合一、3条的用户有极大几率为小广告爱好者
,那么接下来要作的就是
用Python写代码找出微信里面的这些人
。
在总结出这一规律后很乐观的认为实现这一需求并不困难,由于我在几年前就曾拿过Python研究微信好友,不管是wxpy仍是itchat操做起来应该都不复杂,可是事实确证实我仍是太年轻了

添加描述app
不知从什么时候起,虽然这些库还能安装使用可是微信基本已经
禁止了大部分人的网页版微信登录权限
,所以当我使用多个微信号分别扫完登录微信的二维码以后,无一例外的提示我
<
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
(
)

添加描述url
那么接下来的任务就简单了,咱们只须要保持微信窗口不移动,在记录下每个关键位置的坐标
(微信图标位置,群聊窗口位置,单个群成员头像位置)
以后。
好比咱们想对上面说的第一条规则进行判断即获取每个群成员微信号是否设置,就能够按照模拟如下操做实现:
-
点击微信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}不是广告号"
)

添加描述spa
能够看到成功将早小起的微信从广告号中排除

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

添加描述orm
能够看到最终是找到了6个疑似广告号的微信,接下来经过其余规则的手动判断最终将两个用户断定为广告高风险用户并移除。
写在最后
经过上面的操做,虽然成功的踢出了两个疑似广告号,但整体来讲仍是
败了
。由于依旧很难去判断是否真的踢对了人,若是踢错了,那么则粉丝-1,同时也能够发现想用Python准确找到群里的牛皮癣仍是很是困难的,使用pynput最多能够完成
微信名、微信号及头像
(使用识图API)的判断,可是朋友圈隐藏的更多信息却很难提取挖掘。
同时pynput有着和selenium一样的缺点,那就是因为
模拟真人操做而致使的速度慢
,而且它的定位方式
仅支持坐标
,因此还须要保证在操做的过程当中微信窗口不能够被移动,不然以前记录的元素将所有失效,此处建议开发者能够升级更多的定位方式。