日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

2.#技术|Python实现钉钉课程自动签到, opencv+threading+tkinter

發布時間:2023/12/2 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.#技术|Python实现钉钉课程自动签到, opencv+threading+tkinter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假期的最后8天開了一門雙學位的計算機網課————Android程序設計,從早上8點一直上到下午5點30,不定時的在群里發布課程簽到,每次我都倒霉的錯過,于是在網上google有沒有啥自動簽到的東東,可以救救孩子,結果卻發現全是上班族的釘釘打卡,算了那就自己搜搜輪子拼裝一個吧,哈哈哈哈。遂有此文。


用到的庫:

import sys from time import sleep import tkinter as tk import pyautogui import pyscreeze import cv2 import threading import urllib.request as urllib

python實現思路:

  • 用opencv+pyscreeze掃描屏幕,找到"立即簽到"四字所在位置。
  • 計算中心點,pyautogui調用點擊。
  • 設置掃描屏幕時間,默認為30S掃描一次。
  • tkinter編一個 丑陋 的可視化頁面。
  • "立即簽到"按鈕長這個樣子


    話不多說,上代碼

    import sys from time import sleep import tkinter as tk import pyautogui import pyscreeze import cv2 import threading import urllib.request as urllibdef method1():# print("執行了方法1")screenScale=1target= cv2.imread(r'targe.png',cv2.IMREAD_GRAYSCALE)screenshot=pyscreeze.screenshot('./my_screenshot.png')temp = cv2.imread(r'my_screenshot.png',cv2.IMREAD_GRAYSCALE)theight, twidth = target.shape[:2]tempheight, tempwidth = temp.shape[:2]print("目標圖寬高:"+str(twidth)+"-"+str(theight))print("模板圖寬高:"+str(tempwidth)+"-"+str(tempheight))scaleTemp=cv2.resize(temp, (int(tempwidth / screenScale), int(tempheight / screenScale)))stempheight, stempwidth = scaleTemp.shape[:2]print("縮放后模板圖寬高:"+str(stempwidth)+"-"+str(stempheight))res = cv2.matchTemplate(scaleTemp, target, cv2.TM_CCOEFF_NORMED)mn_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)if(max_val>=0.9):# 計算出中心點top_left = max_locbottom_right = (top_left[0] + twidth, top_left[1] + theight)tagHalfW=int(twidth/2)tagHalfH=int(theight/2)tagCenterX=top_left[0]+tagHalfWtagCenterY=top_left[1]+tagHalfH#左鍵點擊屏幕上的這個位置pyautogui.click(tagCenterX,tagCenterY,button='left')print("位置是:",tagCenterX,tagCenterY)pyautogui.moveTo(tagCenterX-500, tagCenterY)else:print("未發現")def method2():# print("執行了方法2")root = tk.Tk()root.title('Qust釘釘自動簽到')root.geometry('480x400')index = tk.Label(root, text='開始運行了。。。。', bg='#D3D3D3', font=('微軟雅黑', 10))index.place(relx=0.25, rely=0.1, relwidth=0.5, relheight=0.15)btn1 = tk.Button(root, text='點擊停止', bg='#D3D3D3', font=('微軟雅黑', 13), command=sys.exit)btn1.place(relx=0.25, rely=0.5, relwidth=0.5, relheight=0.15)root.mainloop()def method3():# print("執行了方法3")while (1 == 1):method1()sleep(30)#等待30s運行一次,這里你可以自己改def thread_it(): # 多線程thread1 = threading.Thread(target=method3)# thread2 = threading.Thread(target=method2)thread1.setDaemon(True)# thread2.setDaemon(True)thread1.start()# thread2.start()method2()if __name__ == '__main__':urllib.urlretrieve('https://s4.ax1x.com/2022/03/03/bYWMon.png','./targe.png')#這里面的地址是“立即簽到”這張圖片root = tk.Tk()root.title('Qust釘釘自動簽到')root.geometry('480x400')index = tk.Label(root, text='編不出好看的UI,>0< ...', bg='#D3D3D3', font=('微軟雅黑', 10))index.place(relx=0.25, rely=0.1, relwidth=0.5, relheight=0.15)# 第一個按鈕btn1 = tk.Button(root, text='點擊這里運行就完了', bg='#D3D3D3', font=('微軟雅黑', 13), command=lambda:[root.destroy(),thread_it()])btn1.place(relx=0.25, rely=0.5, relwidth=0.5, relheight=0.15)root.mainloop()

    期間踩過的坑有:

    • 1.鼠標點擊后會停留在"立即簽到"上,遮擋部分字體,影響識別時間,于是設置了點擊后鼠標位置自動左移500個像素,遂解決,識別速度嘎嘎快。
    • 2.tkinter 在默認運行主線程時會等待子線程運行完畢才繼續,使得程序無響應(如上圖),引入多線程后解決。

    結果:

    最終呈現出來的效果還是非常令人滿意的,當天晚上我開了一個小群,不間斷的發送了幾十條簽到,在程序不間斷運行6個小時后依然能準確搞定。(雖然python運行就是慢,但抵不住它編的快啊!!!!)

    附上截圖:

    就這樣,下次見。

    總結

    以上是生活随笔為你收集整理的2.#技术|Python实现钉钉课程自动签到, opencv+threading+tkinter的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。