Некоторое время назад я столкнулся с проблемой, которая заставила написать Telegram бота. Хочу рассказать о проблеме, поделиться мыслями. И, конечно, выложу исходный код Бота.
Приближался очередной «отпуск» 2024 года.
Думаю, что не ошибусь, если скажу, что многие IT-специалисты сталкиваются с серьезной проблемой — невозможностью полноценно отдохнуть даже во время отпуска. Время, предназначенное для восстановления сил и перезагрузки, часто превращается в продолжение рабочей недели, только без официального расписания. Постоянные рабочие сообщения и звонки нарушают личные границы и планы. Это ухудшает качество отдыха, способствует профессиональному выгоранию. Хуже того, это приводит к снижению эффективности работы в дальнейшем, после «отпуска».
Современные средства коммуникации, такие как Telegram, электронная почта и другие мессенджеры, делают человека доступным круглосуточно. Не берусь говорить за всех, но лично меня крайне раздражают красные кружочки с количеством не отвеченных сообщений на иконках приложений. Очевидно, так и задумано; чтобы человека тянуло «избавиться» от них, прочитав, далеко не всегда «желанное» сообщение. Даже если сотрудник включил автоответчик в почте или указал в мессенджере статус "в отпуске", поток сообщений коллег, клиентов или руководства часто не прекращается. Это приводит к ситуации, когда сотрудник, вместо того чтобы расслабляться и восстанавливать силы, вынужден постоянно отвлекаться на рабочие вопросы. Причина такой ситуации — отсутствие культуры уважения личных границ; а также пренебрежение разработанными бизнес-процессами: когда проще написать коллеге напрямую вместо того, чтобы направить обращение в службу «одного окна» (Helpdesk) – и дождаться ответа, согласно специально для того установленным правилам. Многие считают, что возможность мгновенно связаться с человеком дает им право на немедленный ответ, вне зависимости от того, находится ли он в отпуске или нет. Иронично, но те, кто активно беспокоит других в отпуске, зачастую сами стараются избегать работы в свободное время.
Постоянное нарушение личных границ в отпуске напрямую связано с профессиональным выгоранием. Выгорание — это состояние эмоционального, физического и психического истощения, вызванное длительным воздействием стресса на работе. Если сотрудник не может полноценно отдохнуть, организм и психика не успевают восстановиться. Это приводит к накоплению стресса, который со временем перерастает в хроническое состояние усталости и апатии. Не имея возможности отключиться от рабочих вопросов, человек постоянно находится в напряжении. Даже находясь физически вне офиса, на уровне подсознания он как бы продолжает оставаться на работе. Это не только снижает качество отдыха, но и способствует быстрому выгоранию. Теряется интерес к работе, снижается продуктивность, ухудшается психоэмоциональное состояние.
Во-первых, постоянное отвлечение на работу в отпуске мешает полноценному отдыху. Если постоянно отвлекаться на работу, в конечном итоге, возвращаются из отпуска не отдохнувшими, уставшими. Это негативно сказывается на продуктивности и ускоряет выгорание.
Во-вторых, эта практика разрушает доверие и взаимопонимание в команде. Если коллеги не уважают границы друг друга, это создает напряжение и ухудшает атмосферу в коллективе. Снижение мотивации и рост выгорания в долгосрочной перспективе наносят урон компании, приводя к текучке кадров и снижению качества работы.
Каждый решает сам. В моём случае достаточно эффективным средством стал Telegram Bot. Идея примерно такова… Все люди, которые могут мне написать, условно поделены на две группы: сотрудники и все остальные. Соответственно, сотрудникам нужно отправлять одно сообщение, всем остальным другое (или не отправлять вообще). На пути к цели встает всего лишь одна проблема: как понять “Who is Who?” В моем случае в этом нет никаких проблем, так как существует некоторое количество групп, в которых состоят все (или почти все) сотрудники. Соответственно, если перед ответом проверять, состоит ли сотрудник в соответствующих группах, легко управлять тем, какое сообщение будет отправлено. Я не стал особо усложнять Бота, поэтому продумывать его более детально и делать более функциональным, не стал. Единственная дополнительная «фишка»: если я, всё же, решил ответить сам, Бот перестает отвечать этому конкретному пользователю на ближайшие 15 минут с момента моего последнего сообщения.
from telethon import TelegramClient, events
import time
from telethon.tl import functions, types
api_id = 'ТУЦ'
api_hash = 'ТУЦ'
client = TelegramClient('session_name', api_id, api_hash)
# Список названий рабочих чатов (через запятую)
GROUP_CHAT_NAMES = ['РАБОЧАЯ_ГРУППА_1','РАБОЧАЯ_ГРУППА_2']
# Переменная для хранения списка всех контактов
all_contacts = set()
# Словарь для хранения времени последнего ответа пользователя в каждом чате
last_user_reply_time = {}
# Функция для загрузки текста ответа из файла
def load_reply_text(filename):
with open(filename, 'r', encoding='utf-8') as file:
return file.read().strip()
# Загрузка текста ответа для коллег и друзей из файлов
reply_text_colleague = load_reply_text('reply_work2.txt')
reply_text_friend = load_reply_text('reply_friend2.txt')
@client.on(events.NewMessage(incoming=True))
async def handler(event):
global all_contacts, last_user_reply_time
# Проверяем, является ли чат личным
if not event.is_private:
return
# Получаем текущий чат и время
chat_id = event.chat_id
current_time = time.time()
# Проверяем, прошло ли 15 минут с момента последнего ответа пользователя в данном чате
if chat_id in last_user_reply_time and current_time - last_user_reply_time[chat_id] < 15 * 60:
return
# Получаем отправителя сообщения
sender = await event.get_sender()
sender_name = sender.first_name if sender.first_name else "Unknown"
# Проверяем, является ли отправитель контактом из списка GROUP_CHAT_NAMES
if sender_name in all_contacts:
await client.send_message(event.chat_id, reply_text_colleague)
else:
await client.send_message(event.chat_id, reply_text_friend)
@client.on(events.NewMessage(outgoing=True))
async def outgoing_handler(event):
global last_user_reply_time
# Проверяем, является ли чат личным
if not event.is_private:
return
# Обновляем время последнего ответа пользователя в данном чате
chat_id = event.chat_id
last_user_reply_time[chat_id] = time.time()
async def fetch_contacts():
global all_contacts
# Получаем список всех диалогов пользователя
async for dialog in client.iter_dialogs():
# Проверяем, является ли диалог групповым чатом из списка GROUP_CHAT_NAMES
if dialog.name in GROUP_CHAT_NAMES:
# Получаем список участников чата и добавляем их в общий список контактов
async for member in client.iter_participants(dialog):
all_contacts.add(member.first_name if member.first_name else "Unknown")
# Выводим список всех контактов в стандартный вывод
print("Список всех контактов:", all_contacts)
with client:
# Получаем список всех контактов перед началом работы
client.loop.run_until_complete(fetch_contacts())
client.run_until_disconnected()