python青年大学习一键提醒功能(团支书、辅导员必备)(一)

青年大学习一键提醒功能,以我自己的学校为例子。

原因:

上学期做了班级团支书,发现每周都要提醒班上同学做青年大学习,有些同学总是会忘记。
为了让同学们能及时学习新思想,争做新青年!!!
然后就想做一个自动提醒青年大学习的脚本,很早就写完了,已经实践了一个学期,发现效果还行。
最近在封装成APP能让其他专业的同学也可以用。( 还在摸鱼 )

Language:

python

第一步抓包软件的安装(Charles Or Fiddler 其他也可)

在我其他博客上有教程
Charles: 安装教程
Filddler:安装教程

Charles为例子吧

在手机端打开智慧团建公众号,打开青年大学习(只有团支书才有这个青年大学习,每个团员的信息都在这里面)
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第1张图片
就可以看到这些有哪些人做了青年大学习
(没写之前就是看这个,对着谁没做,就私聊谁,XXX我都烦死了)
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第2张图片
然后在Charles中找到这个页面的包
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第3张图片
然后就可以在这里看到是否学习了本期的青年大学习,所以把这里的信息爬下来,就知道有谁没有做了最新一期的青年大学习了。
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第4张图片

接下来我们要分析一下这个网址

http://m.fjcyl.com/admin/cylOrgMembers/selectCurrentStudy?studyId=202012071000060&current=&PAGE_SIZE=20&CURRENT_PAGE=1&orgId=286788

所以这里面有一些参数要分析一下

studyId=202012071000060 (本期青年大学习的id,不同期青年大学习的id不同)
current= (忽略)
PAGE_SIZE=20	(一页的信息,就是有20个同学的信息(是否做了青年大学习))
CURRENT_PAGE=1   (当前页面,想知道多少页的话可以用自己班上的团员个数除20再加1)
orgId=286788	(这个是这个团支部的编号ID,不同的团支部ID不同。)

所以我们现在要先获取最新一期的青年大学习的ID,然后再看Charles中哪个网址里面有这个信息。
发现是这个网址
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第5张图片
再分析一下这个网站

http://m.fjcyl.com/admin/cylOrgMembers/selectList?orderBy=1&quarterNo=10

参数分析
orderBy=1  (忽略,我也不知道这是啥)
quarterNo=10  (这个是第几季,比如现在是第十季,所以是10)
那么现在就要去获取最新一期是第几季的,所以就又要去了。

就找到了这个了
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第6张图片

代码部分

现在就名单和最新一期的青年大学习都拿到了,可以写代码了
0.写请求头

import requests
headers = {
     
    'Host': 'm.fjcyl.com',
    'Referer': 'http://m.fjcyl.com/admin/cylOrgMembers/groupStudyQuery?orgId=286788&position=30',
    'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.12(0x17000c33) NetType/WIFI Language/zh_CN',
    'Cookie': 'JSESSIONID='  # 这个是变的,下一期再说怎么解决这个问题
}

1.获取最新一季度的青年大学习(第十季)

def LastestNum():
    URL = "http://m.fjcyl.com/admin/cylOrgMembers/groupByList?groupBy=1"
    info = URL
    info_rsp = session.post(url=info, headers=headers)
    info_json = info_rsp.json()
    x = info_json['rs'][0]['quarterNo']
    return x

2.获取最新一季中最新一期的青年大学习(第几季第几期)

def LastestURL():
    num = LastestNum()
    URL = "http://m.fjcyl.com/admin/cylOrgMembers/selectList?orderBy=1&quarterNo={}".format(num)
    info = URL
    info_rsp = session.post(url=info, headers=headers)
    info_json = info_rsp.json()
    Ls = info_json["rs"]
    StudyTdLists = []
    for k in Ls:
        StudyTdLists.append(k['guoupStudyId'])
    return max(StudyTdLists)

3.获取最新的一期的青年大学习没做的名单

def GetInfo(i):
    num = LastestURL()
    URL = "http://m.fjcyl.com/admin/cylOrgMembers/selectCurrentStudy?studyId={}¤t=&PAGE_SIZE=20&CURRENT_PAGE={}&orgId=286788".format(
        num, i)  # num是最新一期的青年大学习的ID,i是哪一页的信息
    info = URL
    info_rsp = session.post(url=info, headers=headers)
    info_json = info_rsp.json()
    List = info_json["rs"]['rs']
    for detail in List:
        if detail['isStudy'] != '是':
            DidDone.append(detail['acctName'])
    return DidDone

def Parma():    # 我们班有3页,所以就直接这样了
    Temp1 = GetInfo(1)
    Temp2 = GetInfo(2)
    Temp3 = GetInfo(3)
    Temp = Temp1 + Temp2 + Temp3   # 这里是将没有做的同学记录下来
    DidDoneEmail = []   # 这里是将没有做的同学记录下来
    if len(Temp) == 0:
        print("全部都完成了")
        return 0
    else:
        for k in Temp:
            print("未完成同学:" + k)
    for i in range(len(Email)):
        if Email[i][0] in Temp:
            DidDoneEmail.append(Email[i][1])
    return DidDoneEmail

名单获取了,怎么提醒?
用QQ邮箱提醒 (可能你会觉得有点鸡肋,但是还是可以的,我实践了一个学期,效果不错)
首先采集全班团员的名字和QQ邮箱,因为我自己就有,团支书都有团员的基本资料,
所以就用python的一些文件处理,读取xml文件,来进行提取信息。(这部分就是csv,xml文件处理)
然后固定在代码中,就像这个

Email = [
    ['张三', '[email protected]'], ['李四', '[email protected]'],
    ['老王', '[email protected]'], ['小王', '[email protected]'],
]

发送QQ邮件提醒

然后就可以发送邮件了

def Send_Email():
    msg = MIMEText('青年大学习!不用回复!赶紧做!!')   # 构造邮件,内容为青年大学习
    msg["Subject"] = "青年大学习!!又是你!!!"        # 设置邮件主题
    msg["From"] = '团支书'          # 寄件者
    msg["To"] = '未做人员'          # 收件者
    from_addr = '[email protected]'
    password = ''					# 这个是你申请的授权码!!!不是你的qq邮箱密码。
    smtp_server = 'smtp.qq.com'     # smtp服务器地址
    to_addr = Parma()               # 收件人地址
    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('success')
    except Exception as e:
        if e == None:
            # Send_Boss()   # 我们学院规定全班完成,要发给对接的同学,这个就不写出来了。
            print('Faild:%s' % e)
            pass

获取QQ邮箱的通信码

python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第7张图片
点击账号
python青年大学习一键提醒功能(团支书、辅导员必备)(一)_第8张图片
获取授权码就可以了。

第一阶段结束

第一期先这样,我一开始是这样的,手动复制cookie(比较菜)
不过下一期再说说怎么把自动获得cookie
(完整代码就在最后一期) 点击这里
有意见的话,我们共同交流学习吧。

你可能感兴趣的:(python爬虫,python,爬虫)