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.