使用云服务器加python脚本助力考研单词背诵。
实现效果如下:
撸起袖子开始干:
第一步:明确需求
1,定时定量推送考研单词
第二步:选择实现平台和语言
1,服务器:百度云服务器centos7.6,3个月十八
2,语言:python
3,数据库:mysql(后面实际用了CVS)
4,平台:pycharm
5,邮件服务器:smtp.sohu.com
第三步:制定施工计划
1,对于单词推送时间,单词量,已推送量和推送账户,使用xml配置
2,制定存储单词的CVS文件
3,编写读取xml的代码
4,编写获取推送单词的代码
5,编写发送单词的代码
6,编写设置xml的文档
7,测试3-6直到不报错
8,部署到服务器
第四步:执行计划
1,对于单词推送时间,单词量,已推送量和推送账户,使用xml配置
tstime-推送时间(没用上),tsnumber-每次推送的单词量,tscur-已推送单词量,tscounts-推送账户
上面我是用sptest123@sohu.com作为邮件服务器,1547837674@qq.com作为我的目标邮箱。
2,制定存储单词的CVS文件
这个很简单,只需要把单词复制到Excel中去,再加上序号即可,然后导出为csv格式的文件。
3,编写读取xml的代码
这部分主要是获取配置信息,以便使用:
def getXML():
# 获取当前文件的绝对路径
cur_path = os.path.abspath(__file__)
# 获取当前文件的目录
now_path = os.path.dirname(cur_path)
# 拼接xml文件的路径
con_path = os.path.join(now_path + "/config.xml")
# 读取xml文件
domTree = parse(con_path)
rootNode = domTree.documentElement
# 获取推送时间
tstime = rootNode.getElementsByTagName("tstime")[0].childNodes[0].data
# 获取推送量
tsnumber = rootNode.getElementsByTagName("tsnumber")[0].childNodes[0].data
# 获取已推送量
tscur = rootNode.getElementsByTagName("tscur")[0].childNodes[0].data
# 获取推送账户
tscounts = rootNode.getElementsByTagName("tscounts")[0].getElementsByTagName("count")
#拼接推送账户
counts=[]
for count in tscounts:
counts.append(count.childNodes[0].data)
return [tstime,tsnumber,tscur,counts]
4, 编写获取推送单词的代码
def getTSVocabularies(start,end):
# 获取当前文件的绝对路径
cur_path = os.path.abspath(__file__)
# 获取当前文件的目录
now_path = os.path.dirname(cur_path)
csvFileName = os.path.join(now_path+"/va.CSV")
vocs=[]
#这里为你的csv编码
with open(csvFileName, newline='', encoding="gbk") as csvfile:
rows = csv.reader(csvfile)
for row in rows:
if int(row[0])>=start and int(row[0])<end:
vocs.append(row[1]+'\n')
csvfile.close()
return vocs
5,编写发送单词的代码
def sendMail(count,text):
text1=''
for i in text:
text1+=i+'\t\n'
# 第三方 SMTP 服务
mail_host = "smtp.sohu.com" # 设置服务器
mail_user = "sptest123" # 用户名
mail_pass = "GFDK8UQET5V9C" # 口令
sender = 'sptest123@sohu.com' #这里设置成你自己的发送邮箱
receivers = count # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 这里是文章主题
message = MIMEText(text1, 'plain', 'gbk')
message['From'] = Header("你的名字", 'utf-8')
message['To'] = Header("you", 'utf-8')
# 主题
subject = '考研单词推送,今日单词'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user, mail_pass)#这里可能会通不过,需要设置一下白名单
smtpObj.sendmail(sender, receivers, message.as_string())
return True
except smtplib.SMTPException:
return False
这里是搜狐的,在下面加上你的服务器的公网地址即可:测试的话加上电脑所处ip段的公网地址:
6,编写设置xml的文档
这里主要是实现修改tscur,因为每次从tscur开始推送
def setXML(tscur):
# 获取当前文件的绝对路径
cur_path = os.path.abspath(__file__)
# 获取当前文件的目录
now_path = os.path.dirname(cur_path)
# 拼接xml文件的路径
con_path = os.path.join(now_path + "/config.xml")
tmp_config="./config.xml"
# 读取xml文件
domTree = parse(con_path)
rootNode = domTree.documentElement
# 设置已推送量
rootNode.getElementsByTagName("tscur")[0].childNodes[0].data=tscur
fw = open(tmp_config, "w")
domTree.writexml(fw)
fw.close()
7,测试3-6直到不报错
if __name__=="__main__":
############################
#这一段是实现在早上6点和晚上11点之间推送
pattern = re.compile("[0-9]+:[0-9]+:[0-9]+")
while True:
s = re.findall(pattern, time.ctime())
hour=int(s[0].split(':')[0])
if hour>=6 and hour <=23
#################################
# 读取配置文件
[tstime, tsnumber, tscur, counts] = getXML()
# 获取TS单词
vocabularies = getTSVocabularies(int(tscur), int(tsnumber) + int(tscur))
# 发送邮件
result = sendMail(counts, vocabularies)
# 设置csv
setXML(str(int(tsnumber) + int(tscur)))
print(time.ctime()+':'+str(result))
else:
pass
#####################
#设置推送间隔为tstime*3600,比如tstime=1,1*3600s=1h
time.sleep(int(tstime)*3600)
8,部署到服务器
先使用winSCP把以下三个文件放到服务器下的任意一个你创建的目录下:
然后在服务器进入到该目录,执行如下命令即可:
- 最后一个“&”表示后台运行程序
- “nohup” 表示程序不被挂起
- “python3”表示执行python代码
- “-u”表示不启用缓存,实时输出打印信息到日志文件(如果不加-u,则会导致日志文件不会实时刷新代码中的print函数的信息)
- “vocabularyTS.py”表示python的源代码文件
- “print.log”表示输出的日志文件
- “>”表示将打印信息重定向到日志文件
- “2>&1”表示将标准错误输出转变化标准输出,可以将错误信息也输出到日志文件中(0-> stdin, 1->stdout, 2->stderr)
9,注意点:
服务器安装python3,在部署脚本的时候先测试一下脚本中导入的模块存不存在,就是在服务器上进入python3命令行导入一下看看会不会报错。3.x的pip在linux上是pip3。
10,所有代码如下:
#!/usr/bin/env python
#-*- encoding: utf-8 -*-
import os
from xml.dom.minidom import parse
import csv
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import time
import re
def getXML():
# 获取当前文件的绝对路径
cur_path = os.path.abspath(__file__)
# 获取当前文件的目录
now_path = os.path.dirname(cur_path)
# 拼接xml文件的路径
con_path = os.path.join(now_path + "/config.xml")
# 读取xml文件
domTree = parse(con_path)
rootNode = domTree.documentElement
# 获取推送时间
tstime = rootNode.getElementsByTagName("tstime")[0].childNodes[0].data
# 获取推送量
tsnumber = rootNode.getElementsByTagName("tsnumber")[0].childNodes[0].data
# 获取已推送量
tscur = rootNode.getElementsByTagName("tscur")[0].childNodes[0].data
# 获取推送账户
tscounts = rootNode.getElementsByTagName("tscounts")[0].getElementsByTagName("count")
counts=[]
for count in tscounts:
counts.append(count.childNodes[0].data)
return [tstime,tsnumber,tscur,counts]
def getTSVocabularies(start,end):
# 获取当前文件的绝对路径
cur_path = os.path.abspath(__file__)
# 获取当前文件的目录
now_path = os.path.dirname(cur_path)
csvFileName = os.path.join(now_path+"/va.CSV")
vocs=[]
with open(csvFileName, newline='', encoding="gbk") as csvfile:
rows = csv.reader(csvfile)
for row in rows:
if int(row[0])>=start and int(row[0])<end:
vocs.append(row[1]+'\n')
csvfile.close()
return vocs
def sendMail(count,text):
text1=''
for i in text:
text1+=i+'\t\n'
# 第三方 SMTP 服务
mail_host = "smtp.sohu.com" # 设置服务器
mail_user = "sptest123" # 用户名
mail_pass = "GFDK8UQET5V9C" # 口令
sender = 'sptest123@sohu.com'
receivers = count # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 这里是文章主题
message = MIMEText(text1, 'plain', 'gbk')
message['From'] = Header("你的名字", 'utf-8')
message['To'] = Header("you", 'utf-8')
# 这里需要改为爬取主题
subject = '考研单词推送,今日单词'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
return True
except smtplib.SMTPException:
return False
def setXML(tscur):
# 获取当前文件的绝对路径
cur_path = os.path.abspath(__file__)
# 获取当前文件的目录
now_path = os.path.dirname(cur_path)
# 拼接xml文件的路径
con_path = os.path.join(now_path + "/config.xml")
tmp_config="./config.xml"
# 读取xml文件
domTree = parse(con_path)
rootNode = domTree.documentElement
# 设置已推送量
rootNode.getElementsByTagName("tscur")[0].childNodes[0].data=tscur
fw = open(tmp_config, "w")
domTree.writexml(fw)
fw.close()
if __name__=="__main__":
pattern = re.compile("[0-9]+:[0-9]+:[0-9]+")
while True:
s = re.findall(pattern, time.ctime())
hour=int(s[0].split(':')[0])
if hour>=6 and hour <=23:
# 读取配置文件
[tstime, tsnumber, tscur, counts] = getXML()
# 获取TS单词
vocabularies = getTSVocabularies(int(tscur), int(tsnumber) + int(tscur))
# 发送邮件
result = sendMail(counts, vocabularies)
# 设置csv
setXML(str(int(tsnumber) + int(tscur)))
print(time.ctime()+':'+str(result))
else:
pass
time.sleep(int(tstime)*3600)