TypeError: send_message() got an unexpected keyword argument 'chat_id'
Не могу понять как решить эту проблему с кодом. Ошибка выходит при запуске от этого скрипта:
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()
Источник: Stack Overflow на русском