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

2020-09-09     AI科技大本營

原標題:微信群總有人發廣告?用Python寫一個自動化機器人消滅他

作者 | 劉早起

出品 | 早起Python(ID: zaoqi-python)

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

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

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

第一回合

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

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

  • 沒有設置 微信號

  • 頭像為網紅女生

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

  • 沒發過 朋友圈

  • 沒有 朋友圈背景圖

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

並且根據歷史數據, 符合1、3條的用戶有極大機率為小廣告愛好者,那麼接下來要做的就是 用Python寫代碼找出微信裡面的這些人。在總結出這一規律後很樂觀的認為實現這一需求並不困難,因為我在幾年前就曾拿過Python研究微信好友,不論是 wxpy還是itchat操作起來應該都不複雜,但是事實確證明我還是太年輕了

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

1203

為了你的帳號安全,此微信號已不允許登錄網頁微信。

你可以使用Windows微信或Mac微信在電腦端登錄。

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

第二回合

如果你經常寫Python爬蟲,那麼你會知道在有些情況下,與其使用Requests對付一些噁心的反爬措施,不如Selenium操作起來方便。所以在發現想使用基於微信API的思路失效後,我將目光轉向了相對笨一點的方法————pynput

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

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

就像上面GIF演示的一樣,先導入pynput並實例一個滑鼠控制器,接著將微信在狀態欄的位置提交給mouse.position,這樣滑鼠就會移動到該位置,再使用mouse.press來模擬滑鼠點擊即可自動打開微信。那麼問題來了,如何獲得我想要的位置的坐標?總不能一點一點試吧!

pynput除了使可以使用Controller來控制滑鼠,也可以監控滑鼠,比如使用下面的代碼就可以記錄下程序啟動後滑鼠的每一個點擊操作所在的位置

frompynput importmouse

defon_move(x, y ):

print( '滑鼠移動至 {0}'.format(

(x,y)))

defon_click(x, y , button, pressed):

print( '{0} 在坐標 {1}'.format( '滑鼠點擊'ifpressed else'滑鼠釋放', (x, y)))

ifnotpressed:

returnFalse

whileTrue:

withmouse.Listener(on_move = on_move,on_click = on_click) aslistener:

listener.join

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

  • 點擊微信app

  • 點擊需要的群聊

  • 依次點擊每一個群成員頭像

  • 移動到微信號的位置

  • 雙擊該微信號

  • 複製該微信號判斷是否為初始微信號

在上面的過程中,值得說的是最後一步,複製我們可以使用pynput中的鍵盤控制器,在雙擊選中對應微信號之後通過下面的代碼實現模擬鍵盤輸入Command + C完成複製操作

frompynput.keyboard importKey

frompynput.keyboard importController asController1

keyboard = Controller1

withkeyboard.pressed(Key.cmd):

keyboard.press( 'c')

keyboard.release( 'c')

但是粘貼則不需要使用pynput通過模擬command+c來粘貼到另一個編輯中複雜過程,我們可以使用第三方庫pyperclip,直接通過下面兩行代碼即可將複製好的文字轉為 字符串

importpyperclip

pyperclip.paste

在將群成員的微信號轉換為 字符串後,不論我們是通過判斷字符串的長度還是用正則表達式或者是其他的方法都可以輕鬆的判斷該成員的微信號是否為初始微信號,實現規則1的判斷,下面的代碼與動態圖就是獲取第一個群成員微信號的 完整過程

frompynput.mouse importButton, Controller

importtime

frompynput.keyboard importKey

frompynput.keyboard importController asController1

importpyperclip

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

withkeyboard.pressed(Key.cmd):

keyboard.press( 'c')

keyboard.release( 'c')

time.sleep( 1)

wechatid = pyperclip.paste

print( f"微信號 {wechatid}疑似廣告號" iflen(wechatid) > 20elsef"微信號 {wechatid}不是廣告號" )

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

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

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

寫在最後

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

同時pynput有著和selenium同樣的缺點,那就是由於 模擬真人操作而導致的速度慢,並且它的定位方式 僅支持坐標,所以還需要保證在操作的過程中微信窗口不可以被移動,否則之前記錄的元素將全部失效,此處建議開發者可以升級更多的定位方式。

文章來源: https://twgreatdaily.com/zh/ZgR7c3QBd8y1i3sJc5mr.html











CSDN湘苗培優

2020-12-24