文章目录
- 前言
- 一、前期准备
- zfile部署
- mysql服务搭建
- 二、编写python脚本
- python代码
- 三、总结
前言
大家好!我是一名计算机专业的菜鸟,作为这个专业的学习委员,我觉得收电子版作业是一件非常麻烦的事情,作业实验科目也比较多,一到了要交实验报告的时候,我的QQ,微信都是他们发作业的消息,有时候可能还忘了收别人早就发给我的作业了,我就在想,有没一种收作业的软件或者网站,最好还能自动qq邮件提醒那些没交作业的同学,后来我了解到了一个开源的网盘叫做zfile,作为大学生有免费的10个月左右的阿里云服务器,领取之后就把这个项目部署到我的阿里云服务器,数据就放在我的某个目录下,通过写python程序监控该目录,没交作业的就自动发邮件去提醒。
网站大致就是如图:
服务器中的数据目录:
一、前期准备
一、准备一台云服务器,如果是大学生的话,阿里云免费送几个月的云服务器使用权,2核2G的完全够用了。
二、你需要了解到一些docker,mysql,linux的相关知识,通过docker可以快速部署服务。
zfile部署
zfile官网:https://docs.zfile.vip/
一、概述
基于 Java 的在线网盘程序,支持对接 S3、OneDrive、SharePoint、又拍云、本地存储、FTP 等存储源,支持在线浏览图片、播放音视频,文本文件等文件类型。
二、安装部署
在这之前你需要安装好了docker,如果想了解docker安装可以去看我以前的博客:https://blog.csdn.net/qq_62331653/article/details/135596921?spm=1001.2014.3001.5502
Docker 镜像托管在 DockerHub:https://hub.docker.com/r/zhaojun1998/zfile
[root@gang ~]# docker search zfile #查看zfile的镜像仓库
[root@gang ~]# docker pull zhaojun1998/zfile #拉取镜像
[root@gang ~]# docker images #查看你的镜像
docker run -d --name=zfile --restart=always \
-p 8080:8080 \
-v /root/zfile/db:/root/.zfile-v4/db \
-v /root/zfile/logs:/root/.zfile-v4/logs \
-v /root/zfile/file:/data/file \
zhaojun1998/zfile
zfile容器运行之后,可以通过阿里云的这个服务器ip地址访问,如果打不开的话,去阿里云网站上去把8080端口加入到安全组
,这个时候就可以访问了,这个时候进行一系列的配置,你的本地数据目录填/data/zfile。
这样zfile服务算是搭建完成。
mysql服务搭建
[root@gang ~]# docker pull mysql:5.7 #拉取mysql:5.7的镜像
docker run -id --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 #后台运行
docker exec -it mysql env LANG=C.UTF-8 /bin/bash #进入容器
mysql搭建完成,需要在mysql中,建库建表来保存自己班上的学生信息。如果用代码连接不到数据库,同样也要去阿里云网站上去把3306端口加入到安全组
二、编写python脚本
在编写python脚本之前,我们需要设计如何写代码,如何取数据进行对比,数据库会保存班上的学生信息,例如学号,姓名,邮箱等等,在保存同学的数据目录下利用os.listdir(url)方法,列出当前的学生信息,然后与数据库进行对比,没有的就是没有交作业的,然后通过smtplib这个库中的方法给他发qq邮箱通知。
python代码
代码如下(示例):
需要哪些模块可以通过pip安装。
#! /usr/bin/python3.6
import mysql.connector
import os
import smtplib
from email.mime.text import MIMEText
def Mysql_part():
mydb = mysql.connector.connect(
host="ip地址",
user="root",
passwd="密码",
port=3306,
database="students"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM student")
myresult = mycursor.fetchall()
names = {} #姓名qq字典
for x in myresult:
names[x[2]]=x[3]
# print(names)
return names
def view_current_file(url="/root/zfile/file"): #存放学生作业数据的目录
files = os.listdir(url)
work_complete_num = 0 #作业完成总人数
work_false = {} #作业没完成的人
for name in list(Mysql_part().keys()):
exchange = False
for file in files:
if name in file:
exchange = True
if exchange==True:
work_complete_num+=1
else:
work_false[name]=Mysql_part().get(name)
return work_false,work_complete_num, #返回没有交作业的人
# print(view_current_file())
def work_false_email(rece,name):
sender = user = '309jjj@qq.com' # 发送方的邮箱账号
passwd = 'dddddddd' # 授权码----->获取方法可以去百度,如何得到qq邮箱的授权码
receiver = rece+"@qq.com" # 接收方的邮箱账号,不一定是QQ邮箱
# 纯文本内容
msg = MIMEText(f'我说%s同学,你是不是还没交作业,你快去把作业交了!' % name, 'plain', 'utf-8')
# From 的内容是有要求的,前面的abc为自己定义的 nickname,如果是ASCII格式,则可以直接写
msg['From'] = '309hhhgff@qq.com'
msg['To'] = receiver
msg['Subject'] = '计科5班学委催作业通知' # 点开详情后的标题
try:
# 建立 SMTP 、SSL 的连接,连接发送方的邮箱服务器
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录发送方的邮箱账号
smtp.login(user, passwd)
# 发送邮件 发送方,接收方,发送的内容
smtp.sendmail(sender, receiver, msg.as_string())
print('邮件发送成功')
smtp.quit()
except Exception as e:
print(e)
print('发送邮件失败')
if __name__ == '__main__':
work_false = view_current_file()
for name in list(work_false[0].keys()):
value = work_false[0].get(name)
work_false_email(value,name)
print("当前交作业的人数:",work_false[1])
separator = ", "
print(work_false[0])
result = separator.join(list(work_false[0].keys()))
result = "当前没交作业的名单是:" + result
print(result)
import subprocess
os.system('chattr -i zfile/file/作业未交名单.txt') #做这个设置的原因是我不允许该文件可以被任何人删除
file_path = "/root/zfile/file/作业未交名单.txt" # 替换为实际的文件路径
content = "交作业人数:"+str(work_false[1])+"人\n当前没交作业人数:"+str(len(work_false[0]))+"人\n"+result
# 使用 subprocess 执行 echo 命令将内容写入文件
subprocess.run(["bash", "-c", f"echo '{content}' > {file_path}"])
os.system('chattr +i zfile/file/作业未交名单.txt')
效果展示图:
三、总结
通过本次的这个小项目,我学习到了很多,比如咋用程序自动发邮箱,怎么让没交作业名单这个文件不允许被删除,咋用python脚本运行linux中的shell脚本等,但是这个脚本虽然基本实现了我的功能,但是正真用的时候,可能满足不了需求,场景也会在变,但还好我基本可以实现这些小功能,到时候在变的时候在慢慢改代码,我觉得通过自己的专业知识,解决到生活中的小问题,真的挺开心的。