TypeError: send_message() got an unexpected keyword argument 'chat_id'

Рейтинг: 1Ответов: 0Опубликовано: 19.05.2023

Не могу понять как решить эту проблему с кодом. Ошибка выходит при запуске от этого скрипта:

from telegram import Bot, Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext

from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google.oauth2.service_account import Credentials
import schedule
import threading
import time
import telegram
import sqlite3

TOKEN 
CHAT_ID   
SPREADSHEET_ID 
CREDENTIALS_FILE creds.json

conn = sqlite3.connect('bot_data.db')
c = conn.cursor()

c.execute('''
    CREATE TABLE IF NOT EXISTS user_data (
        id INTEGER PRIMARY KEY,
        current_row INTEGER,
        all_rows_processed BOOLEAN,
        custom_comment BOOLEAN
    )
''')
conn.commit()

def check_queue_periodically(bot):
    schedule.every(2).minutes.do(check_queue, context=bot)

    while True:
        schedule.run_pending()
        time.sleep(20)

def get_values(spreadsheet_id, range_name):
    creds = Credentials.from_service_account_file(CREDENTIALS_FILE)
    try:
        service = build('sheets', 'v4', credentials=creds)
        result = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_name).execute()
        rows = result.get('values', [])
        return rows
    except HttpError as error:
        print(f"Произошла ошибка: {error}")
        return error

def update_values(spreadsheet_id, range_name, values):
    creds = Credentials.from_service_account_file(CREDENTIALS_FILE)
    try:
        service = build('sheets', 'v4', credentials=creds)
        body = {
            'values': values
        }
        result = service.spreadsheets().values().update(
            spreadsheetId=spreadsheet_id, range=range_name,
            valueInputOption='RAW', body=body).execute()
        return result
    except HttpError as error:
        print(f"Произошла ошибка: {error}")
        return error

def check_queue(context: telegram.ext.CallbackContext):
    # Загрузка данных пользователя
    user_data = load_user_data()

    bot = context.bot if context else updater.bot
    all_rows = get_values(SPREADSHEET_ID, 'Sheet1!A2:H1000')
    post_found = False
    for i, row in enumerate(all_rows, start=2):
        row += [''] * (8 - len(row))
        if len(row) >= 4 and not row[7] and not row[5] and not row[6]:
            post_found = True
            message = f"Текст поста:\n\n{row[2]}\n\nПредложенный комментарий\n\n{row[3]}\n\nСсылка на пост:\n\n{row[1]}"
            bot.send_message(chat_id=194321613, text=message)
            update_values(SPREADSHEET_ID, f'Sheet1!G{i}', [["Обрабатывается"]])  # Столбец G
            update_values(SPREADSHEET_ID, f'Sheet1!H{i}', [["Обрабатывается"]])  # Столбец H
            update_values(SPREADSHEET_ID, f'Sheet1!H{i}', [["Да"]])
            user_data["current_row"] = i
            user_data['all_rows_processed'] = False
            break
    else:
        if not post_found and not user_data.get('all_rows_processed', False):
            user_data['all_rows_processed'] = True
        elif post_found:
            user_data['all_rows_processed'] = False
    
    # Сохранение данных пользователя
    save_user_data(user_data)


def start(update: Update, context: CallbackContext):
    context.bot.send_message(chat_id=update.effective_chat.id, text="Бот начал свою работу. Ожидаю новые посты.")
    check_queue(context)
    context.job_queue.run_once(check_queue, 120, context=context)

def approve_yes(update: Update, context: CallbackContext) -> None:
    # Загрузка данных пользователя
    user_data = load_user_data()

    if 'current_row' in user_data:
        current_row = user_data['current_row']
        post_text = get_values(SPREADSHEET_ID, f'Sheet1!D{current_row}')[0][0]  # Изменили C на D
        update_values(SPREADSHEET_ID, f'Sheet1!F{current_row}', [[post_text]])  
        update_values(SPREADSHEET_ID, f'Sheet1!G{current_row}', [["Комментарий одобрен"]])  
        context.bot.send_message(chat_id=update.effective_chat.id, text="Комментарий одобрен.")
        del user_data['current_row']
        
        # Сохранение данных пользователя
        save_user_data(user_data)

        check_queue(context)
        context.job_queue.run_once(check_queue, 120, context=context)  # Добавлено
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Нет активного поста для согласования.")

def approve_no(update: Update, context: CallbackContext) -> None:
    # Загрузка данных пользователя
    user_data = load_user_data()

    if 'current_row' in user_data:
        current_row = user_data['current_row']
        update_values(SPREADSHEET_ID, f'Sheet1!F{current_row}', [["-"]])  
        update_values(SPREADSHEET_ID, f'Sheet1!G{current_row}', [["Комментарий отклонен"]])  
        context.bot.send_message(chat_id=update.effective_chat.id, text="Комментарий отклонен.")
        del user_data['current_row']

        # Сохранение данных пользователя
        save_user_data(user_data)

        check_queue(context)
        context.job_queue.run_once(check_queue, 120, context=context)  # Добавлено
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Нет активного поста для согласования.")

def custom(update: Update, context: CallbackContext) -> None:
    # Загрузка данных пользователя
    user_data = load_user_data()

    if 'current_row' in user_data:
        user_data['custom_comment'] = True
        context.bot.send_message(chat_id=update.effective_chat.id, text="Введите свой комментарий.")

        # Сохранение данных пользователя
        save_user_data(user_data)
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Нет активного поста для согласования.")

def message_handler(update: Update, context: CallbackContext) -> None:
    # Загрузка данных пользователя
    user_data = load_user_data()

    if 'custom_comment' in user_data:
        current_row = user_data['current_row']
        custom_comment = update.message.text
        update_values(SPREADSHEET_ID, f'Sheet1!F{current_row}', [[custom_comment]])
        update_values(SPREADSHEET_ID, f'Sheet1!G{current_row}', [["Пользовательский"]])
        context.bot.send_message(chat_id=update.effective_chat.id, text="Ваш комментарий сохранен.")
        del user_data['current_row']
        del user_data['custom_comment']

        # Сохранение данных пользователя
        save_user_data(user_data)

        check_queue(context)
        context.job_queue.run_once(check_queue, 120, context=context)

def load_user_data():
    conn = sqlite3.connect('bot_data.db')
    c = conn.cursor()
    c.execute('SELECT * FROM user_data WHERE id = 1')
    data = c.fetchone()
    conn.close()  # Закрыть соединение после использования
    if data is None:
        return {}
    else:
        return {
            'current_row': data[1],
            'all_rows_processed': data[2],
            'custom_comment': data[3]
        }

def save_user_data(user_data):
    conn = sqlite3.connect('bot_data.db')
    c = conn.cursor()
    c.execute('''
        INSERT OR REPLACE INTO user_data
        (id, current_row, all_rows_processed, custom_comment) VALUES (?, ?, ?, ?)
    ''', (1, user_data.get('current_row'), user_data.get('all_rows_processed'), user_data.get('custom_comment')))
    conn.commit()
    conn.close()  # Закрыть соединение после использования


def main() -> None:
    global updater  # делаем updater глобальной переменной
    updater = Updater(token=TOKEN)

    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("yes", approve_yes))
    dispatcher.add_handler(CommandHandler("no", approve_no))
    dispatcher.add_handler(CommandHandler("custom", custom))
    dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, message_handler))

    updater.start_polling()

    thread = threading.Thread(target=check_queue_periodically, args=(updater.bot,))
    thread.start()

    updater.idle()

if __name__ == '__main__':
    try:
        main()
    finally:
        conn.close()

Ответы

Ответов пока нет.