爬虫 APP 逆向 ---> shopee(虾皮) 电商

news2024/12/27 15:30:48

shopee 泰国站点:https://shopee.co.th/

shopee 网页访问时,直接弹出使用 app 登录查看,那就登录 shopee 泰国站点 app。

手机抓包:分类接口

接口:https://mall.shopee.co.th/api/v4/pages/get_category_tree

请求参数:

GET /api/v4/pages/get_category_tree HTTP/2
Host: mall.shopee.co.th
Cookie: 请求的cookie
X-Api-Source: rn
X-Shopee-Language: en
If-None-Match-: 55b03-158a0f98f80a09649f8dcfd2f8d263d4
X-Shopee-Client-Timezone: Asia/Shanghai
Cache-Control: no-cache, no-store
Client-Request-Id: 866aa1ae-8ad1-4fdb-ab12-5c1cd5326645.379
User-Agent: Android app Shopee appver=33835 app_type=1 platform=native_android os_ver=31 Cronet/102.0.5005.61
Af-Ac-Enc-Sz-Token:  一大串字符
X-Sap-Ri: 616c6b67968b98bfd88b87180110349e24abfda49173147d6085
D42920b3: 一大串字符
D609da9f: CTEoMyxcrcDaO0/OkIoS0bVWFEb=
651bb94a: 0+eWOk+Gy1GgoMssBoNnarzOM8E=
Referer: https://mall.shopee.co.th/
Accept-Encoding: gzip, deflate, br

Cookie 不用说,登录后的授权,其他其他参数经分析都是在 app 中生成的。

对于 app 中生成,解决方法有三个

  • 1. 直接逆向参数,然后使用 python 还原
  • 2. 把 java 代码扣出来,补 java 代码,然后编译成 jar 包,python 调用 jar 包生成
  • 3. 直接通过 frida 的 rpc ,hook 住关键函数,python 通过 http 服务去调用

这里使用 第三种方法:通过 frida 的 rpc

import time
import json
import frida
import uvicorn
import subprocess
from pathlib import Path
from fastapi import FastAPI, Request


js_code = """
console.log("脚本载入成功");
function call_request_defense(req_url) { //定义导出函数
    let ret_result;
    Java.perform(function x() {
        console.log("注入成功");
        console.log(`req_url ---> ${req_url}`);
        let ret_hashtable;
        let TargetClass = "com.shopee.shpssdk.SHPSSDK";
        // 遍历并操作目标类的实例
        Java.choose(TargetClass, {
            onMatch: function (instance) {
                console.log("Instance found: " + instance);
                // 调用实例方法
                ret_hashtable = instance.requestDefense(req_url, null)
                console.log(`ret_hashtable ---> ${ret_hashtable}`);
            },
            onComplete: function () {
                console.log("Search complete");
            }
        });
        let obj = {}
        let key_set = ret_hashtable.keySet();
        let key_set_it = key_set.iterator();
        while (key_set_it.hasNext()) {
            let key_str = key_set_it.next().toString();
            obj[key_str] = ret_hashtable.get(key_str).toString();
        }
        ret_result = JSON.stringify(obj);
        return ret_result;
    });
    return ret_result;
}
rpc.exports = {
    // 导出名callfunc1中不能有大写字母或者下划线
    callfunc1: call_request_defense
};
"""


def my_message_handler(message, payload):
    print(message)
    print(payload)


# 执行 Frida 脚本的函数
def run_frida_script():
    try:
        subprocess.run("adb forward tcp:27042 tcp:27042", shell=True)
        # device = frida.get_usb_device()
        device = frida.get_remote_device()
        time.sleep(3)  # 睡眠3秒, 防止程序运行过快从而导致附加不上
        # session = device.attach('蝦皮購物')
        session = device.attach(31785)
        time.sleep(3)
        script = session.create_script(js_code)
        script.load()

        def on_message(message, payload):
            print(message)
            print(payload)

        script.on('message', on_message)
        return script
    except Exception as e:
        print(f'frida 失败 ---> {e}')


app = FastAPI()
global_script = None


@app.post("/get_req_args")
async def root(request: Request):
    data_dict = await request.json()
    req_url = 'https://mall.shopee.sg/api/v4/pdp/get?_pft=127&apm_fs=true&apm_p=7&apm_pid=shopee%2F%40shopee-rn%2Fproduct-page%2FPRODUCT_PAGE&apm_ts=1732599014952&from_source=dd&item_id=25766030491&pdp_type=0&shop_id=1197286982&tz_offset_minutes=480'
    req_url = data_dict['req_url']
    global global_script
    if not global_script:
        global_script = run_frida_script()
    json_string = global_script.exports_sync.callfunc1(req_url, None)
    json_data = json.loads(json_string)
    print(f'req_args ---> {json_data}')
    return json_data


