0%
🎯
LEVEL 1
⭐
1 XP
- Регистрация
- 13 Фев 2025
- Сообщения
- 29
- Конкурсы
- 0
- Реакции
- 7
- Баллы
- 3
- Возраст
- 36
- Тема Автор
- #1
Требования для запуска бота:
Python 3.8+ установлен на сервере или ПК.
Установить библиотеку aiogram:
Создать файл bot.py, вставить туда код бота (твой токен и ID беседу куда будут приходить обращения).
Запустить бота
Убедиться, что бот добавлен в группу поддержки с правами отправлять сообщения.
Пользователи пишут боту в личку, чтобы бот запомнил их ID.
В группе поддержки можно использовать команду /otvet @username текст для ответа.
Python 3.8+ установлен на сервере или ПК.
Установить библиотеку aiogram:
Код:
pip install aiogram
Создать файл bot.py, вставить туда код бота (твой токен и ID беседу куда будут приходить обращения).
Запустить бота
Python:
python bot.py
Убедиться, что бот добавлен в группу поддержки с правами отправлять сообщения.
Пользователи пишут боту в личку, чтобы бот запомнил их ID.
В группе поддержки можно использовать команду /otvet @username текст для ответа.
Python:
import logging
from aiogram import Bot, Dispatcher, executor, types
import re
API_TOKEN = "7847568827:AAFAGHqyBbnaCae4j52HQdQYsf1dzlB4hAc"
GROUP_CHAT_ID = -1002418234487
logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
user_states = {}
user_db = {}
def normalize_username(username):
if not username:
return ""
return username.lower().lstrip("@")
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add("? Написать обращение")
keyboard.add("?? Написать разработчику")
keyboard.add("? Перейти на форум")
await message.answer(
"Привет! Я бот тех. поддержки.\nВыберите действие:",
reply_markup=keyboard
)
@dp.message_handler(lambda message: message.text == "? Написать обращение")
async def write_issue(message: types.Message):
user_states[message.from_user.id] = {"step": "waiting_for_nick"}
await message.answer("Введите ваш ник на форуме:")
@dp.message_handler(lambda message: user_states.get(message.from_user.id, {}).get("step") == "waiting_for_nick")
async def get_nick(message: types.Message):
user_states[message.from_user.id]["nick"] = message.text.strip()
user_states[message.from_user.id]["step"] = "waiting_for_issue"
await message.answer("Опишите суть вашего обращения:")
@dp.message_handler(lambda message: user_states.get(message.from_user.id, {}).get("step") == "waiting_for_issue")
async def get_issue(message: types.Message):
if message.from_user.username:
user_db[normalize_username(message.from_user.username)] = message.from_user.id
data = user_states[message.from_user.id]
nick = data["nick"]
issue = message.text.strip()
await message.answer("✅ Ваше обращение принято в обработку, спасибо! ?")
msg = (
"? *Новое обращение в тех. поддержку:*\n"
f"? Пользователь: @{message.from_user.username or message.from_user.first_name}\n"
f"? Ник форума: {nick}\n"
f"? Суть: {issue}"
)
try:
await bot.send_message(chat_id=GROUP_CHAT_ID, text=msg, parse_mode="Markdown")
except Exception as e:
logging.error(f"Ошибка при отправке сообщения в группу: {e}")
admin_id = message.from_user.id
await bot.send_message(admin_id, f"Ошибка при отправке обращения в группу:\n{e}")
user_states.pop(message.from_user.id, None)
@dp.message_handler(commands=['otvet'])
async def answer_support_group(message: types.Message):
if message.chat.id != GROUP_CHAT_ID:
await message.reply("❌ Эта команда доступна только в группе поддержки.")
return
args = message.get_args()
if not args:
await message.reply("Использование: /otvet @username текст_ответа")
return
match = re.match(r"@?(\w+)\s+(.+)", args)
if not match:
await message.reply("Пожалуйста, укажите через пробел: @username текст_ответа")
return
username = match.group(1).lower()
text = match.group(2)
user_id = user_db.get(username)
if not user_id:
await message.reply("Неверный user_id. Введите числовой ID пользователя или сначала чтобы пользователь писал боту.")
return
try:
await bot.send_message(user_id, f"? Ответ от поддержки:\n{text}")
await message.reply("✅ Сообщение отправлено пользователю.")
except Exception as e:
await message.reply(f"Ошибка при отправке сообщения пользователю: {e}")
@dp.message_handler(commands=['staty'])
async def staty(message: types.Message):
text = (
"? Привет! Этот бот тех. поддержки создан для форума pawno-live.ru\n"
"Создатель:
)
await message.answer(text)
@dp.message_handler(commands=['bot', 'бот'])
async def bot_info(message: types.Message):
text = (
f"? Я бот тех. поддержки.\n"
f"Мой username: @{(await bot.get_me()).username}\n"
f"Мой ID: {bot.id if hasattr(bot, 'id') else 'неизвестно'}"
)
await message.answer(text)
@dp.message_handler(commands=['id'])
async def show_id(message: types.Message):
chat_type = message.chat.type
if chat_type in ['group', 'supergroup', 'channel']:
await message.answer(f"ID этой беседы: {message.chat.id}")
else:
await message.answer(f"Ваш user_id: {message.from_user.id}")
@dp.message_handler(commands=['testgroup'])
async def test_group(message: types.Message):
try:
await bot.send_message(GROUP_CHAT_ID, "Тестовое сообщение в группу!")
await message.answer("Сообщение в группу отправлено!")
except Exception as e:
await message.answer(f"Ошибка при отправке сообщения в группу: {e}")
@dp.message_handler(lambda message: message.text == "?? Написать разработчику")
async def contact_developer(message: types.Message):
await message.answer("Связаться с разработчиком: ")
@dp.message_handler(lambda message: message.text == "? Перейти на форум")
async def go_to_forum(message: types.Message):
keyboard = types.InlineKeyboardMarkup()
keyboard.add(types.InlineKeyboardButton(text="Перейти на pawno-live.ru", url="https://pawno-live.ru"))
await message.answer("Перейдите по ссылке ниже:", reply_markup=keyboard)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Последнее редактирование модератором: