得物小程序逆向+qt可视化(不含sku)

声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872              
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!q 2766958292

前言:

重新研究227几天,我发现淘系事件真的太恶心了。一直在调整事件执行顺序。最终把s89 s90 s46 s5给搞了。非淘不检测这几个。中途不知道触发了什么事件把s46加上去,s5没上去导致非淘都过不去。淘系我手动测了一下过了几次。轨迹太恶心了。还有那个ai轨迹研究不明白。怎么收集轨迹没搞懂,最后生成的文件轨迹更差了。有懂的告诉我一下,大家相互交流一下。

接着就是得物,太恶心了风控。我就失败了一次,直接被风控了。进都进不去。ck,st检测很严格。还有code,必须有生成auth token,没有资源跑不起来。我就随便测了几个风控不严格得接口。

1.逆向过程

data,sign就不说了。一个env aes 加密几天没看我也忘了为了交个课程结课作业完成了个大概就没管了。很容易就找到了,sign时md5。

2.收集指纹

为了增加代码行数,方便大作业演示直接全丢给内存跑就行了,丢给缓存吃力不讨好。直接用window环境就行了。

3.code授权

42开源了一个code frida自动授权的。有需要的自己去找我就当宣传一下了。

4.完整代码如下

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import numpy as np
from PyQt5.QtWebEngineWidgets import *
import os
import json
import random
import execjs
import requests
from openpyxl import Workbook
import pandas  as pd
from pyecharts.charts import Map,Page
from openpyxl.utils.dataframe import dataframe_to_rowsclass Ui_MainWindow(QMainWindow):def __init__(self):super(QtWidgets.QMainWindow,self).__init__()self.pageNo=Noneself.setupUi(self)self.retranslateUi(self)def on_lineEdit_textChanged(self, text):try:# 这里处理输入框内容的变化self.pageNo=textexcept Exception as e:print("发生异常:", e)sys.exit(1)  # 或者其他错误处理方式def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)self.centralWidget = QWidget(MainWindow)self.centralWidget.setObjectName("centralWidget")MainWindow.setCentralWidget(self.centralWidget)# 使用网格布局self.gridLayout = QGridLayout(self.centralWidget)# 创建输入框并添加到布局中self.lineEdit = QLineEdit()self.lineEdit.setPlaceholderText("输入爬取页数")# textChanged事件连接到相应的槽self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 2)  # 行,列,行占比,列占比# 创建爬取数据按钮并添加到布局中self.pushButtonCrawl = QPushButton()self.pushButtonCrawl.setText("爬取数据")# clicked事件连接到相应的槽self.pushButtonCrawl.clicked.connect(self.spider)self.gridLayout.addWidget(self.pushButtonCrawl, 0, 0)# 创建打开列表按钮并添加到布局中self.pushButtonOpenList = QPushButton()self.pushButtonOpenList.setText("打开列表")# clicked事件分别连接到两个不同的槽self.pushButtonOpenList.clicked.connect(self.openfile)self.pushButtonOpenList.clicked.connect(self.creat_table_show)self.gridLayout.addWidget(self.pushButtonOpenList, 0, 1)# 创建表格控件并添加到布局中self.tableWidget = QTableWidget()self.tableWidget.setColumnCount(0)self.tableWidget.setRowCount(0)self.tableWidget.setStyleSheet("selection-background-color:pink")self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)self.gridLayout.addWidget(self.tableWidget, 2, 0, 1, 2)  # 表格控件在第三行,横跨两列# 必要时添加所需的方法,如 on_lineEdit_textChanged, spider, openfile, creat_table_showdef retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "窗口名字(自定义)"))def openfile(self):###获取路径===================================================================openfile_name = QFileDialog.getOpenFileName(self,'选择文件','','Excel files(*.xlsx , *.xls)')#print(openfile_name)global path_openfile_name###获取路径====================================================================path_openfile_name = openfile_name[0]def creat_table_show(self):###===========读取表格,转换表格,===========================================if len(path_openfile_name) > 0:input_table = pd.read_excel(path_openfile_name)print(input_table)#print(input_table)input_table_rows = input_table.shape[0]input_table_colunms = input_table.shape[1]#print(input_table_rows)#print(input_table_colunms)input_table_header = input_table.columns.values.tolist()#print(input_table_header)###===========读取表格,转换表格,============================================###======================给tablewidget设置行列表头============================self.tableWidget.setColumnCount(input_table_colunms)self.tableWidget.setRowCount(input_table_rows)self.tableWidget.setHorizontalHeaderLabels( ['商品id', '封面路径', '标题', '价格', '开售时间', '属性id值', '价格类型', '商品类型','类别id','活动期间价格', '授权价格', '售卖数量', '产品单元id', '最优价格'])###======================给tablewidget设置行列表头============================###================遍历表格每个元素,同时添加到tablewidget中========================for i in range(input_table_rows):input_table_rows_values = input_table.iloc[[i]]#print(input_table_rows_values)input_table_rows_values_array = np.array(input_table_rows_values)input_table_rows_values_list = input_table_rows_values_array.tolist()[0]#print(input_table_rows_values_list)for j in range(input_table_colunms):input_table_items_list = input_table_rows_values_list[j]#print(input_table_items_list)# print(type(input_table_items_list))###==============将遍历的元素添加到tablewidget中并显示=======================input_table_items = str(input_table_items_list)newItem = QTableWidgetItem(input_table_items)newItem.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter)self.tableWidget.setItem(i, j, newItem)###================遍历表格每个元素,同时添加到tablewidget中========================else:self.centralWidget.show()def spider(self):# 创建一个工作簿print("开始爬取")tab_headers = ['商品id', '封面路径', '标题', '价格', '开售时间', '属性id值', '价格类型', '商品类型','类别id','活动期间价格', '授权价格', '售卖数量', '产品单元id', '最优价格']wb = Workbook()# 选择活动工作表ws = wb.active# ws.append(tab_headers)store_data = []for count in range(int(self.pageNo)):# 设置表头headers = {}envs = [放入自己的指纹]env = random.choice(envs)headers['User-Agent'] = env['dua']mode = env['dmo']  # 手机型号cp = execjs.compile(open('./得物.js', 'r', encoding='utf8').read())data = cp.call('getSk', env)['data']json_data = {'data': data,}response = requests.post('###/webSk', headers=headers, json=json_data)sk = response.textltk = cp.call('getLtK', env, mode)headers['ltk'] = ltkheaders['SK'] = sk# 第一次是21 然后变20# lastId '' 第二次开始 '1' '2'if count == 0:limit = 21else:limit = 20lastId = count+1json_data = cp.call('getSign', limit, lastId)response = requests.post('#/v1/h5/index/fire/index', headers=headers, json=json_data)hotList = json.loads(response.text)['data']['hotList']for hot in hotList:typeId = hot['typeId']if 'product' in hot:sku = hot["product"]["spuId"]logoUrl = hot["product"]["logoUrl"]title = hot["product"]["title"]price = hot["product"]["price"] / 100if 'sellDate' in hot["product"]:sellDate = hot["product"]["sellDate"]else:sellDate = '未知'propertyValueId = hot["product"]["propertyValueId"]priceType = hot["product"]["priceType"]goodsType = hot["product"]["goodsType"]categoryId = hot["product"]["categoryId"]activityPrice = hot["product"]["activityPrice"] / 100authPrice = hot["product"]["authPrice"] / 100soldCountText = hot["product"]["soldCountText"]cspuId = hot["product"]["cspuId"]if "newOptimalPrice" in hot["product"]:newOptimalPrice = hot["product"]["newOptimalPrice"] / 100else:newOptimalPrice = '未知'store_data.append([sku, logoUrl, title, price, sellDate, propertyValueId, priceType, goodsType,categoryId, activityPrice, authPrice, soldCountText, cspuId, newOptimalPrice])df = pd.DataFrame(store_data, columns=tab_headers)# 现在,我们将 DataFrame 中的数据逐行追加到工作表中for row in dataframe_to_rows(df, index=False, header=False):print(row)if row:  # 这将跳过空行ws.append(row)# 保存工作簿wb.save('./得物.xlsx')page = Page(layout=Page.DraggablePageLayout)# 先生成render.html文件page.render()print("爬取完成")QMessageBox.about(self, 'ok', '数据已爬取完成')if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())

