telegram-bot на python отправка сообщений по расписанию

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

Я новичок, пишу бот у которого хочу реализовать следующий функционал (основной функционал): первый сценарий:

import random
import telebot
from telebot import types
from words import first, second, second_add, third, mes, pict

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Привет':
       bot.send_message(message.from_user.id, 'Привет!)')
       keyboard = types.InlineKeyboardMarkup()
       key_1 = types.InlineKeyboardButton(text='МУР', callback_data='МУР')
       keyboard.add(key_1)
       bot.send_message(message.from_user.id, text='Узнай!', reply_markup=keyboard)
    elif message.text == '/help':
        bot.send_message(message.from_user.id, text='Напиши Привет')
    else:
        bot.send_message(message.from_user.id, text='Я тебя не понимаю. Напиши Привет')

@bot.callback_query_handler(func=lambda call:True)
def callback_worker(call):
    if call.data == 'МУР':
# random.choice(first) - из файла word генерируются уже заданные слова
        msg = random.choice(first) + '' + random.choice(second) + '' + random.choice(second_add) + '' + random.choice(third) + '' + random.choice(pict)
        sent_message = bot.send_message(call.message.chat.id, msg)
        keyboard = types.InlineKeyboardMarkup()
        key_1 = types.InlineKeyboardButton(text='МУР', callback_data='МУР')
        keyboard.add(key_1)
        bot.edit_message_reply_markup(chat_id=sent_message.chat.id, message_id=sent_message.message_id, reply_markup=keyboard)


bot.polling(none_stop=True, interval=0)

Второй сценарий

import asyncio
import random
from datetime import datetime
from toke import bot, chat_id
from words import mes, pict

async def main():
    while True:
        now = datetime.now()
        if now.hour == 8 and now.minute == 22 and now.second == 0:
            await send_message()
        await asyncio.sleep(1)

async def send_message():
    await bot.send_message(chat_id=chat_id, text='Какой-то текст' + random.choice(pict))

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(main())
    loop.run_forever()

Не могу запустить оба функционала одновременно. Пробовал, через multiprocessing в main.py, не работает. Объединяя все в один файл, так же не работает, бот ждет отправки сообщения по времени, а основной функционал, не работает. Так же переписывал основную часть через async, попытка не удалась. Так же функционал отправки пробовал реализовать через schedule. Если запускать второй код отдельно, сообщение он отправляет, но сразу же падает. Подскажите каким образом можно реализовать?

Ответы

▲ 1Принят

Пример:

import time
from datetime import datetime
from threading import Thread
import schedule
import telebot
from telebot import types


bot = telebot.TeleBot('2145840652:AAHP6FegIyorKW6OQlFX6y6P3')

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Привет':
       bot.send_message(message.from_user.id, 'Привет!)')
       keyboard = types.InlineKeyboardMarkup()
       key_1 = types.InlineKeyboardButton(text='МУР', callback_data='МУР')
       keyboard.add(key_1)
       bot.send_message(message.from_user.id, text='Узнай!', reply_markup=keyboard)
    elif message.text == '/help':
        bot.send_message(message.from_user.id, text='Напиши Привет')
    else:
        bot.send_message(message.from_user.id, text='Я тебя не понимаю. Напиши Привет')

def main():
    print('Бот запущен')
    while True:
        now = datetime.now()
        if now.hour == 18 and now.minute == 22:
            send_message()
        time.sleep(50)

def main1():
    print('Бот запущен 2')
    schedule.every().day.at("18:34").do(send_message)
    while True:
        schedule.run_pending()
        time.sleep(1)

def send_message(chat_id=125748):
    bot.send_message(chat_id=chat_id, text='Какой-то текст')

Thread(target=main).start()
Thread(target=main1).start()
bot.polling(none_stop=True, interval=0)

рекомендую перейти на aiogram

import asyncio
import aioschedule as schedule
from aiogram import Bot, Dispatcher, executor
from aiogram.types import Message

API_TOKEN = '2145840652:AAHP6FegIyorKW6OQlFX6y6P3'

bot = Bot(API_TOKEN)
dp = Dispatcher(bot)

async def job(chat_id):
    await bot.send_message(chat_id=chat_id, text="I am working.")
    
@dp.message_handler(commands='start')
async def cmd_start(message: Message):
    print(message.chat.id)
    await bot.send_message(chat_id=message.chat.id, text=f"chat.id = {message.chat.id}")

async def run_scheduler():
    print("Starting scheduler")
    for hour in range(9, 21):
        schedule.every().day.at(f"{hour}:00").do(job, chat_id=125748)

    while True:
        await schedule.run_pending()
        await asyncio.sleep(1)

async def on_startup(_):
    asyncio.create_task(run_scheduler())

executor.start_polling(dp, on_startup=on_startup)