文章目录

  • 前言
  • docker启动及环境配置
  • 安装chrome浏览器
  • 安装chromedriver
  • 上传脚本
  • mail配置
  • shell脚本
  • 添加计划任务
  • 小意外
  • 启动方法
  • 发布到dockerhub

前言

已经把镜像传到了dockerhub 可以直接pull

docker pull lum1n0us/just_auto_punch:1.0

前几天把b站上的docker学习视频看完了,之前我在服务器上部署的自动健康打卡,随着恢复快照消失了;后来在mac上部署,发现电脑一旦休眠,就无法执行计划任务,太麻烦了,就准备在docker中部署,并将其打包成为镜像,发布到dockerhub。

实现的功能:计划任务自动打卡、发送邮件告知打卡成功or失败

docker启动及环境配置

这里我用的是centos的镜像,并提前下好了python3.7的安装包

docker启动:

docker run -it --name just_automatic_health_punch_in -v /home/dockertest:/root centos /bin/bash

安装依赖包:

yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel vim wget unzip lrzsz

已有python3.7安装包,解压缩

tar -xvzf Python-3.7.0.tgz

进入文件夹并安装:

cd Python-3.7.0
./configure
./configure --enable-optimizations
make&&make install

安装chrome浏览器

先配置yum源

cd /etc/yum.repos.d/
vim google-chrome.repo

写入以下的内容:

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

安装chrome浏览器:

yum -y install google-chrome-stable --nogpgcheck

安装chromedriver

先查看chrome浏览器版本

chrome -version
# Google Chrome 93.0.4577.63

https://npm.taobao.org/mirrors/chromedriver/下载对应版本的驱动

cd /root
wget https://npm.taobao.org/mirrors/chromedriver/93.0.4577.15/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/
chmod 777 /usr/bin/chromedriver

上传脚本

mkdir auto_punch
cd auto_punch
rz
chmod 744 *

然后在脚本中将chrome和driver路径改为当前的绝对路径,贴一个改好的脚本

from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options


def clock_in(uname, passwd):
    # 实现无可视化操作
    chrome_options = Options()
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.binary_location = r'/usr/bin/google-chrome'
    bro = webdriver.Chrome(executable_path='/usr/bin/chromedriver', options=chrome_options)
    bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F')
    print('信息门户加载完成')

    username_btn = bro.find_element_by_id('username')
    password_btn = bro.find_element_by_id('password')
    username_btn.send_keys(uname)
    password_btn.send_keys(passwd)
    login_btn = bro.find_element_by_id('passbutton')
    login_btn.click()

    # 直接请求打卡页面
    bro.get('http://ehall.just.edu.cn/default/work/jkd/jkxxtb/jkxxcj.jsp?_p=YXM9MiZ0PTImZD0xMDEmcD0xJmY9MzAmbT1OJg__&_l=&_t=')

    # # 如果当日提交过,选择关闭按钮
    # if '当天已经' in bro.page_source:
    #     close_btn = bro.find_element_by_class_name('layui-layer-btn0')
    #     close_btn.click()

    # 体温数值填入
    tw = bro.find_element_by_xpath('//*[@id="input_tw"]')
    tw.send_keys('36.7')
    zwtw = bro.find_element_by_xpath('//*[@id="input_zwtw"]')
    zwtw.send_keys('36.7')
    print('温度已填写')

    # 提交
    submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div[2]/div/div/button[1]')
    submit_btn.click()
    # print('打卡成功')

    bro.quit()


if __name__ == '__main__':
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    uname_passwd = [
        ['学号1', '密码1', '姓名1'],
        ['学号2', '密码2', '姓名2']
    ]
    for up in uname_passwd:
        clock_in(up[0], up[1])
        print(f'{up[2]}打卡成功')

mail配置

先安装

yum install mailx sendmail -y

修改配置文件

vim /etc/mail.rc

在尾部添加(因为阿里云不让用25端口发送邮件,所以这里用465):

# 这里是你想用来发送邮件的邮箱
set from=xxxxxx@163.com
# 163的邮件服务器
set smtp=smtps://smtp.163.com:465
# 前面的邮箱地址和第一行保持一致,后面是邮箱登录的授权码,不是密码
set smtp-auth-user=xxxxxx@163.com  
set smtp-auth-password=xxxxxx
# 保持默认
set smtp-auth=login
##忽略ssl的检查
set ssl-verify=ignore
##指定证书所在的目录
set nss-config-dir=/root/.certs

shell脚本

下面用一个shell脚本,来将自动打卡和发送邮件提醒集成到一起

touch auto_punch.sh
chmod u+x auto_punch.sh
/usr/local/bin/python3 /root/auto_punch/auto_punch.py > /root/auto_punch/result.txt 2>&1
if [ -n "$(cat /root/auto_punch/result.txt | grep '最后打卡人的姓名')" ]
then
    mail -s "punch success" 收信邮箱 < /root/auto_punch/result.txt
else
    mail -s "punch failed" 收信邮箱 < /root/auto_punch/result.txt
fi

添加计划任务

yum install crontabs -y
systemctl crond start

每天00:01执行

01 00 * * * /usr/bin/sh /root/auto_punch/auto_punch.sh

小意外

到这里,crond无法运行,我才发现问题,systemctl无法启动,百度后才知道是docker想要获得systemctl这样的命令,还要在开始的参数里加上--privileged=true,我当时是直接打包了镜像

docker commit -a "Lum1n0us" -m "JUST health automatic health punch" 51a0962ecfac centos/auto_punch

现在开始继续,先启动上面打包好的镜像

docker run -d --privileged=true --name just_auto_punch centos/auto_punch /usr/sbin/init
docker exec -it c7ed7ff1df13 /bin/bash

启动systemctl

systemctl start crond
systemctl enable crond.service

到这里环境全部搭好,下面再次构建镜像

docker commit -a "Lum1n0us" -m "JUST health automatic health punch" 51a0962ecfac centos/auto_punch:2.0

启动方法

docker run -d --privileged=true --name just_auto_health_punch lum1n0us/just_auto_punch:1.0 /usr/sbin/init

发布到dockerhub

dockerhub注册完账号后,先登录

docker login -u 用户名 -p 密码

然后要先规范镜像的命名方式

docker tag centos/auto_punch:2.0 lum1n0us/just_auto_punch:1.0

最后发布

docker push lum1n0us/just_auto_punch:1.0