被我的 Telegram 机器人禁止的用户不会继续被禁止吗?

Users banned by my Telegram bot do not stay banned?

TL;DR:“Attempts”中列出的方法没有正常工作。每当我 运行 那些 Python 方法时,它们最终只会踢用户(或者可能最多禁止他们 2-3 分钟),无论我是否包含 until_date。所有组权限均已启用,并且在 BotFather 中组隐私模式和“允许组?”被禁用。


我是 Stack Overflow 的新手,所以我不确定我的问题的格式是否正确,以及是否需要冗长的描述。

上下文:我有一个(私人)电报群,有 700 多位用户。还有另外两个管理员和五个机器人(Rose, Group Help, Combot 和我编码的两个)。在过去的几周里,我一直面临通过我自己的机器人禁止用户的问题,而 Rose 和 Group Help 机器人似乎能够。

问题:我的机器人限制了组的条目数量(每个用户)以避免人们潜伏,或者在我分享邀请时只是突袭组link. Group help bot 和 Rose 会把没有解决验证码的人赶出去,并在进入后的前 5 分钟内出现。我保留 Combot 以避免让已知的垃圾邮件发送者进入我的组。我面临的问题是,每当我自己的机器人发出禁令时,用户就会被踢出局。我尝试了多种方法来禁止我的 Python 脚本中的用户,但没有任何效果。我尝试从 python-telegram-bot 切换到 AIOgram,但它仍然不起作用。我不确定这是由机器人之间的冲突(这没有多大意义)、错误的方法还是 group/account-related 问题引起的。我在“测试组”中试用了我的机器人,它运行良好。

群日志频道异常示例截图:Since I can't embed pictures yet, here is the imgur link.

部分使用AIOgram的当前(伪)代码:

@dp.message_handler(content_types=["new_chat_members"])
async def newUser(message: types.Message):
    for user in message.new_chat_members:
        con = psycopg2.connect(...)
        #[...SQL query fetching number of entries of a user...]

        if "DB is empty":
            #..Initialize..

        else:
            cur.execute(sql_script) #cur is the cursor
            #Returns a list with at most one tuple, where the first instance is the number of entries
            entries_list = cur.fetchall()

            if len(entries_list) == 0 or None:
                #Adds user to a table in Heroku DB and initializes entry = 1
                insertUser(tablename, userid, 1)
                await bot.send_message(channel_id, log_message)
                con.close()
            
            elif entries_list[0][0] < 2:
                updateUserEntries(tablename, entries_list[0][0] + 1, userid)
                await bot.send_message(channel_id, log_message)
                con.close()

            else: #Ban on third entry
                await chat.kick(userid, until_date = datetime.now() + timedelta(hours = 6))
                await bot.send_message(chat.id, ban_message)
                await bot.send_message(channel_id, log_message)
                #Removes user from the table (i.e. resets the entry count)
                removeUser(tablename, userid)
                con.close()

尝试:我尝试使用的禁止用户的方法是:

本来只是想暂时封禁用户,所以应该多一个until_date参数。但我也尝试过永久禁止它们,根据 documentation 任何少于 30 秒或超过 366 天的时间都算作永久禁止。没有任何效果。 (顺便说一下,该脚本总体上有效并且 运行 很棒。我没有分享完整的脚本,因为我不喜欢 table 它是 public,而且问题也确实存在无论如何都不属于整个脚本。)

更多详细信息:除了添加管理员和“保持匿名”之外,我的机器人启用了所有组权限。在 BotFather 中,它同时具有组隐私模式和“允许组?”禁用(因为我只将它用于我的组)。目前,我为机器人使用的库(在 Python 中)是 AIOgram. Previously, it was all written using python-telegram-bot. I am using it in conjunction with psycopg2,用于将用户数据存储在 Heroku 的数据库中。有一次我什至尝试在我的数据库中创建一个“ban table”,但它仍然无法将用户拒之门外,因为该禁令实际上并没有禁止人们。该禁令实际上只是起到了“踢球”的作用。

我正在考虑设置一个 webhook,但我对 Flask 或 Django 以及一般的 webhook 不熟悉。所以这可能需要我一些时间。但是,我不确定它是否会有所不同,因为它应该不会有太大差异,除了速度和内存方面。

