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

使用Python instagrapi库发送私信时遇类型错误问题求助

解决instagrapi 2.0.3中direct_media_share发送成功后程序报错终止的问题

问题详情

使用instagrapi 2.0.3调用direct_media_share分享帖子私信给用户时,实际私信已发送成功,但程序直接报错终止。错误日志包含两个问题:

  1. 多次触发Status 201: JSONDecodeError in public_request,请求目标用户主页接口失败
  2. 最终抛出TypeError: unsupported operand type(s) for //: 'str' and 'int',错误来自extractors.py中对timestamp字段的处理

原代码

from instagrapi import Client

cl = Client()
cl.login(USERNAME, PASSWORD)    

pk_send = cl.media_pk_from_url("https://www.instagram.com/p/C2t3L9qoSAT/?utm_source=ig_web_copy_link&igsh=MzRlODBiNWFlZA==")
post_send = cl.media_id(pk_send)

user_id = cl.user_id_from_username('alirezaevilx')

cl.direct_media_share(post_send, [user_id])

错误日志

Status 201: JSONDecodeError in public_request (url=https://www.instagram.com/alirezaevilx/?__a=1&__d=dis) >>> 
Status 201: JSONDecodeError in public_request (url=https://www.instagram.com/alirezaevilx/?__a=1&__d=dis) >>> 
Status 201: JSONDecodeError in public_request (url=https://www.instagram.com/alirezaevilx/?__a=1&__d=dis) >>> 
Traceback (most recent call last):
  File "C:\Python\IGbot\main.py", line 23, in <module>
    cl.direct_media_share(post_send, [user_id])
  File "C:\Python\IGbot\venv\Lib\site-packages\instagrapi\mixins\direct.py", line 884, in direct_media_share
    return extract_direct_message(result["payload"])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\IGbot\venv\Lib\site-packages\instagrapi\extractors.py", line 335, in extract_direct_message
    data['timestamp'] = datetime.datetime.fromtimestamp(data['timestamp'] // 1_000_000)
                                                        ~~~~~~~~~~~~~~~~~~^^~~~~~~~~~~
TypeError: unsupported operand type(s) for //: 'str' and 'int'

解决方案

1. 修复timestamp类型转换错误

错误核心是Instagram返回的timestamp是字符串类型,但instagrapi 2.0.3的解析函数直接用字符串做整除运算。用猴子补丁替换原解析函数,添加类型转换逻辑:

from instagrapi import Client
import datetime

# 定义修复后的消息解析函数
def fixed_extract_direct_message(data):
    from instagrapi.extractors import extract_user_short, extract_media, extract_link, extract_reel_share, extract_reaction
    
    message = {
        "id": data["item_id"],
        "thread_id": data["thread_id"],
        "text": data.get("text", ""),
        "type": data["item_type"],
        "timestamp": data["timestamp"],
        "user_id": data["user_id"],
        "user": extract_user_short(data["user"]),
        "reactions": []
    }
    
    # 修复timestamp:先转为整数再处理
    if isinstance(message["timestamp"], str):
        message["timestamp"] = datetime.datetime.fromtimestamp(int(message["timestamp"]) // 1_000_000)
    else:
        message["timestamp"] = datetime.datetime.fromtimestamp(message["timestamp"] // 1_000_000)
    
    # 保留原函数的其他解析逻辑
    if "media_share" in data:
        message["media"] = extract_media(data["media_share"])
    if "link" in data:
        message["link"] = extract_link(data["link"])
    if "reel_share" in data:
        message["reel_share"] = extract_reel_share(data["reel_share"])
    if "reactions" in data:
        message["reactions"] = [extract_reaction(r) for r in data["reactions"]]
    
    return message

# 替换instagrapi中的原解析函数
from instagrapi import extractors
extractors.extract_direct_message = fixed_extract_direct_message

# 你的业务代码
USERNAME = "你的用户名"
PASSWORD = "你的密码"

cl = Client()
cl.login(USERNAME, PASSWORD)    

pk_send = cl.media_pk_from_url("https://www.instagram.com/p/C2t3L9qoSAT/?utm_source=ig_web_copy_link&igsh=MzRlODBiNWFlZA==")
post_send = cl.media_id(pk_send)

user_id = cl.user_id_from_username('alirezaevilx')

cl.direct_media_share(post_send, [user_id])

2. 解决JSONDecodeError(可选优化)

JSONDecodeError是因为user_id_from_username方法依赖的公开主页接口格式变更,爬取失败。可以手动获取目标用户的user_id,跳过该方法调用:

# 替换原user_id获取代码,1234567890替换为alirezaevilx的实际user_id
user_id = 1234567890

补充说明

  • 猴子补丁是临时修复方案,建议关注instagrapi的版本更新,后续官方版本可能会修复这个类型转换问题
  • 私信发送成功却报错,是因为API调用已完成,但返回结果解析失败导致程序终止,修复解析逻辑后程序即可正常执行完毕

内容的提问来源于stack exchange,提问作者alireza.haraji.dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:32:05