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

大資料文摘發表於2020-09-27

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

大資料文摘授權轉載自早起Python

作者:劉早起


微信群牛皮癬,指的是在微信群裡毫無下限的群發小廣告的使用者,是微信群主最痛恨的一波人。


如果熟悉早起的讀者可以知道我有一個技術交流群,但是自從建群以來就飽受小廣告的困擾。他們偽裝成正常人混進群然後不停的傳送廣告轟炸,嚴重的打亂了群內的技術交流氣氛?


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


或者是一聲不吭的去騷擾每一個群成員?


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


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


第一回合


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


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

  • 沒有設定微訊號

  • 頭像為網紅女生

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

  • 沒發過朋友圈

  • 沒有朋友圈背景圖

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


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


在總結出這一規律後很樂觀的認為實現這一需求並不困難,因為我在幾年前就曾拿過Python研究微信好友,不論是wxpy還是itchat操作起來應該都不復雜,但是事實確證明我還是太年輕了微信群總是有人發廣告?看我用Python寫一個自動化機器人消滅他!


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


<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.144531254.546875)
time.sleep(2)
mouse.press(Button.left)
mouse.release(Button.left)

#點選頭像
mouse.position = (1194.140625441.05859375)
time.sleep(1)
mouse.press(Button.left)
mouse.release(Button.left)

# 點選選中文字
mouse.position = (965.60546875284.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同樣的缺點,那就是由於模擬真人操作而導致的速度慢,並且它的定位方式僅支援座標,所以還需要保證在操作的過程中微信視窗不可以被移動,否則之前記錄的元素將全部失效,此處建議開發者可以升級更多的定位方式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562039/viewspace-2724380/,如需轉載,請註明出處,否則將追究法律責任。

相關文章