Skip to content

An automatic RPA robot for daily covid-19 report in Soochow University. 一个自动化实现苏州大学每日健康疫情打卡的工具,基于Python Selenium。

License

Notifications You must be signed in to change notification settings

Andrew8102/sudaDailyReport

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Linux无界面自动化打卡组合拳

适用于Linux系统的苏大每日健康打卡的无界面打卡程序,按照下面操作自行设置即可,主代码修改自 EuGEne老哥,谢谢你

如果是macOS或者Windows可以魔改本教程实现打卡

Python pip安装selenium

pip install selenium

CentOS 或其他版本Linux安装chrome

curl https://intoli.com/install-google-chrome.sh | bash

如果是macOS或windows

自己手动下载chrome浏览器就行,如果早就安装了就不用管了,然后可以参考原作者的实现有界面打卡

下载Chrome-driver

先查看chrome版本

google-chrome --version

再下载对应版本的driver

http://npm.taobao.org/mirrors/chromedriver上查地址

复制一下链接地址

然后拼接并解压

wget http://npm.taobao.org/mirrors/chromedriver/84.0.4147.30/chromedriver_linux
unzip chromedriver_linux64.zip

放入主程序

新建一个daka.py的文件,这个地方修改了原作者的一些代码,主要在打开浏览器函数中作了修改

# encoding=utf-8

from selenium import webdriver
from time import strftime, localtime
import requests
import time
import json
import os

# 开启浏览器


# 开启浏览器
def openChrome():
 options = webdriver.ChromeOptions()
 options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
 options.add_argument('window-size=1600x900') # 指定浏览器分辨率
 options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
 options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
 #options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
 #options.add_argument('--headless') # 浏览器不提供可视化页面.linux下如果系统不支持可视化不加这条会启动失败
 options.add_argument('disable-infobars')
 driver = webdriver.Chrome(options=options,executable_path='./chromedriver')
 return driver


def find(driver, str):
 try:
     driver.find_element_by_xpath(str)
 except:
     return False
 else:
     return True

# 流程


