爬虫逆向你应该懂得Javascript知识

news2024/9/23 9:35:37
背景

大家在学习爬虫逆向的时候,一般都会涉及到对js源文件进行代码扣去,但是有的时候,你最好有js基础,能发现加密或者解密在那个位置,或者是能用python改写js代码,这就对个人的Javascript的能力有一定要求,用了一段时间给大家整理出来了。
本篇文章整理源:https://blog.csdn.net/qq_38490457/article/details/109257751 ,本人只把js逆向应该懂得语法写了出来,如果大家有什么不明白的,可以去 看一下原作者。

js逆向技巧

​ 调用函数时,解析器也不会检查实参的数量,多余实参不会被赋值,如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined。

​ chunk开头的js文件是 vue打包后的。

webpack整合后的js文件一般带有webpack_require等字段。

立即执行函数:
(function () {
    alert("我是一个匿名函数");
})();

concat()

连接数组,使数组增长

var arr = ["孙悟空", "猪八戒", "沙和尚"];
var arr2 = ["白骨精", "玉兔精", "蜘蛛精"];
var arr3 = ["二郎神", "太上老君", "玉皇大帝"];
var result = arr.concat(arr2, arr3, "牛魔王", "铁扇公主");
console.log(result);
 
join():

数组连接符,间隔符

var arr = ["孙悟空", "猪八戒", "沙和尚"];
var result = arr.join("@-@");
console.log(result);
call和apply:

call(对象,参数) apply(对象,参数)

person.sayHello.call(person, "Hello");  // 输出:Hello, John
person.sayHello.apply(person, ["Hello"]);  // 输出:Hello, John
Date:
var date = new Date();
console.log(date);
console.log(date.getFullYear());//获取当前日期对象的年份(四位数字年份)
console.log(date.getMonth());//获取当前日期对象的月份(0 ~ 11)
console.log(date.getDate());//获取当前日期对象的日数(1 ~ 31)
console.log(date.getHours());//获取当前日期对象的小时(0 ~ 23)
console.log(date.getMinutes());//获取当前日期对象的分钟(0 ~ 59)
console.log(date.getSeconds());//获取当前日期对象的秒钟(0 ~ 59)
console.log(date.getMilliseconds());//获取当前日期对象的毫秒(0 ~ 999)
随机数:
/*随机数*/
//Math.random():可以用来生成一个0-1之间的随机数
//生成一个0-x之间的随机数:Math.round(Math.random()*x)
//生成一个x-y之间的随机数:Math.round(Math.random()*(y-x)+x)
console.log(Math.round(Math.random() * 10));            //生成一个0-10之间的随机数
console.log(Math.round(Math.random() * (10 - 1) + 1));  //生成一个1-10之间的随机数

字符串操操作:
concat

字符串连接concat

var str = "Hello,World!";
console.log(str.concat("你好,", "世界!"));

slice:
  • 第一个参数:开始位置的索引(包括开始位置)
  • 第二个参数:结束位置的索引(不包括结束位置),如果省略第二个参数,则会截取到后边所有的
var str = "Hello,World!";
var result = str.slice(1, 4);
console.log(result);
result = str.slice(1);
console.log(result);
result = str.slice(1, -1);
console.log(result);
substr

子串:参数:

  • 第一个参数:截取开始位置的索引
  • 第二个参数:截取的长度
var str = "Hello,World!";
var result = str.substr(6, 6);
console.log(result);

split

字符串拆分:

该方法可以将一个字符串拆分为一个数组,需要一个字符串作为参数,将会根据该字符串去拆分数组

var str = "Hello,World!";
var result = str.split(",");
console.log(result);

字符串大小写转化:

var str = "Hello,World!";
var result = str.toUpperCase();
var result = str.toLowerCase();
正则:

创建方式一:

var 变量名 = new RegExp(“正则表达式”,“匹配模式”);

匹配模式:

  • i:忽略大小写
  • g:全局匹配模式
  • ig:忽略大小写且全局匹配模式
// 这个正则表达式可以来检查一个字符串中是否含有a
var reg = new RegExp("ab", "i");
var str = "Abc";
var result = reg.test(str);
console.log(result);

创建方式二:

var 变量名 = /正则表达式/匹配模式;

匹配模式:

  • i:忽略大小写

  • g:全局匹配模式

  • m:执行多行匹配

  • [a-z]:任意小写字母

  • [A-Z]:任意大写字母

  • [A-z]:任意字母

  • [0-9]:任意数字

search() 返回第一个出现的位置,没有则返回-1

