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

公众号:青春山东

注:签到功能只适用山东地区;如果只想获取截图(任意地区皆可),直接执行即可,无需修改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 -*-
###公众号青春山东,需要修改openid
import requests
import time
import re
import json
import os
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    #用户信息获取地址
nvi_url = "/SmartLA/dxxjfgl.w?method=getNewestVersionInfo&openid=" + openid  #获取最新大学习信息
sign_url = "/SmartLA/dxxjfgl.w?method=studyLatest"    #签到地址
ubi_url = "/SmartLA/dxxjfgl.w?method=getUserBasicInfo&openid=" + openid    #获取用户信息

s = requests.Session()    #建立会话

###尝试获取用户信息,不检验openid是否合法
def getuserinfo():
    try:    
        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]    #组织编号,团组织对应的编号,每个团组织都不一样
        return xm, sjhm, dw, tzb, zzbh
    except:
        print("获取失败!")  

###获取最新大学习期数和地址
def versions():
    r = s.post(root_url + nvi_url,data = "", headers = {"User-Agent": ua})
    version = r.json()['version']
    url = r.json()['url']
    return version, url
    
##签到
def sign(version = '9-b'):    #签到最新一期,书写方式例如"7-7"
    headers = {
        "User-Agent" : ua,
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
        }
    data = {
        "openid": openid,
        "version":version
        }
    r = s.post(root_url + sign_url, data = data, headers = headers)
    print(r.json())
    return r.json()

##学习记录
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)    #输出结果

##获取用户信息
def getubi():
    r = s.get(root_url + ubi_url,data = "", headers = {"User-Agent": ua})
    res = json.dumps(r.json(), sort_keys=True, indent=4, separators=(',', ':'))    #转成字典、文本化
    res = eval(repr(res).replace('\\\\', '\\'))    #将"\\"替换成"\",解决直接打印unicode
    print(res)    #输出结果

##获取截图地址,需要自行测试是否为截图,适用于大多数情况。url为sign()签到后的返回值。
def endjpg(url,v = 'end'):
    try:
        for i in range(len(url) - 1, -1, -1):    #寻找最后一次出现字符'/'时的位置
            if url[i] == '/':
                break
        end_url = url[0:i] + "/images/end.jpg"    #构建一个简单截图链接
        try:
            r = s.get(end_url, data = "", headers = {"User-Agent": ua})
            if r.status_code == 200:
                open('./'+ v + '.jpg','wb').write(r.content)
                print(v + '.jpg\t' + end_url)
            else:
                print("截图链接无效,请手动获取截图!")
        except:
            print("保存失败!")
        return end_url
    except:
        return "未知错误!"

if __name__ == "__main__":
    print(time.strftime("[%Y/%m/%d %H:%M:%S]\t"), end = '')
    version, url = versions()
    if version == '10-4-1':
        print("截图"+ version +"需要手动获取!")
        exit(0)
    if os.path.exists('./'+ version + '.jpg'):
        print("截图"+ version +".jpg已存在!")
        exit(0)
    sign(version)
    endjpg(url,version)    #获取最新一期截图地址


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