5.运行结果

有点垃圾将就着用了。

窗体展示
​​​

 

 

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

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

相关文章

Python实现国密GmSSL

Python实现国密GmSSL 前言开始首先安装生成公钥与私钥从用户证书中读取公钥读取公钥生成签名验证签名加密解密 遇到的大坑参考文献 前言 首先我是找得到的gmssl库,经过实操,发现公钥与密钥不能通过pem文件得到,就是缺少导入pem文件的api。这…

迷你手持小风扇到底哪个牌子最好?揭秘迷你手持手持小风扇排行榜

在炎炎夏日,迷你手持小风扇成为了我们不可或缺的清凉伴侣。然而,面对市场上琳琅满目的品牌,迷你手持小风扇到底哪个牌子最好?今天,我将揭秘迷你手持小风扇排行榜,带大家一探各大品牌的魅力,让你…

字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

尼恩:百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中,经常性的指导小伙伴们改造简历。 经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#xff0c…

【LeetCode】【5】最长回文子串

文章目录 [toc]题目描述样例输入输出与解释样例1样例2 提示Python实现动态规划 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给一个字符串s,找到s中最长的回文子串 样例输入输出与解释 样例1 输入…

文件上传安全指南:保护免受不受限制的文件上传攻击

文件上传安全指南:保护免受不受限制的文件上传攻击 在现代应用程序中,文件上传功能是一个常见且重要的部分。然而,这也为攻击者提供了潜在的攻击向量,尤其是不受限制的文件上传攻击。本文将详细介绍如何通过一系列安全措施来保护…

