使用Python instagrapi库发送私信时遇类型错误问题求助
问题详情
使用instagrapi 2.0.3调用direct_media_share分享帖子私信给用户时,实际私信已发送成功,但程序直接报错终止。错误日志包含两个问题:
- 多次触发
Status 201: JSONDecodeError in public_request,请求目标用户主页接口失败 - 最终抛出
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
相关产品推荐
相关产品推荐