def operate_dk(driver):
 # 打开配置文件
 try:
     with open("config.json", encoding='utf-8') as f:
         config = json.load(f)
 except:
     print("配置文件错误!请检查配置文件是否与py文件放置于同一目录下,或配置文件是否出错!\n请注意'现人员位置'只可填入以下四项中的任意一项:'留校', '在苏州', '江苏省内其他地区', '在其他地区'")
     driver.quit()
     return -1
 else:
     # 老版本登陆
     # url = "http://ids1.suda.edu.cn/amserver/UI/Login?goto=http%3a%2f%2fmyauth.suda.edu.cn%2fdefault.aspx%3fapp%3dsswsswzx2%26jumpto%3d&welcome=%e5%b8%88%e7%94%9f%e7%bd%91%e4%b8%8a%e4%ba%8b%e5%8a%a1%e4%b8%ad%e5%bf%83&linkName=%e5%a6%82%e6%9e%9c%e6%97%a0%e6%b3%95%e4%bd%bf%e7%94%a8%e7%bb%9f%e4%b8%80%e8%ba%ab%e4%bb%bd%e7%99%bb%e5%bd%95%ef%bc%8c%e8%af%b7%e7%82%b9%e5%87%bb%e8%bf%99%e9%87%8c&linkUrl=http://aff.suda.edu.cn/_web/ucenter/login.jsp&gx_charset=UTF-8"
     # driver.get(url)
     # # 找到输入框并输入查询内容
     # elem = driver.find_element_by_id("IDToken1")
     # elem.send_keys(config["学号"])
     # elem = driver.find_element_by_id("IDToken9")
     # elem.send_keys(config["密码"])
     # # 提交表单
     # driver.find_element_by_xpath("//*[@id='loginBtn']").click()
     # try:
     #     driver.find_element_by_xpath("//*[text()='首页']")

     # 新版登陆
     url = "https://auth.suda.edu.cn/cas/login?service=https%3A%2F%2Fauth.suda.edu.cn%2Fsso%2Flogin%3Fredirect_uri%3Dhttps%253A%252F%252Fauth.suda.edu.cn%252Fsso%252Flogin%26x_client%3Dcas"
     driver.get(url)
     # 找到输入框并输入查询内容
     elem = driver.find_element_by_id("username")
     elem.send_keys(config["学号"])
     elem = driver.find_element_by_id("password")
     elem.send_keys(config["密码"])
     # 提交表单
     driver.find_element_by_xpath("//*[@id='fm1']/div[7]").click()
     try:
         driver.find_element_by_xpath("//*[text()='账户信息']")

     except:
         print('登陆失败!请检查学号密码是否正确')
         os.system('killall chromedriver')
         return -1
     else:
         print('登录成功!')
         url = "http://aff.suda.edu.cn/_web/fusionportal/detail.jsp?_p=YXM9MSZwPTEmbT1OJg__&id=2749&entranceUrl=http%3A%2F%2Fdk.suda.edu.cn%2Fdefault%2Fwork%2Fsuda%2Fjkxxtb%2Fjkxxcj.jsp&appKey=com.sudytech.suda.xxhjsyglzx.jkxxcj."
         driver.get(url)
         print('访问页面')
         # 这个页面必须点两次,不晓得为啥
         time.sleep(1)
         try:
             driver.find_element_by_xpath(
                 "/html/body/div/div[2]/div/section/div/div[2]/div[1]/a[1]").click()
             time.sleep(1)
             print('准备点击小窗口')
             driver.find_element_by_xpath(
                 "//*[@class='action-btn action-do']").click()
             # 切换到小框内
             print("切换到小框内")
             iframe1 = driver.find_element_by_id("layui-layer-iframe1")
             driver.switch_to.frame(iframe1)
         except:
             driver.quit()
         flag = False
         while(flag == False):
             time.sleep(1)
             flag = find(driver, "//*[text()='"+config["学号"]+"']")

         # 填写体温
         elem = driver.find_element_by_id("input_swtw")
         elem.send_keys("36.8")
         elem = driver.find_element_by_id("input_xwtw")
         elem.send_keys("36.8")

         ## 个人健康状况-正常
         driver.find_element_by_xpath("//*[@id='checkbox_jkzk33']").click()
         
         #xrywz = {'在校': 'radio_xrywz5', '在苏州': 'radio_xrywz7','江苏省其他地区': 'radio_xrywz9', '在其他地区': 'radio_xrywz23'}
         #driver.find_element_by_xpath("//*[@id='"+xrywz[config["现人员位置"]]+"']").click()

         # 更新后通过select来选择人员位置地址
         xrywz = {'在校': '2', '在苏州': '3','江苏省其他地区': '4', '在其他地区': '7'}
         driver.find_element_by_xpath("//*[@id='select2-select_xrywz-container']").click()
         driver.find_element_by_xpath('//*[@id="select2-select_xrywz-results"]/li/ul/li['+xrywz[config["现人员位置"]]+']').click()

         # 输入家庭地址
         elem = driver.find_element_by_id("input_jtdz")
         elem.send_keys(config["家庭地址"])

         # 是否医学隔离中
         driver.find_element_by_xpath("//*[@id='radio_sfyxglz7']").click()
         # 当日行动轨迹是否外出
         driver.find_element_by_xpath("//*[@id='radio_sfywc11']").click()
         # 是否与新冠确诊病例/无症状感染者接触过
         driver.find_element_by_xpath("//*[@id='radio_sfygrzjcg15']").click()
         # 是否与新冠确诊病例/无症状感染者有行程轨迹交叉
         driver.find_element_by_xpath("//*[@id='radio_sfyxcgjjc19']").click()
         # 是否有中高风险地区旅居史(包括途径中高风险地区)
         driver.find_element_by_xpath("//*[@id='radio_sfyzgfxljs23']").click()
         # 是否与中高风险地区人员接触
         driver.find_element_by_xpath("//*[@id='radio_sfyzgfxryjc27']").click()

         # 提交
         print("submit")
         driver.find_element_by_xpath("//*[@id='tpost']").click()
         time.sleep(1)
         try:
             driver.find_element_by_xpath("//*[text()='提交成功!']")
             print('打卡成功!')
             driver.find_element_by_xpath(
                 "//a[@class='layui-layer-btn0']").click()
             ddpost("今天的打卡已经成功执行")
             wxpost("主人,打卡成功啦~")
         except:
             try:
                 driver.find_element_by_xpath(
                     "//*[text()='当天已经提交过,是否继续提交?']")
                 print("已打卡过!")
                 driver.find_element_by_xpath(
                     "//a[@class='layui-layer-btn0']").click()
                 ddpost("今天的打卡已经成功执行")
                 wxpost("主人,打卡GET啦~")
             except:
                 print("打卡失败!请重新开始")
                 driver.find_element_by_xpath(
                     "//a[@class='layui-layer-btn0']").click()
                 ddpost("今天的打卡失败,请手动打卡")
                 wxpost("今天的打卡失败,请手动打卡")
                 driver.quit()
                 os.system('killall chromedriver')
         time.sleep(3)
         print("即将退出程序...")
         driver.quit()
         os.system('killall chromedriver')