match() 找到第一个符合要求的内容,设置匹配模式为 g ,可以将所有的匹配出来

replace( ) 默认只会替换第一个 设置全局匹配替换全部

var result = str.search(/a[bef]c/);
var result = str.match(/[a-z]/ig);
var result = str.replace(/[a-z]/gi, "@_@");

正则量词:

  • {n} :正好出现n次

  • {m,} :出现m次及以上

  • {m,n} :出现m-n次

  • + :至少一个,相当于{1,}

  • * :0个或多个,相当于{0,}

  • ? :0个或1个,相当于{0,1}

  • ^ :表示开头,注意它在[^字符序列]表达的意思不一样

  • $ :表示结尾

  • [^a-z]:除了任意小写字母

  • [^A-Z]:除了任意大写字母

  • [^A-z]:除了任意字母

  • [^0-9]:除了任意数字

转义字符:

  • \. :表示.
  • \\ :表示\

泛指:

  • \w :任意字母、数字、,相当于[A-z0-9]
  • \W :除了字母、数字、,相当于[^A-z0-9]
  • \d :任意的数字,相当于[0-9]
  • \D :除了任意的数字,相当于[^0-9]
  • \s :空格
  • \S :除了空格
  • \b :单词边界
  • \B :除了单词边界
案例:

除去空格:

var str = "  hello xxxxx  "
var reg = /^\s*|\s*$/g;
console.log(str);
str = str.replace(reg, "");
console.log(str);

检验单词:

var str = "hello child"
var reg = /\bchild\b/;
console.log(reg.test(str));

检测手机号:

var phoneStr = "15131494600";
var phoneReg = /^1[3-9][0-9]{9}$/;
console.log(phoneReg.test(phoneStr));
DOM节点

获取标签:

  • getElementById()
  • getElementsByTagName()
  • getElementsByClassName()
  • querySelector( ) css选择器
  • querySelectorAll(" ")

获取值:

​ 方法 描述
元素节点.innerText 获取 HTML 元素的 inner Text。
元素节点.innerHTML 获取 HTML 元素的 inner HTML。
元素节点.属性 获取 HTML 元素的属性值。 a.href
元素节点.getAttribute(attribute) 获取 HTML 元素的属性值。 a.getAttribute(“href”)

元素节点.setAttribute(attribute, value) 改变 HTML 元素的属性值。

元素节点.style.样式 获取 HTML 元素的行内样式值。

<script>
    var box = document.getElementById("box");
    console.log(box.style.width);
</script>
<script>
    /*通用的获取元素样式的方法*/
    function getStyle(obj, name) {
        if (window.getComputedStyle) {
            //正常浏览器的方式,具有getComputedStyle()方法
            return getComputedStyle(obj, null)[name];
        } else {
            //IE8的方式,没有getComputedStyle()方法
            return obj.currentStyle[name];
        }
    }

    var box = document.getElementById("box");

    console.log(getStyle(box, "width"));
    console.log(getStyle(box, "height"));
    console.log(getStyle(box, "background-color"));
</script>
//编写一段兼容性代码,用来获取任意标签的文本内容
<script>
    var a = document.getElementById("a");

    console.log(getInnerText(a));

    /*获取任意标签的内容*/
    function getInnerText(element) {
        // 判断浏览器是否支持textContent,如果支持,则使用textContent获取内容,否则使用innerText获取内容。
        if(typeof element.textContent == "undefined") {
            return element.innerText;
        } else {
            return element.textContent;
        }
    }
</script>

修改 HTML 元素

方法 描述
document.createElement(element) 创建 HTML 元素节点。
document.createAttribute(attribute) 创建 HTML 属性节点。
document.createTextNode(text) 创建 HTML 文本节点。
元素节点.removeChild(element) 删除 HTML 元素。
元素节点.appendChild(element) 添加 HTML 元素。
元素节点.replaceChild(element) 替换 HTML 元素。
元素节点.insertBefore(element) 在指定的子节点前面插入新的子节点。

DOM事件

窗口事件:

属性描述
onblur当窗口失去焦点时运行脚本
onfocus当窗口获得焦点时运行脚本。
onload当文档加载之后运行脚本。
onresize当调整窗口大小时运行脚本
onstorage当 Web Storage 区域更新时(存储空间中的数据发生变化时)运行脚本。
<script>
    window.onblur = function () {
        console.log("窗口失去焦点");
    };
</script>
<script>
    window.onfocus = function () {
        console.log("窗口获取焦点");
    };
</script>

表单事件:

