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

news2025/1/15 13:08:57

声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!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_rows


class Ui_MainWindow(QMainWindow):

    def __init__(self):
        super(QtWidgets.QMainWindow,self).__init__()
        self.pageNo=None
        self.setupUi(self)
        self.retranslateUi(self)


    def on_lineEdit_textChanged(self, text):
        try:
            # 这里处理输入框内容的变化
            self.pageNo=text
        except 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_show


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.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.text
            ltk = cp.call('getLtK', env, mode)
            headers['ltk'] = ltk
            headers['SK'] = sk
            # 第一次是21 然后变20
            # lastId '' 第二次开始 '1' '2'
            if count == 0:
                limit = 21
            else:
                limit = 20
            lastId = count+1
            json_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"] / 100
                    if '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"] / 100
                    authPrice = hot["product"]["authPrice"] / 100
                    soldCountText = hot["product"]["soldCountText"]
                    cspuId = hot["product"]["cspuId"]
                    if "newOptimalPrice" in hot["product"]:
                        newOptimalPrice = hot["product"]["newOptimalPrice"] / 100
                    else:
                        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 sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

5.运行结果

有点垃圾将就着用了。

窗体展示
​​​

 

 

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

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

相关文章

linux-配置服务器之间 ssh免密登录

前言 在管理多台Linux服务器时,为了方便操作和自动化任务,实现服务器之间的SSH免密登录是非常有必要的。SSH免密登录可以避免每次远程连接时输入密码,大大提高效率。本文将详细介绍SSH免密登录的原理和实现步骤。 一、原理解释 SSH免密登录的实现依赖于SSH密钥对,主要是利用…

为什么手机冬天续航短 – 锂电池的温度特性曲线

原文出自微信公众号【小小的电子之路】 相信大家都有这样的经历:手机的续航能力在寒冷的冬天会有一定程度的降低,有些手机甚至充不进去电。在这种情况下,有些人可能会在手机上贴一个暖宝宝。其实这个问题不止出现在手机上,大家如果…

Mybatis Cache(一)MybatisCache+Redis