def main():
    uvicorn.run(f'{Path(__file__).stem}:app', host="0.0.0.0", port=9500)


if __name__ == '__main__':
    main()
    pass

通过 frida-ps 查看要 hook 的进程

这里要 hook 泰国的,所以 pid 是 31785

import re
import time
import copy
import json
import requests
from datetime import datetime
from loguru import logger
import traceback

requests.packages.urllib3.disable_warnings()


class SpiderDemo(object):
    def __init__(self):
        self.proxies = {
            'http': 'http://127.0.0.1:7890',
            'https': 'http://127.0.0.1:7890',
        }
        self.headers = {
            # "Host": "mall.shopee.sg",
            # "X-Api-Source": "rn",
            "X-Shopee-Language": "en",
            # "Af-Ac-Cli-Id": "34b3055fd7b9089bae7b8f6ac2f26ca6",
            # "If-None-Match-": "55b03-24cfe96938a6a6d5ae7e9410df32f9fa",
            "Shopee_http_dns_mode": "1",
            # "X-Shopee-Client-Timezone": "Asia/Shanghai",
            # "Cache-Control": "no-cache, no-store",
            "Cookie": "SPC_DID=O142PAj/32dZfKX4N53blQ1t5reVeGhPJmQF9ikDMew=; SPC_F=5858e12b8c30ccb3_unknown; REC_T_ID=8cbc4880-beab-11ef-b727-36f242b5381f; SPC_AFTID=b25c3453-e2ad-42f0-8ee4-03e98d76751c; SPC_CLIENTID=O142PAj/32dZfKX4hhcnmybxabffjfeq; shopee_app_version=33835; SPC_F=5858e12b8c30ccb3_unknown; userid=1421474215; shopid=1420696038; username=kingking482; shopee_token=EAwLsszK+CeDVWxZpYaNQu3F/7LcnX3Hvzgm39E4x4uNynjHMp+p5Fo2HFwWNrGoVritm4eCtfqAHFuZE2JVq7E=; SPC_U=1421474215; SPC_R_T_ID=0x7A96XMg1ulYu5diWw8k3EB9+DygwRdOLyKroXqWTl5jt4Hxl2s2eQABjuIU5SzmXrv2g8mqLxjHa++VYUPZjRR5DglKQrWFLzcdiuA2tK91Q/OFS8UIghYYhDIBirzL8MsCqyv2OIWi51RAee1O1fplXE8UPmFiWhWrIyTmjM=; SPC_R_T_IV=dEUxNHRGVmhCTmNISkx4Tw==; SPC_T_ID=0x7A96XMg1ulYu5diWw8k3EB9+DygwRdOLyKroXqWTl5jt4Hxl2s2eQABjuIU5SzmXrv2g8mqLxjHa++VYUPZjRR5DglKQrWFLzcdiuA2tK91Q/OFS8UIghYYhDIBirzL8MsCqyv2OIWi51RAee1O1fplXE8UPmFiWhWrIyTmjM=; SPC_T_IV=dEUxNHRGVmhCTmNISkx4Tw==; SPC_RNBV=6039001; shopee_rn_bundle_version=6039001; language=en; language=en; shopee_rn_version=1734688365; SPC_SI=/jxhZwAAAABPMm5JTDExMuRcNQAAAAAAMVVMWEN4SXY=; _gcl_au=1.1.1157564451.1734922577; _ga=GA1.1.996212100.1734922581; _fbp=fb.2.1734922583807.906828666777832583; SPC_SEC_SI=v1-U0lQeUw1RFRaZVI1M1ZEMnPE1qfJZamJ5rlZoWJfgsLUWRq7yoGqGopTa046jgsbMno5rIYByLdrrIiDJ11j1PrKbmaweCR+EBI1bRqOmDE=; csrftoken=zRd8NnrevEQPR4l6GT6icpnunDZMfFFd; SPC_DH=EL9XCHTVSjl3dO3dGNrD+wqhL5Ujg2vyEvgh7wfBpLmZWKGTuJ8DAb7OGSUfWLxoh6iMhfvqHbAI; SPC_B_SI=mTFpZwAAAABlZ2VqbnFLcu2SHwAAAAAAM0hqcEtIRHY=; SPC_ST=.OFhaUE41czZpZWhpYkpSQkvxLptruT9XgiqP0HDvHVw/OWv7vs+qAYlh8dDCv0PGl7kKYFNfxrNc4jQBEQXgaaWz+73TNS4+Mb5t2sLa/yRtdAkyGerds66F+RLZQk+d4akPpvEqK3B5AV8g+xjaQ8qiux9pbvm/KTcGTcg+lGQS/K2895+Ji2jEG1CVk5cC5sLIsiwmUDfnd8h49NG6+5dNrNDPpfOveLCW3Fe0Mw/J0VptgH2f9CqvfBT0XiYs; SPC_EC=.OFhaUE41czZpZWhpYkpSQkvxLptruT9XgiqP0HDvHVw/OWv7vs+qAYlh8dDCv0PGl7kKYFNfxrNc4jQBEQXgaaWz+73TNS4+Mb5t2sLa/yRtdAkyGerds66F+RLZQk+d4akPpvEqK3B5AV8g+xjaQ8qiux9pbvm/KTcGTcg+lGQS/K2895+Ji2jEG1CVk5cC5sLIsiwmUDfnd8h49NG6+5dNrNDPpfOveLCW3Fe0Mw/J0VptgH2f9CqvfBT0XiYs; csrftoken=VN1Y7f5G1Uli1XhnGmZZABx8wcLySWIe; UA=Mozilla%2F5.0%20%28Linux%3B%20Android%2012%3B%20MI%206X%20Build%2FSQ1D.211205.016.A1%3B%20wv%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Version%2F4.0%20Chrome%2F131.0.6778.135%20Mobile%20Safari%2F537.36%20Shopee%20Beeshop%20locale%2Fen%20version%3D33835%20appver%3D33835%20rnver%3D1734688365%20app_type%3D1%20platform%3Dweb_android%20os_ver%3D31; AC_CERT_D=U2FsdGVkX1+sIY/+KPEUtaYpWc7VR/NHYFrS+/4TFuN6IeJPvQ/CO3pncRl8OxseigIzojlafZc3nIjRahcpZ3S6C9bYNJS9jnO/c1VbmMwCLvSdCJINouczlCotsUMndNEl6udq3/Pq4s4wVkUStx7+oV6OHKURfZsk3Ng2AhFEF+5r/I9N3UKk8Dti46Vj+dwXR3ajHgpUHG0PrvugxDhmRuSvnxFnrFjnPxoc0CggMh8I/ylPYFQV+eSkndUKEzs1QkdR4/qhpZeklRvYyZYczmc6tHtXJGMa/V6NANPJtqMTMllsqzNLC+xpYkY0rowGDeKAUFbxXv7mvfnBW/vtA94HXLDaVW4aBgxfloEpcrXkPckHUrtGVVdrc1SFxquAgOPbs9BzXR5THJQbIiTnPsiE84T8kfpFb0yb50QgEnw6dGmWAd4oEDrwCIaRIQmkeS0CNrzSh9oP61uFnDxhUG1xh058ft8+SwSEBlHAmuNu0nym013feKCjUsnRGcIfHqEyXnk7lHoVBHaQsWRbBAycH+PKsqJ9+1E6DrstY+zhqWs+UJS1vTjXeTHguFW2WOuZRrsP3WHtJTNs50c87W8HwVwEGKZdCGCznmwDOhULMe2cq2tae2yRWyEQYWOIY1DPx0Xc0VovZ4PsKqYBrwyIHfirimPcTAlv0dfjvkQmZ0fUwOPiNa5y8iQL19vubKXhHKlG21spU8Y82OubnfT0x146bX7tPvFtcQAJuVitkQUnL2tOYhJeh2H0HMbc2QPTdNU2PQ7W2mwabV9ef9PLDthUlRaaI8UpjNid+SDIuCs0fwWudD+DnYy4B7t10ciImZBYOVBgy8mBU4gYmbpYrr2rOkj+R+eAcxgAl5sl6ZvS6KHUqsR9GQcSKGC46J46VOSbE+3YGGwcHIbKvkYz7zsCZu3El7OTwN3RJPZyXYSb/EWsBmzN2DiOY82iLhSk6qlLxrgYTpYCdLXL0t5y8uX1OFBfBtEmU8PkE8VJr0IoYqDjL7ZN+cEs/l+9zvlhxl1jOebTfuvUR8j00kfsWy4X2+XJxC2lFGZ9VzBdHy0pQYp4z6axCP05QAvWV8kcKAqGbn8F6sBq7g==; _ga_LB1RXY1EGG=GS1.1.1735095758.3.0.1735095759.59.0.0",
            # "Client-Request-Id": "5a9c34d4-45dd-45a5-833f-a6d585dea54e.236",
            "User-Agent": "Android app Shopee appver=33731 app_type=1 platform=native_android os_ver=31 Cronet/102.0.5005.61",
            # "Af-Ac-Enc-Sz-Token": "Dss2/0+/c42i8gAFlp/vWQ==|r+hUnM6COojHukeyy51+K15ayQI8ctNORfbISS9uCPBVdaxCwPDCGwLTioU7e2PxVA9XFnY++JFBdGROe83W5GfnLYbXv7ogG6Y=|1owBc7shk6ypUIJX|08|1",
            # "Referer": "https://mall.shopee.sg/",
            # "Accept-Encoding": "gzip, deflate, br",
        }
        pass

    @staticmethod
    def get_req_args(req_url):
        resp_json = None
        try:
            post_data = {'req_url': req_url}
            url = 'http://127.0.0.1:9500/get_req_args'
            resp = requests.post(url, json=post_data)
            resp_json = resp.json()
        except Exception as e:
            logger.warning(f'http api 失败 ---> {e}')
            raise Exception(f'http api 失败 ---> {e}')
        return resp_json

    def get_response(self, crawl_url):
        req_args = self.get_req_args(crawl_url)
        headers = {**self.headers, **req_args}
        response = requests.get(crawl_url, headers=headers, verify=False, proxies=self.proxies)
        resp_json = response.json()
        logger.info(f'status_code ---> {response.status_code}')
        error_int = resp_json['error']
        if 0 != error_int:
            raise Exception('cookie 失效')
        print(json.dumps(resp_json, ensure_ascii=False, indent=4))

