1. 程式人生 > 其它 >【Python開發】那些年因填報體溫困擾了我的雙手

【Python開發】那些年因填報體溫困擾了我的雙手

一、起因

因為這些天要求報體溫限制了我的雙手,還時不時的給忘了。怎麼辦,自動化吧!怎麼自動化,直接伺服器定時任務吧。這裡因為從除錯到伺服器定時任務並實現任務通知,整個的流程比較複雜,我就簡單說一下自己開發的思路吧。個人娛樂,大佬輕噴。畢竟這種不起眼的指令碼也就只有我好意思拿得出手。好久沒更新文章了,水一下。(既然不能搞漏洞復現就安心寫開發)

二、問題需求

使用的操作還是相對比較複雜的,這裡簡單羅列一下吧。後文對比較複雜的操作進行詳細介紹。

  • 谷歌自動化
  • 登入介面驗證碼識別
  • 本地圖片上傳
  • 識別彈窗
  • xpath解析
  • 完成提醒

三、驗證碼

這裡用了第三方,一個打碼平臺。畢竟驗證碼識別這東西一塊錢可以識別很多次,沒必要去自己做。當然不嫌麻煩可以去卷積神經網路做深度學習。我感覺沒必要吧,API它不香嗎。現成的模組,直接呼叫就ok了。

四、圖片上傳

使用selenium做自動化時,我們經常會遇到的一個讓人頭疼的問題就是檔案上傳。問題的難點在於selenium無法識別並操作Windows視窗,若我們可以繞過彈出框直接把檔案資訊上傳給選擇按鈕,問題就解決了。分析HTML,發現無論是普通前臺還是Extjs,他們的html有一個共同的特點,具有以下程式碼:

<input ..... type="file" ...../>

我們可以使用selenium自帶的sendkeys把檔案路徑(相對絕對無所謂)傳給該元素,就可繞過選擇視窗直接上傳檔案。

解決方案: driver.find_element_by_name(XXXXX).sendKeys("filePath")定位元素根據情況而定,有時候用name定位不到時,可使用xpath進行定位。如:driver.find_element_by_xpath("//li[@id='img_list_1']/

input[@type='file']").send_keys('E:\imgs/1.png')

五、彈窗識別

1.先用switch_to_alert()方法切換到alert彈出框上

2.可以用text方法獲取彈出的文字資訊

3.accept()點選確認按鈕

4.dismiss()相當於點右上角x,取消彈出框

六、完成提醒

任務完成後的機器人提醒有跟多種。我這裡簡單講一下最簡單的Server醬。當然我還是習慣呼叫釘釘API。

Server醬是什麼?

Server醬」,英文名「ServerChan」,是一款「手機」和「伺服器」、「智慧裝置」之間的通訊軟體。

說人話?就是從伺服器、路由器等裝置上推訊息到手機的工具。

開通並使用上它,只需要一分鐘:

微信掃碼登入
設定訊息通道
發訊息,一般有兩種方式:在支援Server醬的軟體介面或配置檔案中填入SendKey,即可使用。你也可以自己往 https://sctapi.ftqq.com/.send 傳送請求,就可以收到訊息啦。

七、完整程式碼

#!/user/bin/
# -*- coding:UTF-8 -*-
# Author:Master

from selenium import webdriver
from time import sleep
from PIL import Image
# 打碼平臺,網站自行註冊http://ttshitu.com/
from 打碼平臺 import base64_api
import time
from selenium.webdriver.support.select import Select

ren={'姓名':'身份證號',}

for key,value in ren.items():
    sfz = value
    passwd = sfz[12:]
    path = r'./chromedriver'

    print(key+'正在填報體溫!')
    driver = webdriver.Chrome(executable_path=path)
    # 考慮網站安全性,自行修改網址
    driver.get("https://www.cnblogs.com/mastersir/p/16261963.html")
    #賬號登入
    driver.find_element_by_xpath('//*[@id="name"]').send_keys(sfz)
    sleep(1)
    driver.find_element_by_xpath('//*[@id="password"]').send_keys(passwd)
    sleep(2)
    #儲存驗證碼
    driver.save_screenshot('aa.png')
    rangle = (
    int(1948), int(587), int(2222), int(645))
    i = Image.open('./aa.png')
    code_img_name = './code.png'
    frame = i.crop(rangle)
    frame.save(code_img_name)

    img_path = './code.png'
    # 打碼平臺賬號密碼
    code = base64_api(uname='admin', pwd='admin', img=img_path)
    sleep(1)

    #輸入驗證碼登入
    driver.find_element_by_xpath('//*[@id="veryCode"]').send_keys(code)
    sleep(2)
    driver.find_element_by_xpath('//*[@id="denglu"]').click()
    Cookies=driver.get_cookies()
    Cookies = Cookies[0]['name'] +'=' + Cookies[0]['value']
    #填報體溫
    sleep(1)
    driver.get('http://wwww.yunxs.top/student/student/healthReport/healthReportList.jsp')
    time.sleep(1)
    driver.find_element_by_xpath('/html/body/form/div/button').click()
    sleep(1)
    s = driver.find_element_by_xpath('/html/body/form/div/div/div[4]/div/div[2]/div[1]/div/select')
    Select(s).select_by_visible_text("正常")
    s.click()
    time.sleep(1)
    y = driver.find_element_by_xpath('//*[@id="healthReport"]/div/div[2]/div[3]/div/select')
    Select(y).select_by_visible_text("是")
    y.click()
    time.sleep(1)
    driver.find_element_by_xpath('/html/body/form/div/div/div[4]/div/div[2]/div[6]/div/input').send_keys("正常")
    driver.find_element_by_xpath('//*[@id="healthReport"]/div/div[2]/div[7]/div/input').send_keys("正常")
    sleep(1)
    s2= Select(driver.find_element_by_id('province'))
    s2.select_by_value('XX省')
    time.sleep(1)
    s3= Select(driver.find_element_by_id('city'))
    s3.select_by_value('XX市')
    time.sleep(1)
    s4= Select(driver.find_element_by_id('district'))
    s4.select_by_value('XX市')
    sleep(1)

    jsString = "document.getElementsByClassName('form-control dingWeiInfo')[0].removeAttribute('readonly')"
    driver.execute_script(jsString)
    driver.find_element_by_xpath('//*[@id="healthReport"]/div/div[2]/div[10]/div[1]/input').send_keys("XX省XX市XX區XX路")
    sleep(2)
    upload = driver.find_element_by_xpath('//*[@id="imgUplod"]')
    # 上傳圖片路徑
    upload.send_keys('/Users/Downloads/xck.jpeg')
    sleep(1)
    driver.find_element_by_xpath('//*[@id="text"]/div[5]/button').click()
    sleep(1)
    # 確認彈窗
    alert=driver.switch_to.alert
    alert.accept()
    print('\033[1;35m 已完成 \033[0m')
    print('-'*30)
    sleep(3)

八、總結

指令碼用了最基礎的方法。通過selenium實現谷歌自動化模擬點選螢幕。驗證碼識別由於是程式碼生成的,最後非圖片格式,所以無法直接進行下載處理。這裡解決辦法是截圖,定位擷取驗證碼,在進行識別。在圖片上傳操作的時候容易獲取錯誤xpath,具體參考上文描述。如果點一下還覺得累就去伺服器做個定時任務吧。這次水文就到這了。