JS逆向进阶篇【去哪儿旅行登录】【上篇】

目标url:

  • aHR0cHM6Ly91c2VyLnF1bmFyLmNvbS9wYXNzcG9ydC9sb2dpbi5qc3A=

实现难点:

  • 逆向滑块请求
  • 发送短信登录

目录

  • 每篇前言:
  • 0、前置技术栈
    • (1)JS实现页面滑动
    • (2)JS实现记录滑动轨迹
    • (3)补基础浏览器环境
    • (4)补环境

每篇前言:

  • 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者

  • 🔥🔥本文已收录于爬虫进阶+实战系列教程专栏:《爬虫进阶+实战系列教程》
  • 🔥🔥热门专栏推荐:《Python全栈系列教程》、《爬虫从入门到精通系列教程》、《爬虫进阶+实战系列教程》、《Scrapy框架从入门到实战》、《Flask框架从入门到实战》、《Django框架从入门到实战》、《Tornado框架从入门到实战》、《前端系列教程》。
  • 📝​📝本专栏面向广大程序猿,为的是大家都做到Python全栈技术从入门到精通,穿插有很多实战优化点。
  • 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述

0、前置技术栈

(1)JS实现页面滑动

简单实现单击鼠标左键,控制台打印鼠标移动事件信息,松开左键后取消打印。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div onmousedown="doDown(event)">滑动例子</div><script>function doDown(e){console.log("doDown", e);// 添加鼠标移动事件document.addEventListener("mousemove", doMove);document.addEventListener("mouseup", doUp);}function doMove(e){console.log("doMove", e)}function doUp(e){console.log("doUp", e)document.removeEventListener("mousemove", doMove);document.removeEventListener("mouseup", doUp);}
</script></body>
</html>

在这里插入图片描述

(2)JS实现记录滑动轨迹

下述有关轨迹的模拟生成,是根据本文目标网站提取的核心逻辑!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div onmousedown="doDown(event)">滑动例子</div><script>t = {state: {},sliderInfo: {track: [],deviceMotion: []}}function doDown(e){// n = e    n.clientX是点击的x坐标var n = (e.changedTouches || e.touches || [e])[0];t.state.downX = n.clientX;console.log("开始x坐标:", n.clientX)console.log("doDown", e);// 添加鼠标移动事件document.addEventListener("mousemove", doMove);document.addEventListener("mouseup", doUp);}function doMove(e){var o = (e.changedTouches || e.touches || [e])[0];var n = t.state.downX;// o就是当前滑动的event;   o.clientX就是当前滑动的x坐标;   n是最开始点击的x坐标;// o.clientX - n 就是滑动距离!var u = (e = e || window.event, o.clientX - n);var n = u;var i = Date.now() % 1e5,    // 获取一个随机数s = (e.changedTouches || e.touches || [e])[0],o = s.clientX.toFixed(2), // 将数字保留2个小数位数并返回一个字符串u = s.clientY.toFixed(2),a = n.toFixed(2),// “i;横坐标;纵坐标;滑动距离"f = "".concat(i, ";").concat(o, ";").concat(u, ";").concat(a);// 核心t.sliderInfo.track.push(f);// 也是轨迹window.addEventListener("deviceorientation", function (e) {t.sliderInfo.deviceMotion.push(e)}, !1)console.log("滑动过程u:", u)console.log("doMove", e)}function doUp(e){console.log("doUp", e)document.removeEventListener("mousemove", doMove);document.removeEventListener("mouseup", doUp);console.log(t.sliderInfo.track)console.log(t.sliderInfo.deviceMotion)}
</script></body>
</html>

在这里插入图片描述

(3)补基础浏览器环境

在使用pyexecjs执行JavaScript代码时(因为使用的nodejs引擎来执行的JavaScript代码,有别于浏览器),如果存在读取浏览器环境,就会失败报错。如:
在这里插入图片描述
此时,就需要创造浏览器环境然后再执行JavaScript代码:

npm config set registry https://registry.npm.taobao.orgnpm install -g jsdom   
npm install -g node-gyp
npm install -g canvas --canvas_binary_host_mirror=https://npm.taobao.org/mirrors/canvas/

可以通过命令:npm root -g来查看npm安装目录~

模块安装完成之后,需要将npm root -g查到的npm安装目录添加到系统环境变量中:
在这里插入图片描述

安装完毕后,就可以通过上述模块补浏览器环境:

const jsdom = require("jsdom");
const {JSDOM} = jsdom;// 模拟浏览器打开https://www.toutiao.com,页面内容就是html
const html = '<!DOCTYPE html><p>Hello world</p>';
const dom = new JSDOM(html, {url: "https://www.toutiao.com",referer: "https://example.com",contentType: "text/html"
});// 下面就是补浏览器环境
document = dom.window.document;window = global;
Object.assign(global, {location: {hash: "",host: "user.qunar.com",hostname: "user.qunar.com",href: "https://user.qunar.com/passport/login.jsp",origin: "https://user.qunar.com",pathname: "/",port: "",protocol: "https:",search: "",},navigator: {appCodeName: "Mozilla",appName: "Netscape",appVersion: "5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",cookieEnabled: true,deviceMemory: 8,doNotTrack: null,hardwareConcurrency: 4,language: "zh-CN",languages: ["zh-CN", "zh"],maxTouchPoints: 0,onLine: true,platform: "MacIntel",product: "Gecko",productSub: "20030107",userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",vendor: "Google Inc.",vendorSub: "",webdriver: false}
});location = window.location

只要在js文件中加入上述代码,运行就ok了!

(4)补环境

上述示例只是补充了浏览器中常见的window、document对象,抠出来的js代码中可能还有其他的值和变量,此时就需要根据环境提示来进行补环境:

  • python运行js代码,分析报错信息
  • 补充&测试

比如js代码中有这么一句:

var xhr = new XMLHttpRequest();

上述所补环境就不够,就会报错:
在这里插入图片描述
这时候就需要了解下XMLHttpRequest是啥?
简单说几句:

  • 所有Ajax请求底层都是基于XMLHttpRequest。所以这个玩意就是发送Ajax请求用,一般情况下,这种js代码是跟算法逻辑无关的,所以直接补充这个对象,相应三个函数给空,不让js代码报错即可!
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){if(xhr.readyState == 4){// 成功接收到响应数据var data = xhr.responseText;console.log(data);}
};
xhr.open('POST', '/test/', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
xhr.send('n1=1;n2=2;');

补环境:

XMLHttpRequest = function() {return {open: function(){},setRequestHeader: function(){},send: function(){}}
}

这样的话,扣下来的js代码中有类似下图代码也就没问题了~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas从基础统计到高级分析的完整指南【第77篇—Pandas高级分析】

Pandas从基础统计到高级分析的完整指南 在数据科学和分析领域中&#xff0c;Pandas是Python中最受欢迎的数据处理库之一。它提供了丰富而强大的功能&#xff0c;其中包括各种统计方法&#xff0c;用于更好地理解和分析数据。本文将介绍Pandas中常用的统计方法&#xff0c;通过…

分享80个jQuery特效,总有一款适合您

分享80个jQuery特效&#xff0c;总有一款适合您 80个jQuery特效下载链接&#xff1a;https://pan.baidu.com/s/1o8TcFu68r67e7VeiwmR-XQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理…

游泳耳机怎么选?四大口碑最好游泳耳机推荐

在挑选适合游泳的耳机时&#xff0c;选择合适的产品至关重要。游泳不仅是一项身体锻炼&#xff0c;更是一种享受。佩戴耳机能够为游泳者提供更加愉悦的体验&#xff0c;但确保所选耳机符合水中使用的要求至关重要。 传统的有线耳机和非防水设计的蓝牙耳机并不适合水中使用&…

牛客错题整理——C语言(实时更新)

1.以下程序的运行结果是&#xff08;&#xff09; #include <stdio.h> int main() { int sum, pad,pAd; sum pad 5; pAd sum, pAd, pad; printf("%d\n",pAd); }答案为7 由于赋值运算符的优先级高于逗号表达式&#xff0c;因此pAd sum, pAd, pad;等价于(…

嵌入式Qt Qt Creator安装与工程介绍

一.Qt概述 什么是Qt&#xff1a;Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 二.Qt Creator下载安装 下载地址&#xff1a;Index of /a…

从零开始实现消息队列(一)

从零开始实现消息队列 .什么是消息队列需求分析核心概念模型 . 什么是消息队列 相信大家都了解过阻塞队列和生产者消费者模型,而阻塞队列最大的用途,就是用于实现生产者消费者模型,生产者消费者模型有以下好处: 解耦合 解释: 当主机A给主机B发消息时,A给B发送请求,B给A返回响应…

C语言第二十三弹---指针(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、sizeof和strlen的对比 1.1、sizeof 1.2、strlen 1.3、sizeof 和 strlen的对比 2、数组和指针笔试题解析 2.1、⼀维数组 2.2、二维数组 总结 1、si…

全坚固平板EM-I12U,全新升级后的优质体验

平板终端机在户外勘探、制造业、畜牧业、银行金融行业当中都不是陌生的&#xff0c;能采集各种数据来转换成信息流向企业和行业的各个分支当中&#xff0c;在整个行业发展、社会推动上面都起着关键性作用&#xff0c;而平板终端机的升级也就意味着未来的这些行业发展会进入一个…

服务治理中间件-Eureka

目录 简介 搭建Eureka服务 注册服务到Eureka 简介 Eureka是Spring团队开发的服务治理中间件&#xff0c;可以轻松在项目中&#xff0c;实现服务的注册与发现&#xff0c;相比于阿里巴巴的Nacos、Apache基金会的Zookeeper&#xff0c;更加契合Spring项目&#xff0c;缺点就是…

Python算法题集_合并K个升序链表

Python算法题集_合并K个升序链表 题23&#xff1a;合并K个升序链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环】2) 改进版一【列表排序】3) 改进版二【堆排序】4) 改进版三【分区海选】 4. 最优算法 本文为Python算法题集之一的代…

LeetCode Python - 13.罗马数字转整数

目录 题目答案运行结果 题目 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII…

three.js 细一万倍教程 从入门到精通(二)

目录 三、全面认识three.js物体 3.1、掌握几何体顶点_UV_法向属性 3.2、BufferGeometry设置顶点创建矩形 3.3、生成酷炫三角形科技物体 四、详解材质与纹理 4.1、初识材质与纹理 4.2、详解纹理偏移_旋转_重复 偏移 旋转 重复 4.3、设置纹理显示算法与mipmap mapFil…