当前位置:   article > 正文

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

得物小程序逆向+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.完整代码如下

  1. from PyQt5 import QtCore, QtGui, QtWidgets
  2. from PyQt5.QtWidgets import *
  3. from PyQt5.QtCore import *
  4. import numpy as np
  5. from PyQt5.QtWebEngineWidgets import *
  6. import os
  7. import json
  8. import random
  9. import execjs
  10. import requests
  11. from openpyxl import Workbook
  12. import pandas as pd
  13. from pyecharts.charts import Map,Page
  14. from openpyxl.utils.dataframe import dataframe_to_rows
  15. class Ui_MainWindow(QMainWindow):
  16. def __init__(self):
  17. super(QtWidgets.QMainWindow,self).__init__()
  18. self.pageNo=None
  19. self.setupUi(self)
  20. self.retranslateUi(self)
  21. def on_lineEdit_textChanged(self, text):
  22. try:
  23. # 这里处理输入框内容的变化
  24. self.pageNo=text
  25. except Exception as e:
  26. print("发生异常:", e)
  27. sys.exit(1) # 或者其他错误处理方式
  28. def setupUi(self, MainWindow):
  29. MainWindow.setObjectName("MainWindow")
  30. MainWindow.resize(800, 600)
  31. self.centralWidget = QWidget(MainWindow)
  32. self.centralWidget.setObjectName("centralWidget")
  33. MainWindow.setCentralWidget(self.centralWidget)
  34. # 使用网格布局
  35. self.gridLayout = QGridLayout(self.centralWidget)
  36. # 创建输入框并添加到布局中
  37. self.lineEdit = QLineEdit()
  38. self.lineEdit.setPlaceholderText("输入爬取页数")
  39. # textChanged事件连接到相应的槽
  40. self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)
  41. self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 2) # 行,列,行占比,列占比
  42. # 创建爬取数据按钮并添加到布局中
  43. self.pushButtonCrawl = QPushButton()
  44. self.pushButtonCrawl.setText("爬取数据")
  45. # clicked事件连接到相应的槽
  46. self.pushButtonCrawl.clicked.connect(self.spider)
  47. self.gridLayout.addWidget(self.pushButtonCrawl, 0, 0)
  48. # 创建打开列表按钮并添加到布局中
  49. self.pushButtonOpenList = QPushButton()
  50. self.pushButtonOpenList.setText("打开列表")
  51. # clicked事件分别连接到两个不同的槽
  52. self.pushButtonOpenList.clicked.connect(self.openfile)
  53. self.pushButtonOpenList.clicked.connect(self.creat_table_show)
  54. self.gridLayout.addWidget(self.pushButtonOpenList, 0, 1)
  55. # 创建表格控件并添加到布局中
  56. self.tableWidget = QTableWidget()
  57. self.tableWidget.setColumnCount(0)
  58. self.tableWidget.setRowCount(0)
  59. self.tableWidget.setStyleSheet("selection-background-color:pink")
  60. self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
  61. self.gridLayout.addWidget(self.tableWidget, 2, 0, 1, 2) # 表格控件在第三行,横跨两列
  62. # 必要时添加所需的方法,如 on_lineEdit_textChanged, spider, openfile, creat_table_show
  63. def retranslateUi(self, MainWindow):
  64. _translate = QtCore.QCoreApplication.translate
  65. MainWindow.setWindowTitle(_translate("MainWindow", "窗口名字(自定义)"))
  66. def openfile(self):
  67. ###获取路径===================================================================
  68. openfile_name = QFileDialog.getOpenFileName(self,'选择文件','','Excel files(*.xlsx , *.xls)')
  69. #print(openfile_name)
  70. global path_openfile_name
  71. ###获取路径====================================================================
  72. path_openfile_name = openfile_name[0]
  73. def creat_table_show(self):
  74. ###===========读取表格,转换表格,===========================================
  75. if len(path_openfile_name) > 0:
  76. input_table = pd.read_excel(path_openfile_name)
  77. print(input_table)
  78. #print(input_table)
  79. input_table_rows = input_table.shape[0]
  80. input_table_colunms = input_table.shape[1]
  81. #print(input_table_rows)
  82. #print(input_table_colunms)
  83. input_table_header = input_table.columns.values.tolist()
  84. #print(input_table_header)
  85. ###===========读取表格,转换表格,============================================
  86. ###======================给tablewidget设置行列表头============================
  87. self.tableWidget.setColumnCount(input_table_colunms)
  88. self.tableWidget.setRowCount(input_table_rows)
  89. self.tableWidget.setHorizontalHeaderLabels( ['商品id', '封面路径', '标题', '价格', '开售时间', '属性id值', '价格类型', '商品类型',
  90. '类别id',
  91. '活动期间价格', '授权价格', '售卖数量', '产品单元id', '最优价格'])
  92. ###======================给tablewidget设置行列表头============================
  93. ###================遍历表格每个元素,同时添加到tablewidget中========================
  94. for i in range(input_table_rows):
  95. input_table_rows_values = input_table.iloc[[i]]
  96. #print(input_table_rows_values)
  97. input_table_rows_values_array = np.array(input_table_rows_values)
  98. input_table_rows_values_list = input_table_rows_values_array.tolist()[0]
  99. #print(input_table_rows_values_list)
  100. for j in range(input_table_colunms):
  101. input_table_items_list = input_table_rows_values_list[j]
  102. #print(input_table_items_list)
  103. # print(type(input_table_items_list))
  104. ###==============将遍历的元素添加到tablewidget中并显示=======================
  105. input_table_items = str(input_table_items_list)
  106. newItem = QTableWidgetItem(input_table_items)
  107. newItem.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
  108. self.tableWidget.setItem(i, j, newItem)
  109. ###================遍历表格每个元素,同时添加到tablewidget中========================
  110. else:
  111. self.centralWidget.show()
  112. def spider(self):
  113. # 创建一个工作簿
  114. print("开始爬取")
  115. tab_headers = ['商品id', '封面路径', '标题', '价格', '开售时间', '属性id值', '价格类型', '商品类型',
  116. '类别id',
  117. '活动期间价格', '授权价格', '售卖数量', '产品单元id', '最优价格']
  118. wb = Workbook()
  119. # 选择活动工作表
  120. ws = wb.active
  121. # ws.append(tab_headers)
  122. store_data = []
  123. for count in range(int(self.pageNo)):
  124. # 设置表头
  125. headers = {}
  126. envs = [放入自己的指纹]
  127. env = random.choice(envs)
  128. headers['User-Agent'] = env['dua']
  129. mode = env['dmo'] # 手机型号
  130. cp = execjs.compile(open('./得物.js', 'r', encoding='utf8').read())
  131. data = cp.call('getSk', env)['data']
  132. json_data = {
  133. 'data': data,
  134. }
  135. response = requests.post('###/webSk', headers=headers, json=json_data)
  136. sk = response.text
  137. ltk = cp.call('getLtK', env, mode)
  138. headers['ltk'] = ltk
  139. headers['SK'] = sk
  140. # 第一次是21 然后变20
  141. # lastId '' 第二次开始 '1' '2'
  142. if count == 0:
  143. limit = 21
  144. else:
  145. limit = 20
  146. lastId = count+1
  147. json_data = cp.call('getSign', limit, lastId)
  148. response = requests.post('#/v1/h5/index/fire/index', headers=headers, json=json_data)
  149. hotList = json.loads(response.text)['data']['hotList']
  150. for hot in hotList:
  151. typeId = hot['typeId']
  152. if 'product' in hot:
  153. sku = hot["product"]["spuId"]
  154. logoUrl = hot["product"]["logoUrl"]
  155. title = hot["product"]["title"]
  156. price = hot["product"]["price"] / 100
  157. if 'sellDate' in hot["product"]:
  158. sellDate = hot["product"]["sellDate"]
  159. else:
  160. sellDate = '未知'
  161. propertyValueId = hot["product"]["propertyValueId"]
  162. priceType = hot["product"]["priceType"]
  163. goodsType = hot["product"]["goodsType"]
  164. categoryId = hot["product"]["categoryId"]
  165. activityPrice = hot["product"]["activityPrice"] / 100
  166. authPrice = hot["product"]["authPrice"] / 100
  167. soldCountText = hot["product"]["soldCountText"]
  168. cspuId = hot["product"]["cspuId"]
  169. if "newOptimalPrice" in hot["product"]:
  170. newOptimalPrice = hot["product"]["newOptimalPrice"] / 100
  171. else:
  172. newOptimalPrice = '未知'
  173. store_data.append([sku, logoUrl, title, price, sellDate, propertyValueId, priceType, goodsType,
  174. categoryId, activityPrice, authPrice, soldCountText, cspuId, newOptimalPrice])
  175. df = pd.DataFrame(store_data, columns=tab_headers)
  176. # 现在,我们将 DataFrame 中的数据逐行追加到工作表中
  177. for row in dataframe_to_rows(df, index=False, header=False):
  178. print(row)
  179. if row: # 这将跳过空行
  180. ws.append(row)
  181. # 保存工作簿
  182. wb.save('./得物.xlsx')
  183. page = Page(layout=Page.DraggablePageLayout)
  184. # 先生成render.html文件
  185. page.render()
  186. print("爬取完成")
  187. QMessageBox.about(self, 'ok', '数据已爬取完成')
  188. if __name__ == "__main__":
  189. import sys
  190. app = QtWidgets.QApplication(sys.argv)
  191. MainWindow = QtWidgets.QMainWindow()
  192. ui = Ui_MainWindow()
  193. ui.setupUi(MainWindow)
  194. MainWindow.show()
  195. sys.exit(app.exec_())

5.运行结果

有点垃圾将就着用了。

窗体展示
​​​

 

wx a15018601872   
q 2766958292
仅用于学习交流
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/641654

推荐阅读
相关标签