我不确定我做错了什么。我尝试尽我所能解决问题(考虑到我对 Telegram API 和 Telegram python 库非常陌生,尤其是 AIOgram)。

如果有人对我如何解决这个问题有任何想法,我将不胜感激!

(旁注:我在一个多星期前联系了 Telegram 支持,但我没有收到任何回复。)

我不太清楚这里出了什么问题,但我有一些 hints/remarks:

  • 您使用哪个库来发出 api 请求应该是无关紧要的。如果愿意,您甚至可以通过 browser/curl/whatever 手动提出请求
  • webhooks 与此无关 - 您获取更新的方式与向 api
  • 发出请求无关
  • python-telegram-bot 将 timezone-naive 日期时间解释为 UTC - 这可能会影响您传递 until_date
  • 的方式

免责声明:我目前是 python-telegram-bot 的维护者。

谢谢@CallMeStag 的评论!正如我在下面描述的那样,我最终“解决”了这个问题。虽然,我仍然不确定为什么会这样,但是使用我在问题中列出的任何方法都没有用。


免责声明:这不是解决问题的有效方法,我不保证它会起作用。我也没有很高的人加入组,所以这些解决方案可能不适合你。

部分(非)解决方案:我认为我的机器人和 Telegram 之间存在“幻影问题”。不管我是否包含 until_date,Telegram(或 Python,我不确定)都无法将“踢”方法理解为“禁止”。 (此外,Telegram 支持 non-existent)。所以,我想到了三种(或四种)替代方法来禁止某人而不必真正禁止他们:

  • 解决方案 1:在您的数据库中创建一个 table,其中将包含您最终将禁止的所有用户。对于您的“禁止”功能,包括一个消息处理程序来侦听新的聊天成员。每当有新用户加入(使用 new_chat_members 来捕获事件)时,通过您创建的 table 中的所有条目使其成为 运行(例如,您可以使用 SELECT COUNT(*) FROM {BANTABLENAME} WHERE USERID = {USERID})所以它会告诉您该用户是否被禁止。如果查询 returns 一个大于 0 的值,你可以只做一个 IF 语句并将用户踢出。 (您显然可以通过手动添加 until_date 使其变得更复杂一些)。缺点是它可能无法将用户拒之门外,因为当您 运行 SQL 查询时会有一点 latency/delay。
  • 解决方案 2:此解决方案仍然需要您在数据库中创建 table 个被禁止的用户。但不是让人们直接加入您的群组,而是先将他们引导至您的机器人聊天。为“/start”添加命令处理程序。每当用户启动机器人时,通过 table 条目使其成为 运行 并根据结果,机器人将回复组 link 或一条消息通知他们他们可以' t 加入(或什么都不加入)。
  • 解决方案 3:设置 webhook。我还不知道怎么做,所以你应该在网上查一下。这将要求您至少学习 Flask 或 Django。与其他解决方案相比,这绝对是一个更好的解决方案。通常,这个“禁止问题”与您是否使用 webhook 无关(如 所说)。但与我的下一个建议(不知何故有效)相比,这绝对是一个更好的做法。
  • 解决方案 4 (已验证):我很好奇,想要一个更直接的解决方案,所以我决定手动尝试 making requests through www.api.telegram.org/bot<TOKEN>/METHOD?PARAMETERS using GET and POST HTTPS methods in Python. This is definitely not an ideal solution if you have a high traffic of users. Because you might get errors due to too many requests. Also, depending on what you're trying to do, it might be too slow. So definitely use webhooks instead. In my case, I only need to POST the ban using the banChatMember method,这种情况发生的频率也很低。所以我应该不会遇到问题。 (如果有我会更新)。

进一步疑惑:我不确定为什么方案4有效,但是用python-telegram-botAIOgram直接禁止无效。我没试过Telethon or Pyrogram。它们应该相似,但它们还允许您 log-in 作为用户(即它将通过机器人启动您的帐户会话),这可能会起作用。

更新:没用。被禁止的用户仍然不会被禁止。它仅在我出于某种原因手动执行时才有效。整件事真的没有任何意义。轮询的时候好像不行,手动发www.api.telegram.org/bot<token>/banChatMember?chat_id=<chatid>&user_id=<userid>.

就可以了