python實(shí)現(xiàn)自動(dòng)打卡小程序
本文實(shí)例為大家分享了python實(shí)現(xiàn)自動(dòng)打卡小程序的具體代碼,供大家參考,具體內(nèi)容如下
""" 湖南大學(xué)疫情防控每日自動(dòng)打卡程序v1.0 author: Liu time:2021/3/16 """ from selenium import webdriver from selenium.webdriver.chrome.options import Options from PIL import Image from bs4 import BeautifulSoup import requests from aip import AipOcr import time from datetime import datetime import re class DailyAttend(object): def __init__(self, browser, stu_id, passwd, t, address, tmp_yesterday, tmp_today): self.browser = browser self.stu_id = stu_id self.passwd = passwd self.t = t self.address = address self.tmp_yesterday = tmp_yesterday self.tmp_today = tmp_today self.img_path = "captcha.png" def get_captcha_img(self): url = "https://fangkong.hnu.edu.cn/app/#/login?redirect=%2Fhome" self.browser.get(url) self.browser.find_element_by_class_name("vcdoe-tips").click() # 模擬點(diǎn)擊使驗(yàn)證碼加載出來 time.sleep(2) webpage = self.browser.page_source soup = BeautifulSoup(webpage, features="html.parser") div = soup.find("div", attrs={"class": "login-content"}) src = div.find_all("img")[2].attrs["src"] # 從html中解析出圖片鏈接 r = requests.get(src) if r.status_code == 200: open(self.img_path, "wb").write(r.content) else: print("網(wǎng)絡(luò)不佳,無法加載驗(yàn)證碼圖片") def recog_captcha_img(self): img = Image.open(self.img_path) img = img.convert('L') # P模式轉(zhuǎn)換為L(zhǎng)模式(灰度模式默認(rèn)閾值127) count = 165 # 設(shè)定閾值 table = [] for i in range(256): if i < count: table.append(0) else: table.append(1) img = img.point(table, '1') img.save(self.img_path) # 保存處理后的驗(yàn)證碼 ## 調(diào)用百度ocr # 識(shí)別碼 APP_ID = "23779944" API_KEY = "FPgsSXsuqXk3twpqVHmNNK6g" SECRET_KEY = "nG08oGzErk8CdMvDAynAiGdzfBjHr3NO" # 初始化對(duì)象 client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 讀取圖片 def get_file_content(file_path): with open(file_path, 'rb') as f: return f.read() image = get_file_content(self.img_path) # 定義參數(shù)變量 options = {'language_type': 'ENG', } # 識(shí)別語言類型,默認(rèn)為'CHN_ENG'中英文混合 # 調(diào)用通用文字識(shí)別 result = client.basicGeneral(image, options) # 高精度接口 basicAccurate for word in result['words_result']: self.captcha = (word['words']) def login(self): ## 登錄 while True: self.browser.find_element_by_css_selector("[type=text]").send_keys(self.stu_id) self.browser.find_element_by_css_selector("[type=password]").send_keys(self.passwd) self.browser.find_element_by_css_selector("[type=number]").send_keys(self.captcha) self.browser.find_element_by_tag_name("button").click() time.sleep(2) page = self.browser.page_source html = BeautifulSoup(page, features="html.parser") err_message = html.find("p", attrs={"class": "el-message__content"}) if err_message.text == "登錄成功": print("登錄成功!") break elif err_message.text == "賬號(hào)或密碼錯(cuò)誤": print("賬號(hào)或密碼錯(cuò)誤!請(qǐng)重新輸入!") self.stu_id = input("請(qǐng)輸入學(xué)號(hào):") self.passwd = input("請(qǐng)輸入密碼:") continue else: self.get_captcha_img() self.recog_captcha_img() continue def attend(self): success_messages = self.browser.find_elements_by_css_selector('p[class=el-message__content]') success_messages = [message.text for message in success_messages] if "今日已打卡" in success_messages: print("今日已打卡!") time.sleep(60) else: ## 選擇打卡定位 self.browser.find_elements_by_xpath('//div/span[text()="正在獲取定位..."]')[1].click() time.sleep(1) for i in range(17): self.browser.find_elements_by_xpath('//ul/li')[i + 1].click() time.sleep(1) self.browser.find_element_by_xpath('//ul/li[text()="岳麓區(qū)"]').click() time.sleep(1) self.browser.find_element_by_xpath('//div/button[text()="確認(rèn)"]').click() time.sleep(1) ## 輸入相關(guān)打卡信息并點(diǎn)擊打卡按鈕 self.browser.find_elements_by_css_selector('input[placeholder="街道門牌、樓層房間號(hào)等信息"]')[1].send_keys(self.address) temp = self.browser.find_elements_by_css_selector("input[placeholder=請(qǐng)輸入]") temp[0].send_keys(self.tmp_yesterday) temp[1].send_keys(self.tmp_today) self.browser.find_elements_by_css_selector( 'button[class="btnDaka van-button van-button--info van-button--normal van-button--block"]')[1].click() today = datetime.now().strftime("%Y-%m-%d") print(today + "打卡成功!") time.sleep(60) if __name__ == "__main__": ## 歡迎界面 print("=" * 100) print("打卡小程序") print("歡迎你湖南大學(xué)的朋友!開始使用吧!") print("=" * 100) ## 用戶輸入 while True: t = input("請(qǐng)輸入你的每日打卡時(shí)間(24小時(shí)制, 例如:00:10):") if re.search('^(([0-1][0-9])|(2[1-3])):[0-5][0-9]$', t) == None: print("你輸入的時(shí)間格式有誤,請(qǐng)重新輸入!") continue stu_id = input("請(qǐng)輸入你的學(xué)號(hào):") passwd = input("請(qǐng)輸入個(gè)人門戶密碼:") address = input("請(qǐng)輸入你的打卡詳細(xì)地址(例如:湖南大學(xué)北校區(qū)1舍):") tmp_yesterday = input("請(qǐng)輸入你的昨日體溫:") tmp_today = input("請(qǐng)輸入你的今日體溫:") print("=" * 100) if input("請(qǐng)檢查你的輸入是否無誤,若有誤則輸入y并重新輸入,若無誤則輸入n:") == "n": print("=" * 100) break user_info = { 't': t, 'stu_id': stu_id, 'passwd': passwd, 'address': address, 'tmp_yesterday': tmp_yesterday, 'tmp_today': tmp_today } ## 瀏覽器設(shè)置 chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) browser = webdriver.Chrome(executable_path="chromedriver.exe", options=chrome_options) ## 打卡 app = DailyAttend(browser, **user_info) # 實(shí)例化打卡器 print("正在等待打卡時(shí)間到來...") while True: if datetime.now().strftime("%H:%M") == t: app.get_captcha_img() app.recog_captcha_img() app.login() app.attend() else: time.sleep(10)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)處理Excel數(shù)據(jù)并生成只讀模式
這篇文章主要為大家詳細(xì)介紹了如何使用 Python 處理 Excel 數(shù)據(jù),并生成只讀模式的 Excel 文檔,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考下2023-11-11pycharm社區(qū)版安裝node.js插件運(yùn)行js代碼方法
PyCharm可以說是當(dāng)今最流行的一款Python IDE了,下面這篇文章主要給大家介紹了關(guān)于pycharm社區(qū)版安裝node.js插件運(yùn)行js代碼的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10python標(biāo)準(zhǔn)庫模塊之json庫的基礎(chǔ)用法
json庫是處理JSON格式的Python標(biāo)準(zhǔn)庫,json庫主要包括兩類函數(shù),操作函數(shù)和解析函數(shù),下面這篇文章主要給大家介紹了關(guān)于python標(biāo)準(zhǔn)庫模塊之json庫的基礎(chǔ)用法,需要的朋友可以參考下2022-06-06Python generator生成器和yield表達(dá)式詳解
這篇文章主要介紹了Python generator生成器和yield表達(dá)式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python進(jìn)行數(shù)據(jù)預(yù)處理的4個(gè)重要步驟
在數(shù)據(jù)科學(xué)項(xiàng)目中,數(shù)據(jù)預(yù)處理是最重要的事情之一,本文詳細(xì)給大家介紹python進(jìn)行數(shù)據(jù)預(yù)處理的4個(gè)重要步驟:拆分訓(xùn)練集和測(cè)試集,處理缺失值,處理分類特征和進(jìn)行標(biāo)準(zhǔn)化處理,需要的朋友可以參考下2023-06-06python使用opencv對(duì)圖像mask處理的方法
這篇文章主要介紹了python使用opencv對(duì)圖像mask處理的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python之虛擬環(huán)境virtualenv,pipreqs生成項(xiàng)目依賴第三方包的方法
今天小編就為大家分享一篇Python之虛擬環(huán)境virtualenv,pipreqs生成項(xiàng)目依賴第三方包的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python中json格式數(shù)據(jù)的編碼與解碼方法詳解
這篇文章主要介紹了Python中json格式數(shù)據(jù)的編碼與解碼方法,詳細(xì)分析了Python針對(duì)json格式數(shù)據(jù)的編碼轉(zhuǎn)換操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07Python中用函數(shù)作為返回值和實(shí)現(xiàn)閉包的教程
這篇文章主要介紹了Python中用函數(shù)作為返回值和實(shí)現(xiàn)閉包的教程,代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04