Python实现每日健康打卡(附代码)

Python实现每日健康打卡(附代码)

  • 一 、配置python环境
  • 二、安装相应的模块
  • 三、配置webdriver
  • 四、具体实现
      • 1 、 分析网页结构
      • 2、 获取验证码
      • 3、处理验证码
        • 附:
      • 4、登录
      • 5、完成打卡操作
      • 7、主程序
  • 五、部署到服务器-实现定时执行
      • 1、定时执行(我的是mac,这里就以mac为例子)
  • 六、没有服务器的就在自己电脑运行
      • windows使用任务计划程序即可
      • mac和linux可以使用crontrab(系统自带哦)

首先我想实现的功能有如下几个

  • 每天定时打卡
  • 将虚假位置传输到页面
  • 如果打卡成功,将打卡信息发送至邮箱(并有打卡成功界面截图)
  • 如果打卡失败,将打卡信息发送至邮箱(并有打卡成功界面截图)
  • 不被系统检测为脚本(感觉应该不会吧)
    这里放上一个打卡成功截图Python实现每日健康打卡(附代码)_第1张图片
    图上截图网页的文字之所以不显示 是由于我将脚本部署到了云服务器 应该是编码问题 由于对我的脚本运行并没有影响 我并没有去管它。
    起初我是打算使用request将数据直接传输到服务器,我感觉这样做安全性不太好,直到我看到了selenium这个自动化测试模块,让我直呼牛皮plus呀。本文就是使用selenium这个自动化测试框架进行的。下面就是开发过程了,艰难啊,心酸啊 好多报错一次次百度。

一 、配置python环境

这一步请参考其他文章(并非本文重点)

二、安装相应的模块

具体使用的模块如下 大多pip直接安装即可

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
import time
from datetime import datetime
from email.mime.text import MIMEText
import muggle_ocr#ocr模块 直接pip安装即可
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

着重提一下 PIL模块的安装命令是

pip install pillow

三、配置webdriver

webdriver在不同平台下的安装几乎一致 可以自行百度搜索,在我的脚本中我使用的是直接指定地址

chrome_driver = "/usr/bin/chromedriver"  #这个是chromedriver的地址 没有也会报错

下面的代码是使用webdriver.Chrome一些参数

chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')#上面三行代码就是为了将Chrome不弹出界面,实现无界面爬取
    # driver = webdriver.Chrome(options=chrome_options)
    chrome_driver = "/usr/bin/chromedriver"  #这个是chromedriver的地址 没有也会报错
    # browser = webdriver.Chrome(executable_path=chrome_driver)

    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')# 没有就是运行不起来 就很神奇
    
    # browser = webdriver.Chrome(chrome_options=chrome_options)

    driver =webdriver.Chrome(options=chrome_options,executable_path=chrome_driver)

四、具体实现

1 、 分析网页结构

这些只能说 只可意会不可言传 哈哈哈哈!

2、 获取验证码

从网页获取后将图片存储到本地

png=driver.find_element_by_xpath("/html/body/div/form/div[3]/div/div/img")
print("开始点击快速登录")
png.screenshot('captcha.png'

3、处理验证码

这个我在网上找了很多解决验证码的办法,起初我使用的百度开放平台的文字识别接口,我后来不停的测试,把免费的接口次数给用完了,容我一会儿、、、后来换了好几个ocr模块,有的识别率高,但是只能运行一次,有的识别率不高,比如我现在用的这个,识别正确率感人啊,所以经过了一些技术处理。具体代码实现如下:

 code_path='captcha.png'
    img = Image.open(code_path)
    # 将图片变成灰色
    img_gray = img.convert('L')
    img_gray.save('code_gray.png')
    # 转成黑白图片
    img_black_white = img_gray.point(lambda x: 0 if x > 200 else 255)
    img_black_white.save('code_black_white.png')

    # # ModelType.Captcha 可识别4-6位验证码
    # sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
    # with open(r"code_black_white.png", "rb") as f:
    #     b = f.read()
    #     text = sdk.predict(image_bytes=b)
    #     print(text)
        
    #     return text

    # 初始化;model_type 包含了 ModelType.OCR/ModelType.Captcha 两种
    sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
    # ModelType.OCR 可识别光学印刷文本 这里个人觉得应该是官方文档写错了 官方文档是ModelType.Captcha 可识别光学印刷文本
    with open(r"captcha.png", "rb") as f:
        b = f.read()
        text = sdk.predict(image_bytes=b)
        print(text)
        num_code=str_num(text)
        print(num_code)
        return num_code

附:

str_num函数是筛选数字的,因为我的验证码都是数字,但是ocr总是给我识别些别的,唉。
函数附上:

def str_num(text):
    a="".join(list(filter(str.isdigit, text)))
    return a

4、登录

这一步没啥好说的了,验证码都到手了,还说啥!上代码:

def login(captcha):
    driver.find_element_by_xpath('/html/body/div/form/div[1]/input').send_keys('*******')  # 找到账号框并输入账号
    driver.find_element_by_xpath('/html/body/div/form/div[2]/input').send_keys('****')  # 找到密码框并输入密码
    driver.find_element_by_xpath('/html/body/div/form/div[3]/div/input').send_keys(captcha)  # 找到验证码框并输入验证码
    driver.find_element_by_xpath('/html/body/div/form/input').click()  # 找到登陆按钮并点击

在这里面我用的都是xpath,因为我对前端不熟悉。

5、完成打卡操作

action起来!(加一句 由于我的位置信息是无法直接输入的需要从微信后台获取,而我是在网页上进行的操作,哪来的微信,所以修改这个input的属性 onlyread直接删了,就可以继续进行操作了,狂笑!!)

print("action")
    try:
        driver.find_element_by_xpath('//*[@id="cmarea"]/div[2]/div[1]/a').click()  # 进打卡
    except:
        print("js执行前")
        #js='document.getElementByXpath("//*[@id="profileform"]/div[1]/div/input").removeAttribute("readonly")'
        js='document.getElementsByName("formdata[v]")[0].removeAttribute("readonly")'
        driver.execute_script(js)#执行js语句
        print("js执行后")

        #地址
        driver.find_element_by_xpath('//*[@id="profileform"]/div[1]/div/input').send_keys('河南省,新乡市,延津县,南门|35.14946,114.22926')
        print("location已经执行")
        driver.find_element_by_xpath('//*[@id="profileform"]/div[2]/div/label[2]').click()#风险 否
        print("第一个radio")

        driver.find_element_by_xpath('//*[@id="profileform"]/div[3]/div/label[1]').click()#疫苗 有
        #//*[@id="profileform"]/div[3]/div/label[1] 疫苗

        driver.find_element_by_xpath('//*[@id="profileform"]/div[4]/div/input').send_keys('36.7')
        print("体温已经执行")
        #//*[@id="profileform"]/div[4]/div/input 体温 

        driver.find_element_by_xpath('//*[@id="profileform"]/div[25]/button').click()#提交按钮
        #//*[@id="profileform"]/div[25]/button 提交按钮

        try:
            
            message= driver.find_element_by_xpath('/html/body/div[2]/div[2]').text
            driver.save_screenshot("over.png")
            print(message)
            # send(message)
        except:
            message= "打卡成功"
            print(message)
            driver.save_screenshot("over.png")
            send(message)
        else:
            message= "今天已经打过卡咯"
            driver.save_screenshot("over.png")
            print(message)
            send(message)
            #/html/body/div[2]/div[2] 新增失败 
            #新增失败,该项资料一天最多只能填写1份,明天再填吧~          

    else:
        print("没有异常")
    
    #//*[@id="profileform"]/div[1]/div/input location

6、最后附上邮件发送模块(qq邮箱哈,其他的需要改SMTP服务器)

def send(message):
     # 主题
    msg = MIMEMultipart('related')
    content = MIMEText('
imageid
'
, 'html', 'utf-8') # 正文 msg.attach(content) msg['Subject'] = message msg['From'] = msg_from msg['To'] = msg_to file = open(r"over.png", "rb") img_data = file.read() file.close() img = MIMEImage(img_data) img.add_header('Content-ID', 'imageid') msg.attach(img) try: s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号 25 s.login(msg_from, passwd) s.sendmail(msg_from, msg_to, msg.as_string()) print('发送成功!') except Exception: print('发送失败!') finally: s.quit()

结束的好快啊,下面就是我的主程序了!

7、主程序

if __name__ == '__main__':
    msg_from = '*******@qq.com'  # 发送方邮箱
    passwd = 'bscuidzaaf'  # 填入发送方邮箱的授权码
    msg_to = '*****@qq.com'  # 收件人邮箱
    
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')#上面三行代码就是为了将Chrome不弹出界面,实现无界面爬取
    # driver = webdriver.Chrome(options=chrome_options)
    chrome_driver = "/usr/bin/chromedriver"  #这个是chromedriver的地址 没有也会报错
    # browser = webdriver.Chrome(executable_path=chrome_driver)
    
    
    
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')# 没有就是运行不起来 就很神奇
    
    # browser = webdriver.Chrome(chrome_options=chrome_options)

    driver =webdriver.Chrome(options=chrome_options,executable_path=chrome_driver)
    driver.get("http://htu.banjimofang.com/?uid=1146514&tm=1628045137&sign=ff095221b70c62d2be402991fbdde4f6&option=&")
    driver.find_element_by_xpath('//*[@id="home"]/div/div/div[1]/a[2]').click()  # 找到登陆按钮并点击
    time.sleep(5)
    get_captcha()
    captcha = discern_captcha()
    login(captcha)

    flage=1#登录标志 1 失败 0成功
    while(flage):
        try:
            driver.find_element_by_xpath("/html/body/div/form/div[4]")
        except:
            print("有异常")#登录成功
            get_action()
            flage=0
        else:
            print("没有异常")#登录失败
            get_captcha()
            captcha = discern_captcha()
            a_login(captcha)
            flage=1
    print("succesful")
    get_action()
    # driver.save_screenshot("over.png")
    # message='打卡截图'
    # send(message)
    driver.quit()

结束!

五、部署到服务器-实现定时执行

提醒一下代码中的webdriver地址记得修改成服务器中webdriver所在的地址(需要自己下载的,链接百度一下就有)

1、定时执行(我的是mac,这里就以mac为例子)

在终端中键入

crontab -e

进去后输入

09 00 * * * * /Users/lichun/opt/anaconda3/envs/pytorch/bin/python /Users/lichun/Documents/python/练习/HCI3.0.py

意思是每天00:09执行
具体格式如下:

 # 每1分钟执行一次Command
* * * * * Command

# 每小时的第3和第15分钟执行
3,15 * * * * Command

# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * Command

# 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2  *  * Command

# 每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 Command

# 晚上11点到早上7点之间,每隔一小时重启smb

几个常用的命令也列出来:

Crontab -l 查看
Crontab -e 新建 编辑
 
sudo /usr/sbin/cron start 启动
sudo /usr/sbin/cron restart 重启
sudo /usr/sbin/cron stop 停止
  • 23-7/1 * * * /etc/init.d/smb restart

六、没有服务器的就在自己电脑运行

windows使用任务计划程序即可

mac和linux可以使用crontrab(系统自带哦)

你可能感兴趣的:(Blog,python,脚本语言,定时任务,微信小程序,ui)