上学期做了班级团支书,发现每周都要提醒班上同学做青年大学习,有些同学总是会忘记。
为了让同学们能及时学习新思想,争做新青年!!!
然后就想做一个自动提醒青年大学习的脚本,很早就写完了,已经实践了一个学期,发现效果还行。
最近在封装成APP能让其他专业的同学也可以用。( 还在摸鱼 )
python
在我其他博客上有教程
Charles: 安装教程
Filddler:安装教程
在手机端打开智慧团建公众号,打开青年大学习(只有团支书才有这个青年大学习,每个团员的信息都在这里面)
就可以看到这些有哪些人做了青年大学习
(没写之前就是看这个,对着谁没做,就私聊谁,XXX我都烦死了)
然后在Charles中找到这个页面的包
然后就可以在这里看到是否学习了本期的青年大学习,所以把这里的信息爬下来,就知道有谁没有做了最新一期的青年大学习了。
接下来我们要分析一下这个网址
http://m.fjcyl.com/admin/cylOrgMembers/selectCurrentStudy?studyId=202012071000060¤t=&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中哪个网址里面有这个信息。
发现是这个网址
再分析一下这个网站
http://m.fjcyl.com/admin/cylOrgMembers/selectList?orderBy=1&quarterNo=10
参数分析
orderBy=1 (忽略,我也不知道这是啥)
quarterNo=10 (这个是第几季,比如现在是第十季,所以是10)
那么现在就要去获取最新一期是第几季的,所以就又要去了。
现在就名单和最新一期的青年大学习都拿到了,可以写代码了
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]'],
]
然后就可以发送邮件了
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
第一期先这样,我一开始是这样的,手动复制cookie(比较菜)
不过下一期再说说怎么把自动获得cookie
(完整代码就在最后一期) 点击这里
有意见的话,我们共同交流学习吧。