29

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

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI1MTE2ODg4MA%3D%3D&%3Bmid=2650074804&%3Bidx=1&%3Bsn=a6d20f4d7df0011bdaf5de4337716625
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

预备通知 | Python数据挖掘与Stata应用能力提升与实证前沿国庆工作坊

序幕

微信群牛皮癣,指的是在微信群里毫无下限的群发小广告的用户,是微信群主最痛恨的一波人。如果熟悉早起的读者可以知道我有一个技术交流群,但是自从建群以来就饱受小广告的困扰。他们伪装成正常人混进群然后不停的发送广告轰炸,严重的打乱了群内的技术交流气氛:point_down: y2uIbuZ.png!mobile 或者是一声不吭的去骚扰每一个群成员:point_down: VRvQVzf.png!mobile 虽然不清楚是什么能够驱使他们这样不折不扣的努力成为最强微信群牛皮癣(可能是钞能力),但在经历太多次的骚扰之后,我开始思考是否可以用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:point_down:

YRF3iaU.gif!mobile

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

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

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()

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

  • 点击微信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}不是广告号")

uAFVvqq.gif!mobile

可以看到成功将早小起的微信从广告号中排除 rUJRveV.png!mobile 那么接下来只需要记录下每两个群成员之间间隔的坐标距离,之后循环去 模拟滚动 或者 下拉 来实现上述过程,就可以将群里所有成员的微信号根据规则1进行判断,找到异常的那些成员 单独进行判断IvAZVf.png!mobile 可以看到最终是找到了6个疑似广告号的微信,接下来通过其他规则的手动判断最终将两个用户判定为广告高风险用户并移除。

写在最后

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

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

近期文章

Python网络爬虫与文本数据分析

rpy2库 | 在jupyter中调用R语言代码

tidytext | 耳目一新的R-style文本分析库

reticulate包 | 在Rmarkdown中调用Python代码

plydata库 | 数据操作管道操作符>>

七夕礼物 | 全网最火的钉子绕线图制作教程

读完本文你就了解什么是文本分析

文本分析在经管领域中的应用概述

综述:文本分析在市场营销研究中的应用

plotnine: Python版的ggplot2作图库

小案例: Pandas的apply方法   

stylecloud:简洁易用的词云库  

用Python绘制近20年地方财政收入变迁史视频   

Wow~70G上市公司定期报告数据集

漂亮~pandas可以无缝衔接Bokeh

YelpDaset: 酒店管理类数据集10+G

后台回复 2020 0909 获取 本文的代码

分享 ”和“ 在看 ”是更好的支持!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK