You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Facebook Messenger聊天:UTF-8编码响应无法解码问题

解决Messenger聊天记录爬取中响应解码失败的问题

嘿,我之前也碰到过一模一样的糟心事——请求明明返回200,res.encoding也显示是UTF-8,但就是死活解不开响应内容,盯着一堆乱码头都大了!咱们一步步来排查和解决这个问题:

可能的原因及对应解决方案

1. 响应内容被压缩了(gzip/deflate格式)

很多网站会自动压缩响应内容,哪怕你没在请求头里指定,requests有时候也可能没自动处理好(尤其是请求头里没带Accept-Encoding的时候)。

  • 排查方法:打印响应头看看有没有Content-Encoding: gzip或Content-Encoding: deflate字段。
  • 解决代码:
    import gzip
    from io import BytesIO
    
    def download_thread(self, limit, offset, thread_id):
        # 你的请求逻辑...
        res = requests.post(url, headers=headers, data=data)
        
        # 处理gzip压缩内容
        if 'Content-Encoding' in res.headers and res.headers['Content-Encoding'] == 'gzip':
            content = gzip.decompress(res.content)
        else:
            content = res.content
        
        # 再尝试解码
        try:
            text = content.decode('utf-8')
            print(text[:500]) # 先看前500字符确认
        except UnicodeDecodeError:
            # 走其他解码逻辑
            pass
    

2. 响应是二进制格式(比如Protocol Buffers)

Messenger的私有API大概率不会返回纯文本/JSON,而是用Protocol Buffers(protobuf)这种二进制序列化格式传输内容——你直接用UTF-8解码二进制数据,肯定会乱码。

  • 排查方法:打开Chrome开发者工具的「响应」标签,看是不是标注了Binary,或者内容开头有protobuf的特征字节(比如\x08、\x12这类)。
  • 解决思路:
    • 找Messenger API对应的protobuf定义文件(网上能搜到一些开源的),用protobuf库解析二进制内容;
    • 检查请求体里的参数,有没有类似format=json的选项(部分私有API支持切换返回格式)。

3. res.encoding检测不准

requests自动检测的编码有时候会出错,服务器返回的Content-Type头里的编码可能和实际内容不符。

  • 解决方法:用第三方库检测真实编码:
    import chardet
    
    content = res.content
    encoding_result = chardet.detect(content)
    # 用检测到的编码解码
    try:
        text = content.decode(encoding_result['encoding'])
    except UnicodeDecodeError:
        # 兜底用ISO-8859-1解码(至少能拿到可转码的内容)
        text = content.decode('ISO-8859-1')
    

4. 看似200,实际是无效响应

有时候服务器返回200,但内容其实是登录页面、错误提示页(比如会话过期、认证失效),这类HTML内容可能包含非UTF-8编码的字符,或者你没拿到真正的聊天数据。

  • 排查方法:直接打印res.content的前100个字节,看看是不是HTML标签(比如<html>、<head>),如果是,说明你的请求头里的Cookie、Authorization等认证参数过期或不正确了。
  • 解决思路:重新从Chrome开发者工具复制最新的Cookie和认证头,确保请求和浏览器的会话状态一致。

调试小技巧

每次请求后先做这几步:

  1. 打印res.headers,重点看Content-Type、Content-Encoding字段;
  2. 打印res.content[:100],直观判断是压缩内容、二进制还是HTML;
  3. 先不解码,用base64.b64encode(res.content)把内容转成base64,对比浏览器里的响应内容是否一致,确认请求没发错。

另外提醒一句:Messenger的私有API违反Facebook的服务条款,爬取聊天记录可能有账号风险,谨慎操作哦!

内容的提问来源于stack exchange,提问作者Taako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:38:54