def main():
    crawl_url_category_tree = "https://mall.shopee.co.th/api/v4/pages/get_category_tree"
    crawl_url_product_list = "https://mall.shopee.co.th/api/v4/recommend/recommend?bundle=category_landing_page&cat_level=2&catid=11045117&limit=20&offset=0"
    timestamp13 = int(datetime.now().timestamp() * 1000)
    crawl_url_product_detail = f"https://mall.shopee.co.th/api/v4/pdp/get?_pft=255&apm_fs=true&apm_p=7&apm_pid=shopee%2F%40shopee-rn%2Fproduct-page%2FPRODUCT_PAGE&apm_ts={timestamp13}&item_id=23454437584&pdp_type=0&shop_id=989284521&tz_offset_minutes=480"

    xp_spider = SpiderDemo()
    # 分类
    xp_spider.get_response(crawl_url_category_tree)
    # 分类中的产品列表
    xp_spider.get_response(crawl_url_product_list)
    # 产品详情
    xp_spider.get_response(crawl_url_product_detail)


if __name__ == '__main__':
    main()
    pass

rpc 服务 运行截图:

获取 shopee 结果截图:

后续如果大规模抓取,就需要大量账号,和国外的代理 ip

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

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

相关文章

[实战]推流服务SRS安装

业务场景 在Web浏览器端展示摄像头的视频数据。 协议 物联代理推流协议:rtmp 浏览器器拉流协议:http-flv 推流方案 1、Nginx加nginx-http-flv-modules模块 2、采用SRS服务器 推流服务SRS网站:https://ossrs.io/lts/zh-cn/ 推流服务…

