得物小程序逆向+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_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.运行结果

有点垃圾将就着用了。

窗体展示
​​​

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

loguru和print输出顺序乱序

执行代码&#xff1a; from loguru import logger for i in range(1000):print(i)logger.info(i)执行效果&#xff1a; 0 1 2 3 4 2024-05-25 09:52:01.974 | INFO | __main__:<module>:6 - 0 2024-05-25 09:52:01.974 | INFO | __main__:<module>:6 - 1…

Java面试八股之可重入锁ReentrantLock是怎么实现可重入的

可重入锁ReentrantLock是怎么实现可重入的 ReentrantLock实现可重入性的机制主要依赖于以下几个核心组件和步骤&#xff1a; 状态计数器&#xff1a;ReentrantLock内部维护一个名为state的整型变量作为状态计数器&#xff0c;这个计数器不仅用来记录锁是否被持有&#xff0c;…

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

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

UE5 像素流与web 交互

总结下虚幻与网页的交互&#xff0c;这里将ue5 与js 交互传递参数记录下&#xff0c;其它的博主写的就是缺胳膊少腿的要么就是封闭收费&#xff0c;这个是在官方可以查询到。这里记录下&#xff1a; 点个关注不迷路&#xff1a; 具体的使用如下&#xff1a; 在你的游戏玩家类…

想要修改Excel表格内容,怎么移除编辑权限?

在使用Excel进行数据处理和管理时&#xff0c;我们经常会遇到需要保护工作表以防止误操作的情况。有时可能碰到“被保护单元格不支持此功能”的提示&#xff0c;本文将详细介绍这个问题的解决方案&#xff0c;帮助你取消单元格保护&#xff0c;使用所需的功能。 一、取消单元格…

01_Spark概述

文章目录 1.Spark概述Spark就是基于MR开发分布式计算分布式存储分布式传输集群中心化集群去中心化Spark集群中心化框架与系统引擎Driver 2.Spark核心模块3.spark和MR开发语言上处理方式Spark能否代替MR&#xff1f; 4.Spark运行模式部署Spark部署方式local模式 1.Spark概述 Sp…

汇编实现的操作系统

掌握X86汇编语言和GDB程序调试工具对于程序员来说是非常重要的_gdb 查看x86汇编-CSDN博客 掌握编译器和虚拟机的开发有哪些方面的好处-CSDN博客 Ville Mikael Turjanmaan开发的一个操作系统MenuetOS可运行在IA-32, x86-64平台上&#xff0c;完全用 64 位汇编语言编写。功能包…

【vue-1】vue入门—创建一个vue应用

最近在闲暇时间想学习一下前端框架vue&#xff0c;主要参考以下两个学习资料。 官网 快速上手 | Vue.js b站学习视频 2.创建一个Vue3应用_哔哩哔哩_bilibili 一、创建一个vue3应用 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

Unreal Engine5 Landscape地形材质无法显示加载

UE5系列文章目录 文章目录 UE5系列文章目录前言一、解决办法 前言 在使用ue5做地形编辑的时候&#xff0c;明明刚才就保存的Landscape地形完全消失不见&#xff0c;或者是地形的材质不见了。重新打开UE5发现有时候能解决&#xff0c;但大多数时候还是没有解决&#xff0c;我下…

AI应用案例:服务器智能分析管理系统

服务器硬件配置、性能状态、所运行的应用系统等信息分散于多个不同的信息管理系统。人为查询判断现有的服务器资源是否满足用户需求&#xff0c;且需结合资产管理系统与Maximo基础资源、性能监控、运维管理等各个系统互不关联&#xff0c;数据分散不能为运维管理提供完整一致的…

探索AI写作工具:五款推荐

在现实生活中&#xff0c;除了专业的文字工作者&#xff0c;各行各业都避免不了需要写一些东西&#xff0c;比如策划案、论文、公文、讲话稿、总结计划……等等。而随着科技的进步&#xff0c;数字化时代的深入发展&#xff0c;AI已经成为日常工作中必不可少的工具了&#xff0…

特征融合篇 | YOLOv8改进之利用新的空间金字塔池化FocalModulation取代SPPF

前言:Hello大家好,我是小哥谈。Focal Modulation Networks(FocalNets)的基本原理是替换自注意力(Self-Attention)模块,使用焦点调制(focal modulation)机制来捕捉图像中的长距离依赖和上下文信息。本文所做的改进是将新的空间金字塔池化FocalModulation取代SPPF模块。…

AWS Elastic Beanstalk 监控可观测最佳实践

一、概述 Amazon Web Services (AWS) 包含一百多种服务&#xff0c;每项服务都针对一个功能领域。服务的多样性可让您灵活地管理 AWS 基础设施&#xff0c;然而&#xff0c;判断应使用哪些服务以及如何进行预配置可能会非常困难。借助 Elastic Beanstalk&#xff0c;可以在 AW…

LLM大模型的7种推理框架分析

LLM的7种推理框架 Hugging Face的transformers 这是一个Python库&#xff0c;可以简化本地运行LLM的过程。 Transformers的优点&#xff1a; 自动模型下载提供代码片段非常适合实验和学习 Transformers的缺点&#xff1a; 需要对ML和NLP有深入了解需要编码和配置技能 2.L…

探寻最强性能云电脑:ToDesk云电脑、无影云、网易云游戏、易腾云横测大比拼

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

Linux基础(二):环境搭建

本文准备从0开始&#xff0c;一步步搭建一套属于自己的Linux系统环境&#xff0c;这将是后续学Linux、用Linux、Linux环境编程、应用和项目部署、工具实验等一系列学习和实践的基石&#xff0c;希望对小伙伴们有帮助。提前备好Linux编程实验环境非常重要&#xff0c;建议人手一…

齐护K210系列教程(三十一)_视觉小车

视觉小车 齐护编程小车端程序动作说明联系我们 在经常做小车任务项目时会用的K210的视觉与巡线或其它动作结合&#xff0c;这就关系到要将K210的识别结果传送给小车的主控制器&#xff0c;K210为辅助传感器&#xff08;视觉采集&#xff09;。 这节课我们用K210识别图像&#x…

加速度传感器的冲击振动的原始特征与解算(部分)

这里是工作中测得的一组数据&#xff0c;设备有多个加速度传感器通道&#xff0c;我们可以看到冲击振动发生前后&#xff0c;各个振动传感器的的反馈以及其他的细化特征&#xff1a; 1.随机振动&#xff08;加速度传感器视角&#xff09; 2.冲击振动&#xff08;加速度&#x…

不平衡数据研究:分配权重 合并2个loader

分配权重&#xff08;基于实例分配&#xff0c;基于类分配&#xff09; import numpy as np import torch from torch.utils.data import DataLoader, WeightedRandomSampler, Dataset# Mock dataset class class MockDataset(Dataset):def __init__(self, data, targets):sel…

“AIGC行业投资时机分析:评估当前市场发展阶段与未来需求趋势“

文章目录 每日一句正能量前言行业前景当前发展前景相关领域的发展趋势行业潜力竞争情况结论 市场需求人才需求情况机会挑战结论 选择与规划自我评估行业调研职业规划风险管理个人陈述示例 后记 每日一句正能量 胖了就减&#xff0c;没钱就赚&#xff0c;不会就学&#xff0c;不…