安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装及使用详解(文末附样例)

1. 概览 微软威胁建模工具(Threat Modeling Tool)是 Microsoft 安全开发生命周期 (SDL,Security Develop LifeCycle) 的核心要素。 当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段,软件架构师可以使用威胁建模工具提…

linux系统防火墙开放端口命令

目录 linux相关命令参考文章1.开放端口1.1 开发单个端口1.2 一次性开放多个端口 2.保存设置3.查看所有开放的端口4.查看防火墙状态 linux相关命令参考文章 管理、设置防火墙规则(firewalld): https://download.csdn.net/blog/column/8489557/137911049 i…

打造AI虚拟伴侣 - 优化方案

第一部分:框架优化概述 1、精确定位: 构建一个高度灵活且用户友好的平台,旨在通过无缝集成多种大型语言模型(LLMs)后端,为用户创造沉浸式的角色交互体验。不仅适配电脑端,还特别优化移动端体验,满足二次元AI虚拟伴侣市场的特定需求。 2、核心功能强化: 增强后端兼容…

每日练习之深度优先搜索——最大的湖

最大的湖 题目描述 运行代码 #include<iostream> using namespace std; bool mp[102][102]; int sum,num; int N,M,K; int dfs(int x,int y ) {if( mp[x][y] ){mp[x][y]0;sum;dfs(x1,y);dfs(x-1,y);dfs(x,y1);dfs(x,y-1);}return 0; } int main() {cin>>N>>…

【每日一题】52.20个机器学习问题 2 (模型部署、实践流程和应用问题)

在上一篇《20个机器学习问答题》中&#xff0c;问题主要围绕机器学习的基础概念和理论知识。 这次&#xff0c;本篇内容针对机器学习的实践和应用继续提出了20个不同的问题。【点击跳转原文】 在实际应用中&#xff0c;机器学习模型的建立流程是怎样的&#xff1f; 机器学习模…

