Python Telegram Bot Chat.ban_member () проблемы

Я работаю с Python Telegram Bot https://python-telegram-bot.readthedocs.io/en/stable/telegram.chat.html и пытаюсь создать своего первого бота в телеграмме.

Я использовал пример https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/chatmemberbot.py в качестве шаблона.

Я хочу добавить функцию, согласно которой, если пользователя нет в списке, бот должен выгнать его, но у меня есть некоторые проблемы с реализацией этой функции. Мой код выглядит следующим образом:

#!/usr/bin/env python
# pylint: disable=C0116,W0613
# This program is dedicated to the public domain under the CC0 license.

"""
Simple Bot to handle '(my_)chat_member' updates.
Greets new users & keeps track of which chats the bot is in.
Usage:
Press Ctrl-C on the command line or send a signal to the process to stop the
bot.
"""

import logging
from typing import Tuple, Optional

from telegram import Update, Chat, ChatMember, ParseMode, ChatMemberUpdated
from telegram.ext import (
    Updater,
    CommandHandler,
    CallbackContext,
    ChatMemberHandler,
)

# Enable logging
logging.basicConfig(
    format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)

logger = logging.getLogger(__name__)

def checkUsers(update: Update, context: CallbackContext, chat: Chat) -> None:
    """Greets new users in chats and announces when someone leaves"""

    cause_name = update.chat_member.from_user.mention_html()
    member_name = update.chat_member.new_chat_member.user.mention_html()
    
    member = update.chat_member.new_chat_member.user.username
    userId = update.chat_member.new_chat_member.user.id
    print(userId)
    
    approvedMembers = ["Jack", "shaamsCat"]
    
    if member in approvedMembers :
        update.effective_chat.send_message(
            f"{member_name} was added by {cause_name}. Welcome!",
            parse_mode=ParseMode.HTML,
        )
    elif member not in approvedMembers : 
        update.effective_chat.send_message(
            f"{member_name} is not on the list!",
            parse_mode=ParseMode.HTML,
        ),
                
    chat.ban_member(userId)
       

def main() -> None:
    """Start the bot."""
    # Create the Updater and pass it your bot's token.
    updater = Updater("TOKEN")

    # Get the dispatcher to register handlers
    dispatcher = updater.dispatcher

    # Handle members joining/leaving chats.
    dispatcher.add_handler(ChatMemberHandler(checkUsers, ChatMemberHandler.CHAT_MEMBER))

    # Start the Bot
    # We pass 'allowed_updates' handle *all* updates including `chat_member` updates
    # To reset this, simply pass `allowed_updates=[]`
    updater.start_polling(allowed_updates=Update.ALL_TYPES)

    # Run the bot until you press Ctrl-C or the process receives SIGINT,
    # SIGTERM or SIGABRT. This should be used most of the time, since
    # start_polling() is non-blocking and will stop the bot gracefully.
    updater.idle()


if __name__ == "__main__":
    main()

И я получаю следующую ошибку в этом случае:

TypeError: checkUsers() missing 1 required positional argument: 'chat'

Если я изменю функцию checkUsers(), чтобы она выглядела так:

def checkUsers(update: Update, context: CallbackContext) -> None:
"""Greets new users in chats and announces when someone leaves"""

cause_name = update.chat_member.from_user.mention_html()
member_name = update.chat_member.new_chat_member.user.mention_html()

member = update.chat_member.new_chat_member.user.username
userId = update.chat_member.new_chat_member.user.id
print(userId)

approvedMembers = ["Jack", "shaamsCat"]

if member in approvedMembers :
    update.effective_chat.send_message(
        f"{member_name} was added by {cause_name}. Welcome!",
        parse_mode=ParseMode.HTML,
    )
elif member not in approvedMembers : 
    update.effective_chat.send_message(
        f"{member_name} is not on the list!",
        parse_mode=ParseMode.HTML,
    ),
            
Chat.ban_member(userId)
   

Тогда ошибка:

TypeError: ban_member() missing 1 required positional argument: 'user_id'

И если я не передам никаких аргументов в Chat.ban_member(), то отсутствующие аргументы выглядят следующим образом:

TypeError: ban_member() missing 2 required positional arguments: 'self' and 'user_id'

Я буду признателен за любую помощь, я уверен, что это будут любые фундаментальные знания, которых мне не хватает, я буду честен и скажу вам, что только начал работать с Python несколько дней назад, так что будьте любезны, пожалуйста!!

Благодарю вас!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратные вызовы обработчика должны иметь ровно два позиционных аргумента — именно так устроен python-telegram-bot. Вот почему ваш первый подход не работает.

Более того, Chat.ban_member — это ограниченный метод, а не метод класса/статический. Chat — это класс, а не экземпляр этого класса, поэтому Chat.ban_member(user_id) тоже не может работать. Вам нужен экземпляр класса Chat для вызова этого метода. В вашем случае, вероятно, update.chat_member.chat или update.effective_chat (последнее является сокращением для первого).


Отказ от ответственности: в настоящее время я являюсь сопровождающим python-telegram-bot.

Замечательно! update.efficient_chat.ban_member(userId) сделал работу. Спасибо чувак! Думаю, я должен лучше понимать класс и методы.

Ferran Casals 22.03.2022 00:18

Другие вопросы по теме