利用python在微信群中簽到、搶沙發
注意
- 程式僅能在電腦上運行,運行時需要保證群界面在最前端且不被移動,
背景
我是一名高中生(2020年),疫情期間,在家上網課,有的老師讓我們在班群里簽到,
其中一個群反應速度特別快,老師一說“簽到吧”,不到1秒,近半個班的人就回復了,所以,要是搶到了沙發,就特別有成就感,??
實作前
實作目標需做到兩點:
- 判斷是否提交簽到,
- 提交簽到,
思考:
1. 判斷是否提交簽到
也就是判斷老師是否發表了簽到訊息,
由觀察可知,在微信群中,若拉動條在最下端,這時群里來了新訊息,且行數一定時,新訊息會出現在固定位置,
而我們老師在發布簽到通知時,總是發“簽到吧”或者“同學們簽到吧”之類文字,不會超過一行,因此訊息行數固定為一行,
接下來通過分析新訊息的頭像,就可以判斷資訊是否是老師發送的,避免在有同學手滑提前回復時,程式出現誤判;
如下圖,是這時需判斷發送人,
訊息若是老師發的,那十有八九是通知簽到,
不是的話,發送就發送了吧,這么做可以省去程式對文本的分析,所以,我們只要不斷截屏檢測該固定位置,判斷是否是老師的頭像,就可以判斷是否應該簽到了,
至于如何實作,我稍后說,下面介紹第二個需求的思考,
2. 提交簽到
這里,使程式模擬鍵盤按下回車來發送訊息,
提前打下發送資訊,保持游標在編輯框中,
- 綜上,程式流程如下:
用PPT做的,我沒能用Markdown做出來,
具體實作
首先是截屏,這里我使用的是
pyautogui,
截圖用法如下:
pyautogui.screenshot(region=[710, 720, 500, 250])
# x, y , x1, y1
運行上述代碼會截取螢屏 (x, y) 到 (x + x1, y + y1) 區間的內容,
用IPython的話,影像會直接顯示在控制臺上,
然后,多次嘗試,找到頭像的坐標,
我進行了多次嘗試,
找到位置后定義函式:
def getscreenshot():
return pyautogui.screenshot(region=[425,590,45,47])
注意,這個坐標不一定適用于你的電腦哦??,
接下來,截取老師的頭像,留作正確結果,用回傳影像的save方法,保存圖片到和程式的相同路徑下,如
XXX.save('老師的頭像.png'),在加載時,用PIL模塊的Image的open方法加載圖片就好,如:
goal = Image.open('老師的頭像.png')
我使用模塊
pynput模擬鍵盤,這個模塊也可以控制、監聽滑鼠和鍵盤,并且是跨平臺的,這里只用到了一點,
代碼如下:
import pynput
def enter():
ctr = pynput.keyboard.Controller() #獲得控制元件,
ctr.press(pynput.keyboard.Key.enter) #按下回車,
ctr.release(pynput.keyboard.Key.enter)#松開回車,
最后,定義main函式:
def main():
while getscreenshot() != goal:
pass
enter()
print("Success.")
全部代碼如下:
import pynput
from PIL import Image
goal = Image.open('老師的頭像.png')
#加載目標檔案,需要你自己提前用getscreenshot函式截取,
def getscreenshot():
return pyautogui.screenshot(region=[425,590,45,47])
def enter():
ctr = pynput.keyboard.Controller()
ctr.press(pynput.keyboard.Key.enter)
ctr.release(pynput.keyboard.Key.enter)
def main():
while getscreenshot() != goal:#如果截圖和目標不相同,就一直回圈,
pass
enter()
print("Success.")
if __name__ == '__main__':
main()
閑談
寫完程式,感覺用python實作這種簡單的影像識別并不太困難,
而我們那位老師,每次讓我們簽到,然后手動核對、填寫Excel在上交學校,做了很多重復的機械性作業,
如果他會python,上網課這么長時間,足夠把這項作業自動化了,畢竟elif足夠勝任了,
學編程真好,??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151732.html
標籤:Python
上一篇:大一新生,遇到了點問題。




