Pyrogram:电报 API 在 search_messages() 请求后返回 400:INPUT_FILTER_INVALID

问题描述 投票:0回答:1

所以我正在尝试收集有关聊天中语音笔记的统计数据,例如计数和平均长度; 我曾经用电视马拉松做过:

await client.get_messages(entity=chat, from_user=my_id, filter=telethon.types.InputMessagesFilterVoice)

但现在我决定将其移植到热解图中,重写基本逻辑并根据请求:

async for vc in __usr__.search_messages(message.chat.id, filter=pyrogram.enums.MessagesFilter.VOICE_NOTE, from_user=message.chat.id): ...
我收到以下错误:

(2024-03-29 20:05:30,835) [ERROR] Telegram says: [400 INPUT_FILTER_INVALID] - The filter is invalid for this query (caused by "messages.Search")
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/dispatcher.py", line 240, in handler_worker
    await handler.callback(self.client, *args)
  File "/root/python/userbot/userbot/voice_stat.py", line 51, in __handle_outgoing_message__
    await __voice_info__(message)
  File "/root/python/userbot/userbot/voice_stat.py", line 64, in __voice_info__
    async for vc in __usr__.search_messages(message.chat.id,
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/methods/messages/search_messages.py", line 130, in search_messages
    messages = await get_chunk(
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/methods/messages/search_messages.py", line 35, in get_chunk
    r = await client.invoke(
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/methods/advanced/invoke.py", line 79, in invoke
    r = await self.session.invoke(
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/session/session.py", line 389, in invoke
    return await self.send(query, timeout=timeout)
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/session/session.py", line 357, in send
    RPCError.raise_it(result, type(data))
  File "/usr/local/lib/python3.10/dist-packages/pyrogram/errors/rpc_error.py", line 91, in raise_it
    raise getattr(
pyrogram.errors.exceptions.bad_request_400.InputFilterInvalid: Telegram says: [400 INPUT_FILTER_INVALID] - The filter is invalid for this query (caused by "messages.Search")

这是我的代码片段:

async def __voice_info__(message: pyrogram.types.Message):
    if not message.chat or not message.from_user:
        return

    ...

    async for vc in __usr__.search_messages(message.chat.id,
                                            filter=pyrogram.enums.MessagesFilter.VOICE_NOTE,
                                            from_user=message.chat.id):
        ...

    ...

    async for vc in __usr__.search_messages(message.chat.id,
                                            filter=pyrogram.enums.MessagesFilter.VOICE_NOTE,
                                            from_user=message.from_user.id):
        ...

    answer = "..."
    await message.reply(answer)

我搜索了整个网络,但没有发现任何关于为什么 voice_note 是无效过滤器的信息。

__usr__
确实是用户而不是机器人

python bots telegram telegram-bot pyrogram
1个回答
0
投票

所以我发现,如果您使用 filter 关键字参数(即传递 EMPTY 以外的 MessageFilter )以及 from_user 关键字参数,Telegram 将回复 [400 INPUT_FILTER_INVALID] - 过滤器对此无效查询。

所以我的解决方案是结合这些功能并检查每条消息的发件人,如下所示:

async for vc in __usr__.search_messages(message.chat.id, filter=pyrogram.enums.MessageFilter.VOICE_NOTE):
    # Assuming vc.chat.type == pyrogram.enums.ChatType.PRIVATE
    if vc.from_user == message.chat.id:
        ...
    else:
        ...
© www.soinside.com 2019 - 2024. All rights reserved.