Задать вопрос
@FLAB_B

Телеграм бот. Как исправить ошибку Updater.__init__() missing 1 required positional argument: 'update_queue'?

Написал телеграм бота через Chat-GPT, при запуске кода выходит ошибка
6424163a397ad924097038.png

Сам код бота:
from warnings import filterwarnings
from telegram.warnings import PTBUserWarning

filterwarnings(action="ignore", message=r".*CallbackQueryHandler", category=PTBUserWarning)

# Исправленный код без ошибки
import telegram
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, MessageHandler
# Изменил импорт Filters на MessageFilter, так как Filters больше не поддерживается
from telegram.ext.filters import MessageFilter
import requests
# Добавил импорт bs4
from bs4 import BeautifulSoup
import time
import threading
# Исправленный код без ошибки
# Токен бота
TOKEN = '6279852230:AAHje-Kvg7UHbiMN5JjVeDks-5KdBtJFw'
# Список фриланс бирж для поиска заказов
websites = ['https://www.upwork.com', 'https://www.freelancer.com', 'https://www.fiverr.com']
# Список пользователей
users = []
# Класс для хранения информации о каждом заказе
class Order:
    def __init__(self, title, url, description, website):
        self.title = title
        self.url = url
        self.description = description
        self.website = website
# Класс для хранения информации о каждом пользователе
class User:
    def __init__(self, chat_id, keywords, orders):
        self.chat_id = chat_id
        self.keywords = keywords
        self.orders = orders
# Функция для получения заказов с биржи в соответствии с ключевыми словами
def get_orders(keywords, website):
    orders = []
    for kw in keywords:
        url = f"{website}/projects/?q={kw}"
        response = requests.get(url)
        soup = BeautifulSoup(response.content, "html.parser")
        projects = soup.find_all("div", {"class": "project-view"})
        for project in projects:
            title = project.find("div", {"class": "title"}).text.strip()
            url = f"{website}{project.find('a')['href']}"
            description = project.find("div", {"class": "description"}).text.strip()
            order = Order(title, url, description, website)
            orders.append(order)
    return orders
# Функция для отправки заказов пользователю в личные сообщения
def send_orders(bot, update, user):
    for order in user.orders:
        response = f"{order.title}\n{order.description}\n{order.url}"
        bot.send_message(chat_id=update.message.chat_id, text=response)
        time.sleep(0.5)
# Функция для обработки команды /start
def start(bot, update):
    chat_id = update.message.chat_id
    user = User(chat_id, [], [])
    users.append(user)
    response = "Привет! Я могу помочь тебе найти заказы на фриланс биржах. Чтобы добавить ключевые слова, нажми на кнопку 'Добавить ключевые слова'. Чтобы остановить поиск заказов, нажми на кнопку 'Остановить поиск заказов'."
    bot.send_message(chat_id=chat_id, text=response, reply_markup=start_keyboard())
# Функция для обработки команды /add_keywords
def add_keywords(bot, update):
    chat_id = update.message.chat_id
    user = get_user(chat_id)
    response = "Введите ключевые слова через запятую:"
    bot.send_message(chat_id=chat_id, text=response)
    return "ADD_KEYWORDS"
# Функция для обработки ввода ключевых слов от пользователя
def handle_keywords(bot, update):
    chat_id = update.message.chat_id
    user = get_user(chat_id)
    keywords = update.message.text.split(",")
    user.keywords.extend([kw.strip() for kw in keywords])
    response = "Ключевые слова добавлены."
    bot.send_message(chat_id=chat_id, text=response, reply_markup=start_keyboard())
    return -1
# Функция для обработки команды /remove_keywords
def remove_keywords(bot, update):
    chat_id = update.message.chat_id
    user = get_user(chat_id)
    user.keywords = []
    response = "Ключевые слова удалены."
    bot.send_message(chat_id=chat_id, text=response, reply_markup=start_keyboard())
# Функция для обработки команды /stop_search
def stop_search(bot, update):
    chat_id = update.message.chat_id
    user = get_user(chat_id)
    user.orders = []
    response = "Поиск заказов остановлен."
    bot.send_message(chat_id=chat_id, text=response, reply_markup=start_keyboard())
# Функция для обработки запроса на отправку заказов пользователю
def get_user_orders(bot, update):
    chat_id = update.message.chat_id
    user = get_user(chat_id)
    if user.orders:
        send_orders(bot, update, user)
    else:
        response = "Заказов нет."
        bot.send_message(chat_id=chat_id, text=response, reply_markup=start_keyboard())
# Функция для получения пользователя по chat_id
def get_user(chat_id):
    for user in users:
        if user.chat_id == chat_id:
            return user
    return None
