安徽省的小伙伴们有福了!!专属于你们的青年大学习自动提醒脚本来了!!

Posted 小生凡一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安徽省的小伙伴们有福了!!专属于你们的青年大学习自动提醒脚本来了!!相关的知识,希望对你有一定的参考价值。

应安徽的粉丝要求,帮他写一个安徽省的青年大学习提醒脚本,我之前写的那个只是适合福建省的。
冲!

B 站视频讲解:视频讲解

GitHub 链接:GitHub

由于系统可能有时候会有变动,所以建议大家还是在GitHubstar一下,如果系统更新,我也会更新相应的脚本文件。

在这里插入图片描述
在这里插入图片描述

1. 明确需求

安徽省的青年大学习是在公众号里面的,所以里面是完成了的成员名单,那么我只需要将这一期完成的名单爬取下来,再和本班的花名册做个比较,找出没完成的名单就好了。

2. 拿到完成名单

2.1 拿到完成的名单

本文的例子已经取得了本班团支书的同意

首先进入最新一期的青年大学习中,。

在这里插入图片描述
这部分是已经完成了的名单,所以我们要爬取这些东西。

使用的是charles抓包工具,以前写福建省的时候已经提到了。

如果还没配置的同学,可以点击这里 - - >charles

页面太多的话,我们可以先清除掉这些请求
在这里插入图片描述
然后在微信上点击刷新

在这里插入图片描述
然后我们很容易就能看到哪一个请求是该页面的请求了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

建议使用火狐浏览器看,火狐浏览器可以加unicode编码解码

在这里插入图片描述
在这里插入图片描述
我们就拿到了这个已经做完了的名单了。

那么我们分析一下这个请求的网址

在这里插入图片描述

很直观了,应该不用我多讲了把,需要什么信息。但是这里是浏览器帮我们解码的,我们发送请求给服务器的时候要自己进行编码

那么后面level 1level 4你们肯定都知道了的。那么前面这个reason_stage131是啥呢?我猜应该是代表你所查询的这一期的青年大学习的标识。那么如何获取呢?请往下看!

2.2 拿到最新的table_name

分析可知就是这个网址!

http://dxx.ahyouth.org.cn/api/peopleRankList

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
完成了!

3. 获取未完成名单

首先要拿到自己班的名单和邮箱,可以填个在线表格啥的。

不过一定要这种格式
在这里插入图片描述
然后再执行这一行代码


def InitEmailInfo():
    wb = xlrd.open_workbook('')    # 填写你的文件目录
    sh = wb.sheet_by_name('Sheet1')     # 按工作簿定位工作表
    AllList = []
    numList = []
    for i in range(1, sh.nrows):
        listTemp = [sh.row_values(i)[0], sh.row_values(i)[1]]
        AllList.append(listTemp)
        numList.append(sh.row_values(i)[0])
    print(AllList)  # 在命令行拿到这个之后要记得复制!!!!
    return AllList

在命令行AllList拿到这个之后要记得复制!!!!

复制给这个!这个就是制作你们班表单的过程。
在这里插入图片描述
在这里插入图片描述

4. 发送邮件提醒

获取QQ邮箱的通信码
在这里插入图片描述
点击账号
在这里插入图片描述
获取授权码就可以了。

5. 完整代码

# -*- coding:utf-8 -*-
import requests, xlrd, smtplib
from urllib.parse import urlencode
from email.mime.text import MIMEText

# UrlEncode编码 和 UrlDecode解码

def InitEmailInfo():
    wb = xlrd.open_workbook('')    # 打开excel
    sh = wb.sheet_by_name('Sheet1')     # 按工作簿定位工作表
    AllList = []
    numList = []
    for i in range(1, sh.nrows):
        listTemp = [sh.row_values(i)[0], sh.row_values(i)[1]]
        AllList.append(listTemp)
        numList.append(sh.row_values(i)[0])
    print(AllList)
    return AllList


def GetNewTableName():  # 获取最新一期的青年大学习
    RankRsp = requests.get("http://dxx.ahyouth.org.cn/api/peopleRankList")
    RankJson = RankRsp.json()
    return RankJson['list'][0]['table_name']


def GetNotFinishList():  # 获取名单
    ClassAllListEmail = [ ['张三', '11111@qq.com'], ['李四', '22222@qq.com'],
   ['老王', '333333@qq.com'], ['小王', '444444@qq.com']]  # 这里记得赋值上面的AllList!!!
    ClassHaveDone = []
    ClassNotDoneName = []
    ClassNotDoneEmail = []
    headers = {
        "Host": "dxx.ahyouth.org.cn",
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (Khtml, "
                      "like Gecko) Mobile/15E148 MicroMessenger/8.0.7(0x18000731) NetType/WIFI Language/zh_CN",
        "Accept-Language": "zh-cn",
        "Referer": "http://dxx.ahyouth.org.cn/",
        "Accept-Encoding": "gzip, deflate",
        "Connection": "keep-alive",
    }
    params = {
        "level1": "直属高校",
        "level2": "",  # 学校
        "level3": "",  # 学院
        "level4": "",  # 班级
    }
    info = urlencode(params)
    tableName = GetNewTableName()
    URL = "http://dxx.ahyouth.org.cn/api/peopleRankStage?table_name=" + tableName + "&" + info
    info_rsp = requests.get(url=URL, headers=headers)
    info_json = info_rsp.json()
    AllInfoList = info_json['list']['list']
    for people in AllInfoList:
        ClassHaveDone.append(people['username'])
    for k in ClassAllListEmail:
        if k[0] not in ClassHaveDone:       # 如果这个同学没做的话
            ClassNotDoneEmail.append(k[1])   # 就添加Email在这其中
            ClassNotDoneName.append(k[0])   # 就添加Name在这其中
    for p in ClassNotDoneName:
        print("未完成同学:", p)
    return ClassNotDoneEmail


def Send_Email():
    msg = MIMEText('青年大学习!不用回复!赶紧做!!')  # 构造邮件,内容为青年大学习
    msg["Subject"] = "青年大学习!!又是你!!!"  # 设置邮件主题
    msg["From"] = '辛苦勤奋艰苦奋斗的团支书'  # 寄件者
    msg["To"] = '未做人员'              # 收件者
    from_addr = ''      # TODO 这里记得写你的邮箱地址
    password = ''       # TODO 这里记得更改上面为from_addr的邮箱的申请码
    smtp_server = 'smtp.qq.com'  # smtp服务器地址
    to_addr = GetNotFinishList()  # 收件人地址
    print(to_addr)
    try:
        # smtp协议的默认端口是25,QQ邮箱smtp服务器端口是465,第一个参数是smtp服务器地址,第二个参数是端口,第三个参数是超时设置,这里必须使用ssl证书,要不链接不上服务器
        server = smtplib.SMTP_SSL(smtp_server, 465, timeout=2)
        server.login(from_addr, password)  # 登录邮箱
        # 发送邮件,第一个参数是发送方地址,第二个参数是接收方列表,列表中可以有多个接收方地址,表示发送给多个邮箱,msg.as_string()将MIMEText对象转化成文本
        server.sendmail(from_addr, to_addr, msg.as_string())
        server.quit()
        print('发送邮件成功')
    except Exception as e:
        print('发送邮件失败: ', e)


if __name__ == '__main__':
    # InitEmailInfo() # 初始化的操作,第一次运行这个拿到AllList,复制给ClassAllListEmail之后就可以注释掉了
    GetNotFinishList()  # 获取名单,但是不发送邮件
    # Send_Email()  # 获取名单,并发送邮件

6. 最后

小生凡一,期待你的关注。

以上是关于安徽省的小伙伴们有福了!!专属于你们的青年大学习自动提醒脚本来了!!的主要内容,如果未能解决你的问题,请参考以下文章

安卓端强大的追剧神器,美剧迷们有福了

还没有女朋友的朋友们,你们有福了,学会CycleGAN把男朋友变成女朋友

FANUC数控宏程序编程讲解,学数控的有福了!

分享一波golang公链学习资料,英语能力不行的人有福了

Linux 游戏玩家有福了

上海市青年大学习自动提醒 代码脚本