commit 615cfdae3c666df717e2dd9ef7256fdd928b4c21 Author: KerradKerridi Date: Tue Aug 23 00:10:42 2022 +0300 v 1.0 diff --git a/Stick/Bye_3.tgs b/Stick/Bye_3.tgs new file mode 100644 index 0000000..c0df4a9 Binary files /dev/null and b/Stick/Bye_3.tgs differ diff --git a/Stick/Hello_1.tgs b/Stick/Hello_1.tgs new file mode 100644 index 0000000..937b94c Binary files /dev/null and b/Stick/Hello_1.tgs differ diff --git a/Stick/Hello_10.tgs b/Stick/Hello_10.tgs new file mode 100644 index 0000000..094a1cd Binary files /dev/null and b/Stick/Hello_10.tgs differ diff --git a/Stick/Hello_2.tgs b/Stick/Hello_2.tgs new file mode 100644 index 0000000..1f184f4 Binary files /dev/null and b/Stick/Hello_2.tgs differ diff --git a/Stick/Hello_3.tgs b/Stick/Hello_3.tgs new file mode 100644 index 0000000..6f1f34e Binary files /dev/null and b/Stick/Hello_3.tgs differ diff --git a/Stick/Hello_4.tgs b/Stick/Hello_4.tgs new file mode 100644 index 0000000..0307f18 Binary files /dev/null and b/Stick/Hello_4.tgs differ diff --git a/Stick/Hello_5.tgs b/Stick/Hello_5.tgs new file mode 100644 index 0000000..ec80b08 Binary files /dev/null and b/Stick/Hello_5.tgs differ diff --git a/Stick/Hello_6.tgs b/Stick/Hello_6.tgs new file mode 100644 index 0000000..01170c2 Binary files /dev/null and b/Stick/Hello_6.tgs differ diff --git a/Stick/Hello_7.tgs b/Stick/Hello_7.tgs new file mode 100644 index 0000000..8142e82 Binary files /dev/null and b/Stick/Hello_7.tgs differ diff --git a/Stick/Hello_8.tgs b/Stick/Hello_8.tgs new file mode 100644 index 0000000..3c395f1 Binary files /dev/null and b/Stick/Hello_8.tgs differ diff --git a/Stick/Hello_9.tgs b/Stick/Hello_9.tgs new file mode 100644 index 0000000..b332426 Binary files /dev/null and b/Stick/Hello_9.tgs differ diff --git a/Stick/Sleep_1.tgs b/Stick/Sleep_1.tgs new file mode 100644 index 0000000..b951e08 Binary files /dev/null and b/Stick/Sleep_1.tgs differ diff --git a/Stick/Universal_1.tgs b/Stick/Universal_1.tgs new file mode 100644 index 0000000..ed29e45 Binary files /dev/null and b/Stick/Universal_1.tgs differ diff --git a/Stick/Universal_2.tgs b/Stick/Universal_2.tgs new file mode 100644 index 0000000..06ea463 Binary files /dev/null and b/Stick/Universal_2.tgs differ diff --git a/Stick/Universal_3.tgs b/Stick/Universal_3.tgs new file mode 100644 index 0000000..f006e47 Binary files /dev/null and b/Stick/Universal_3.tgs differ diff --git a/Stick/Universal_4.tgs b/Stick/Universal_4.tgs new file mode 100644 index 0000000..47cc16b Binary files /dev/null and b/Stick/Universal_4.tgs differ diff --git a/Stick/Universal_5.tgs b/Stick/Universal_5.tgs new file mode 100644 index 0000000..8da5664 Binary files /dev/null and b/Stick/Universal_5.tgs differ diff --git a/Stick/Universal_6.tgs b/Stick/Universal_6.tgs new file mode 100644 index 0000000..6d5f6f1 Binary files /dev/null and b/Stick/Universal_6.tgs differ diff --git a/Stick/Universal_7.tgs b/Stick/Universal_7.tgs new file mode 100644 index 0000000..b8ec19a Binary files /dev/null and b/Stick/Universal_7.tgs differ diff --git a/Stick/bye_stick.tgs b/Stick/bye_stick.tgs new file mode 100644 index 0000000..a109aef Binary files /dev/null and b/Stick/bye_stick.tgs differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..426c717 --- /dev/null +++ b/main.py @@ -0,0 +1,298 @@ +import configparser +import os +import sys +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) +BOT_TOKEN = config.get('Telegram', 'BOT_TOKEN') +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +GROUP_FOR_POST = config.get('Telegram', 'group_for_posts') +GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message') +TEST_CHANNEL = config.get('Telegram', 'test_channel') +MAIN_PUBLIC = config.get('Telegram', 'main_public') +GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs') +IMPORTANT_LOGS = config.get('Telegram', 'important_logs') +PROJECT_ROOT = os.path.dirname(__file__) +PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK') +bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None) + + +def telegram_bot(): + @bot.message_handler(commands=['start']) + def send_welcome(message): + try: + hello_stickers = [ + open('Stick/Hello_1.tgs', 'rb'), + open('Stick/Hello_2.tgs', 'rb'), + open('Stick/Hello_3.tgs', 'rb'), + open('Stick/Hello_4.tgs', 'rb'), + open('Stick/Hello_5.tgs', 'rb'), + open('Stick/Hello_6.tgs', 'rb'), + open('Stick/Hello_7.tgs', 'rb'), + open('Stick/Hello_8.tgs', 'rb'), + open('Stick/Hello_9.tgs', 'rb'), + open('Stick/Hello_10.tgs', 'rb'), + ] + random_index = random.randint(0, len(hello_stickers) - 1) + stick = hello_stickers[random_index] + #logging + 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, stick) + sleep(1) + except : + 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" + "Have a nice time".format( + message.from_user, bot.get_me()), + parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) + except: + 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" + "Have a nice time".format(message.from_user), + parse_mode='html', reply_markup=markup + ) + except: + bot.send_message(IMPORTANT_LOGS, 'Не сработала предложка') + #logging + 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 + 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 + 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: + bye_stickers = [ + open('Stick/Bye_3.tgs', 'rb'), + open('Stick/bye_stick.tgs', 'rb'), + open('Stick/Universal_4.tgs', 'rb'), + open('Stick/Universal_5.tgs', 'rb'), + open('Stick/Universal_6.tgs', 'rb'), + open('Stick/Universal_7.tgs', 'rb'), + open('Stick/Universal_1.tgs', 'rb'), + open('Stick/Universal_2.tgs', 'rb'), + open('Stick/Universal_3.tgs', 'rb'), + ] + random_index = random.randint(0, len(bye_stickers) - 1) + stick = bye_stickers[random_index] + bot.send_sticker(message.chat.id, stick) + except ApiTelegramException.with_traceback('tb') as r: + bot.send_message(IMPORTANT_LOGS, r) + + markup = types.ReplyKeyboardRemove() + try: + bot.send_message(message.chat.id, + "И тебе пока, " + "если позднее захочешь предложить еще один пост, " + "или обратиться к нам с вопросом, " + "то просто пришли в чат команду /start\n" + "Have a nice time".format( + message.from_user, bot.get_me()), + parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) + except: + bot.send_message(GROUP_FOR_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" + "Have a nice time".format( + message.from_user, bot.get_me()), + parse_mode='html', disable_web_page_preview=not PREVIEW_LINK) + 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: + bot.send_message(IMPORTANT_LOGS, f'ALARM, у пользователя не отправилось сообщение\n\nАвтор: {message.from_user.first_name}\nПост можно посмотреть в логах') + + bot.send_message(message.chat.id, + "Пост успешно отправлен. Ожидай одобрения\n" + "Have a nice time".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" + "Have a nice time".format(message.from_user), + parse_mode='html', disable_web_page_preview=not PREVIEW_LINK + ) + except: + bot.send_message(chat_id=GROUP_FOR_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: + bot.send_message(chat_id=GROUP_FOR_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: + bot.send_message(chat_id=GROUP_FOR_LOGS, text='Не удалось выложить/удалить пост с фотографией, что-то пошло не так') + elif call.data == 'decline': + try: + bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + except: + bot.send_message(chat_id=GROUP_FOR_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: + print('Ошибка соединения: ', e) + bot.send_message(IMPORTANT_LOGS, "Ошибка соединения, потерял связь") + except Exception as r: + print("Непредвиденная ошибка: ", r) + bot.send_message(IMPORTANT_LOGS, "Произошло что-то непредвиденное, хелп") + finally: + print("Здесь всё закончилось") + bot.send_message(IMPORTANT_LOGS, 'Я упал, помогите') \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0ec9818 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pyTelegramBotAPI \ No newline at end of file diff --git a/settings_example.ini b/settings_example.ini new file mode 100644 index 0000000..33efa8f --- /dev/null +++ b/settings_example.ini @@ -0,0 +1,9 @@ +[Telegram] +bot_token = 5719450198:AAEI6hQgwiIcxMLGvVrPdopWqVlwHqR0QoU +preview_link = false +main_public = @love_biysk +group_for_posts = -793789724 +group_for_message = -736077298 +group_for_logs = -721685792 +important_logs = -625900899 +test_channel = -1001725605158 \ No newline at end of file