利用Python一键完成青年大学习并获取截图

青年大学习截图是怎么回事呢?青年大学习相信大家都很熟悉,但是青年大学习截图是怎么回事呢,下面就让小编带大家一起了解吧。青年大学习截图,其实就是完成青年大学习所截的图片,大家可能会很惊讶青年大学习怎么会截图呢?但事实就是这样,小编也感到非常惊讶。这就是关于青年大学习截图的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!

公众号:青春山东

注:签到功能只适用山东地区;如果只想获取截图(任意地区皆可),直接执行即可,无需修改openid。

环境:Python3
所需第三方库:requests(没有的pip install requests安装一下就好)


主要功能

  1. 一键完成所有大学习
  2. 完成任意一期大学习
  3. 获得截图(可能会失败、但成功可能性极高)

使用方法

  1. 修改第11行的openid为自己的,获取方法后文会提及。(如果不指定openid则只能获取截图。)将获取到的openid替换掉给出的1234567890AbCdEfGhIj_KlMnOpQ即可。(28个字符)
  2. python qndxx.py执行即可完成签到和截图。
  3. 如果想要执行一键签到所有将115行autosign()前“#”去掉即可。

openid

什么是openid?

openid是微信用户在公众号appid下的唯一用户标识(appid不同,则获取到的openid就不同),可用于永久标记一个用户,同时也是微信JSAPI支付的必传参数。

如何获取?

  • 抓包分析。这种方法略微麻烦就不说了。
  • 访问特殊页面获取。
    ① 打开任意一期团课
    ② 进入我的学习日志
    ③ 复制链接得到的链接就包含了openid,即字符串中的”…openid=xxxxx&….”其中的xxxxx就是所需的openid。
     复制到的链接大概这样
    http://qndxx.youth54.cn/SmartLA/lottery.w?method=openFxjm&openid=1234567890AbCdEfGhIj_KlMnOpQ


脚本(点我下载

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#Site: https://blog.for-get.com
###公众号青春山东,需要修改openid
import requests
import time
import re
import json
global openid, ua, xm, sjhm, dw, tzb, zzbh

openid = "1234567890AbCdEfGhIj_KlMnOpQ" #微信openid,系统判别方式,需要修改!

ua = "Mozilla/5.0 (Linux; Android 9; QNDXX 666 Pro Build/PKQ1.180917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045111 Mobile Safari/537.36 MMWEBID/3667 MicroMessenger/7.0.14.1660(0x27000E37) Process/tools NetType/4G Language/zh_CN ABI/arm64 WeChat/arm64" #模拟微信UA
root_url = "http://qndxx.youth54.cn" #根地址
save_url = "/SmartLA/lottery.w?method=saveUser" #保存地址,即签到地址
record_url = "/SmartLA/lottery.w?method=openFxjm&openid=" + openid #学习记录地址
userinfo_url = "/SmartLA/lottery.w?method=enterUpdateUserInfo&openid=" + openid #用户信息获取地址
list_url = "/SmartLA/lottery.w?method=pageSdtwdt" #青年大学习目录,提供所有期数的索引

s = requests.Session() #建立会话
try: #尝试获取用户信息,值得注意的是这里并不检验openid的合法性,如果调用record()函数后能正确输出姓名,则证明脚本运行成功
r = s.post(root_url + userinfo_url,data = "", headers = {"User-Agent": ua})
res1 = re.findall(": (.*?),",r.text) #筛选信息,正则表达式出现了点问题,无法正确匹配...
for i in range(0,len(res1)): #暴力匹配
if res1[i][1:-1] == openid:
break
xm = res1[i + 1][1:-1] #姓名
sjhm = res1[i + 2][1:-1] #手机号码
dw = res1[i + 3][1:-1] #地区
tzb = res1[i + 4][1:-1] #团组织
zzbh = res1[i + 5][1:-1] #组织编号,团组织对应的编号,每个团组织都不一样
except:
print("未知错误!")

###获取大学习目录
def versions():
r = s.get(root_url + list_url,data = "", headers = {"User-Agent": ua})
res = re.findall("var ds=(.*?);",r.text)[0][1:-1] #筛选信息
res =json.loads(res) #转成字典
version = [] #构建版本列表
for i in range(0, len(res)):
version.append(res[i]['version'])
return version

###签到指定期数
def sign(version = versions()[0]): #如果要签到第二季第三期,则传递字符串"2-3",默认签到最新一期
headers = { #构造请求头
"User-Agent": ua,
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Referer": "http://qndxx.youth54.cn/SmartLA/lottery.w?method=pageSdtwdt&version=" + version + "&state=123",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,en-US;q=0.9"
}
data = { #构造请求信息
"openid": openid,
"xm":xm,
"sjhm":sjhm,
"dw":dw,
"address":"",
"nickname":"",
"tzb":tzb,
"version":version,
"zzbh":zzbh
}

print(version , end = "")
r = s.post(root_url + save_url, data = data, headers = headers)
print(r.json()) #输出返回信息
return r.json()

###自动签到,完成已有期数的签到
def autosign():
version = versions()
for i in range(0, len(version)):
sign(version[i]) #执行签到
time.sleep(0.233) #防止请求过快导致异常,单位秒。

###获取个人学习、签到记录总览
def record():
r = s.get(root_url + record_url,data = "", headers = {"User-Agent": ua})
res = re.findall("var canshu=(.*?);",r.text)[0][1:-1] #筛选信息
res = json.dumps(json.loads(res), sort_keys=True, indent=4, separators=(',', ':')) #转成字典、文本化
res = eval(repr(res).replace('\\\\', '\\')) #将"\\"替换成"\",解决直接打印unicode
print(res) #输出结果

###获取截图地址,需要自行测试是否为截图,适用于大多数情况。参数url为函数sign()执行后的返回值,或者为青年大学习播放地址。
def endjpg(url):
try:
url = url['url'] #获取url信息
lenth = len(url)
if lenth == 0: #判断是否为空
return "版本号错误!"
for i in range(lenth - 1, -1, -1): #寻找最后一次出现字符'/'时的位置
if url[i] == '/':
break
end_url = url[0:i] + "/images/end.jpg" #构建一个简单截图链接
return end_url
except:
return "未知错误!"

###保存截图
def savejpg(url, title = 'end'): #参数url使用endjpg()返回值即可;title即保存的文件名,可以留空
try:
r = s.get(url, data = "", headers = {"User-Agent": ua})
if r.status_code == 200:
open(title + '.jpg','wb').write(r.content) #保存截图
print("截图获取成功,"+ title +".jpg已保存!")
else:
print("截图获取失败,请尝试手动获取截图!")
except:
print("未知错误!")

if __name__ == "__main__":
#autosign() #自动签到所有期数、补齐之前未签到
new = versions()[0] #获取最新一期编号
savejpg(endjpg(sign(new)), new) #签到,获取并保存通用截图
record() #输出学习记录


最后,还是希望大家能够抽出时间来认真大学习!

这里要填写昵称

这是一个很懒的作者,请善待他。

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