爬虫_06_余票检测js解加密

news/2024/7/19 11:48:34 标签: python, 爬虫

06_余票检测&js解加密&12306模拟登录

余票检测1️⃣

JS解密+混淆破解

  • 博客地址:https://www.cnblogs.com/bobo-zhang/p/11243138.html
  • 爬取的网站:https://www.aqistudy.cn/html/city_detail.html

分析

  1. 修改查询条件(城市的名称+时间范围),点击查询按钮,捕获点击按钮后发起请求对应的数据包。点击查询按钮后,发起的是ajax请求。该请求就会指定查询条件对应的数据加载到当前页面中。(我们要爬取的数据就是该ajax请求请求到的数据)

  2. 分析捕获到的数据包

    • 提取出请求的url:https://www.aqistudy.cn/apinew/aqistudyapi.php

    • 请求方式:post

    • 请求参数:d:动态变化的一组数据(且加密)

    • 响应数据:是加密的密文数据

      • 问题:该数据包请求到的是密文数据,为何在前台页面显示的却是原文数据?
      • 原因:请求请求到密文数据后,前台接收到密文数据后使用指定的解密操作(js函数)对密文数据进行了解密,然后将原文数据显示在了前台页面。
    • 下一步工作的步骤:

      • 首先先处理动态变化的请求参数,动态获取该参数的话,就可以携带该参数进行请求参数,将请求到的密文数据捕获到。
      • 将捕获到的密文数据找到对应的解密函数对其进行解密即可。
      • 【重点】需要找到点击查询按钮后对应的ajax请求代码,从这组代码中就可以破解动态变化的请求参数和加密的响应数据对应的相关操作
  3. 找ajax请求对应的代码,分析代码获取参数d的生成,和加密的响应数据的解密操作

3.1 处理动态变化的请求参数

  • 基于火狐浏览器定位查询按钮绑定的点击事件。

    在这里插入图片描述

  • 从getData函数实现中找寻ajax请求对应的代码

    • 从getData函数的实现中没有找到ajax代码,但是发现了另外两个函数的调用
      • getAQIData(); getWeatherData(); ajax代码一定是存在于这两个函数实现内部
      • type == HOUR:查询时间是以小时为单位
  • 分析getAQIData(); getWeatherData():找到ajax代码

    • 没有找到ajax请求代码
    • 发现了另一个函数调用:getServerData(method,param,func,0.5)
      • method = ‘GETCITYWEATHER’ or ‘GETDETAIL’
      • params = {city,type,startTime,endTime}:查询条件
  • 分析getServerData,找寻ajax代码

    • 基于抓包工具做全局搜索

      在这里插入图片描述

    • 找到的函数实现被加密

    • 对getServerData加密的实现进行解密

      • js混淆:对核心的js代码进行加密
      • js反混淆:对js加密代码进行解密
        • 暴力破解:https://www.sojson.com/jscodeconfusion.html
        • 终于看到了ajax实现的代码
        • 分析结论:
          • data:加密的响应数据
            • decodeData(data)将加密的响应数据进行解密
              • 参数data:加密的响应数据
          • param:动态变化且加密的请求参数
            • getParam(method,object)返回动态变化的请求参数
              • 参数method:method = ‘GETCITYWEATHER’ or ‘GETDETAIL’
              • 参数object:{city,type,startTime,endTime}:查询条件

js逆向

  • 现在只需要调用两个js函数(decodeData,getParam)返回结果即可。在python程序中如何调用js函数。
  • js逆向:在python中调用js函数
    1. 方式1:手动的将js函数改写成为python函数
    2. 方式2:
      • 使用固定模块实现自动逆向(推荐)
      • 利用PyExecJS库来实现模拟JavaScript代码执行获取动态加密的请求参数,然后再将加密的响应数据代入decodeData进行解密即可!
      • 在本机安装好nodejs的环境

PyExecJS的使用2️⃣

python">#模拟执行decodeData的js函数对加密的响应数据进行解密
import execjs
import requests

node = execjs.get()

#Params
method = "GETCITYWEATHER"
city = '北京'
type = 'HOUR'
start_time = '2018-01-25 00:00:00'
end_time = '2018-01-25 23:00:00'

