Приложение Т—Ж
В нем читать удобнее

Мой первый Telegram-бот для фриланса: от идеи до первых ошибок

1

Этот текст написан в Сообществе, в нем сохранены авторский стиль и орфография

Исходные данные

Я работаю веб-дизайнером в агентстве и подрабатываю на фрилансе: веду соцсети, настраиваю рекламу, пишу тексты. Работы много, но денег всё равно постоянно не хватает. Поэтому клиентов я стараюсь не упускать.

Основная проблема — клиенты пишут через разные площадки и соцсети. Более того, кто-то присылает запрос ночью, кто-то утром, и часть сообщений просто теряется в потоке чатов. В какой-то момент я решил, что это надо прекратить. Нужно написать простой и эффективный Telegram-бот, который будет сам принимать заявки, сохранять контакты в таблицу и напоминать мне о дедлайнах.

Вы можете ознакомиться с моей статьей и использовать для себя некоторые полезные инструменты и техники, которые я использовал в рамках этого проекта. Позже я хотел бы выкладывать статьи с более конкретным разбором кода и техническими аспектами моегоTelegram-бота.

Идея и функционал

Я решил, что бот должен делать только самое необходимое — без сложных сценариев и интерфейсов. Главное, чтобы человек мог быстро оставить заявку, а я не потерял контакт.

Как работает бот: пользователь нажимает кнопку о том, что хочет сделать заказ. Далее выбирает тип работы: «нужна консультация», «запустить рекламу» и так далее. Бот записывает username пользователя и текст обращения в таблицу Google Sheets, после чего отправляет мне уведомление в личку. Чтобы я сразу видел, кто и что написал.

Позже я добавил команду /brief. Когда человек её вводит, бот присылает шаблон с вопросами — имя, бюджет, ссылка на проект, цель. Это оказалось удобнее, чем получать разрозненные сообщения и потом самостоятельно спрашивать у клиента детали.

В итоге получился минималистичный инструмент, без особого дизайна. Бот не продаёт, не анализирует, не шутит — просто помогает не упустить потенциального клиента и структурирует заявки.

Полезные техники при написании бота

Когда начал собирать бота, выявил для себя несколько полезных техник и правил, которым следовал при написании кода. Приёмы не мои, большая их часть была найдена в сети, но их практическая применимость и польза лично мною неоспоримы. Вот несколько техник, которые я использовал:

1. Разделение логики на команды и обработчики сообщений.
Например, /start открывает приветствие и объясняет, что бот делает, /brief отправляет шаблон для заявки, а всё остальное попадает в общий обработчик сообщений. Это упрощает добавление новых функций без переписывания всего бота.

2. Валидация входных данных. Сразу проверяю, что человек прислал корректное имя, ссылку или текст. Если что-то не так — бот просит уточнить, вместо того чтобы записывать мусор в таблицу. Это экономит потом кучу времени.

3. Логирование действий. Каждый раз, когда приходит сообщение или создаётся запись в таблице, бот оставляет запись в логах (текстовых файлах, хранящихся на диске). Благодаря этому я сразу видел ошибки и понимал, где что сломалось.

4. Минимизация зависимостей. Чем меньше внешних сервисов подключаешь, тем проще развернуть бота и тем меньше вероятность поломок. Об инструментах в статье речь пойдёт дальше.

5. Использование шаблонов для сообщений. Например, заранее подготовленные тексты для приветствия или команд типа /brief обеспечивают единообразие в работе с пользователями.

Эти техники позволили сделать бота более предсказуемым и удобным, даже при отсутствии глубокого опыта в программировании.

Какие инструменты я использовал

Кратко расскажу о том, какие инструменты использовал при написании бота.

Язык программирования я выбрал Python. Он прост в изучении благодаря куче туториалов в сети. Для взаимодействия с Telegram использовал библиотеку aiogram: она помогает быстро прописывать логику, обрабатывать команды и сообщения.

Чтобы заявки сами записывались в таблицу, подключил Google Sheets API. Это нужно, чтобы всё хранилось в одном месте, и я мог отслеживать новые сообщения без лишнего копирования.

Для тестирования и отладки кода использовал Replit — удобно проверять куски логики прямо из браузера, не ставя ничего на компьютер. Сам код писал в среде Visual Studio Code — удобна для редактирования и работы с более сложными файлами.

Чтобы не забыть детали, структуру команд и варианты вопросов для бота храню в Notion. Это удобно: есть и план работы, и текстовые шаблоны для сообщений.

Иногда застревал на мелких кусках кода, и тут здорово помогали ChatGPT и GitHub Copilot. Например, один раз бот перестал отправлять уведомления — нейронка подсказала корректный синтаксис. После небольшой правки всё заработало.

Бот работает на базе домашнего ноутбука, но если компьютер выключить — работа будет приостановлена. Поэтому уже присматриваюсь к облачным вариантам: подумал развернуть его на виртуальной машине. Присматривался к Cloud4Y и Beget для аренды сервера, но пока всё ещё работаю с локальной машины и просто оставляю ноутбук включенным на ночь. Вероятно к данному вопросу я вернусь в будущих статьях.

Первая серьёзная ошибка

К сожалению, без проблем не обошлось. В будущем я подготовлю отдельную большую статью о всех ошибках и нестандартных ситуациях, которые повстречались мне при написании бота. Приведу пример самой первой ошибки.

Через пару дней работы бот перестал записывать заявки в Google Sheets. Сначала я даже не понял, что случилось: сообщения приходили, уведомления отправлялись, а таблица оставалась пустой.

Проверив логи (техника, о которой я рассказывал выше), я увидел ошибку: 403: The caller does not have permission. Причина — токен Google API истёк, а бот продолжал работать вхолостую.

Чтобы исправить, пришлось сделать несколько шагов:

  1. Сгенерировать новый токен в Google Cloud Console.
  2. Сохранить его в отдельном.env файле, а не зашивать прямо в код, чтобы в будущем менять проще.

Вывод из ситуации: всё, что может истечь, рано или поздно истечёт. Бот нуждается в контроле и уведомлениях о сбоях — иначе можно потерять важные заявки.

Что по итогу

Бот помогает не пропускать клиентов: заявки собираются автоматически, и я точно знаю, что ничего не потерялось. Конечно, это пока только начало проекта — в планах добавить интеграцию с CRM и оплатой, сделать работу ещё удобнее.

Я собираюсь продолжать делиться опытом: писать статьи про особенности написания кода на Python, рассказывать о типичных ошибках, показывать способы визуализации данных и автоматизации процессов. В целом мне приятно делиться такими кейсами, и буду рад продолжать делать это для читателей Т⁠—⁠Ж.

Вот что еще мы писали по этой теме
Сообщество