使用云服务器加python脚本助力考研单词背诵

使用云服务器加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把以下三个文件放到服务器下的任意一个你创建的目录下:

在这里插入图片描述

然后在服务器进入到该目录,执行如下命令即可:

在这里插入图片描述

  1. 最后一个“&”表示后台运行程序
  2. “nohup” 表示程序不被挂起
  3. “python3”表示执行python代码
  4. “-u”表示不启用缓存,实时输出打印信息到日志文件(如果不加-u,则会导致日志文件不会实时刷新代码中的print函数的信息)
  5. “vocabularyTS.py”表示python的源代码文件
  6. “print.log”表示输出的日志文件
  7. “>”表示将打印信息重定向到日志文件
  8. “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)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值