1. 程式人生 > 實用技巧 >微信群總是有人發廣告?我用Python寫個機器人消滅他!

微信群總是有人發廣告?我用Python寫個機器人消滅他!

序幕

微信群牛皮癬,指的是在微信群裡毫無下限的群發小廣告的使用者,是微信群主最痛恨的一波人。如果熟悉早起的讀者可以知道我有一個技術交流群,但是自從建群以來就飽受小廣告的困擾。他們偽裝成正常人混進群然後不停的傳送廣告轟炸,嚴重的打亂了群內的技術交流氣氛:point_down:

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:961562169

或者是一聲不吭的去騷擾每一個群成員:point_down:雖然不清楚是什麼能夠驅使他們這樣不折不扣的努力成為最強微信群牛皮癬(可能是鈔能力),但在經歷太多次的騷擾之後,我開始思考是否可以用Python消滅他們。

第一回合

其實一開始的思路很簡單,總共分兩步,首先成功識別出這些人再用Python將他們踢出去即可。

但是這兩步,每一步都不簡單,先來說說第一步 如何準確的識別這些使用者,網上沒有資料也沒有一個好的鑑別標準,只能用我的大腦完成特徵識別。經過這幾個月,近百份發廣告使用者的樣本訓練,我這個“ 人工智慧”基本可以判斷一個非正常使用者 至少滿足下面幾條中的三條以上

  • 沒有設定 微訊號

  • 頭像為網紅女生

  • 微信名為特殊符號或者表情

  • 沒發過 朋友圈

  • 沒有 朋友圈背景圖

  • 通過後不會有除進群申請外的其他回覆

並且根據歷史資料, 符合1、3條的使用者有極大概率為小廣告愛好者,那麼接下來要做的就是用Python寫程式碼找出微信裡面的這些人

。在總結出這一規律後很樂觀的認為實現這一需求並不困難,因為我在幾年前就曾拿過Python研究微信好友,不論是 wxpy還是 itchat操作起來應該都不復雜,但是事實確證明我還是太年輕了

不知從何時起,雖然這些庫還能安裝使用但是微信基本已經 禁止了大部分人的網頁版微信登陸許可權,因此當我使用多個微訊號分別掃完登陸微信的二維碼之後,無一例外的提示我

<error><ret>1203</ret><message>
為了你的帳號安全,此微訊號已不允許登入網頁微信。

你可以使用Windows微信或Mac微信在電腦端登入。
</message></error>

這就讓人頭疼了,總不能手動的去一個一個check我的幾千個微信好友吧,於是我開始思考是否有其他的解決辦法。

第二回合

Requests
Selenium
pynput

pynput是一款使用Python來控制和監控電腦滑鼠、鍵盤的第三方庫,說到這裡你大概明白我想怎麼做了,直接用API取資料搞不定,那麼我就像Selenium一樣, 模擬點選一個一個好友來實現我想要的操作。

下面簡單說一下這個庫,因為沒有太多依賴庫所以安裝起來很簡單,直接 pip install pynput即可,使用起來也很簡單,對於滑鼠操作只依賴座標,看個demo:point_down:

就像上面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()

那麼接下來的任務就簡單了,我們只需要保持微信視窗不移動,在記錄下每一個關鍵位置的座標(微信圖示位置,群聊視窗位置,單個群成員頭像位置)之後,比如我們想對上面說的第一條規則進行判斷即獲取每一個群成員微訊號是否設定,就可以按照模擬以下操作實現:

  • 點選微信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}不是廣告號")

可以看到成功將早小起的微信從廣告號中排除

那麼接下來只需要記錄下每兩個群成員之間間隔的座標距離,之後迴圈去 模擬滾動或者 下拉來實現上述過程,就可以將群裡所有成員的微訊號根據規則1進行判斷,找到異常的那些成員 單獨進行判斷

可以看到最終是找到了6個疑似廣告號的微信,接下來通過其他規則的手動判斷最終將兩個使用者判定為廣告高風險使用者並移除。

寫在最後

通過上面的操作,雖然成功的踢出了兩個疑似廣告號,但總體來說還是 敗了。因為依舊很難去判斷是否真的踢對了人,如果踢錯了,那麼則粉絲-1,同時也可以發現想用Python準確找到群裡的牛皮癬還是非常困難的,使用pynput最多可以完成 微信名、微訊號及頭像(使用識圖API)的判斷,但是朋友圈隱藏的更多資訊卻很難提取挖掘。