# Функция для создания клавиатуры с кнопками
def start_keyboard():
    keyboard = [[InlineKeyboardButton("Добавить ключевые слова", callback_data=";add_keywords")],
                [InlineKeyboardButton("Удалить ключевые слова", callback_data="remove_keywords")],
                [InlineKeyboardButton("Получить заказы", callback_data="get_orders")],
                [InlineKeyboardButton("Остановить поиск заказов", callback_data="stop_search")]]
    return InlineKeyboardMarkup(keyboard)
# добавил отступы и исправил расположение return
# Функция для обработки нажатия на кнопки
def button_handler(bot, update):
    query = update.callback_query
    chat_id = query.message.chat_id
    user = get_user(chat_id)
    command = query.data
    if command == "add_keywords":
        bot.send_message(chat_id=chat_id, text="Введите ключевые слова через запятую:")
        return"ADD_KEYWORDS"
    elif command == "remove_keywords":
        user.keywords = []
        response ="Ключевые слова удалены."
        bot.edit_message_text(chat_id=chat_id, message_id=query.message.message_id, text=response, reply_markup=start_keyboard())
    elif command == "get_orders":
        orders = []
        for website in websites:
            orders.extend(get_orders(user.keywords, website))
        user.orders = orders
        send_orders(bot, update, user)
    elif command == "stop_search":
        user.orders = []
        response = "Поиск заказов остановлен"
        bot.edit_message_text(chat_id=chat_id, message_id=query.message.message_id, text=response, reply_markup=start_keyboard())
# Функция для запуска бота
# Исправленный код без ошибки
def main():
    import telegram
    bot_token = '6279852230:AAHje-Kvg7UHbiMN5JeDks-5K3dBtJFrw'
    updater = telegram.ext.Updater(bot_token)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("add_keywords", add_keywords))
    dp.add_handler(MessageHandler(Filters.text, handle_keywords))
    dp.add_handler(CommandHandler("remove_keywords", remove_keywords))
    dp.add_handler(CommandHandler("stop_search", stop_search))
    dp.add_handler(CommandHandler("get_orders", get_user_orders))
    dp.add_handler(CallbackQueryHandler(button_handler))
    updater.start_polling()
    updater.idle()
if __name__ == "__main__":
    main()

Я не сильно силен в Пайтон и начал пока изучать основы.
Пожалуйста помогите с этой ошибкой.
Сам chat GPT не дает ответа для исправления этой ошибки, я обновлял библиотеки, но это не помогло.
Если заходить через пайчарм, то ошибки начинаются с самого начала, я не знаю насколько это нормально.
  • Вопрос задан
  • 7283 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
@veselcraft
Оратор выше, который вам абсолютно никак не помог и порекомендовав глянуть туториалы, совершенно не прав, потому что дело даже не в том, что вы пишете код через ChatGPT, а просто в слишком новой версии библиотеки python-telegram-bot, о которой чат-бот ещё ничего не знает.

Думаю, что вам этот ответ уже не нужен, но если не хотите особо заморачиваться, просто сделайте даунгрейд либы:

pip install python-telegram-bot==13.13

Но лучше всего самостоятельно разобраться в новой версии библиотеки и переписать всё ваше сокровище под неё. Понимаю, новичку трудно, но зная азы программирования вскоре сможете выучить любой другой язык :)
Ответ написан
Комментировать
JustKappaMan
@JustKappaMan
Frontend, backend, desktop. Всего понемногу.
Я не сильно силен в Пайтон и начал пока изучать основы.

Написал телеграм бота через Chat-GPT.

Нет слов, одни эмоции. Так и начни с основ, а не лезь в написание Телеграм ботов, если даже не знаешь что такое аргумент. Chat-GPT - ужасный инструмент, если ты ничего не смыслишь в программировании. Часто генерирует полный бред. По личному опыту: сносно генерирует лишь docstrings, и то приходится половину текста править. Берись за официальную документацию Питона и лекции на канале МФТИ, а не за Chat-GPT.
Ответ написан
@KlucH
По существу не подскажу, но ради всего святого, убери токен, если хочешь показать кому-то свой код
Ответ написан
@zekefast
Используй `Application` объект вместо `Updater`. Посмотри примеры (Examples) для библиотеки `python-telegram-bot` в официальной документации. Тебе также придётся сделать твои handler-ы `async def` вместо `def`, а при отправке сообщений добавить `await`. Это асинхронная обработка IO. Почитай про неё доку или маны, если не понимаешь ещё. Она спользуется для того, что бы чат работал быстрее (т.е. пока происходит оправка сообщения Python может занятся чем-то ещё).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы