序幕
微信群牛皮癬,指的是在微信群里毫無下限的群發小廣告的用戶,是微信群主最痛恨的一波人,如果熟悉早起的讀者可以知道我有一個技術交流群,但是自從建群以來就飽受小廣告的困擾,他們偽裝成正常人混進群然后不停的發送廣告轟炸,嚴重的打亂了群內的技術交流氣氛: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)的判斷,但是朋友圈隱藏的更多資訊卻很難提取挖掘,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/107561.html
標籤:其他
上一篇:Python有哪些神一般的騷操作? 遠遠不止搶車票、搶紅包《附代碼》
下一篇:Python爬蟲的常見依賴庫大全
