学校健康打卡之打包Docker镜像
前言
已经把镜像传到了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
上一篇: 部署kubernetes集群--服务发现插件CoreDNS
下一篇: kubectl 命令自动补全
推荐阅读