属性描述
onblur当元素失去焦点时运行脚本
onfocus当元素获得焦点时运行脚本。
onchange当元素改变时运行脚本。
oninput当元素获得用户输入时运行脚本。
oninvalid当元素无效时运行脚本。
onselect当选取元素时运行脚本。
onsubmit当提交表单时运行脚本。
<script>
    var textInput = document.getElementById("text");
/* 当文本框获取焦点,文本框背景为红色 */
textInput.onfocus = function () {
    this.style.background = "red";
};

/* 当文本框失去焦点,文本框背景为绿色 */
textInput.onblur = function () {
    this.style.background = "green";
};

this就是调用者,谁调用就是谁。

BOM事件

就是 broswer object model 浏览器对象,浏览器自带的对象有 window,navigate,loaction,history,screen ,这个地方很重要,为什么需要补环境,因为我们的使用nodejs模拟浏览器执行js,但是node的环境是没有这些对象的。

Window对象

警告框

window.alert("sometext");
alert("sometext");

确认框

window.confirm("sometext");
confirm("sometext");

如果您希望用户验证或接受某个东西,则通常使用“确认”框。

当确认框弹出时,用户将不得不单击“确定”或“取消”来继续进行。

如果用户单击“确定”,该框返回 true。如果用户单击“取消”,该框返回 false。

提示框

window.prompt("sometext","defaultText");// sometext提示词 default默认值

如果用户单击“确定”,该框返回输入值。如果用户单击“取消”,该框返回 NULL。

var person = prompt("请输入您的姓名", "比尔盖茨");
if (person != null) {
    console.log(person);
}

定时事件

  • setTimeout(function, milliseconds)

    在等待指定的毫秒数后执行函数。

  • setInterval(function, milliseconds) 单位是毫秒

    等同于 setTimeout(),但持续重复执行该函数。

  • setInterval() 方法:定时器

    window.setInterval(function, milliseconds)

Navigate对象

​ 获取UA伪装:navigator.userAgent

Location
console.log(location);          //输出location对象
console.log(location.href);     //输出当前地址的全路径地址
console.log(location.origin);   //输出当前地址的来源
console.log(location.protocol); //输出当前地址的协议
console.log(location.hostname); //输出当前地址的主机名
console.log(location.host);     //输出当前地址的主机
console.log(location.port);     //输出当前地址的端口号
console.log(location.pathname); //输出当前地址的路径部分
console.log(location.search);   //输出当前地址的?后边的参数部分

跳转:location.assign(“https://www.baidu.com”)

刷新:location.reload(true)

HIstory对象

退回到上一个页面:history.back();

跳转到下一个页面:history.forward();

异常处理:

try {
    // 可能发生异常的代码
} catch (error) {
    // 发生错误执行的代码
} finally {
    // 无论是否出错都会执行的代码
}

eval:

eval(”字符串“) eval会执行js代码

eval("alert('Hello')");

JSON:

在JSON中,每一个数据项,都是由一个键值对组成的,但是键必须是字符串,且由双引号包围,而值必须是以下数据类型之一:

  • 字符串(在 JSON 中,字符串值必须由双引号编写)
  • 数字
  • 对象(JSON 对象) { }
  • 数组 [ ]
  • 布尔
  • null
JSON.parse()

​ 当你有一个包含JSON字符串的变量时,你可以使用JSON.parse()将其转换为JavaScript对象。

var jsonString = '{"name":"John","age":30,"city":"New York"}';
var jsonObject = JSON.parse(jsonString);
console.log(jsonObject.name); // 输出:John
console.log(jsonObject.age);  // 输出:30
console.log(jsonObject.city); // 输出:New York
JSON.stringify()

jsonString将成为一个包含转换后的JSON字符串的变量:

var data = { name: "John", age: 30, city: "New York" };
var jsonString = JSON.stringify(data);
console.log(jsonString); //{"name":"John","age":30,"city":"New York"} 
console.log(data) //{ name: 'John', age: 30, city: 'New York' }

AJAX:

创建 XMLHttpRequest :

variable = new XMLHttpRequest();//所有现代浏览器

兼容所有浏览器的写法:

var xhttp;
if (window.XMLHttpRequest) {
    xhttp = new XMLHttpRequest();
} else {
    // code for IE6, IE5
    xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

在这里插入图片描述

注意 send()这个,很多XHR页面都有这个方法。

在这里插入图片描述

GET请求

users.json:

[
  {"name":"孙悟空","age":18,"gender":"男"},
  {"name":"猪八戒","age":19,"gender":"男"},
  {"name":"唐僧","age":20,"gender":"男"},
  {"name":"沙和尚","age":21,"gender":"男"}
]

index.html:

//步骤一:创建异步对象
var ajax = new XMLHttpRequest();
//步骤二:参数一是请求的类型,参数二是需要发送数据的地址
ajax.open("get", "users.json");
//步骤三:发送请求
ajax.send();
//步骤四:注册事件 onreadystatechange 状态改变就会调用
ajax.onreadystatechange = function () {
    if (ajax.readyState == 4 && ajax.status == 200) {
        //步骤五:如果能够进到这个判断,说明数据完美的回来了,并且请求的页面是存在的
        console.log(ajax.responseText);//输入响应的内容
    }
};

POST请求:

users.json:

[
  {"name":"孙悟空","age":18,"gender":"男"},
  {"name":"猪八戒","age":19,"gender":"男"},
  {"name":"唐僧","age":20,"gender":"男"},
  {"name":"沙和尚","age":21,"gender":"男"}
]

index.html:

//步骤一:创建异步对象
var ajax = new XMLHttpRequest();
//步骤二:设置请求的类型及数据所在的地址,注意:post请求一定要添加请求头才行不然会报错
ajax.open("post", "users.json");
//添加请求头
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//步骤三:发送请求
ajax.send();
//步骤四:注册事件 onreadystatechange 状态改变就会调用
ajax.onreadystatechange = function () {
    //步骤五:如果能够进到这个判断,说明数据完美的回来了,并且请求的页面是存在的
    if (ajax.readyState == 4 && ajax.status == 200) {
        console.log(ajax.responseText);//输入响应的内容
    }
};

整合get和post:

var Ajax = {
    get: function (url, fn) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) {
                fn.call(this, xhr.responseText);
            }
        };
        xhr.send();
    },
    post: function (url, data, fn) {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
                fn.call(this, xhr.responseText);
            }
        };
        xhr.send(data);
    }
};

