Python爬虫&js逆向&sm4逆向案例

文章声明

本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与文章作者无关,若有侵权,请联系我立即删除!

概要

- 该篇文章是基于sm4的加密分析
- 不分析所有加密参数, 只分析 sm4算法
- 用到的工具 360浏览器
- 用到的在线加密测试网址
	https://lzltool.cn/SM4

逆向目标

请求参数 encData,响应参数 encData

开始整活

抓包

打开F12 选择XHR请求 定位到搜索数据包

在这里插入图片描述

参数定位及分析

  • 直接搜索关键词,这里推荐搜索encType因为这个词出现的地方大概率是加密的位置

  • 其实加密的算法请求体都已经告知了encType: "SM4"

  • 通过关键字搜索最终定位到了这里(很好搜,总共就两处)
    在这里插入图片描述

  • l.toUpperCase()就是生成的请求体密文

  • 技巧1:像这种参数和响应数据都是加密的,我遇到的最多的就是这几种AES, DES, 现在多了个 SM4

  • 技巧2:SM4算法的加密模式也分CBC, ECB同样分是否有iv两种情况
    在这里插入图片描述

在上图中我们可以看到 请求体的数据在此处还是明文状态
而 l 就是加密后的请求体,经过查看一番后,锁定了加密处就是 s = y(u, c) 和 l = b(s, a);
直接断点到 l = b(s, a), 这时候我们先大胆猜想一下, 既然 sm4 是有两种加密模式,如果是cbc模式,那应该有 key, iv, 加密的明文 这三个数据;
而这里却只有 s, a 两个数据,这不得不让我们怀疑使用的是 ecb模式加密的
先把请求体复制下来 
    {"addr":"","regnCode":"320200","medinsName":"","businessLvOutMedOtp":"","pageNum":6,"pageSize":10,"queryDataSource":"es"}

  • 在控制台分别输出 s, a, 发现原始数据都被转成了字节数组
    在这里插入图片描述

  • 字节数组a 其实就是上面复制的明文请求体(e.data.data)转成的字节数组

  • 那么s就一定是加密的密钥了,为了安全我这里就不暴露了

  • 然后就开始测试, 测试网站: https://lzltool.cn/SM4

在这里插入图片描述
在这里插入图片描述

  • 发现加密结果一致,说明我们分析的没有问题,然后放开断点测试下响应数据的解密

在这里插入图片描述

  • 也是能正常解密的,至此就分析结束了

总结

