油猴支持阿里云自动登陆插件
遇到的以下问题,都已在脚本中解决:
- 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据
- 元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆不丝滑,通过元素发现机制,解决此问题并做到丝滑登陆
- 根据密钥计算校验码之前做过,本次引入了一个外部依赖默认的计算跟预期不一致,卡了10分钟
参考资料:入门篇 | 油猴开发指南
// ==UserScript==
// @name 阿里云自动登录
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 自动填写阿里云登录表单
// @author 你
// @match https://signin.aliyun.com/*.onaliyun.com/login.htm?callback=*// @grant GM_getResourceText
// @resource user_info_url file://D:/temp/csdn/userinfo.json// ==/UserScript==(function() {'use strict';// 注意:这里应该替换为你的实际用户名和密码var username = "帐号"; // 替换为你的用户名var password = "密码"; // 替换为你的密码var secretKey = "填入密钥"// 用户信息保存在本地let info_content = GM_getResourceText('user_info_url');let user_info_json = JSON.parse(info_content);var username = user_info_json['username']var password = user_info_json['password']// 用来计算双因子验证码 的密钥var secretKey = user_info_json['secretKey']// 定义一个辅助函数来等待某个选择器对应的元素出现function waitForElement(inputSelect,tag, callback) {const observer = new MutationObserver((mutations) => {var ele_input = document.querySelector(inputSelect);var but_next = document.querySelector('.next-btn.next-large.next-btn-primary')// 判断所有想到的元素都已加载完成,才进行数据改写if (ele_input && but_next.innerText == tag) {observer.disconnect();callback(ele_input,tag);}});observer.observe(document.body, { childList: true, subtree: true });}// 对元素进行赋值function freshReactValue(input){const evt = new Event("change");// 对其进行事件触发input.dispatchEvent(evt);// 获取元素的所有键名,并通过find函数进行查找// find函数会根据传入的函数进行判断,返回正确的值,// 而我们的函数是判断前缀是否是__reactEventHandlersconst prop = Object.keys(input).find((p) => p.startsWith("__reactEventHandlers"));// 获取到对应键名的对象,得到该对象的onchange函数,并且传入eventinput[prop].onChange(evt);}window.addEventListener('load', () => {// 用户名登陆m,waitForElement('#loginName',"下一步", (loginInput,tag) => {loginInput.value = username;console.error(username)// 刷新freshReactValue(loginInput);// 点击下一步var but_pass = document.querySelector('.next-btn.next-large.next-btn-primary')but_pass.click();});// 密码登陆waitForElement('#loginPassword',"登录", (passInput,tag) => {passInput.value = password;// 刷新freshReactValue(passInput);// 点击下一步var but_pass = document.querySelector('.next-btn.next-large.next-btn-primary')but_pass.click();});// 双因子验证码waitForElement('.next-input.next-medium input[placeholder="请输入 6 位数字安全码"]',"提交验证", (secr_input,tag) => {// 计算验证码const secret = GenerateTOTP(secretKey);secr_input.value = secret;// 刷新freshReactValue(secr_input);// 点击下一步var but_pass = document.querySelector('.next-btn.next-large.next-btn-primary')but_pass.click();});});// 双因子计算原始库,也可以使用远程引用 ,但是想着使用的文件不大,就直接放进来 了"use strict";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}};"undefined"!=typeof module&&module.exports&&(module.exports=sjcl);sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.g(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.g(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b&=31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===c},g:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},j:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]}};sjcl.codec.base32={e:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",fromBits:function(a,b){var c="",d,e=0,g=sjcl.codec.base32.e,f=0,k=sjcl.bitArray.bitLength(a);for(d=0;5*c.length<k;)c+=g.charAt((f^a[d]>>>e)>>>27),5>e?(f=a[d]<<5-e,e+=27,d++):(f<<=5,e-=5);for(;c.length&5&&!b;)c+="=";return c},toBits:function(a){a=a.replace(/\s|=/g,"").toUpperCase();var b=[],c,d=0,e=sjcl.codec.base32.e,g=0,f;for(c=0;c<a.length;c++){f=e.indexOf(a.charAt(c));if(0>f)throw new sjcl.exception.invalid("this isn't base32!");27<d?(d-=
27,b.push(g^f>>>d),g=f<<32-d):(d+=5,g^=f<<32-d)}d&56&&b.push(sjcl.bitArray.partial(d&56,g,1));return b}};sjcl.hash.sha1=function(a){a?(this.d=a.d.slice(0),this.b=a.b.slice(0),this.a=a.a):this.reset()};sjcl.hash.sha1.hash=function(a){return(new sjcl.hash.sha1).update(a).finalize()};sjcl.hash.sha1.prototype={blockSize:512,reset:function(){this.d=this.h.slice(0);this.b=[];this.a=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.b=sjcl.bitArray.concat(this.b,a);b=this.a;a=this.a=b+sjcl.bitArray.bitLength(a);for(b=this.blockSize+b&-this.blockSize;b<=a;b+=this.blockSize)n(this,c.splice(0,16));return this},finalize:function(){var a,b=this.b,c=this.d,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);
b.push(Math.floor(this.a/0x100000000));for(b.push(this.a|0);b.length;)n(this,b.splice(0,16));this.reset();return c},h:[1732584193,4023233417,2562383102,271733878,3285377520],i:[1518500249,1859775393,2400959708,3395469782]};function n(a,b){var c,d,e,g,f,k,m,l=b.slice(0),h=a.d;e=h[0];g=h[1];f=h[2];k=h[3];m=h[4];for(c=0;79>=c;c++)16<=c&&(l[c]=(l[c-3]^l[c-8]^l[c-14]^l[c-16])<<1|(l[c-3]^l[c-8]^l[c-14]^l[c-16])>>>31),d=19>=c?g&f|~g&k:39>=c?g^f^k:59>=c?g&f|g&k|f&k:79>=c?g^f^k:void 0,d=(e<<5|e>>>27)+d+m+l[c]+a.i[Math.floor(c/20)]|0,m=k,k=f,f=g<<30|g>>>2,g=e,e=d;h[0]=h[0]+e|0;h[1]=h[1]+g|0;h[2]=h[2]+f|0;h[3]=h[3]+k|0;h[4]=h[4]+m|0}sjcl.misc.hmac=function(a,b){this.f=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.c=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.c[0].update(c[0]);this.c[1].update(c[1])};sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){a=(new this.f(this.c[0])).update(a).finalize();return(new this.f(this.c[1])).update(a).finalize()};function HOTP(K, C){var key = sjcl.codec.base32.toBits(K);// Count is 64 bits long. Note that JavaScript bitwise operations make// the MSB effectively 0 in this case.var count = [((C & 0xffffffff00000000) >> 32), C & 0xffffffff];var otplength = 6;var hmacsha1 = new sjcl.misc.hmac(key, sjcl.hash.sha1);var code = hmacsha1.encrypt(count);var offset = sjcl.bitArray.extract(code, 152, 8) & 0x0f;var startBits = offset * 8;var endBits = startBits + 4 * 8;var slice = sjcl.bitArray.bitSlice(code, startBits, endBits);var dbc1 = slice[0];var dbc2 = dbc1 & 0x7fffffff;var otp = dbc2 % Math.pow(10, otplength);var result = otp.toString();while (result.length < otplength){result = '0' + result;}return result}// 计算双因子function GenerateTOTP(secret) {var ctime = Math.floor((new Date() - 0) / 30000);var code = HOTP(secret, ctime);return code;}})();
相关文章:
油猴支持阿里云自动登陆插件
遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆…...
【2024年华为OD机试】(C卷,100分)- 字符串筛选排序 (Java JS PythonC/C++)
一、问题描述 题目描述 输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母 (k > 1) 输出该字母所在字符串中的位置索引 (字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串…...
iOS - runtime总结
详细总结一下 Runtime 的核心内容: 1. 消息发送机制 // 消息发送的基本流程 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取 isaClass cls object_getClass(self);// 2. 查找缓存IMP imp cache_getImp(cls, _cmd);if (imp) return imp(self, _cmd, ...);…...
第33 章 - ES 实战篇 - MySQL 与 Elasticsearch 的一致性问题
思维导图 0. 前言 MySQL 与 Elasticsearch 一致性问题是老生常谈了。网上有太多关于这方面的文章了,但是千篇一律,看了跟没看没有太大区别。 在生产中,我们往往会通过 DTS 工具将 binlog 导入到 Kafka,再通过 Kafka 消费 binlog&…...
Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】
挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…...
PythonQT5打包exe线程使用
打包: pyinstaller --noconsole --onefile test.py–noconsole 表示不需要打开命令行 修改:test.spec 一般项目里面需要用的资源文件,比如lib、png、exe等。 需要单独修改spec文件 pathex[.],binaries[(D:/test.png, .),(D:/simsun.ttc, .…...
【Powershell】Windows大法powershell好(二)
PowerShell基础(二) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 1. powershell 执行外部命令 powershell也可以执行一些外部的…...
前端学习-环境this对象以及回调函数(二十七)
目录 前言 目标 环境对象 作用 环境对象this是什么? 判断this指向的粗略规则是什么? 回调函数 目标 常见的使用场景 综合案例:Tab任务栏切换 总结 前言 男儿何不带吴钩,收取关山五十州 目标 能够分析判断函数运行在不…...
Element-plus、Element-ui之Tree 树形控件回显Bug问题。
需求:提交时,需要把选中状态和半选中状态 的数据id提交。如图所示: 数据回显时,会出现代码如下: <template><el-tree ref"treeRef" :data"tree" show-checkbox node-key"id" …...
互联网全景消息(10)之Kafka深度剖析(中)
一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…...
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步
Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步 目录 Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动…...
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)
pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)/ x y 代码代码 1:torch.matmul(x, y)输入张量:计算逻辑:输出结果: 代码 2:y y.view(4,1)…...
PyTorch环境配置常见报错的解决办法
目标 小白在最基础的环境配置里一般都会出现许多问题。 这里把一些常见的问题分享出来。希望可以节省大家一些时间。 最终目标是可以在cmd虚拟环境里进入jupyter notebook,new的时候有对应的环境,并且可以跑通所有的import code。 第一步:…...
罗永浩再创业,这次盯上了 AI?
罗永浩,1972年7月9日生于中国延边朝鲜族自治州的一个军人家庭,是一名朝鲜族人;早年在新东方授课,2004年当选 “网络十大红人” ;2006年8月1日,罗永浩创办牛博网;2008年5月,罗永浩注册…...
VUE3 provide 和 inject,跨越多层级组件传递数据
provide 和 inject 是 Vue 3 提供的 API,主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中,跨越多层组件传递数据,而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...
git打补丁
1、应用场景 跨仓库升级 开发项目B使用的是开源项目A。开源项目A发现漏洞,作者进行了修复,我们可以通过使用git补丁的方式,将作者修改的内容复制到我 们的项目B中。 2、TortoiseGit方式 源仓库 格式化补丁 根据提交数量,生成…...
机械燃油车知识图谱、知识大纲、知识结构(持续更新...)
一、发动机 曲柄连杆机构 配气机构 点火系统 起动系统 燃油供给系统 润滑系统 冷却系统 二、底盘 (一)传动系统 1、离合器 2、变速器 3、万向传动装置 4、驱动桥 (二)行驶系统 1、车架 2、车桥 3、悬架 4、车轮 &a…...
Vue3学习总结
一、Vue 3 基础搭建与核心语法 1.创建 Vue 3 应用 在项目的入口文件 main.js 中,通过以下代码创建 Vue 3 应用实例: import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app); 这几行代码的作用是引入…...
Type-C双屏显示器方案
在数字化时代,高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步,一款结合了便携性和高效视觉输出的设备——双屏便携屏,逐渐崭露头角,成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...
【读书与思考】焦虑与内耗
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 今天一个朋友和我说,最近比较焦虑和内耗,无心工作和学习,我问他你焦虑内耗的时候,时间主要花在哪了,他告诉我说主要花在看有关移…...
基于python的网页表格数据下载--转excel
基于 Python 的网页表格数据爬取与下载:以维基百科为例 目录 基于 Python 的网页表格数据爬取与下载:以维基百科为例1. 背景介绍2. 工具与环境3. 操作步骤1. 获取网页内容2. 定位表格元素3. 表格变身 Pandas DataFrame4. 检查数据,收工!5. 进阶玩法与优化6. 完整代码4. 结果…...
Vue.js开发入门:从零开始搭建你的第一个项目
前言 嘿,小伙伴们!今天咱们来聊聊 Vue.js,一个超火的前端框架。如果你是编程小白,别怕,跟着我一步步来,保证你能轻松上手,搭建起属于自己的第一个 Vue 项目。Vue.js 可能听起来有点高大上&#…...
LS1046+XILINX XDMA PCIE调通
欢迎点赞收藏,欢迎私下讨论技术,分享技术 硬件平台 :NXP LS1046 XILINX FPGA 软件平台:LINUX 4.19.68 buildroot LS1046 PEX3 接 XILINX FPGA,linux使用designware的PCI主控制器。下载XILINX DMA驱动,解…...
HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系
一、前言 当开发者使用Builder做引用数据传递时,会考虑组件的父子关系,使用了bind(this)之后,组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题,引入LocalBuilder装饰器。…...
YOLOv10-1.1部分代码阅读笔记-downloads.py
downloads.py ultralytics\utils\downloads.py 目录 downloads.py 1.所需的库和模块 2.def is_url(url, checkFalse): 3.def delete_dsstore(path, files_to_delete(".DS_Store", "__MACOSX")): 4.def zip_directory(directory, compressTrue, ex…...
计算机图形学【绘制立方体和正六边形】
工具介绍 OpenGL:一个跨语言的图形API,用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT:OpenGL的一个工具库,简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…...
基于django中医药数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,中医药管理平台当然不能排除在外。中医药数据可视化平台是在实际应用和软件工程的开发原理之上,运用Python语言、ECharts技术、…...
kafka消费堆积问题探索
背景 我们的商城项目用PHP写的,原本写日志方案用的是PHP的方案,但是,这个方案导致资源消耗一直降不下来,使用了20个CPU。后面考虑使用通过kafka的方案写日志,商城中把产生的日志丢到kafka中,在以go写的项目…...
Vue.js 使用插槽(Slots)优化组件结构
Vue.js 使用插槽(Slots)优化组件结构 今天我们聊聊 Vue.js 的一个超实用功能——插槽(Slots)。插槽是 Vue 组件开发中的神器,用好它,你可以让组件变得更灵活、更可复用,还能写出优雅的代码结构…...
Broker如何进行定时心跳发送和故障感知
1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…...
贴吧网站建设/济南网络优化网站
C:\Users\this is user name\AppData\Roaming\Scooter Software\Beyond Compare 4 删除这个目录下所有文件(这个方法目前我试过可以的) 一劳永逸,修改注册表 1)在搜索栏中输入 regedit ,打开注册表 2) 删除项目:计算机\HKEY_CURRENT_USE…...
用asp.net做的 购物网站视频/营销推广软文案例
水! 判断一下中间部分是否有相邻的,行列边界是否有一样的 【代码】 /* *********************************************** Author :angon************************************************ */ #include <stdio.h> #include <string.h…...
wordpress 手机验证码插件/深圳全网信息流推广公司
折线分割平面 Time Limit: 1000ms Memory limit: 32768K 有疑问?点这里^_^ 题目描述 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部…...
wordpress页面的template/搜索百度下载安装
转自http://siqun.blog.163.com/blog/static/213496001201341231121720/ 每个进程各自有不同的用户地址空间,任 何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1…...
服装 公司 网站建设/关键词爱站网关键词挖掘工具
蓝牙耳机是运动和跑步的必备产品,它可以为我们的运动过程增加很多乐趣,无论它是舒适的还是充满节奏的音乐,它也可以带来继续坚持下去的动力。由于它是不可或缺的合作伙伴,我如何选择适合自己的蓝牙耳机?许多运动小白对…...
asp.net做网站的流程/移动网站推广如何优化
先来说说序列化是什么吧,序列化是将对象的状态信息转换成可以存储或传输的形式的过程。在序列化期间,将对象的当前状态写入临时或永久存储区。稍后,您可以通过从存储区读取或恢复对象的状态重新创建对象。简而言之,序列化是一种将…...