欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学校健康打卡之打包Docker镜像

程序员文章站 2024-03-12 14:05:38
...

前言

已经把镜像传到了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=[email protected]
# 163的邮件服务器
set smtp=smtps://smtp.163.com:465
# 前面的邮箱地址和第一行保持一致,后面是邮箱登录的授权码,不是密码
set smtp-auth-user=[email protected]  
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