Files
telegram-helper-bot/main.py
2022-08-27 21:20:38 +03:00

303 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import configparser
import os
import sys
from pathlib import Path
from time import sleep
import telebot
import random
from telebot import types
from telebot.apihelper import ApiTelegramException
#Настройки
config_path = os.path.join(sys.path[0], 'settings.ini')
config = configparser.ConfigParser()
config.read(config_path)
#TELEGRAM
BOT_TOKEN = config.get('Telegram', 'BOT_TOKEN')
GROUP_FOR_POST = config.get('Telegram', 'group_for_posts')
GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message')
MAIN_PUBLIC = config.get('Telegram', 'main_public')
GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs')
IMPORTANT_LOGS = config.get('Telegram', 'important_logs')
PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK')
#SETTINGS
LOGS = config.getboolean('Settings', 'logs')
#Инициализируем бота
bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None)
def telegram_bot():
@bot.message_handler(commands=['start'])
def send_welcome(message):
#TODO: Здесь переписать через randint
#TODO: Тексты приветствий вынести в отдельный файл
try:
name_stick_hello = list(Path('Stick').rglob('Hello_*'))
number_stick_hello = random.randint(1, len(name_stick_hello))
random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb')
#logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.send_sticker(message.chat.id, random_stick_hello)
sleep(0.3)
except :
if LOGS:
bot.send_message(IMPORTANT_LOGS, 'Отправка приветственных стикеров лажает')
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("Предложить свой пост")
item2 = types.KeyboardButton("Связаться с админами")
item3 = types.KeyboardButton("Удалить пост")
markup.add(item1, item2, item3)
try:
bot.send_message(message.chat.id,
"Привет, {0.first_name}!\nЯ бот группы 'Влюбленный Бийск', "
"создан для того, "
"чтобы помочь тебе выложить пост в группу,"
"или связаться с админами.\n"
"Основная группа в ВК: https://vk.com/love_bsk\n"
"Основная группа в ТГ: https://t.me/love_biysk\n"
"<i>Have a nice time</i>".format(
message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
except:
if LOGS:
bot.send_message(IMPORTANT_LOGS, 'Что-то не так с отправкой первого сообщения')
bot.register_next_step_handler(message, go_send_messages)
@bot.message_handler(commands=['end_command'])
def after_post(message):
markup = types.ReplyKeyboardMarkup(row_width=1)
item1 = types.KeyboardButton("Предложить свой пост")
item2 = types.KeyboardButton("Связаться с админами")
item3 = types.KeyboardButton("Удалить пост")
item4 = types.KeyboardButton("Сказать пока!")
markup.add(item1, item2, item3, item4)
bot.send_message(message.chat.id,
"Держи кнопки меню".format(
message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
bot.register_next_step_handler(message, go_send_messages)
def go_send_messages(message):
global msg
if message.text == 'Предложить свой пост':
try:
markup = types.ReplyKeyboardRemove()
bot.send_message(message.chat.id,
"{0.first_name}, окей, пришли мне текст поста\n"
"В данный момент я работаю в тестовом режиме\n"
"поэтому к посту можно прикрепить не более одного фото\n"
"и никаких аудио или видео:(\nОбещаю, я научусь их обрабатывать, но позже".format(message.from_user),
parse_mode='html'
)
sleep(0.6)
msg = bot.send_message(message.chat.id,
"Если хочешь чтобы пост был опубликован анонимно напиши в любом месте "
"своего поста слово 'анон'.\nЕсли хочешь опубликовать пост не анонимно, "
"то напиши 'не анон', 'неанон' или не пиши ничего\n"
"Обрати внимание, что я обучен только на эти команды, и проверь\nчто ты написал так как я тебя попросил\n"
"Пост будет опубликован только в группе ТГ\n"
"<i>Have a nice time</i>".format(message.from_user),
parse_mode='html', reply_markup=markup
)
except:
if LOGS:
bot.send_message(IMPORTANT_LOGS, 'Не сработала предложка')
#logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_post)
elif message.text == "Связаться с админами":
msg = bot.send_message(message.chat.id, "{0.first_name}, напиши свое обращение,"
"Мы постараемся ответить в ближайшее время:)".format(message.from_user),
parse_mode="html")
#logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_message)
elif message.text == "Удалить пост":
#TODO: требует автоматизации. На входе говорим пришли мне пост, на выходе получаем идентификатор поста, удаляем из ТГ. Насчет удаления из ВК надо подумать
msg = bot.send_message(message.chat.id, "{0.first_name}, перешли твой пост из основного канала,"
"\nИмей ввиду, что можно удалить только тот пост в котором ты автор".format(
message.from_user), parse_mode="html")
#logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_message)
elif message.text == "Сказать пока!":
try:
name_stick_bye = list(Path('Stick').rglob('Universal_*'))
number_stick_bye = random.randint(1, len(name_stick_bye))
random_stick_bye = open(name_stick_bye[number_stick_bye], 'rb')
bot.send_sticker(message.chat.id, random_stick_bye)
except ApiTelegramException.with_traceback('tb') as r:
if LOGS:
bot.send_message(IMPORTANT_LOGS, r)
markup = types.ReplyKeyboardRemove()
try:
bot.send_message(message.chat.id,
"И тебе пока, "
"если позднее захочешь предложить еще один пост, "
"или обратиться к нам с вопросом, "
"то просто пришли в чат команду /start\n"
"<i>Have a nice time</i>".format(
message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
except:
if LOGS:
bot.send_message(IMPORTANT_LOGS, 'Что-то не так с прощанием')
if LOGS:
#logging
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
else:
bot.send_message(message.chat.id,
"Я тебя не понимаю. Повтори команду.\n"
"<i>Have a nice time</i>".format(
message.from_user, bot.get_me()),
parse_mode='html', disable_web_page_preview=not PREVIEW_LINK)
#logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
after_post(message=message)
def resend_message_in_group_for_post(message):
markup = types.InlineKeyboardMarkup(row_width=1)
item1 = types.InlineKeyboardButton("Опубликовать", callback_data='post_post_post')
item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline')
markup.add(item1, item2)
try:
if message.content_type == 'text':
post_text = message.text.lower()
if post_text.find('неанон') != -1 or post_text.find('не анон') != -1:
bot.send_message(
#TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST,
text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
reply_markup=markup
)
elif post_text.find('анон') != -1:
bot.send_message(
# TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST,
text=f'Пост из ТГ:\n{message.text}\n\nПост опубликован анонимно',
reply_markup=markup
)
else:
bot.send_message(
# TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST,
text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
reply_markup=markup
)
elif message.content_type == 'photo' and message.media_group_id == None:
post_text_for_photo = message.caption.lower()
bot.send_photo(
# TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST,
caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
photo=message.photo[-1].file_id,
reply_markup=markup
)
#TODO: Не понятна реализация с альбомами от слова совсем
#elif message.content_type == 'photo' and message.media_group_id != None:
# bot.forward_message(chat_id=IMPORTANT_LOGS, from_chat_id=message.chat.id, message_id=message.message_id )
else:
pass
except:
if LOGS:
bot.send_message(IMPORTANT_LOGS, f'ALARM, у пользователя не отправилось сообщение\n\nАвтор: {message.from_user.first_name}\nПост можно посмотреть в логах')
bot.send_message(message.chat.id,
"Пост успешно отправлен. Ожидай одобрения\n"
"<i>Have a nice time</i>".format(message.from_user),
parse_mode='html', disable_web_page_preview=not PREVIEW_LINK
)
after_post(message=message)
def resend_message_in_group_for_message(message):
try:
bot.forward_message(chat_id=GROUP_FOR_MESSAGE,
from_chat_id=message.chat.id,
message_id=message.message_id
)
bot.send_message(message.chat.id,
"Вопрос успешно отправлен. Ответим как только сможем\n"
"<i>Have a nice time</i>".format(message.from_user),
parse_mode='html', disable_web_page_preview=not PREVIEW_LINK
)
except:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, text='Что-то не так с отправкой обратной связи')
after_post(message=message)
#Админка
@bot.callback_query_handler(func=lambda call: True)
def post_for_group(call):
if call.data == 'post_post_post' and call.message.content_type == 'text':
try:
bot.send_message(chat_id=MAIN_PUBLIC, text=call.message.text)
bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
except:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, text='Не удалось выложить/удалить текстовый пост, что-то пошло не так')
elif call.data == 'post_post_post' and call.message.content_type == 'photo':
try:
bot.send_photo(
chat_id=MAIN_PUBLIC,
caption=call.message.caption,
photo=call.message.photo[-1].file_id,
)
bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
except:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, text='Не удалось выложить/удалить пост с фотографией, что-то пошло не так')
elif call.data == 'decline':
try:
bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
except:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, text='Не удалось отклонить пост')
if __name__ == '__main__':
telegram_bot()
try:
bot.polling(none_stop=True)
bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()
except ConnectionError as e:
if LOGS:
print('Ошибка соединения: ', e)
bot.send_message(IMPORTANT_LOGS, "Ошибка соединения, потерял связь")
except Exception as r:
if LOGS:
print("Непредвиденная ошибка: ", r)
bot.send_message(IMPORTANT_LOGS, "Произошло что-то непредвиденное, хелп")
finally:
if LOGS:
print("Здесь всё закончилось")
bot.send_message(IMPORTANT_LOGS, 'Я упал, помогите')