使用delphi11编写一个基于xls作为数据库的照片展示程序

1、创建xls文档可以参考前一篇博客&#xff0c;并使用wps将文档保存为2003格式xls后缀。 2、在form上面放置adoconnection、adotable、datasource、spinedit、timer、checkbox、image、4个button组件。 image的设置&#xff1a; Image1.Align : alClient; Image1.Center : Tr…

如何找到docker的run(启动命令)

使用python三方库进行 需要安装python解释器 安装runlike安装包 pip3 install runlike 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是显示自动换行实验 使用docker启动一个jenkins 启动命令为 docker run -d \ -p 9002:80…

无线领夹麦克风哪个品牌音质最好,揭秘无线领夹麦哪个牌子好用

​随着社交媒体和内容创作的兴起&#xff0c;清晰可靠的音频捕捉已成为打造高品质作品的关键要素。无线领夹麦克风因其轻巧设计和用户友好的接口而受到青睐&#xff0c;它能够确保你的声音在任何环境下都能被完美捕捉。经过精心测试和对比&#xff0c;以下几款无线领夹麦克风是…

大数据学习之安装并配置maven环境

什么是Maven Maven字面意&#xff1a;专家、内行Maven是一款自动化构建工具&#xff0c;专注服务于Java平台的项目构建和依赖管理。依赖管理&#xff1a;jar之间的依赖关系&#xff0c;jar包管理问题统称为依赖管理项目构建&#xff1a;项目构建不等同于项目创建 项目构建是一…

C语言——⾼位优先与低位优先的不同之处是什么?

一、问题 C语⾔的最⼤特⾊就是可移植性好。根据机器类型的不同&#xff0c;⾼位优先与低位优先也不同。那么&#xff0c;最好的可移植的 C 程序应该同时适⽤这两种类型的计算机。下⾯了解⼀下⾼位优先与低位优先的不同之处。 二、解答 所谓的⾼位优先&#xff0c;就是最低的地…

使用docker-compose部署时序数据库InfluxDB1.8.4

背景 如今 InfluxDB 已经更新到了 2.x &#xff0c; InfluxDB 1.x 和 2.x 版本之间有几个主要的区别&#xff1a; 数据模型&#xff1a; 1.x&#xff1a;使用数据库和保留策略来组织数据。 2.x&#xff1a;引入了组织&#xff08;organizations&#xff09;和存储桶&#xff…

牛客NC236 最大差值【simple 动态规划 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204 思路 不难看出该题可以使用动态规划的方式解题。 在循环数组的过程中&#xff0c;记录截止到当前位置-1的最小值&#xff0c; 然后用当前的值去计算最大的差值。Java代码 im…

融媒宝:群发自媒体平台的神器,注册送7天中级会员

近几年自媒体比较火&#xff0c;做自媒体往往需要发布文章或视频到多个平台&#xff0c;如手工复制粘贴逐一发布&#xff0c;委实费时费力、效率不高。今天就给大家分享一款提高自媒体运营效率的神器--融媒宝&#xff1a; 融媒宝简介 融媒宝是一款可免费使用的高效自媒体工具…

22个C语言小白常见问题总结

一.语言使用错误 在打代码的过程中&#xff0c;经常需要在中文与英文中进行转换&#xff0c;因此常出现一些符号一不小心就用错&#xff0c;用成中文。例如&#xff1a;“&#xff1b;”中文中的分号占用了两个字节&#xff0c;而英文中“;”分号只占用一个字节。编译器只能识…

Scala的简单学习一

一 相关知识 1.1 scala的安装 1.在idea中导入依赖&#xff0c;并在Idea下载scala插件 1.2 scala基础知识点 1.scala代码中一行语句的结束是以换行符为标准&#xff0c;可以不用写分号 2.class是一个普通的类&#xff0c;object相当于一个单例对象&#xff0c;object类中的…