Python中如何抓包APP并提取图片内容,但无法获取文字信息?

最近在抓包一个 APP:淘最热点
一款新闻 APP
抓不到新闻列表内容
只抓到了新闻图片

其他同类型的 APP 也抓过
没出现这种问题

用的 charles 抓的,证书设置没问题
不知道是不是这个 APP 的新闻列表走了其他协议

有大佬帮忙抓下看看嘛
Python中如何抓包APP并提取图片内容,但无法获取文字信息?

45 回复

抓了下包,都有的,https://api.news.taozuiredian.com 开头的


我遇到过类似问题,抓包拿到图片数据但文字信息缺失。通常是因为文字内容通过其他接口传输或使用了不同的数据格式。

核心思路是:先抓取完整的网络请求,然后分析数据流向。这里提供一个使用 mitmproxy 的完整方案:

# app_capture.py
import mitmproxy.http
from mitmproxy import ctx
import json
import re
from pathlib import Path

class AppCapture:
    def __init__(self):
        self.image_data = []
        self.text_data = []
        self.output_dir = Path("./captured_data")
        self.output_dir.mkdir(exist_ok=True)
    
    def response(self, flow: mitmproxy.http.HTTPFlow):
        # 检查是否为图片响应
        content_type = flow.response.headers.get("Content-Type", "").lower()
        
        if "image" in content_type:
            # 保存图片数据
            img_filename = f"image_{len(self.image_data)}.bin"
            img_path = self.output_dir / img_filename
            
            with open(img_path, "wb") as f:
                f.write(flow.response.content)
            
            self.image_data.append({
                "url": flow.request.url,
                "filename": img_filename,
                "headers": dict(flow.response.headers)
            })
            ctx.log.info(f"捕获图片: {flow.request.url}")
        
        # 检查可能的文字数据(JSON、文本等)
        elif any(x in content_type for x in ["json", "text", "javascript"]):
            try:
                # 尝试解析为JSON
                if "json" in content_type:
                    text_content = flow.response.text
                    data = json.loads(text_content)
                    
                    # 提取所有字符串字段
                    text_items = self.extract_text_from_json(data)
                    if text_items:
                        self.text_data.extend(text_items)
                        ctx.log.info(f"从JSON提取 {len(text_items)} 条文字")
                
                # 纯文本响应
                elif "text" in content_type:
                    text_content = flow.response.text
                    if len(text_content.strip()) > 0:
                        self.text_data.append({
                            "url": flow.request.url,
                            "content": text_content[:200]  # 截取前200字符
                        })
            
            except (json.JSONDecodeError, UnicodeDecodeError):
                # 非JSON或编码问题,尝试其他解析
                pass
        
        # 保存元数据
        self.save_metadata()
    
    def extract_text_from_json(self, data):
        """递归提取JSON中的所有字符串"""
        text_items = []
        
        if isinstance(data, dict):
            for key, value in data.items():
                if isinstance(value, str) and len(value.strip()) > 0:
                    text_items.append({
                        "field": key,
                        "value": value
                    })
                elif isinstance(value, (dict, list)):
                    text_items.extend(self.extract_text_from_json(value))
        
        elif isinstance(data, list):
            for item in data:
                if isinstance(item, str) and len(item.strip()) > 0:
                    text_items.append({
                        "field": "list_item",
                        "value": item
                    })
                elif isinstance(item, (dict, list)):
                    text_items.extend(self.extract_text_from_json(item))
        
        return text_items
    
    def save_metadata(self):
        """保存捕获的数据信息"""
        metadata = {
            "images": self.image_data,
            "texts": self.text_data
        }
        
        with open(self.output_dir / "metadata.json", "w", encoding="utf-8") as f:
            json.dump(metadata, f, ensure_ascii=False, indent=2)

# 运行命令:mitmdump -s app_capture.py

使用步骤:

  1. 安装依赖:pip install mitmproxy
  2. 保存上面的代码为 app_capture.py
  3. 启动代理:mitmdump -s app_capture.py
  4. 在手机上配置代理(IP为电脑IP,端口默认8080)
  5. 安装mitmproxy证书到手机
  6. 操作APP,所有请求都会被捕获

关键点:

  • 图片通过Content-Type: image/*识别并保存为二进制文件
  • 文字信息通常藏在JSON响应或文本响应中,需要递归提取
  • 有些APP可能使用protobuf、msgpack等序列化格式,需要额外解析
  • 文字和图片可能分开请求,注意关联URL路径

如果还是找不到文字,可能是加密传输或使用WebSocket,需要进一步分析。

建议:同时监控所有数据格式,别只盯着图片接口。

用的什么软件抓的,我刚刚又抓了下,没有你所说的 https://api.news.taozuiredian.com 开头的,其他的 https 倒是有

我用的就是 charles,抓的是 iOS app

我这边抓的安卓的,不知是否是这个区别

试了下,确实是。提供个思路,可以找个老的 apk 版本抓包是可以抓到的

可能是走 TCP 或者 UDP 的, 也可能是设置了不走代理的, 也可能是 Charles 的问题, 试试 fiddler?

这个思路倒是没想过

fiddler 也试过了,也没抓到,所以猜测是不是走了别的协议,设置了不走代理这个有办法破解吗,我看华为应用市场开了代理好像就进不去




可以抓到呀,和正常的没区别

这是什么 App 呀

thor http 抓包

5 楼也是用的苹果抓的,但他尝试用安卓抓也没抓到,我手头上没有苹果机,尴尬

抱拳了,老铁!!!又长见识了

对了,请问 V2EX 怎么发图片来着。。。

印象中 Packet Capture 能导出 pcap 文件的,电脑用 Wireshark 打开。

厉害了

某些第三方 http 库用一般的 http 代理抓包工具是抓不到的,感觉像是识别成了 tcp 包一样。所以抓包还是得上 wireshark

直接图片链接就可以了

好的,下载一个研究下

哦哦,那还是得先在被的网站上传个图,再拿过来链接吧

#21 没错 直接使用类似于 微博是个好图床,ipic 这类上传图片拿到连接 很方便

#16 那个导出只能导出单个吧,没找到过一次性导出所有抓到的包的选项

学习一下 Wireshark …这个世界就没有抓不到的包…

Wireshark 抓到的数据太多了,该怎么样过滤呢?

写一篇抓包大麦网 app 的吧,貌似上面的所有方法都不凑效,我也是只能抓取到图片,其他的 json 等文字信息无法抓到: https://www.damai.cn

#26 我这是酷安的 6.9.4 版本,只设置个代理就能直接抓到搜索接口了

直接在路由器上抓包,难道它的流量不过路由器

我再试试 多谢

能抓到演出列表吗?

直接在路由器上抓是怎样一个思路,可否详细说说

#30 emmmm,搜索接口搜出来的不就是演出列表吗。。按 APP 首页的演唱会、话剧歌剧那些分类查的接口也可以抓到的

标记一下,我一直否塞用 fiddler 抓 好麻烦

楼主解决了吗,同问一下,请问怎么抓一个 app 的流量从中找出 post 的数据呢?

可能对路由器要求比较高,用起来也有点麻烦。
得有一个 openwrt 系统或其它能自己安装软件的路由器,推荐 openwrt 在路由器上安装 tcpdump,ssh 登陆路由器对 wan 口所有流量抓包,

路由器开共享,把抓到的包存到电脑上,用 whireshark 进行分析,当然其它软件也可以。

还有个方法是用笔记本电脑开热点,手机连接这个热点,用抓包工具对笔记本无线网卡抓包。
这两种方法都是在流量的必经之路上抓包,肯定能抓到所需内容,就看能不能分析、解析出来了。

淘宝的 APP 貌似 charles 也是抓不到商品列表等信息,不知道走了啥协议

听起来在‘笔记本电脑开热点’好像更容易实现,路由器这个感觉要变成网工了。。。

#38 走的 HTTPS,用我那篇文章里的通杀方法就可以抓到

帮别人问个外包,有兴趣吗?寻找隐藏接口

也可以抓就是麻烦点
爬虫外包可以找我 qq 3394772548️⃣

亲这是什么软件

#43 Thor

回到顶部