
添加描述正則表達式
微信羣牛皮癬
,指的是在微信羣裏毫無下限的羣發小廣告的用戶,是微信羣主最痛恨的一波人。
若是熟悉早起的讀者能夠知道我有一個技術交流羣,可是自從建羣以來就飽受小廣告的困擾。他們假裝成正常人混進羣而後不停的發送廣告轟炸,嚴重的打亂了羣內的技術交流氣氛👇

添加描述安全
或者是一聲不吭的去騷擾每個羣成員👇

添加描述微信
雖然不清楚是什麼可以驅使他們這樣徹徹底底的努力成爲最強微信羣牛皮癬(多是鈔能力),但在經歷太屢次的騷擾以後,我開始思考是否能夠用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一樣的缺點,那就是因爲
模擬真人操做而致使的速度慢
,而且它的定位方式
僅支持座標
,因此還須要保證在操做的過程當中微信窗口不能夠被移動,不然以前記錄的元素將所有失效,此處建議開發者能夠升級更多的定位方式。