Я работаю с 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-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) сделал работу. Спасибо чувак! Думаю, я должен лучше понимать класс и методы.