// 演示GET请求
Ajax.get("users.json", function (response) {
    console.log(response);
});

// 演示POST请求
Ajax.post("users.json", "", function (response) {
    console.log(response);
});

Cookie:

​ 保存在本地的用户信息,以后发送请求会携带cookie向服务器发送请求,这样用户就不用输入相关信息了。

在这里插入图片描述

document.cookie = "username=zhangsan";//创建一个cookie
var cookies = document.cookie;
console.log(cookies);

cookie中的expires:

​ 即过期时间,过期后自动清除。

document.cookie = "username=zhangsan; expires=Thu, 18 Dec 2043 12:00:00 GMT";

cookie中的path:

​ 即可以使用 path 参数告诉浏览器 cookie 的路径,/表示当前页面

document.cookie = "username=zhangsan; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

ES6新语法:

反引号(`):

// `` 用于多行字符串文本
let str = `<ul>
               <li>沈腾</li>
               <li>玛丽</li>
               <li>魏翔</li>
               <li>艾伦</li>
           </ul>`;
console.log(str);

字符串格式化:

//${变量}  表示占位符
let name = '小可爱';
let result = `欢迎${name}访问我的文章`;
console.log(result);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【考研数据结构代码题8】三元组表示的稀疏矩阵快速转置

题目&#xff1a;三元组表示的稀疏矩阵快速转置 考点&#xff1a;矩阵的压缩与存储 难度&#xff1a;★★★ 稀疏矩阵压缩存储 三元组结构 //三元组结构 typedef struct {int row;int col;int value; } Term; 核心代码 // 转置函数&#xff0c;a为原矩阵&#xff0c;b存放转…

【灌水】自动跑团机器人

实现一个自动COC跑团机器人 这几天玩博德之门3有点累了 #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# 这他妈是什么idea收集器&#xff0c;你们就是靠这个收集idea吗&#xff0c;那我就说一个绝对不赚钱的了。 简单实现了追书人的基本流程&#xff0c;最后…

iview table 默认排序字段不高亮解决办法

iview treeSelect 组件封装 1、表格增加排序时触发的方法2、定义三个变量&#xff0c;sortColumnDefaultStyle存放默认的样式&#xff0c;定义页面默认的列以及顺序3、显示的列加上 sortable, 和样式4、使用下面这块代表默认选中5、点击时清除掉默认的排序6、把排序的字段查询时…

TensorFlow实战教程(十九)-Keras搭建循环神经网络分类案例及RNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用Keras实现手写数字识别的RNN分类案例及可视化呈现。基础性文…

为什么说品牌低价不是一件好事

消费者货比三价为的是买到低价质优的产品&#xff0c;而网络电商平台的公开&#xff0c;也促进了消费者及品牌进行比价&#xff0c;那品牌低价一定就是好事吗&#xff0c;一定会拉高品牌销量吗。其实是不一定的&#xff0c;低价意味着成本的降低&#xff0c;也可能滋生很多产品…

matlab使用scatter函数画图时报错“数组索引必须为正整数或逻辑值”解决办法

一、背景 在使用matlab的scatter函数画图时报错“数组索引必须为正整数或逻辑值”。 scatter函数说明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形标记的散点图。 二、解决办法 如果使用scatter函数时报上述错误&#xff0c;尝试将连续函数先转换为函…

Adobe xd有免费版可以使用吗?

Adobexd现在收费了吗&#xff1f;Adobexd是收费的。Adobexd在中国提供个人版和团队版两项收费政策。个人版每月订阅60元&#xff0c;每年订阅688元&#xff1b;团队版每月订阅112元/用户&#xff0c;每年订阅1288元/用户。 虽然AdobeXD的免费计划已经下线&#xff0c;但Adobe仍…

基于动量的梯度下降

丹尼尔林肯 (Daniel Lincoln)在Unsplash上拍摄的照片 一、说明 基于动量的梯度下降是一种梯度下降优化算法变体&#xff0c;它在更新规则中添加了动量项。动量项计算为过去梯度的移动平均值&#xff0c;过去梯度的权重由称为 Beta 的超参数控制。 这有助于解决与普通梯度下降相…

virtualList 封装使用 虚拟列表 列表优化

虚拟列表 列表优化 virtualList 组件封装 virtualList 组件封装 本虚拟列表 要求一次性加载完所有数据 不适合分页 新建一个select.vue 组件页面 <template><div> <el-select transfer"true" :popper-append-to-body"true"popper-class…

Android修行手册-超出父布局进行显示以及超出父布局实现点击

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

ubuntu下docker环境使用GPU配置

本文主要讲述整个命令流程&#xff0c;具体讲解请看官网nvidia-容器工具包和一篇总结得很详细的博文docker使用GPU总结 docker的版本必须安装19.0版本以上的&#xff0c;这里也只讲19.0版本以上的使用方法 首先设置一下网络信息 curl -fsSL https://nvidia.github.io/libnvi…

批量插入SQL 错误 [933] [42000]: ORA-00933: SQL 命令未正确结束

使用DBeaver向【oracle数据库】插入大量数据 INSERT INTO Student(name,sex,age,address,birthday) VALUES(Nike,男,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike…

Visio学习笔记

1. 常用素材 1.1 立方体&#xff1a;张量, tensor 操作路径&#xff1a;更多形状 ⇒ 常规 ⇒ 基本形状 自动配色 在选择【填充】后Visio会自动进行配色&#xff1b;

我劝烂了,这东西大学生早用早解脱

大学生看我&#xff0c;这个东西太太太香了啊&#xff01;&#xff01;&#xff01; 要写论文&#xff0c;写总结的都给我用起来 这东西能自动写文章&#xff0c;想写几篇就写几篇&#xff0c;篇篇不重复&#xff01;只要输入一个标题&#xff0c;马上就能生成一篇。真的贼香…

2023-11-23 LeetCode每日一题(HTML 实体解析器)

2023-11-23每日一题 一、题目编号 1410. HTML 实体解析器二、题目链接 点击跳转到题目位置 三、题目描述 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们…

视频去水印软件有哪些?分享四款好用去水印软件

对于从事自媒体的朋友们来说&#xff0c;保护自己的视频作品免受盗用至关重要。为了标识归属&#xff0c;我们通常会在视频上添加水印。然而&#xff0c;当我们在寻找素材并打算进行剪辑时&#xff0c;发现素材上的水印会严重干扰使用。在这种情况下&#xff0c;我们需要采取一…

【Linux】who命令使用

who who命令用于显示系统中有哪些使用者正在上面&#xff0c;显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。 著者 由Joseph Arceneaux、David MacKenzie和Michael Stone撰写。 语法 who [选项] [文件|参数] who命…

第19章JAVA绘图

19.1JAVA绘图类 绘图是高级程序设计中非常重要的技术 19.1.1Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图片上进行绘制 Graphics类封装了JAVA支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色&#xff0c;字体&…

Doris-集群部署(四)

创建目录并拷贝编译后的文件 1&#xff09;创建目录并拷贝编译后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02&#xff09;修改可打开文件数&#xff08;每个节点&#x…