June 24, 2020

Бот для обратной связи на Python 3

Начнём как обычно с импортов зависимостей:

from aiogram import Bot, Dispatcher, executor, types
from aiogram import *
from aiogram.types import *

Да да, одна лишь либа aiogram. Далее пойдут константы в виде токена и айди админа которому пересылать сообщения:

TOKEN = "1111111:xxxxxxxx-xxxxxxxx"
admin_id = 1111111

Далее объявление самого бота и закинем сюда же ответ на команду /start

boty = Bot(token=TOKEN)
dp = Dispatcher(boty)


@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
	if message['from'].id == admin_id:
		await message.answer(f"Hi, admin")
	else:
		await message.answer(f"Привет, {message['from'].first_name}!")

Далее пойдет хэндлер для обработки текста и ответов пользователем от аккаунта администратора.


Сначала, во избежания ошибки, мы проверяем есть ли reply на сообщение, если его нет то проверяем нет ли команды /start , если её тоже нет то пересылаем сообщение админу.
Если все же это было reply на сообщение, сначала уточняем что этот reply был от админа, если это так то проверяем что там есть айди пользователя чьё сообщение админ решил реплить (reply), а затем отправляем текст юзеру на чьё сообщение админ нажал reply с текстом который ввел админ. Если же это делает пользователь то мы ему ласково говорим что ему нельзя отвечать на сообщения.

@dp.message_handler()
async def process_start_command(message: types.Message):
	if message.reply_to_message == None:
		if '/start' not in message.text:
			await boty.forward_message(admin_id, message.from_user.id, message.message_id)
	else:
		if message['from'].id == admin_id:
			if message.reply_to_message.forward_from.id:
					await boty.send_message(message.reply_to_message.forward_from.id, message.text)
		else:
			await message.answer('Нельзя отвечать на сообщения.')

Далее пойдет обработка документов и фотографий.

@dp.message_handler(content_types=['photo'])
async def handle_docs_photo(message):
	await boty.forward_message(admin_id, message.from_user.id, message.message_id)

	
@dp.message_handler(content_types=['document'])
async def handle_docs_photo(message):
	await boty.forward_message(admin_id, message.from_user.id, message.message_id)

Тут мы просто пересылаем сообщения данных типов админу. ну и наконец:

if __name__ == '__main__':
	print("starting")
	executor.start_polling(dp)
	

Вот и всё! а теперь полный листинг программы:

from aiogram import Bot, Dispatcher, executor, types
from aiogram import *
from aiogram.types import *


TOKEN = "11111:xxxxxxxxxxx-xxxxxxxxx"
admin_id = 11111111111


boty = Bot(token=TOKEN)
dp = Dispatcher(boty)


@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
	if message['from'].id == admin_id:
		await message.answer(f"Hi, admin")
	else:
		await message.answer(f"Привет, {message['from'].first_name}!")

		
@dp.message_handler()
async def process_start_command(message: types.Message):
	if message.reply_to_message == None:
		if '/start' not in message.text:
			await boty.forward_message(admin_id, message.from_user.id, message.message_id)
	else:
		if message['from'].id == admin_id:
			if message.reply_to_message.forward_from.id:
					await boty.send_message(message.reply_to_message.forward_from.id, message.text)
		else:
			await message.answer('Нельзя отвечать на сообщения.')

			
@dp.message_handler(content_types=['photo'])
async def handle_docs_photo(message):
	await boty.forward_message(admin_id, message.from_user.id, message.message_id)

	
@dp.message_handler(content_types=['document'])
async def handle_docs_photo(message):
	await boty.forward_message(admin_id, message.from_user.id, message.message_id)

	
	if __name__ == '__main__':
	print("starting")
	executor.start_polling(dp)
Прошу меня простить за мой ужасный код, вы всегда можете модифицировать мой код и использовать как хотите, я не несу за это ответственности.

Телеграм канал: https://t.me/CodingCommunity