前面提到了,使用mybatis cache,一般是结合redis使用。 一、demo 1、数据表 create table demo.t_address (id int auto_incrementprimary key,address_name varchar(200) null,address_code varchar(20) null,address_type int n…

Java进阶学习笔记4——Static应用知识:代码块

代码块: 代码块是类的五大成员之一(成员变量、构造器、方法、代码块、内部类)。 Java类生命周期:加载、验证、准备、初始化、卸载。 代码块分为两种: 静态代码块: 格式:static {} 特点&…

Linux--网络通信(一)概述

网络通信概述 网络通信本质上是一种进程间通信,是位于网络中不同主机上的进程之间的通信,属于 IPC 的一种, 通常称为 socket IPC。所以网络通信是为了解决在网络环境中,不同主机上的应用程序之间的通信问题。 大概可以分为三个层…

物联网应用开发--STM32与机智云通信(ESP8266 Wi-Fi+手机APP+LED+蜂鸣器+SHT20温湿度传感器)

实现目标 1、熟悉机智云平台,会下载APP 2、熟悉新云平台创建产品,项目虚拟调试 3、掌握云平台生成MCU代码,并移植。机智云透传固件的下载 4、具体目标:(1)注册机智云平台;(2&…

转行3年涨薪300%,我总结了一套产品经理快速入门指南!

想转行的产品小白,初期一定会遇到这个问题——我要如何 0 基础转行产品经理? 要想 0 基础快速转行产品经理,我通过个人实践总结了 5 个关键点,可以参考。 一、熟悉产品经理的工作全流程 转行的产品小白,首先要建立产…

mninst数据集图片下载

//不需要在官网下载,直接通过python代码,利用pytorch下载即可 from icecream import ic from torchvision import datasets from tqdm import tqdm import ostrain_data datasets.MNIST(root"./data/", trainTrue, downloadTrue) test_data …

VMware虚拟机桥接无线网卡上网(WIFI)

一、打开VM点击【编辑】-【虚拟网络编辑器】 二、点击【桥接模式】- 点击【自动设置】- 选择自己的无线网适配器 - 【确定】 三、开机之后会弹出提示连接网络,就能看见网络已经连上了

FastCopy

目录 背景: 简介: 原理: 下载地址: 工具的使用: 背景: 简介: FastCopy是一款速度非常快的拷贝软件,软件版本为5.7.1 Fastcopy是日本的最快的文件拷贝工具,磁盘间相互拷贝文件是司空见惯的事情,通常情况…

零一万物Yi-1.5开源,34B/9B/6B多尺寸,34B超Qwen1.5-72B

前言 近年来,大型语言模型(LLM)在各个领域展现出惊人的能力,为人们的生活和工作带来了巨大的改变。然而,大多数开源 LLM 的性能仍然无法与闭源模型相媲美,这限制了 LLM 在科研和商业领域的进一步应用。为了…

C# 利用Xejen框架源码,我们来开发一个基于Dapper技术的数据库通用的帮助访问类,通过Dapper的增删改查,可以访问Sqlite数据库

Dapper 是一个轻量级的对象关系映射(ORM)工具,适用于 .NET 平台。它由 Stack Overflow 团队开发,旨在提供简单、高效的数据访问功能。与其他重量级 ORM(如 Entity Framework)相比,Dapper 更加轻…

【算法例题】n元钱买n只鸡

题目描述&#xff1a;公鸡5元1只&#xff0c;母鸡3元1只&#xff0c;小鸡1元3只&#xff0c;问&#xff1a;n元钱买n只鸡&#xff0c;怎么买&#xff1f; 解题思路&#xff1a;这题要用枚举算法&#xff0c;枚举鸡的数量&#xff0c;代码如下&#xff1a; ​#include <bit…

博客系统(Servlet实现)

目录 1.准备工作 2.数据库设计 2.1表设计 2.2封装数据库操作代码 2.3创建 Blog 类 和 User 类 2.4创建 BlogDao 类和 UserDao 类 3.读取博客列表功能 3.1约定前后端交互接口 3.2实现服务器代码 3.3实现客户端代码 4.实现博客详情 4.1约定前后端交互接口 4.2实现服…

jmeter之线程组教程

一、线程组的作用 线程组是测试计划的子控件&#xff0c;也是取样器的父控件setup线程组&#xff0c;在所有线程组之前运行&#xff0c;类似于unittest框架中的SetUp函数&#xff0c;初始化环境teardown线程组&#xff0c;在所有线程组之后运行&#xff0c;类似于unittest中的…

如何在Windows 11和10上检查计算机的正常运行时间,这里有两种方法

序言 你的计算机的正常运行时间告诉你打开计算机已经有多长时间了。如果你需要这些信息进行故障排除或其他操作&#xff0c;那么很容易在Windows 11和Windows 10操作系统上找到你的正常运行时间。我们将向你展示图形和命令行方法。让我们开始吧。 使用任务管理器查找Windows正…

YoloV9实战与改进——专栏目录

摘要 &#x1f525;&#x1f680;本专栏教你如何嗨翻Yolov9&#xff01;&#x1f680;&#x1f525; &#x1f680;炸裂升级&#xff1a;嗨&#xff0c;小伙伴们&#xff01;这里有一波Yolov9的升级大招&#xff0c;带你领略最新论文的精华&#xff01;&#x1f4a5; 什么注意…

Star CCM+在电池热管理中SOC计算、充电Map调用、电池内阻调用的方法

前言 众所周知电池充电电流是随着电池温度与容量变化查表获得(形式见下表),其中电池的充电倍率(电流)是阶梯变化的,而内阻是线型变化的。因此为了仿真的准确定,需要在软件中实现数据的调用,计算电池的发热量。 电池内阻/充电倍率表 一 SOC计算 SOC的估算方法有开路电…

fpga 提高有什么进阶书推荐?

到FPGA中后期的时候就要开始接触&#xff0c;如&#xff1a;高速接口、光纤数字信号处理等项目实践了&#xff0c;那么我们可以读一些书进行提升&#xff0c;大家可以收藏下。 高速接口项目《嵌入式高速串行总线技术:基于FPGA实现与应用》作者&#xff1a;张锋 FPGA提升书籍推…

探索切片索引:列表反转的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;列表反转的挑战 二、切片索引的基本概念 三、切片索引实现列表反转 …