# 钉钉webhook机器人推送


def ddpost(content):
 with open("config.json", encoding='utf-8') as f:
     config = json.load(f)
 timenow = strftime("%Y-%m-%d %H:%M:%S", localtime())
 url = "https://oapi.dingtalk.com/robot/send?access_token="+config['ddkey']
 data = '{"msgtype":"markdown","markdown":{"title":"每日疫情打卡","text":"# 每日打卡提醒 \n >### 消息提示:' + \
     content + ' \n >### 打卡时间:' + timenow + '"}}'
 headers = {'Content-Type': 'application/json'}
 byte_data = data.encode("utf-8")
 rep = requests.post(url=url, data=byte_data, headers=headers)
 print("钉钉打卡成功")

# 微信server酱机器人推送


def wxpost(content):
 with open("config.json", encoding='utf-8') as f:
     config = json.load(f)
 driver.get("https://sc.ftqq.com/"+config['wxkey']+".send?text="+content)
 print("微信打卡成功")


# 主函数
if __name__ == '__main__':
 print("这是一个自动健康打卡的程序。\n\n请在同目录下的config.json中配置打卡信息,例如:\n'学号': '1827405055',\n'密码': '12345678',\n'现人员位置': '在苏州',      (请注意只可填入以下四项中的任意一项:'在校', '在苏州', '江苏省其他地区', '在其他地区')\n'家庭地址': '工业园区'\n其余所有属性均为打卡系统自动填充的上一次打卡信息\n如果需要自动打卡,可以在ddkey或wxkey当中填写你申请的钉钉webhook机器人accesskey或在wxkey当中填写微信server酱公众号的accesskey\n\n程序即将启动...")
 driver = openChrome()
 operate_dk(driver)

保存,然后在同目录下新建一个config.json文件用来存放个人信息,自行修改即可,注意人员位置只可以填写以下四项中的任意一项:'在校', '在苏州', '江苏省其他地区', '在其他地区'

{
    "学号": "xxxxxx",
    "密码": "xxxxxx",
    "现人员位置": "江苏省其他地区",
    "家庭地址": "home",
    "ddkey":"钉钉webhook的accesskey",
    "wxkey":"server酱的accesskey"
}

运行

最后python3 data.py即可自动打卡

image-20200723074142728

可以通过定时任务来自动化进行打卡操作

自动推送

可以在打卡成功后自定义推送给自己的邮箱或者qq微信来实现推送功能 如果需要自动打卡,可以在config.json文件中的ddkey当中填写你申请的钉钉webhook机器人accesskey

image-20200808103315685

或在wxkey当中填写微信server酱公众号的accesskey

image-20200808103329886

这样均可以实现自动化打卡

更新

200730 更新打卡的地址

200808 新增自动推送

200824 更新温度打卡

200828 日常更新登陆页面

210121 更新chromedriver版本88,更新打卡逻辑

致谢名单

  1. CentOS7下无界面使用Selenium+chromedriver进行自动化测试

  2. 自动健康打卡程序

  3. INSTALLING GOOGLE CHROME ON CENTOS, AMAZON LINUX, OR RHEL

  4. MAC安装chromedriver提示“Message: 'chromedriver' executable needs to be in PATH.”

About

An automatic RPA robot for daily covid-19 report in Soochow University. 一个自动化实现苏州大学每日健康疫情打卡的工具,基于Python Selenium。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages