首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
12,994 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
10,649 阅读
3
gradle-5.4.1-all.zip下载
8,674 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
7,521 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
6,782 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
619
篇文章
累计收到
597
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
446
篇与
的结果
2020-04-30
程序篇——如何搭建一个属于你的博客
为了快速,方便,所以这里建博客采用的是现有的程序,如果你追求功能可以选择WordPress如果追求极简可以选择Typecho本站采用的是Z-Blog所以这里就只介绍Z-Blog的程序了,原理都一样三套程序分别下载已经打包好了,在文章末尾,下载好之后就可以进入下一篇了Z-BlogPHP_1_6_0_2100_Valyria.zip大小:2.37MB已经过安全软件检测无毒,请您放心下载。wordpress-5.4.1-zh_CN.zip大小:13.3MB已经过安全软件检测无毒,请您放心下载。Typecho1.1-17.10.30-release.tar.gz大小:476Kb已经过安全软件检测无毒,请您放心下载。
2020年04月30日
1,300 阅读
1 评论
0 点赞
2020-04-30
域名篇——如何搭建一个属于你的博客
现在国内注册域名都是需要实名认证的,所以推荐大厂注册,如腾讯云,阿里云,这里展示的是腾讯云: 而且现在腾讯云,阿里云都有活动,新用户注册域名价格十分美丽,这里以腾讯云为例 先注册腾讯云账号:点击进入 点击这个注册: 这里直接使用微信扫码注册就行了,然后跟着流程走一遍,注册就行了(我以前注册过了,所以不能再演示一次了) 注册完之后,记得实名认证,以及创建实名信息模板实名认证:点击进入域名模板(购买域名需要的):点击进入这里根据自己信息进行填写即可这里域名模板信息审核一遍需要一天左右吧,所以不用着急然后就是氪金环节来到下面这个页面买域名:.org 后缀的域名不需要实名认证。.com / .net /.xyz / .club / .wang / .info /.cn / .com.cn / .net.cn / .ac.cn / .中国 的域名注册成功后 5 天内必须实名认证,否则域名会处于 Serverhold 状态,无法正常使用;待实名审核通过后,1 - 2 个工作日恢复正常状态。腾讯云活动地址:点击进入 这里呢根据自己需求选择域名后缀就行了,推荐COM或者CN(COM国际域名,CN中国域名)这里的购买是一年,续费价格不同CN是35一年,COM是50多一年。域名续费价格:点击进入 选择自己想要的域名后缀之后点击立即抢购 输入域名前缀,点击查询如果是一键购买说明可以注册,如果是则需要换一个点击一键购买点击立即支付即可点击下一步根据需求选择支付方式可以在这里查看以购买的域名:点击进入只有当服务状态为正常时,域名才可以解析到服务器
2020年04月30日
1,603 阅读
0 评论
0 点赞
2020-04-30
总篇——如何搭建一个属于你的博客
博客这东西,还是很有意义的,既可以记录自己的生活,还可以收集学习笔记,现在来看一下怎么自己做一个博客吧!制作一个网站需要以下东西:1,网站域名(如本站的域名是:lanol.cn,这里选取的是腾讯云的域名)2,服务器(或虚拟主机,现在国内服务器绑定域名都需要备案)3,网站程序(有能力的可以自己写,也可以借助现有的程序,比如WordPress,亦或者本站使用的Z-Blog,更轻量的还有Typecho)这里的教程就是采用Z-Blog域名 域名篇——如何搭建一个属于你的博客服务器服务器篇——如何搭建一个属于你的博客程序程序篇——如何搭建一个属于你的博客开始搭建
2020年04月30日
811 阅读
0 评论
1 点赞
2020-04-30
Windows下安装MySQL详细教程
1、安装包下载 2、安装教程 (1)配置环境变量 (2)生成data文件 (3)安装MySQL (4)启动服务 (5)登录MySQL (6)查询用户密码 (7)设置修改用户密码 (8)退出 3、解决问题 1、安装包下载。下载地址:https://dev.mysql.com/downloads/mysql/ 点击下载之后,可以选择注册Oracle账号,也可以跳过直接下载。下载完成后,选择一个磁盘内放置并解压。 2020年2月14日,mysql官网进不去了,好吧~那就来个镜像,总没问题了吧。如果官网龟速下载,建议使用下面镜像巨快。相对的~Mysql国内镜像:http://mirrors.sohu.com/mysql/MySQL-8.0/ 下载完成之后,解压即可!2 安装教程(1)配置环境变量变量名:MYSQL_HOME变量值:E:mysql-5.7.20-winx64 (2)生成data文件以管理员身份运行cmd进入E:pythonmysqlmysql-8.0.12-winx64in>下执行命令:mysqld --initialize-insecure --user=mysql 在E:pythonmysqlmysql-8.0.12-winx64in目录下生成data目录 (3) 安装MySQL继续执行命令:mysqld -install (4)启动服务继续执行命令:net start MySQL (5)登录MySQL登录mysql:(因为之前没设置密码,所以密码为空,不用输入密码,直接回车即可)E:pythonmysqlmysql-8.0.12-winx64in>mysql -u root -p (6)查询用户密码查询用户密码命令:mysql> select host,user,authentication_string from mysql.user; (7)设置(或修改)root用户密码mysql> use mysql 提别注意:下面这个修改密码的方式不正确,可能是因为版本问题。最近解决了。mysql> update mysql.user set authentication_string=("123456") where user="root"; Query OK, 1 row affected, 1 warning (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 1解决方案如下:mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';mysql> flush privileges; #作用:相当于保存,执行此命令后,设置才生效,若不执行,还是之前的密码不变Query OK, 0 rows affected (0.01 sec) (8)退出mysql> quitBye (9)再次登录 3、解决问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)关于修改密码再次登录出现ERROR的解决方案:首先问题出现的原因在于可能是因为版本不同,命令有所差异。个人认为,其实无所谓了,最终问题解决了就是了。如果你是按照上面的完整教程安装出现这种问题的解决方案:1、所有东西都删除,然后重装,按照上面教程再来一遍;部分内容有更正。特别注意!2、如果你之前装了,报错之后就一直放在那里,现在请严格按照下面步骤进行: 1、打开cmd,切换到mysql的bin目录下,输入命令net stop mysql,停止mysql服务; 2、打开mysql的安装目录,找到data文件夹,将其删除! 3、回到cmd命令窗口,输入mysqld -remove 4、接下来按照上面教程,从第二步生成data文件开始执行,一定要注意修改密码那里:mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
2020年04月30日
868 阅读
0 评论
0 点赞
2020-04-29
计数排序——蓝桥杯培训
B站视频演示地址:https://www.bilibili.com/video/BV1GW411H7Cs/概念:计数排序是一个非基于比较的排序算法,而是利用数组下标来确定元素的正确位置。用辅助数组对数组中出现的数字技术,元素转下标,下标转元素。假设元素均大于等于0,一次扫描原数组,将元素值K记录在辅助数组的K位上。1,基础版计数排序 假定20个随机整数的值如下: 9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9 创建一个辅助数组(长度为最大值+1) 先遍历这个无序的随机数列,每一个整数按照其值对号入座,对应数组下标的元素进行加1操作。 比如第一个整数是9,那么数组下标为9的元素加1: 第二个整数是3,那么数组下标为3的元素加1: 继续遍历数列并修改数组。。。。。。 最终,数列遍历完毕时,数组的状态如下: 遍历数组,输出数组元素的下标值,元素的值是几,就输出几次: 0,1,1,2,3,3,3,4,4,5,5,6,7,7,8,9,9,9,9,10public static void countSort1(int[] arr) { int max = arr[0]; for (int i : arr) { if (i > max) { max = i; } } int[] countarr = new int[max + 1]; for (int j : countarr) { countarr[j]++; } int current = 0; for (int i = 0; i < countarr.length; i++) { while (countarr[i] > 0) { arr[current] = i; countarr[i]--; current++; } } }2,改进版: public static void countSort(int[] arr) { // 找到arr的最大值和最小值 int min = arr[0]; int max = arr[0]; for (int i : arr) { if (i < min) { min = i; } if (i > max) { max = i; } } // 创建计数数组 int[] countArr = new int[max - min + 1]; for (int j : countArr) { countArr[j - min]++; } // 定义指针 int current = 0; // 回填 for (int i = 0; i < countArr.length; i++) { while (countArr[i] > 0) { arr[current] = i + min; current++; } } }3,最终版public static int[] countArr3(int[] arr) { int min = arr[0]; int max = arr[0]; for (int i : arr) { if (i < min) { min = i; } if (i > max) { max = i; } } // 创建计数数组 int[] countArr = new int[max - min + 1]; for (int j : countArr) { countArr[j - min]++; } // 对计数数组的元素进行累加,累加的规则将前一个元素的值+当前元素的值 for (int i = 1; i < countArr.length; i++) { countArr[i] += countArr[i - 1]; } // 创建一个数组,存储最终的有序数列 int[] sortedArr = new int[arr.length]; // 回填 for (int i = arr.length - 1; i >= 0; i--) { sortedArr[countArr[arr[i] - min] - 1] = arr[i]; countArr[arr[i] - min]--; } return sortedArr; }以上皆为笔记
2020年04月29日
906 阅读
0 评论
0 点赞
2020-04-28
职教云-智慧职教,签到补签分析(逆天改命系列)
最一开始,我只试着弄了个职教云签到监控。帮我签到,但是后来居然在一些地方看到各种逆天操作,然后发现全部都是教师权限才能的操作,然后我就对职教云补签进行了抓包分析(别问我教师账号怎么来的,注册即可)。在用教师账户进行补签操作之后抓到这么一个包,怎么抓包的就说了,这个也不是重点,主要看思路。这个包是我在职教云手机端抓到的,因为手机版比网页版更老实。先来看下他的参数:传递了一些cookiedata,equipmentAppVersion,equipmentModel,equipmentApiVersion经过目测翻译,加分析值:equipmentAppVersion:这玩意就是app版本号equipmentModel:这个是我手机型号equipmentApiVersion:这个大概估计就是api版本了吧。然后就是那个最关键的data了,一般来说要传递的值都在data里面吧。把它复制出来并且url解码之后是一串这样的为了看得更清楚,给他挪个地方看看咳咳,继续盲猜之旅。目前的值有这些:OpenClassId:这个似乎目测翻译一下就是,开放班级的IDId:这玩意就一个ID,是啥ID咱也不知道呀,放着看看SignId:目测翻译一下,标志ID,估计就是代表这条活动的ID吧StuId:目测翻译就是学生IDSignResultType:标志结果类型,咳咳人工机翻,估计意思就是签到的目标状态SourceType:来源类型?大概这样吧schoolId:目测翻译就是学校ID经过上面这一长短的目测翻译大概需要的一些值就是这样了。现在先试着发一个包看下结果是修改成功,说明可以自己伪造包然后修改签到状态但问题是,我们没有老师的账号就没有老师cookie呀,那怎么可以实现那些逆天操作呢,我试着把传递的cookie删除,然后看下结果然后发现居然也修改成功了,既然cookie都不要了,那我干脆把手机型号,版本型号这些也删除试试,然后只保留一个data,结果。。。。除了说职教云老实我还能说什么。到此我们就可以完成补签操作了。对于上面那几个参数不再次分析了,懒,直接上代码完整代码在GitHub:https://github.com/vastsa/ZhiJiaoYunQianDaofrom configparser import ConfigParser import requests config = ConfigParser() config.read('config.info') try: stuid = config['information']['userid'] except: import get_cookie def get_kecheng(time): data = { 'stuId': stuid, 'faceDate': time } url = 'https://zjyapp.icve.com.cn/newmobileapi/faceteach/getStuFaceTeachList' html = requests.post(url=url, data=data).json() datalist = html['dataList'] courses = len(datalist) courseId = [] courseNmae = [] classSection = [] openClassId = [] for i in range(courses): courseNmae.append(datalist[i]['courseName']) courseId.append(datalist[i]['Id']) classSection.append(datalist[i]['classSection']) openClassId.append(datalist[i]['openClassId']) if courses != 0: print(f'课表如下:') js = 0 for i in range(courses): print(f'【{js}】第{classSection[i]}课:{courseNmae[i]}') js += 1 js = input("请输入你要补签的课堂:") return { 'courseId': courseId[int(js)], 'openClassId': openClassId[int(js)], 'courses': courses } else: print("同学,你今天无课,好好休息!") def buqian(course): url = 'https://zjyapp.icve.com.cn/newmobileapi/faceteach/newGetStuFaceActivityList' data = { 'activityId': course['courseId'], 'stuId': stuid, 'classState': '2', 'openClassId': course['openClassId'] } html = requests.post(url=url, data=data).json()['dataList'] buqianname = [] buqianid = [] for j in range(len(html)): datatype = html[j]['DataType'] if datatype == "签到": buqianname.append(html[j]['Title']) buqianid.append(html[j]['Id']) for i in range(len(buqianid)): print(f'【{i}】{buqianname[i]}') # print(f'【{i}】{buqianid[i]}') target = int(input("请输入要逆天改命的序号:")) datas = f'{{"OpenClassId":"{course["openClassId"]}","Id":"{stuid}","SignId":"{buqianid[target]}","StuId":"{stuid}","SignResultType":1,"SourceType":2,"schoolId":"3-3sabgooohfboflpnx6bq"}}' xdata = { 'data': f'{datas}' } headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'zjyapp.icve.com.cn', 'Connection': 'Keep-Alive', 'Accept-Encoding': 'gzip', 'User-Agent': 'okhttp/3.10.0', } bqurl = 'https://zjyapp.icve.com.cn/newmobileapi/faceteach/changeSignType' html = requests.post(url=bqurl, headers=headers, data=xdata).json() if html['code'] == 1: print(html['msg']) print("逆天改命成功,返回菜单") menu() else: print(html['msg']) print("逆天改命失败,请联系Lan") def menu(): print("【欢迎使用职教云补签助手】") print(" By:Lan") date = input("请输入需要补签的日期如(2020-4-17):") course = get_kecheng(date) buqian(course) if __name__ == '__main__': menu()
2020年04月28日
7,521 阅读
9 评论
1 点赞
2020-04-27
职教云-智慧职教,网课观看分析(秒刷网课)
先来张效果图:当打开课件之后,发现右侧或不断发送一个包StuProcessCellLog的包,初步估计这就是不断向服务器发送我们目前的观看情况的包点开之后翻到最下面,可以看到Form Data,经过自己之前补签的分析,可以猜到下面对应的值的信息,以及刷网课的思路CourseOpenID:这个课程ID可以直接在网址栏查看OpenClassID:这个课程班级ID一样的可以直接在网址栏看上面这两个值在同一个课程都是不变的CellID:这个就是下一步分析怎么来的了token:后来发现这个和Cookie里面的token是一样的,所以也可以不变下面是分析CellID的获取过程:1,首先是获取整个课件的大列表,也就是下图这一块打开之后按F12,打开工具,然后刷新网页可以看到,多了三个东西出来getProcessList,getStuStudyClassList,getTopicByModuleId一个个来看吧,从第一个开始getProcessList:他提交了两条数据,一个是课程id一个是课程班级id返回来一个list,全部展开之后就是我们的课件列表了返回来第一级目录,和他的ID然后是第二个getStuStudyClassList:这个是获取你账户下有哪些课程,在这里可以不用管第三个是getTopicByModuleId可以看到这个是二级目录的id,然后uptopicid这个应该是上传者的id(网易翻译猜的,在这里没啥用,不过修改作业时间那里需要这个id)到这里,目前的三个包已经分析完了,但是还是没有得到刷进度要的CellID,这三个包只翻出来二级目录,还差最后课件的ID就行了,那是因为我们还没有展开课件,所以没有加载,然后我们现在来点开二级目录查看一下查看一下Form Data:一个三个值,第一个courseOpenID:说过了的,第二个OpenClassID:说过的,第三个topicid:现在说topicid:fzpq初步估计就是就是之前传递过的值,经对比可以发现这个id等于我们获取到的二级目录ID。到这里就已经得到了最开始我们所需要的CellID了回过神看这个文件列表发现,职教云好实诚呀。。第一个getProcessList:获取列表第二个getStuStudyClassList:获取学生学习班级列表第三个TopicidByMouduleid:通过Moduleid获取Topicid第四个getCellByTopicId:通过Topicid获取CellID总上就可以快乐的为所欲为了最后附上批量获取课程CellID的python代码import random import time import requests def get_all(): url = 'https://zjyapp.icve.com.cn/newmobileapi/assistTeacher/getModuleListByClassId' data = { 'courseOpenId': 'courseOpenId', 'openClassId': 'courseOpenId', 'stuId': 'stuId', } html = requests.post(url=url, data=data).json() data = html['moduleList'] moduleIds = [] for i in data: print(i['moduleName'] + '已加载') moduleIds.append(i['moduleId']) return moduleIds def get_list(moduleId): url = 'https://zjy2.icve.com.cn/newmobileapi/assistTeacher/getTopicListByModuleId' moduleIds = [] for i in moduleId: data = { 'openClassId': 'openClassId', 'courseOpenId': 'courseOpenId', 'moduleId': f'{i}' } html = requests.post(url=url, data=data).json() data = html['topicList'] for j in data: moduleIds.append(j['topicId']) return moduleIds def get_cell(topicIds): url = 'https://zjy2.icve.com.cn/newmobileapi/assistTeacher/getCellListByTopicId' cellids = [] for k in topicIds: data = { 'openClassId': 'openClassId', 'courseOpenId': 'courseOpenId', 'topicId': k, 'stuId': 'stuId' } html = requests.post(url=url, data=data).json() data = html['cellList'] for i in data: if i['categoryName'] == '子节点': for j in i['cellChildNodeList']: cellids.append(j['cellId']) else: cellids.append(i['cellId']) return cellids
2020年04月27日
10,649 阅读
14 评论
3 点赞
1
...
47
48
49
...
64