aiogram Telegram BOT отправить приветственное сообщение

В большинстве руководств по аиограммам показано, как отвечать на сообщение. Как отправить сообщение, не отвечая? И как вызвать функцию first_message() ?

      from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'API'

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

@dp.message_handler()
async def echo(message: types.Message):
  await message.answer(message.text)

async def first_message()
  await bot.sendMessage(chat.id, 'Bot Started')

if __name__ == '__main__':
   executor.start_polling(dp, skip_updates=True)

Как запустить first_message () при запуске бота? Код ниже не работает.

      if __name__ == '__main__':
    first_message()
    executor.start_polling(dp, skip_updates=True)

6 ответов

Решение

Это оказалось намного проще, чем ожидалось. Facepalm
Рабочее решение:

      from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'API'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler()
async def echo(message: types.Message):
   await bot.send_message(message.chat.id, message.text)

def test_hi():
   print("Hello World")

if __name__ == '__main__':
   test_hi()
   executor.start_polling(dp, skip_updates=True)

Заранее прошу прощения, если мой английский плохой. Я плохо говорю)))

Это гораздо проще, чем вы думали)

Для этого в Aiogram есть встроенный инструмент: on_startup. Вы можете создать функцию, которая принимает один аргумент: Dispatcher и действует так, как вам нужно. В вашем случае хотелось бы что-то вроде этого:

      from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'API'

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

@dp.message_handler()
async def echo(message: types.Message):
  await message.answer(message.text)

async def notify_message(dp: Dispatcher) # THIS FUNCTION
  print('Hello World')

if __name__ == '__main__':
   executor.start_polling(dp, skip_updates=True, on_startup=notify_message)

Также вы можете дождаться своей функции следующим образом:

      from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'API'

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

@dp.message_handler()
async def echo(message: types.Message):
  await message.answer(message.text)

async def notify_message() # THIS FUNCTION
  # await print('Hello World')
  print('Hello, world') # you shouldn't await the print fucntion, because it isn't async.

if __name__ == '__main__':
   await notifty_message()
   executor.start_polling(dp, skip_updates=True)

ИЛИ вы можете сделать это не асинхронным и просто задать это так:

      from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'API'

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

@dp.message_handler()
async def echo(message: types.Message):
  await message.answer(message.text)

def notify_message() # THIS FUNCTION
  print('Hello, world')

if __name__ == '__main__':
   notifty_message()
   executor.start_polling(dp, skip_updates=True)

Выбирайте вариант, который вам больше нравится) На вашем месте я бы выбрал первый , потому что это, как я уже говорил, встроенное решение айограммы, и вы можете использовать некоторые функции, как если бы бот работал, например, отправить админы, что бот включен.

ПС

Вы можете найти дополнительную информацию в документации по айограмме.

Примерно такой ответ должен был быть)

вы можете позвонить aiogram.executor.start(dispatcher, future)для запуска асинхронной функции (в будущем)

      from aiogram import Bot, Dispatcher, executor

bot = Bot(token='your_api_token')
dp = Dispatcher(bot)

async def notify_message() # THIS FUNCTION
  # await bot.sendMessage(chat.id, 'Bot Started')
  await print('Hello World')

@dp.message_handler()
async def echo(message: types.Message):
  await message.answer(message.text)

if __name__ == '__main__':
    executor.start(dp, notify_message())
    executor.start_polling(dp, skip_updates=True)

Второй подход был правильным, но цикл событий asyncio не был инициализирован. Итак, если бы было важно вызвать асинхронную функцию рядом с ботом, вы бы сделали:

      from asyncio import get_event_loop
from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'API'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot=bot, loop=get_event_loop())  # Initialising event loop for the dispatcher

async def notify_message():
    await print('Hello World')

if __name__ == '__main__':
    dp.loop.create_task(notify_message())  # Providing awaitable as an argument
    executor.start_polling(dp, skip_updates=True)

Если вы хотите начать диалог, это невозможно, Telegram не позволяет ботам отправлять первое сообщение. Но если вы хотите сохранить идентификаторы пользователей, вы можете создать базу данных или просто текстовый файл и записать туда любой новый идентификатор пользователя. Вы сможете отправлять всем им сообщения, вводя идентификатор из базы данных вместо chat.id

Я даю вам пример того, как отправить сообщение без использования message.answer, просто используйте:

      @dp.message_handler()
async def echo(message: types.Message):
    await bot.send_message(message.chat.id, message.text)

Я не понимаю, зачем вам печатать ('Бот работает') При запуске "айограммы" сообщает, что бот был запущен

      2021-06-01 09:31:42,729:INFO:Bot: YourBot [@YourBot]
2021-06-01 09:31:42,729:WARNING:Updates were skipped successfully.
2021-06-01 09:31:42,729:INFO:Start polling.
Другие вопросы по тегам