Discord API异常:获取全量频道消息而非指定时间范围消息
问题:Discord API返回频道全部消息而非指定时间范围的消息
你遇到的问题出在两个核心点:
1. 查询字符串格式错误
你的代码初始将query_string设为'?',之后直接追加&after={after},最终生成的URL会是...messages?&after=xxx这种无效格式。Discord API会忽略这种错误的参数前缀,导致after参数完全不生效,自然返回了频道创建以来的所有消息。
2. 时间戳格式不符合API要求
Discord API的after参数需要RFC3339格式的时间字符串(例如2024-05-20T12:00:00Z),而非你当前传入的UNIX时间戳。API无法解析UNIX时间戳,这也是时间过滤失效的原因之一。
修正后的代码
import requests import json import datetime def retrieve_messages(channelid, after=None, before=None): headers = { 'authorization': "<TOKEN>" } # 用字典管理参数,交给requests自动处理拼接 params = {} if after: params['after'] = after if before: params['before'] = before r = requests.get( f'https://discord.com/api/v9/channels/{channelid}/messages', headers=headers, params=params ) jsonn = json.loads(r.text) for value in jsonn: print(value['content'], '\n') # 生成符合API要求的UTC时间字符串 two_days_ago = datetime.datetime.utcnow() - datetime.timedelta(days=2) after_timestamp = two_days_ago.isoformat() + 'Z' retrieve_messages("<CHANNEL_ID>", after=after_timestamp)
补充说明
- 使用
requests.get的params参数可以自动处理查询字符串的格式,避免手动拼接时的低级错误。 - Discord API单次请求最多返回100条消息,如果目标时间范围内的消息超过100条,需要通过分页实现:用最后一条消息的ID作为
before参数循环发起请求,直到返回结果为空。
内容的提问来源于stack exchange,提问作者Trippy Dippy
相关产品推荐
相关产品推荐