#Compile javascript
file = 'jsCode.js'
ctx = node.compile(open(file.,encoding='utf-8').read())

#Get params
js = 'getPostParamCode("{0}","{1}","{2}","{3}","{4}")'.format(method,city,type,start_time,end_time)
#请求参数d
params = ctx.eval(js) #eval执行指定的js函数

#发起post请求
url = 'https://www.aqistudy.cn/apinew/aqistudyapi.php'
data = {
    'd':params
}
response_text = requests.post(url=url,data=data).text #加密的响应数据

#对加密的响应数据进行解密
js = 'decodeData("{0}")'.format(response_text)
decrypted = ctx.eval(js) #返回的是解密后的原文数据
print(decrypted_data)
#执行会报错:目前页面中没有数据。解密函数只是针对页面中原始的数据进行解密。
(response_text)
decrypted = ctx.eval(js) #返回的是解密后的原文数据
print(decrypted_data)
#执行会报错:目前页面中没有数据。解密函数只是针对页面中原始的数据进行解密。

http://www.niftyadmin.cn/n/1363922.html

相关文章

asp.net 中使用JQuery Ajax 上传文件

首先创建一个网页&#xff0c;网页中添加如下代码。 <h3>Upload File using Jquery AJAX in Asp.net</h3> <table> <tr> <td>File:</td> <td> <asp:FileUpload ID"fupload" runat"server" οnchangepr…

爬虫_08_scrapy持久化存储管道操作手动请求发送

08_scrapy&持久化存储&管道操作&手动请求发送 scrapy框架 简介 简介&#xff1a;所谓的框架其实就是一个被集成了很多功能且具有很强通用性的一个项目模板。 学习&#xff1a;学习是学好框架中集成好的各种功能、特性 进阶&#xff1a;逐步的探索框架的底层 …

[python]python学习笔记(四)

14&#xff0c;python如何创建进程并在父子进程通信示例代码如下&#xff1a; [cpp] view plaincopyimport os, sys print "Im going to fork now - the child will write something to a pipe, and the parent will read it back" r, w os.pipe() # r,…

爬虫_09_请求传参中间件大文件下载CrawlSpider

09_请求传参&中间件&大文件下载&CrawlSpider 五大核心组件 目的 大概了解scrapy的运行机制为分布式铺垫 请求传参实现的深度爬取 深度爬取&#xff1a;爬取的数据没有在同一张页面中&#xff08;例如首页数据详情页数据&#xff09; 在scrapy中如果没有请求传…

Hibernate(五)一对一单向关联映射

上次的博文中 Hibernate从入门到精通&#xff08;四&#xff09;基本映射我们已经讲解了一下基本映射和相关概念&#xff0c;接下来 我们会讲稍微复杂点的映射——关系映射。 关系映射分类 关系映射即在基本映射的基础上处理 多个相关对象和多个相关表之间联系的映射。关系映射…

爬虫_10_selenium在scrapy中使用分布式增量式

10_selenium在scrapy中使用&分布式&增量式 selenium在scrapy中的使用 https://news.163.com/ 爬取网易新闻中的国内、国际、军事、航空、无人机这五个板块下所有的新闻数据&#xff08;标题内容&#xff09; 分析 首页没有动态加载的数据 爬取五个板块对应的url 每一…

深度学习_01_简介安装配置

简介 框架介绍 TensorFlow优势 GPU加成自动求导神经网络API 全连接层、卷积层、LSTM…… 开发环境安装 windows 10 and Ubuntu 16.04/18.04Anaconda, Python 3.7CUDA 10.0TensorFlow 2.0PyCharm 注意&#xff1a; CUDA安装时&#xff1a; 取消安装Visual Studio Integ…

【转】Linux高级字符设备之Poll操作

原文网址&#xff1a;http://www.cnblogs.com/geneil/archive/2011/12/04/2275559.html 在用户程序中&#xff0c;select()和poll()也是与设备阻塞与非阻塞访问息息相关的&#xff0c;使用非阻塞I/O的应用程序通常会使用select和poll系统调用查询是否可对设备进行无阻塞的访问。…