首页
统计
邻居
留言
关于
Search
1
彩虹商城系统开发API文档
4,348 阅读
2
IntelliJ IDEA 报错TextMate bundle load error: Bundle kotlin can't be registered
3,755 阅读
3
使用RaiDrive将网盘映射为本地磁盘
2,183 阅读
4
谷歌浏览器 Google Chrome 69.0.3497.100 正式稳定版、测试版及开发版本大全
2,137 阅读
5
抖音、小红书、快手 免费三网解析去水印小工具
2,059 阅读
精选推荐
源码分享
软件下载
影视资源
经验教程
模板插件
Emlogo
Wordpress
浮夸小生。
情感杂文
趣味生活
影视后期
Java学习笔记
登录
Search
标签搜索
个人分享
Wordpress
浮夸小生。
Wordpress教程
Java
PHP
Wordpress优化
Java笔记
网络技巧
网站
CDN
Windows
又拍云
教程
浏览器
IntelliJ IDEA
html
建站教程
微信
情感杂文
浮夸小生。
累计撰写
83
篇文章
累计收到
220
条评论
首页
栏目
精选推荐
源码分享
软件下载
影视资源
经验教程
模板插件
Emlogo
Wordpress
浮夸小生。
情感杂文
趣味生活
影视后期
Java学习笔记
页面
统计
邻居
留言
关于
搜索到
83
篇与
浮夸小生。
的结果
2024-08-27
vue 在苹果IOS系统中调用微信扫一扫 按钮双击多次 或 重复调用多次才会生效
在vue中开发微信扫一扫功能,之前已经给过相应教程。其中点击按钮唤醒微信原生扫一扫功能,按钮需要双击才会生效。阅读官网文档后发现调用微信js要等待jssdk加载完成,放到wx.ready里面试一下。在配置文件加载完成后,调用wx.ready()方法,例如: wx.ready(function() { // 执行业务逻辑 // 例如调用JS-SDK接口等 });
2024年08月27日
39 阅读
0 评论
0 点赞
2024-04-26
Vue3 网页调用微信扫一扫 -小记
网页开发调用扫一扫前言:微信内打开网页链接,调用微信扫一扫功能1.引入第三方 weixin-js-sdknpm install weixin-js-sdk -S附 vue代码:<script lang="ts" setup> import { onMounted,ref } from 'vue' import { queryWxConfig, queryMsg } from "@/api/scanCode" //我自己请求的后台接口 获取 wx.config 配置 import wx from 'weixin-js-sdk'; const wxConfig = ref({ appId: '', timestamp: 0, nonceStr: '', signature: '', }); // 初始化微信 JS-SDK function initWechatSDK() { let url = location.href.split("#")[0]; queryWxConfig(url).then((data)=>{ wxConfig.value.appId = data.data.result.appId; wxConfig.value.timestamp = data.data.result.timestamp; wxConfig.value.nonceStr = data.data.result.nonceStr; wxConfig.value.signature = data.data.result.signature; }); } // 调用微信扫一扫接口 function scanQRCode() { console.log("扫一扫"); wx.config({ debug: false, appId: wxConfig.value.appId, timestamp: wxConfig.value.timestamp, nonceStr: wxConfig.value.nonceStr, signature: wxConfig.value.signature, jsApiList: ['scanQRCode'] // 需要使用的微信接口 }); wx.error(function (res) { console.log(res.errMsg) console.log('微信config配置失败res', res) }) wx.scanQRCode({ needResult: 1, scanType: ['qrCode'], success: function (res) { var result = res.resultStr; // 获取扫码结果 // 处理扫码结果 //....... } }); } onMounted(() => { initWechatSDK(); }); </script>
2024年04月26日
224 阅读
1 评论
0 点赞
2024-04-26
微信JS-SDK 签名方式-java代码小记
签名加密方式阅读官方文档: JS-SDK使用权限签名算法 首先获取 access_token -> AppID(开发者ID) + AppSecret(开发者密码) 获取方式:公众号后台地址-基本配置 其次获取 jsapi_ticket —>携带 access_token 请求链接 (见官方文档)生成加密方式最终需要返回如下信息:wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,直接UUID 随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表 }); 加密算法不在赘述,详情查看 官方文档 {message type="info" content="注意 : access_token 与 jsapi_ticket 有效其为 7200秒(2小时) 微信官方强烈要求做全局缓存"/}附java实现代码:@Slf4j public class WeChatUtil { private static final String APP_ID = "开发者ID"; private static final String APP_SECRET = "开发者密钥"; private static final long EXPIRATION_TIME_MILLIS = 7200 * 1000; // 7200秒转换为毫秒 private static String accessToken; private static String jsapiTicket; private static Date accessTokenLastUpdateTime; private static Date jsapiTicketLastUpdateTime; private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 使用线程安全的ConcurrentHashMap来存储accessToken和jsapiTicket,避免多线程并发问题 private static final ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>(); // 获取微信配置信息 public static WxConfig getWxConfig(String url) { String accessToken = getAccessToken(); String jsapiTicket = getJsapiTicket(accessToken); if (StringUtils.isNotBlank(accessToken) && StringUtils.isNotBlank(jsapiTicket)) { //进行加密 String nonceStr = UUID.randomUUID().toString(); Long timestamp = System.currentTimeMillis() / 1000; Map<String, Object> paramMap = new TreeMap<>(); paramMap.put("noncestr", nonceStr); paramMap.put("jsapi_ticket", jsapiTicket); paramMap.put("timestamp", timestamp); paramMap.put("url", url); // 拼接参数为字符串 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, Object> entry : paramMap.entrySet()) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } String string1 = sb.substring(0, sb.length() - 1); // 去掉最后一个&符号 // 使用SHA1加密 String signature = SHA1(string1); List<String> jsApiList = new ArrayList<>(); jsApiList.add("jsApiList"); return new WxConfig(true, APP_ID, timestamp, nonceStr, signature, jsApiList); } return null; } // 获取 access_token private static String getAccessToken() { log.info("获取acctoken"); // 检查是否过期 if (accessToken == null || accessTokenLastUpdateTime == null || new Date().getTime() - accessTokenLastUpdateTime.getTime() > EXPIRATION_TIME_MILLIS) { // 过期或者第一次获取,需要更新 accessToken updateAccessToken(); } return accessToken; } // 更新 access_token private static void updateAccessToken() { String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APP_ID + "&secret=" + APP_SECRET; String result = HttpClientManager.httpGetMethod(url, null); JSONObject jsonObject = JSONObject.parseObject(result); if (!jsonObject.containsKey("errcode")) { accessToken = jsonObject.getString("access_token"); accessTokenLastUpdateTime = new Date(); log.info(accessToken); // 使用 scheduler 定时在7200秒后再次更新 accessToken scheduler.schedule(WeChatUtil::updateAccessToken, EXPIRATION_TIME_MILLIS, TimeUnit.MILLISECONDS); } } // 获取 jsapi_ticket private static String getJsapiTicket(String accessToken) { // 检查是否过期 if (jsapiTicket == null || jsapiTicketLastUpdateTime == null || new Date().getTime() - jsapiTicketLastUpdateTime.getTime() > EXPIRATION_TIME_MILLIS) { // 过期或者第一次获取,需要更新 jsapiTicket updateJsapiTicket(accessToken); } return jsapiTicket; } // 更新 jsapi_ticket private static void updateJsapiTicket(String accessToken) { String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; String result = HttpClientManager.httpGetMethod(url, null); JSONObject jsonObject = JSONObject.parseObject(result); if (jsonObject.getInteger("errcode") == 0) { jsapiTicket = jsonObject.getString("ticket"); jsapiTicketLastUpdateTime = new Date(); // 使用 scheduler 定时在7200秒后再次更新 jsapiTicket scheduler.schedule(() -> updateJsapiTicket(accessToken), EXPIRATION_TIME_MILLIS, TimeUnit.MILLISECONDS); } } // SHA1 加密 private static String SHA1(String str) { try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(str.getBytes("UTF-8")); byte[] digest = crypt.digest(); // 转换为十六进制字符串 Formatter formatter = new Formatter(); for (byte b : digest) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { throw new RuntimeException(e); } } }
2024年04月26日
104 阅读
0 评论
0 点赞
2024-04-16
信考软件-信考中学信息技术考试练习系统 激活码
前言信考 信息技术考试系统初中_中考信息课模拟适合,所有初中中考学生现在初二和初三,学生都要考一共二十道题,早安装,早练习,早得分亮点第一,和中考判分标准相同(世面上很多软件,和中考判分标准不同,就没有意义,你用他的软件做半天,中考的时候,发现这么操作不得分,你说坑人不)第二,别家的系统,是独占形式的,为了打开它,会删掉你电脑上的其他软件,导致很多文件会打不开,而这个,不删除任何售价官方售价 激活码-- 118 RMB写在最后限时优惠 官方正版 59.9 RMB ~ 不限设备使用~需要联系我吧~
2024年04月16日
340 阅读
0 评论
0 点赞
2023-12-03
长江雨课堂刷课原理分析记录-python脚本技
前言 本篇文章仅限于技术交流-请勿用于商业用途。(如有侵权请联系我,24小时内删除该文章) 起因:高中好哥们(假小子->变大美女)问我长江雨课堂能不能shua课???? emmm...这真不好拒绝,直接抓包分析!!!视频 通过浏览器发包分析 存在心跳包 每五秒一次,接口 以及 发包参数如下:#接口: https://changjiang.yuketang.cn/video-log/heartbeat/ #发包参数: 'heart_data': [ { 'i': 5, #常量 'et': 'playing', #播放操作 'p': 'web', #常量 'n': 'ali-cdn.xuetangx.com',#常量 'lob': 'ykt',# 常量 'cp': videoTime, # 播放进度 ->>>>>>>模拟生成 'fp': 0, # 常量 'tp': videoTime, # 视频时长 'sp': 1,# 常量 'ts': int(time.time() * 1000), # 时间戳 13位 我这里用python直接模拟的 'u': u,# user_id 'uip': '',# 常量 'c': c,# course_id 'v': v,# 视频id 'skuid': skuid, # skuid 'classroomid': classroomid, #classroom_id 'cc': cc, # 常量 'd': duration, # 视频时常 'pg': pg, #视频id + 随机字符串 可以写死 'sq': 2, # 常量 't': 'video', # 常量 'cards_id': 0, # 常量 'slide': 0, # 常量 'v_url': '', # 常量 } ] #以上视频参数 可以在以下接口获取参数值: https://changjiang.yuketang.cn/c27/online_courseware/xty/kls/pub_news/'+课件id+'/ #课件id的值通过该元素获取courseware_idpython代码目前只完成了 视频代码部分(默认是全部课程都刷->按顺序刷课)我没有学过python,代码很烂 勿喷import json import time import random import re import requests #cookies 填写自己的即可 cookies = {} # 课程列表 def course_list(): headers = { 'authority': 'changjiang.yuketang.cn', 'accept': 'application/json, text/plain, */*', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'pragma': 'no-cache', 'referer': 'https://changjiang.yuketang.cn/v2/web/index', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'university-id': '0', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'uv-id': '0', 'xt-agent': 'web', 'xtbz': 'ykt', } params = { 'identity': '2', } response = requests.get('https://changjiang.yuketang.cn/v2/api/web/courses/list', params=params, cookies=cookies, headers=headers) return response.text ## 访问课程链接 def course_info(course_id): headers = { 'authority': 'changjiang.yuketang.cn', 'accept': 'application/json, text/plain, */*', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'classroom-id': '14037619', # 'cookie': 'JG_fcdf8e635093adde6bef42651_PV=1701342457885|1701342464783; django_language=zh-cn; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThjMWY3MTE4MzAxNmQ2LTBjZTM0NjRkYWQ4YmQ1OC0xNjUyNTYzNC0yMDczNjAwLTE4YzFmNzExODMxMjZhNyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%7D; sajssdk_2015_cross_new_user=1; csrftoken=kWczx89mCJgThyBIBlOitizxRIH7Tuef; sessionid=byzyzsb66yxmrf0vy702ap05mm88i74d; user_role=-1; classroomId=14037619; classroom_id=14037619; JG_fcdf8e635093adde6bef42651_PV=1701342457656|1701342457656', 'pragma': 'no-cache', 'referer': 'https://changjiang.yuketang.cn/v2/web/studentLog/14037619', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'university-id': '2868', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'uv-id': '2868', 'xt-agent': 'web', 'xtbz': 'ykt', } params = { 'actype': '-1', 'page': '0', 'offset': '20', 'sort': '-1', } response = requests.get( 'https://changjiang.yuketang.cn/v2/api/web/logs/learn/'+str(course_id), params=params, cookies=cookies,headers=headers) return response.text def courseware(id): headers = { 'authority': 'changjiang.yuketang.cn', 'accept': 'application/json, text/plain, */*', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'classroom-id': '14037619', # 'cookie': 'django_language=zh-cn; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThjMWY3MTE4MzAxNmQ2LTBjZTM0NjRkYWQ4YmQ1OC0xNjUyNTYzNC0yMDczNjAwLTE4YzFmNzExODMxMjZhNyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%7D; sajssdk_2015_cross_new_user=1; csrftoken=kWczx89mCJgThyBIBlOitizxRIH7Tuef; sessionid=byzyzsb66yxmrf0vy702ap05mm88i74d; user_role=-1; classroomId=14037619; classroom_id=14037619; JG_fcdf8e635093adde6bef42651_PV=1701342457656|1701342457656', 'pragma': 'no-cache', 'referer': 'https://changjiang.yuketang.cn/v2/web/studentLog/14037619', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'university-id': '2868', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'uv-id': '2868', 'x-csrftoken': 'kWczx89mCJgThyBIBlOitizxRIH7Tuef', 'xt-agent': 'web', 'xtbz': 'ykt', } response = requests.get( 'https://changjiang.yuketang.cn/c27/online_courseware/xty/kls/pub_news/'+id+'/', cookies=cookies, headers=headers, ) return response.text def coursePageInfo(course_id, id): headers = { 'authority': 'changjiang.yuketang.cn', 'accept': 'application/json, text/plain, */*', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'classroom-id': '14037619', # 'cookie': 'django_language=zh-cn; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThjMWY3MTE4MzAxNmQ2LTBjZTM0NjRkYWQ4YmQ1OC0xNjUyNTYzNC0yMDczNjAwLTE4YzFmNzExODMxMjZhNyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%7D; sajssdk_2015_cross_new_user=1; csrftoken=kWczx89mCJgThyBIBlOitizxRIH7Tuef; sessionid=byzyzsb66yxmrf0vy702ap05mm88i74d; user_role=-1; classroomId=14037619; classroom_id=14037619; JG_fcdf8e635093adde6bef42651_PV=1701342457656|1701342457656', 'pragma': 'no-cache', 'referer': 'https://changjiang.yuketang.cn/v2/web/xcloud/video-student/14037619/18867446', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'university-id': '2868', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'uv-id': '2868', 'xt-agent': 'web', 'xtbz': 'ykt', } response = requests.get( 'https://changjiang.yuketang.cn/mooc-api/v1/lms/learn/leaf_info/'+str(course_id)+'/'+str(id)+'/', cookies=cookies, headers=headers, ) return response.text def is_course_success(course_id, user_id, classroom_id, video_id): headers = { 'authority': 'changjiang.yuketang.cn', 'accept': 'application/json, text/plain, */*', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'classroom-id': '14037619', # 'cookie': 'django_language=zh-cn; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThjMWY3MTE4MzAxNmQ2LTBjZTM0NjRkYWQ4YmQ1OC0xNjUyNTYzNC0yMDczNjAwLTE4YzFmNzExODMxMjZhNyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%7D; csrftoken=kWczx89mCJgThyBIBlOitizxRIH7Tuef; sessionid=byzyzsb66yxmrf0vy702ap05mm88i74d; user_role=-1; classroomId=14037619; classroom_id=14037619; JG_fcdf8e635093adde6bef42651_PV=1701342457656|1701342457656', 'pragma': 'no-cache', 'referer': 'https://changjiang.yuketang.cn/v2/web/xcloud/video-student/14037619/18867444', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'university-id': '2868', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'uv-id': '2868', 'xt-agent': 'web', 'xtbz': 'ykt', } params = { 'cid': course_id, 'user_id': user_id, 'classroom_id': classroom_id, 'video_type': 'video', 'vtype': 'rate', 'video_id': video_id, 'snapshot': '1', } response = requests.get( 'https://changjiang.yuketang.cn/video-log/get_video_watch_progress/', params=params, cookies=cookies, headers=headers, ) return response.text def shuake(duration, videoTime, u, c,v,skuid,classroomid,cc, pg): headers = { 'authority': 'changjiang.yuketang.cn', 'accept': '*/*', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'classroom-id': '14037619', 'content-type': 'application/json', # 'cookie': 'django_language=zh-cn; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThjMWY3MTE4MzAxNmQ2LTBjZTM0NjRkYWQ4YmQ1OC0xNjUyNTYzNC0yMDczNjAwLTE4YzFmNzExODMxMjZhNyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218c1f71183016d6-0ce3464dad8bd58-16525634-2073600-18c1f71183126a7%22%7D; sajssdk_2015_cross_new_user=1; csrftoken=kWczx89mCJgThyBIBlOitizxRIH7Tuef; sessionid=byzyzsb66yxmrf0vy702ap05mm88i74d; user_role=-1; classroomId=14037619; classroom_id=14037619; JG_fcdf8e635093adde6bef42651_PV=1701342457656|1701342457656', 'origin': 'https://changjiang.yuketang.cn', 'pragma': 'no-cache', 'referer': 'https://changjiang.yuketang.cn/v2/web/xcloud/video-student/14037619/18867447', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'x-csrftoken': 'kWczx89mCJgThyBIBlOitizxRIH7Tuef', 'x-requested-with': 'XMLHttpRequest', 'xtbz': 'ykt', } json_data = { 'heart_data': [ { 'i': 5, 'et': 'playing', 'p': 'web', 'n': 'ali-cdn.xuetangx.com', 'lob': 'ykt', 'cp': videoTime, 'fp': 0, 'tp': videoTime, 'sp': 1, 'ts': int(time.time() * 1000), 'u': u, 'uip': '', 'c': c, 'v': v, 'skuid': skuid, 'classroomid': classroomid, 'cc': cc, 'd': duration, 'pg': pg, 'sq': 2, 't': 'video', 'cards_id': 0, 'slide': 0, 'v_url': '', } ] } response = requests.post('https://changjiang.yuketang.cn/video-log/heartbeat/', cookies=cookies, headers=headers, json=json_data) if __name__ == '__main__': json_str = course_list() data = json.loads(json_str) course_lst= data['data']['list'] ## 遍历课程 刷课 for course_lst in course_lst: ## 获取课程id 全部刷 course_id = course_lst['classroom_id'] # 假设course_info()方法返回的是一个JSON字符串 json_str = course_info(course_id) # 解析JSON字符串为Python对象 data = json.loads(json_str) activities = data['data']['activities'] # 遍历JSON对象 for activity in activities: if 'type' in activity: type = activity['type'] # 公告 if type == 9: print('这是一个公告') pass # 期末测试 elif type == 20: print('这是期末测试') pass elif type == 15: # 全部单元Id courseware_id = activity['courseware_id'] json_str = courseware(courseware_id) data = json.loads(json_str) content_info = data['data']['content_info'] for content_info in content_info: print(content_info['name']) for section_list in content_info['section_list']: time.sleep(1) randomStr = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=6)) courseChapterId = section_list['leaf_list'][0]['id'] # 注意这个位置 可能有的页面有多个任务而被忽略 video_name = section_list['name'] print(video_name, courseChapterId) # 进入课程界面 json_str = coursePageInfo(course_id, courseChapterId) data = json.loads(json_str) videoInfo = data['data'] c = videoInfo['course_id'] cc = videoInfo['content_info']['media']['ccid'] classroomid = videoInfo['classroom_id'] # cp 播放时长 d = videoInfo['content_info']['media']['duration'] sku_id = videoInfo['sku_id'] pg = str(videoInfo['id']) + "_" + randomStr v = videoInfo['id'] u = videoInfo['user_id'] progress = is_course_success(c, u, classroomid, v) if_completed = '0' try: if_completed = re.search(r'"completed":(.+?),', progress).group(1) except: pass if if_completed == '1': print(video_name, '\033[31m学习完成,跳过\033[0m') continue else: print(video_name + ",尚未学习,现在开始自动学习") videoTime = 0 while True: if videoTime >= d: videoTime == d shuake(d, videoTime, u, c, v, sku_id, classroomid, cc, pg) print(video_name, '\033[31m学习完成\033[0m') break # 模拟每5秒递增5,实际应用时需要替换为实际的递增逻辑 videoTime += 5 # 判断当前播放时长是否超过视频总时长 # 发送心跳请求 shuake(d, videoTime, u, c, v, sku_id, classroomid, cc, pg) print('学习时长:', videoTime) time.sleep(5) else: pass
2023年12月03日
408 阅读
0 评论
0 点赞
2023-11-05
TypeError: Cannot read properties of undefined (reading 'validate') ——vue-Element
问题每一次都会犯相同的错误this.$refs[formName].validate((valid) => { if (valid) { alert('submit!'); } else { console.log('error submit!!'); return false; } });表单校验 报错 TypeError: Cannot read properties of undefined (reading 'validate') ——vue-Element.....只需要在 form标签上添加 :ref ="" ------完美解决<el-form :ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
2023年11月05日
336 阅读
0 评论
0 点赞
2023-06-27
vue + axios get 请求header后出现跨域错误
this.$axios({ method: "get", url: "http://localhost:8080/api/user/selectAll", headers: { token: this.$store.state.token }, })当我们写前后分离项目的时候需要添加拦截器需要配置token,配置好之后就会如下,出现跨域问题,明明什么都对,但就是找不到问题所在,后来我通过百度发现问题所在当我们在自定义请求头的时候,浏览器浏览器会根据需要,发起一个“PreFlight”(也就是Option请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源,或者域) 这里请求头里也是有咱们写的请求头 但是在浏览器中运行就会报跨域异常 这就要说到OPTIONS如果自定义了请求头跨域请求就会变成复杂请求跨域请求有分为简单请求和复杂请求;一般情况下在不添加请求头的时候是简单请求,如果添加了话就是复杂请求,在发出复杂请求的之前,就会出现一次OPTIONS请求。OPTIONS请求可以被称作一次嗅探请求,通过这个方法,客户端可以在采取具体的资源请求之前,决定对资源采取何种必要措施。由于我的问题出现在请求内容为json的时候,所以是复杂请求,提前进行了一次OPTIONS请求。这个OPTIONS请求中没有增加我们的Authorization请求头,所以就无法通过我们的网关,在网管的地方被拦截下来了,返回了401所以我们就要在后端的拦截器中添加如下代码 if(request.getMethod().equals(RequestMethod.OPTIONS.name())) { response.setHeader("Access-Control-Allow-Origin","*"); response.setHeader("Access-Control-Allow-Headers","*"); response.setHeader("Access-Control-Allow-Methods","*"); response.setHeader("Access-Control-Allow-Credentials","true"); response.setHeader("Access-Control-Max-Age","3600"); response.setStatus(HttpStatus.OK.value()); return true; }目前的项目中,不需要考虑的太复杂,简单处理就是放行OPTIONS请求。这是我自己在项目中实际遇到的问题,百度解决的.然后总结写的一篇文章有错误的地方请指出
2023年06月27日
136 阅读
0 评论
0 点赞
2023-06-19
MacOs利用Brew安装Jdk11
一:安装JDK171.安装openjdk172.把homebrew安装的openjdk17软链接到系统目录brew search jdk //搜索可以安装的jdk版本 brew install openjdk@11 //按自己需要选择 3.执行安装sudo ln -sfn $(brew --prefix)/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk 二:检查是否安装成功在Terminal中运行下面的命令查看Java安装版本,如正常显示Java版本信息则说明安装成功,如果显示command java not find 或者其它则说明没有安装成功java --version三:配置环境变量切到jdk的home文件cd /Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home首次创建配置,可以使用这个命令创建配置文件~touch .bash_profile然后使用以下命令打开配置文件open -e .bash_profile添加配置内容:注意路径JAVA_HOME="/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home" export JAVA_HOME CLASS_PATH="$JAVA_HOME/lib" PATH=".$PATH:$JAVA_HOME/bin"四:完成配置1.完成配置:source .bash_profile2.输入echo $JAVA_HOME可以看到环境配置的路径 source .bash_profile //完成配置 echo $JAVA_HOME //检查配置
2023年06月19日
920 阅读
3 评论
0 点赞
2023-03-24
一篇文章带你入门Java字面量和常量
一篇文章带你入门Java字面量和常量目录引言概念字面量字面量的分类常量总结引言概念字面量: 又叫直接量或者数据,表示直接给出的一个值(可以是整数、小数、ture、false等等。常量: 是指在Java程序中固定不变的数据(字面量)。我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变。字面量♀ 小AD:哥什么是字面量,光看定义不是很明白呢?♂ 明世隐:这还不明白吗?比如你今天去坐地铁,花了5块钱,这个5就是字面量。♀ 小AD:那我明天去更远的地方要8块钱呢?♂ 明世隐:那8就是字面量。♀ 小AD:还是不是很清楚,你还是举游戏的例子吧。♂ 明世隐:你这货,就举你最喜欢的,你杀一个敌方英雄多少金币。♀ 小AD:200啊♂ 明世隐:那200就是字面量。♀ 小AD:那我第2次杀他,就更少钱了可能180,我要是连续杀几次,他可能只值20块了。♂ 明世隐:那180、20就是字面量。♀ 小AD:好像有点明白了。♂ 明世隐:说到底就是指数据。♀ 小AD:哦♂ 明世隐:数据也分好几种类型字面量的分类字面量类型说明举例字符串字面量用双引号(")括起来的内容“小鲁班”,“明世隐”字符字面量用单引号(')括起来的内容‘男',‘女'整数字面量不带小数点的数字200 , 150小数字面量带小数点的数字3.14 , 66.66布尔字面量布尔值表示真假true,false空字面量一个特殊的值,空值null字符串字面量public static void main(String[] args) { System.out.println("小鲁班"); System.out.println("你个**,你特么*****"); }♀ 小AD:明哥我知道这个♂ 明世隐:说说看。♀ 小AD:这个好简单,第一个是我喜欢的小鲁班,第2个是我喷打野常用台词。♂ 明世隐:喷人你倒是记得清楚。这种用双引号包括的内容表示的,就是字符串字面量,也各类语言中常用的包括Java。♀ 小AD:嗯这个比较好理解。♂ 明世隐:记住双引号是英文的哦♀ 小AD:知道了字符字面量System.out.println('男'); System.out.println('A');♂ 明世隐:invalid character constant,大概意思就是“无效的字符常数”。♀ 小AD:就是说单引只能一个字符♂ 明世隐:对是这个意思,如果要多个字符,就用双引号表示字符串字面量。整形字面量System.out.println("第一次击杀"); System.out.println(200); System.out.println("第二次击杀"); System.out.println(180);♀ 小AD:这个我明白,200,180就是整形字面量♂ 明世隐:对的,不错。小数字面量System.out.println("的值是"); System.out.println(3.14); System.out.println("技能冷却时间(秒)"); System.out.println(3.5);布尔字面量System.out.println(true); System.out.prinszKeuhmGUtln(false);♀ 小AD:哥,我看这个true,false是关键字哦。♂ 明世隐:对的呀,布尔就两个值,true、false。♀ 小AD:哦。。♂ 明世隐:说的通俗点,当刺客突到你脸上的时候,你只有两种结果,没有第3种。♀ 小AD:不不不,有好几种,刺客生,刺客死,我生我死,他得200,我得200,你看有好多种情况吧。♂ 明世隐:但你没发现你这些都是对立的吗?♀ 小AD:好像是哦。♂ 明世隐:你就这样想,他突到你脸上,你的结果是什么就不会搞不明白。你的结果就2种,要么活,要么死。还有第3种情况吗。♀ 小AD:不好意思我有复活甲。♂ 明世隐:不好意思,既然是复活甲,那就是活,况且别人压起身,你还不得死。结果就只有生和死,没有别的。♀ 小AD:嗯,我知道了。明哥讲问题真的透彻哦。♂ 明世隐:没办法,谁叫哦遇到你这个大聪明呢?♀ 小AD:我猜你肯定在夸我,虽然我后背有一丝丝的凉。♀ 小AD:哥最后一个空字面我知道了,肯定这样写System.out.println(null);♀ 小AD:明哥,报错了,之前的不都这么写吗?♂ 明世隐:System.out.println()括号中如果传入null,不同形式的null最终的输出也不同。如果是直接传入null,则会报错,因为无法确定传入的值是什么对象。♀ 小AD:额。。不懂♂ 明世隐:意思就是别这么用,后面的章节会具体说明。♀ 小AD:好吧常量♀ 小AD:明哥明哥,我想发个言♂ 明世隐:哟,还举手发言拉,可以啊,今天送你一颗星(明日之星)。♀ 小AD:明哥威武,我想说常量很好理解,就比如我的身份证号码,从我出生到最后都是一样的,是不是可以看作是常量。♂ 明世隐:嗯,不错啊,这个确实可以这样理解的。♀ 小AD:还有还有,你看我的容颜,从小到大,都这么好看,以后也一直是这样的,也是一个常量♂ 明世隐:你这个叫好看?得了吧,你这个叫不丑。♀ 小AD:你要这么说的话,你跟打野对喷的时候,我可就不讲话了。♂ 明世隐:开什么玩笑,我专业喷子30年,就这些小学生,我喷他们可以不带脏字。♀ 小AD:你这个确实。。。有点溜♂ 明世隐:高端的喷子,往往喷人于无形。常量:是final关键字修饰的变量(在c语言中是被const修饰),初始化必须赋值,且类型和值不能再改变。public static void main(String[] args) { final String card = "3603749832492349"; System.out.println("身份证:"+card); }♀ 小AD:如果我给它修改一下呢?♂ 明世隐:那就会编译报错。♂ 明世隐:意思就是不能给常量赋值。♀ 小AD:我知道了,哥我有个好想法!♂ 明世隐:说说看。♀ 小AD:我把我击杀敌人获得的金币设置成常量,就不会越来越不值钱的♂ 明世隐:你这想法,有点邪恶啊。♀ 小AD:我全部设置成第一滴血的金币值,我看谁拦得住我,你看我写的代码。public static void main(String[] args) { final int gold=300; System.out.println("第1滴血:"); System.out.println(gold); System.out.println("第2次击杀获得:"); System.out.println(gold); System.out.println("第3次击杀获得:"); System.out.println(gold); System.out.println("小鲁班已经无人可挡了:"); System.out.println(gold); System.out.println("小鲁班正在大杀特杀:"); System.out.println(gold); System.out.println("小鲁班正在大杀特杀:"); System.out.println(gold); System.out.println("小鲁班已经超神了:"); System.out.println(gold); }♂ 明世隐:我草,这么灵性!♀ 小AD:你不是说程序员可以为所欲为吗?♂ 明世隐:这个倒是实话,你这都是第一滴血的钱,不爽到死啊 。♀ 小AD:对啊,我的程序我做主,我说了算♂ 明世隐:可惜不是你说了算,因为王者,马总说了算。♀ 小AD:我不管♂ 明世隐:行吧,今天多送你两颗星我说了算。♀ 小AD:明哥威武,起飞!
2023年03月24日
236 阅读
1 评论
0 点赞
2022-12-20
java知识点收录
{card-describe title="学习网址"}https://leetcode-cn.com/problemset/all/http://www.cyc2018.xyzhttps://www.nowcoder.com/ta/coding-interviewsJava 全栈知识体系https://www.pdai.tech/{/card-describe}永无止境深拷贝https://zhuanlan.zhihu.com/p/260117694https://github.com/lvminghui/Java-NotesHashmap https://zhuanlan.zhihu.com/p/21673805SpringBoot自动装配原理https://blog.csdn.net/qq_36986015/article/details/107488437b树和b+树的区别https://blog.csdn.net/login_sonata/article/details/75268075二叉树的四种遍历方式https://www.cnblogs.com/du001011/p/11229170.htmlMysql ACID https://www.jianshu.com/p/fc8a654f2205Mysql MVVC https://www.cnblogs.com/hirampeng/p/9944200.htmlMysql 覆盖索引 https://zhuanlan.zhihu.com/p/107125866JVM和JMM https://zhuanlan.zhihu.com/p/136623445,https://www.bilibili.com/video/BV12t411u726JDK1.7和JDK1.8的内存模型比较https://blog.csdn.net/Hollake/article/details/92762180Java中的常量池https://blog.csdn.net/zm13007310400/article/details/77534349接口和抽象类https://cloud.tencent.com/developer/article/1677833Spring实例化Bean三种方法https://www.cnblogs.com/liushiqiang123/p/11502986.htmlBean注入https://www.cnblogs.com/tuyang1129/p/12873492.html设计模式7大原则https://zhuanlan.zhihu.com/p/24614363OAuth2.0认证流程https://www.cnblogs.com/wudimanong/p/10821215.html线程池https://blog.csdn.net/ming1215919/article/details/114799184Listhttps://www.cnblogs.com/xiaobug/p/11606362.html解决--spring.profiles.active=prod设置的变量属性不起作用https://blog.csdn.net/shaojianjun521/article/details/102803303httputil https://www.cnblogs.com/i-tao/p/13638904.htmlConcurrentHashMaphttps://my.oschina.net/liboware/blog/5117011https://blog.csdn.net/qq_18300037/article/details/123795776nohup java -jar rjdataservice-1.0.0-SNAPSHOT.jar >logs.txt & --spring.profiles.active=test
2022年12月20日
269 阅读
2 评论
1 点赞
1
2
...
9