kafka的备份策略:从备份到恢复

文章目录 一、全量备份二、增量备份三、全量恢复四、增量恢复 前言:Kafka的备份的单元是partition,也就是每个partition都都会有leader partiton和follow partiton。其中leader partition是用来进行和producer进行写交互,follow从leader副本进…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机, vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式;nat模式;host模式 一、桥接模式 所谓桥接模式,也就是虚拟机与宿主机处于同一个网段, 宿主机…

视频会议是如何实现屏幕标注功能的?

现在主流的视频会议软件都有屏幕标注功能,屏幕标注功能给屏幕分享者讲解分享内容时提供了极大的方便。那我们以傲瑞视频会议(OrayMeeting)为例,来讲解屏幕标注是如何实现的。 傲瑞会议的PC端(Windows、信创Linux、银河…

任务8 数据库服务配置与管理

数据库服务概述 数据库管理系统 用于建立、修改、访问和维护数据库。 具有多用户和多任务的特性,支持多个用户和应用程序同时进行操作。 数据库管理员通过DBMS对数据库进行统一的管理和控制。 维护数据的安全性和完整性。 按照数据在数据库中的存储和管理方式…

汇通达:下沉市场零售业态进入产业互联网2.0时代

纵观2024年,面对全球经济增长放缓、人口红利减弱的挑战,消费品牌“向下”拓展,下沉至低线级城市乃至村镇地区的趋势愈发明显。 这是因为在三四线城市以及农村市场,消费需求增速较快。CIC灼识咨询在《2024中国下沉市场蓝皮书》中提…

直流无刷电机驱动与控制4-stm32定时器-六步换相输出

第F4_专题07 直流无刷电机驱动与控制(第4节)_STM32定时器基础_哔哩哔哩_bilibili STM32定时器霍尔传感器模式 1、输出比较 2、左侧通入霍尔传感器信号:经过异或门,输出0 1 0 1 0 1等信号。 3、通道输入信号时,每个电平跳变,翻转,都输出一个脉冲。所以TI1F_ED输入如下所示…

【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

Rofin罗芬激光PowerLine L300 PL400 Manual 软件

Rofin罗芬激光PowerLine L300 PL400 Manual 软件

WPF系列五:图形控件Ellipse

简介 使用 Ellipse 控件绘制椭圆形和圆形。 若要绘制椭圆形,请创建 Ellipse 元素,并指定其 Width 和 Height。 使用其 Fill 属性指定用于绘制椭圆形内部的颜色。 使用其 Stroke 属性指定用于绘制椭圆形轮廓的颜色。 StrokeThickness 属性指定椭圆形轮廓…

【hackmyvm】Adroit靶机wp

tags: HMVjava反编译SQL注入 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. java反编译4. sql注入5. 解密密码6. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmAdroit 作者 alienum 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 ┌──(root㉿kali)-[~] └…

map和weakMap的区别

Map 和 WeakMap 都是 JavaScript 中用于存储键值对的数据结构,但它们在设计目的、行为和使用场景上有一些重要的区别。 以下是 Map 和 WeakMap 之间的主要差异: 1. 键的类型 Map:可以使用任何类型的值作为键,包括原始类型&#x…

【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p38654 在当今时代背景下,社会发展日新月异,人们的生活方式与消费观念正经历深刻变革。MoonFox 月狐数据的《2024 年悦己生活消费洞察报告》聚焦于这一充满活力与变化的消费领域。随着就业、婚姻等社会压力的…

OpenCV-Python实战(5)——图形绘制基础

一、直线 cv2.line(img*,pt1*,pt2*,color*,thickness*,lineTypeLINE_8) img:绘图的背景(画布)。 pt1、pt2:始/终点坐标,格式为元组()。 color:直线颜色,BGR格式。 t…

[原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…

vue3----思维导图

介绍:这是一个前端思维导图展示的插件,以及下载svg功能,内部用的scss,不一样的需要改一下,整体也没写太复杂。 效果: 依赖: {"markmap-common": "^0.14.2","markmap…

.NET 8.0 项目升级到 .NET 9.0

本文项目从.NETCore3.1开始一直延续到目前,如果您没有升级过,请参考以下文章: .Net Core 2.2 升级到 .Net Core 3.1:https://blog.csdn.net/hefeng_aspnet/article/details/131259537 NetCore3.1或Net6.0项目升级到Net7.0&#x…

第23天:信息收集-APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围

#知识点 1、信息收集-APP应用-公开信息-知识产权&开发者定位 2、信息收集-APP应用-资产信息-抓包&静态提取&动态调试 一、APP渗透测试的范围->应涵盖APP所有功能和组件,包括但不限于以下几个方面: 1、前端安全:包括界面交互、…

Virtualbox安装ubuntu20虚拟机无法打开终端

用Virtualbox安装ubuntu20系统,安装好之后,无法打开终端; 原因:语言设置导致的问题; 修改方法:将/etc/default/locale里LANG这行的值修改为:en_US.UTF-8即可; 步骤:先在…

PH热榜 | 2024-12-25

1. Assistive24 标语:为残障人士提供的免费辅助技术 介绍:Assistive24 是一款免费的 Chrome 浏览器扩展程序,可以帮助患有注意力缺陷多动障碍 (ADHD)、阅读障碍 (dyslexia) 和低视力等障碍的用户更方便地浏览网页。它提供语音导航、自定义…