某团外卖H5版本爬虫开发和JS逆向过程

对于一般的H5爬虫,大致需要的技术可参见下图。

今天主要以某团外卖为例介绍一下相关技术。

请拿好小本本。Let's Go.

接口逆向

首先,我们用chrome打开网站:http://h5.waimai.meituan.com/。F12打开开发者工具,这时在Network就能看到相关的请求接口了。

https://i.waimai.meituan.com/openh5/homepage/poilist?_=1567748863826&X-FOR-WITH=wJG5u4L0%2FwXsZQl6yywmpR7mTa2SIEWNC95eXDKYC%2Fx%2FEU9l9qNSYIQ0AEODBUiocu2a6WaTbRQm5%2BdY4nPRrDNd%2Bvl4dOfqO9JeJH73afJecdD8S3Cgg9r7CrQIKyE2AUe4PkcJsHOTzVT7ujSDeA%3D%3D

其中URL中相关参数就俩:

然后看Body中的参数:

这是我们发现,需要逆向的参数有三个,分别是:UUID、X-FOR-WITH、_token。

参数逆向

先看_token,这个参数一眼望过去就是个base64加密的参数,但是我们尝试base64解密一下,不可见字符。那现在我们来逆一下吧。

首先,看到这个请求的关键字。

然后,设置URL断点。

设置完成以后,勾选。刷新或重新触发请求数据,可以看到,会在发送数据的时候中断。

右边就是调用堆栈,可以从上到下分析一下代码的调用逻辑,我们会找到,在函数default里面,看到了疑似的生成参数的地方。

我们重新在上面打上断点,重新出发请求,程序将停止在我们的断点位置。然后我们跟进上面的_token生成的i函数。

以及调用的reload函数。

我们看到,reload返回的结果由iI函数生成。

而查看,iI函数可以看到,deflate,这是一个压缩算法!那压缩完应该干什么呢,肯定是base64啊!

所以原始数据肯定是经过压缩再base64加密得到的。

我们再“回到最初的起点~”,我们对那串base64解密以后,看到的不可见字符。

这个时候我们不应该放弃的,如果对这个不可见字符,看一下HEX就会发现。

这个78 9C的头太标志了。好了我要把我珍藏多年的秘籍告诉你们一下。

如果之前我先看一下hex我就不用逆向JS了。这用zlib就能解开了啊。我们试一下。

最终看到,的确解开了。其中的sign参数也是一样的办法就能解开。所以对于这种情况我们应该长个记性,看一眼HEX。

再看参数x-for-with。

按照刚才一样的办法,我找了半天也没找到这个参数的生成过程,在所有调用过程中,看到的都是不带这个参数的,可是发出去的时候,就加上了。好奇怪啊。

这个图是程序根据我们URL断点断下来的位置。蓦然回首,那人却在灯火阑珊处。我们注意到他发送之前调用到的这个i,里面有个send函数,点进去看一下。

看看上面的hookAjax,恍然大悟啊。怪不得之前没找到,他是修改了原生的收发函数添加的部分参数,我们看到open函数里有添加URL参数的代码,这个w()函数就是参数的名字,我们看一眼。

哎唷,写得这么隐秘,把数字转字符,之前还加个1。事出反常必有妖!

我们用python还原一下这个函数(当然也可以把这个代码copy到console执行一下,还更快,我就是show一下我不光会逆向,我的代码也写得6)

bingo!

好了那这个w()函数所对应的值就是我们要的了,再看刚才那张图。

这个h()函数就是我们要找的。

这下很明显了,加密算法,key,iv,模式,填充都有了。

具体待加密的内容我没有详细讲,相信你要是自己断点跑一下,一定看的一清二楚。

至于UUID的算法还原,我就没截图了,留给各位尝试一下吧。大致是每一部分都有一个生成算法,几部分拼接而成,找到的可以评论交作业。

梳理一下

我们这次主要介绍了F12的网络报文分析和断点调试功能,一般H5的爬虫逆向,主要也是以下几个步骤。

这次的例子中我们没有涉及到复杂的算法,否则我们逆不出来的时候,也需要把js拿出来在其他环境直接调用,当js包含大量浏览器环境的时候,还需要用webdriver把js加载起来调用。当然你在做的过程中,cookie参数生成遇到问题,或者让你拿到数据之后,你还会遇到字符加密等其他问题,也可以与我交流。

<think>好的,我现在需要帮助用户解决关于Dify循环实现的问题。首先,我需要明确用户的具体需求。他们提到“dify 循环实现”或“dify 如何处理循环”,但Dify本身可能没有直接称为“循环”的功能,所以需要结合现有文档中的信息来推断可能的解决方案。 根据用户提供的引用内容,Dify工作流中有迭代节点[^1]。这可能类似于编程中的循环结构,用于重复执行某个任务。例如,在处理列表数据或需要多次执行同一操作时,迭代节点可以派上用场。我需要详细解释迭代节点的配置和使用步骤,确保用户能够理解如何设置循环次数或遍历数据集。 另外,用户可能对如何处理循环中的错误或性能问题感兴趣。引用[2]提到在Dify中处理PEM文件的问题,这可能涉及在循环中正确处理数据格式,避免错误积累。需要提醒用户在循环中注意错误处理和资源管理,确保每次迭代的稳定性。 引用[3]中的例子展示了如何结合FastAPI和Selenium进行实时监控并生成GIF,这可能涉及循环截取浏览器内容。虽然Dify本身可能不直接控制这类循环,但可以通过外部脚本或定时任务触发工作流,模拟循环执行。这部分需要说明如何将外部循环机制与Dify结合使用。 接下来,我需要组织回答结构。首先介绍迭代节点的基本概念和配置步骤,然后讨论循环中的数据处理和错误处理,最后补充外部触发循环的方法。同时,生成相关问题以帮助用户进一步探索,比如优化循环性能或处理复杂数据结构。 需要确保回答符合格式要求,使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。同时,引用标识要自然地添加到相关段落末尾,如、[^2]、[^3]。 最后,检查是否有遗漏点,比如Dify的其他循环相关功能或用户可能遇到的常见问题,确保回答全面且易于理解。</think>在Dify中处理循环逻辑主要通过**迭代节点**实现,以下是具体实现方式和应用场景的解析: ### 一、Dify循环实现机制 Dify通过**工作流设计器**中的迭代节点处理循环需求,其核心原理类似编程中的`for循环`。迭代节点可遍历以下数据类型: - 数组列表:`["A","B","C"]` - 字典集合:`{"key1":"value1", "key2":"value2"}` - 数值范围:通过`range()`函数生成序列 配置示例: ```python # 模拟迭代节点的数据输入 input_data = { "dataset": [1,2,3,4,5], "process_logic": "item * 2" # 对每个元素执行乘以2的操作 } ``` ### 二、迭代节点的关键配置步骤 1. **数据源绑定**:将数组/字典类型变量连接到迭代节点的输入端口 2. **循环变量命名**:设定当前元素的变量名(默认为`item`) 3. **子流程设计**:在迭代节点内部构建需要重复执行的逻辑模块 4. **结果聚合**:通过`outputs`收集所有迭代结果,支持数组或对象格式 $$ \text{总耗时} = \sum_{i=1}^{n}(单次迭代时间_i) + 系统开销 $$ ### 三、循环中的特殊处理 1. **错误中断控制**: - 启用`continueOnError`参数可跳过失败迭代 - 通过`try-catch`模块包裹敏感操作 2. **并行优化**: ```python # 伪代码示例 Parallel.forEach(dataset, lambda item: process(item)) ``` 3. **结果过滤**: ```python filtered = filter(lambda x: x%2==0, processed_results) ``` ### 四、应用场景案例 1. **批量文件处理**:遍历存储桶中的文件列表进行格式转换 2. **数据清洗**:对数据库查询结果集进行逐条校验 3. **API轮询**:定时循环调用第三方接口直到满足特定条件
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值