- sm4 加密算法之前都没遇到过,第一次搞得时候也是一脸懵,还好这是第二次...
- 请牢记文章中的两个小技巧,有时候这些不起眼的小技巧能让你事半功倍
<think>好的,用户之前使用了提供的Python脚本来下载抖音视频,但遇到了JSON解析错误。用户自己排查后发现,`response`对象的类型是`requests.models.Response`,而不是可以直接解析的JSON数据。现在用户需要帮助解决这个问题。 首先,我需要确认用户的问题。用户可能在调用`response.json()`时遇到了错误,比如`json.decoder.JSONDecodeError`,因为服务器返回的响应内容不是有效的JSON格式。错误信息可能显示在尝试使用`json.loads(response.text)`时失败,因为`response.text`包含的不是JSON数据。 接下来,分析可能的原因。常见的情况包括: 1. **服务器返回了非JSON内容**:比如HTML页面(如验证页面、登录页面)、空响应或错误信息。 2. **请求头不完整或过时**:抖音可能更新了API的验证机制,需要特定的headers或cookies。 3. **IP被封禁或请求频率过高**:触发反爬机制,返回验证码或其他拦截页面。 4. **URL参数错误**:视频ID不正确或API接口已变更,导致无法获取正确的数据。 用户已经尝试打印`response`的类型,确认是Response对象,这说明用户正确使用了requests库的方法。但解析JSON失败,说明响应内容有问题。 接下来需要指导用户如何进一步调试。例如,检查HTTP状态码是否为200,如果不是,说明请求失败;查看响应头中的Content-Type是否为application/json;打印响应内容的前几百字符,确认是否为预期的JSON数据。 此外,用户提供的脚本中有一个`debug_response`函数,可能用户没有正确调用,或者该函数输出的信息不足以诊断问题。需要提醒用户确保调用这个调试函数,并检查输出内容。 可能的解决方案步骤: 1. **检查HTTP状态码**:确认请求是否成功(状态码200),如果返回403或404,说明请求被拒绝或接口失效。 2. **检查响应内容**:输出`response.text`查看实际返回内容,可能是HTML、错误信息或验证页面。 3. **更新请求头**:确保User-Agent、Cookie、Referer等头部信息符合抖音的最新要求,可能需要模拟移动端浏览器。 4. **处理动态参数**:抖音API可能需要X-Bogus签名或其他动态生成的参数,这些可能需要通过JavaScript逆向或使用第三方库生成。 5. **使用Session对象**:保持会话,处理cookies自动管理,可能提高成功率。 6. **处理重定向**:确保正确处理重定向,可能需要跟随重定向或手动处理Location头。 7. **异常处理**:在解析JSON前检查响应内容是否有效,避免直接解析导致崩溃。 另外,用户提到的错误信息`Expecting value: line 1 column 1 (char 0)`通常意味着尝试解析空字符串或无效JSON,所以重点应放在为什么服务器没有返回预期的JSON数据。 需要提醒用户注意法律和平台规定,确保其使用符合抖音的服务条款,避免侵权或违规行为。 最后,建议用户分享实际的响应内容(如错误页面、HTML结构),以便更准确地诊断问题。如果用户不方便提供,可以引导他们根据响应内容调整请求参数或处理反爬措施。</think>你遇到的 `JSONDecodeError` 错误是由于 `response.text` 中返回的内容不是有效的 JSON 数据,而是一个 `Response` 对象(HTTP 响应)的原始内容。以下是详细分析和解决方法: --- ### **问题本质** - `response` 的类型是 `requests.models.Response`,这是 `requests` 库的标准响应对象。 - **直接调用 `json.loads(response)` 会报错**:因为 `response` 对象本身无法被 JSON 解析,需要先提取响应文本内容 `response.text`,再尝试解析。 - **核心问题**:服务器返回的 `response.text` 不是合法 JSON,可能包含以下内容: 1. **HTML 页面**(如验证页面、登录页面) 2. **空数据** 3. **加密数据**(如抖音的反爬机制) 4. **错误信息**(如接口失效提示) --- ### **调试步骤** #### 1. **查看原始响应内容** 在代码中添加调试输出,检查服务器返回的实际内容: ```python # 修改你的代码,在解析前打印响应内容 response = requests.get(api_url, headers=headers) print("原始响应内容:", response.text) # 打印前500字符观察结构 debug_response(response) # 使用你已有的调试函数 ``` #### 2. **检查常见无效响应类型** - **情况 1:返回 HTML 页面** ```python # 如果输出内容包含 <html> 或验证码,说明被反爬拦截 if "<html>" in response.text: print("服务器返回了HTML页面,可能触发反爬机制!") ``` - **原因**:抖音检测到爬虫行为(如缺少关键请求头、Cookie 失效、IP 被封禁)。 - **解决**:更新请求头、添加 Cookie、降低请求频率。 - **情况 2:返回空内容或错误信息** ```python # 如果响应内容为空或包含错误提示 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") ``` - **原因**:接口失效、视频不存在、URL 错误。 - **解决**:检查视频链接是否有效,确认接口地址是否更新。 --- ### **改进方案** #### 1. **安全解析 JSON** 在代码中添加 **JSON 解析保护**,避免直接崩溃: ```python from json import JSONDecodeError try: data = response.json() # 直接使用 response.json() 更安全 except JSONDecodeError: print("响应内容不是合法JSON!") print("实际内容:", response.text[:500]) # 输出前500字符 data = None ``` #### 2. **更新反反爬策略** 抖音会频繁更新反爬机制,需确保以下参数有效: ```python headers = { # 使用安卓移动端 User-Agent "User-Agent": "Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36", # 添加抖音关键 Cookie(需定期更新) "Cookie": "tt_webid=7158553344444444444; tt_chain_token=xxxxx; s_v_web_id=verify_xxxxxx", # 必须携带 Referer "Referer": "https://www.douyin.com/", # 新增抖音2023年要求的签名头(需动态生成) "x-tt-params": "加密字符串(需逆向生成)" # 关键难点! } ``` #### 3. **处理动态签名(X-Bogus/X-TT-Params)** 抖音的接口需要动态生成的加密参数(如 `X-Bogus`),需通过以下方式获取: - **方法 1**:使用现成工具(如 [douyin-tools](https://github.com/Evil0ctal/douyin-api) 的加密算法)。 - **方法 2**:自行逆向抖音的 JavaScript 加密逻辑(难度较高)。 - **方法 3**:通过 Selenium 模拟浏览器获取完整参数(效率低但简单)。 --- ### **示例代码修正** ```python def get_video_url(share_url): headers = { # 更新为2023年有效的 headers(需自行补充完整) "User-Agent": "Mozilla/5.0 (Lin
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dh_浩开玩笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值