Как сделать бот в Телеграмме с расписанием

В данной статье вы узнаете, как вести учет рабочего времени с помощью Telegram Bot API и механизма веб хуков (англ. Webhooks). Мы разберем этапы создания, настройки и развертывания тайм-трекера. Но сначала хотелось бы рассказать, как эта идея пришла мне в голову. Если же вас интересует только техническая часть повествования, переходите сразу к следующему разделу.

Введение

Как-то в разговоре моя жена сказала, что ей нужно написать почасовой отчет о работе, проделанной за 3 последних месяца, и определить точное количество отработанных часов. Не имея в распоряжении никакого инструмента для регистрации рабочего времени, ей было довольно сложно рассчитать эти показатели по старым заметкам и чатам. Тогда она поддержала предложение своего руководителя создать группу в WhatsApp, куда будет отправлять сообщение в момент начала и окончания работы. Имеющиеся сообщения упростят составление подобных отчетов.

Идея отличная: телефон практически всегда под рукой, так что ничего не стоит просто написать слова “начало”/“окончание” или что угодно. Я вдохновился этой идеей и задумался о способах ее реализации. Часами я искал хороший инструмент для учета рабочего времени, руководствуясь следующими обязательными условиями: 1) он должен легко вводить сообщение “Задание выполняется” или “Задание готово”; 2) он работает на всех имеющихся устройствах.

Телеграм бот для твоей шараги. Часть 4 (система расписания)

Я опробовал несколько соответствующих приложений, которые запускались на компьютерах Mac, Linux и смартфонах, но ни одно из них меня не зацепило. Тогда я вернулся к способу учета времени, которым жена пользовалась на тот момент, и еще раз осмыслил классную задумку прописывать в мессенджере время начала и окончания работ. Изучив материал по теме ботов и веб хуков, я создал инструмент на основе Telegram.

Суть идеи состоит в создании Telegram-бота и реализации веб хуков для специально отформатированных сообщений, которые сохраняют временные метки и описания задач в формате CSV. Далее рассмотрим его принцип действия.

Создание проекта

Прежде всего, я начал искать существующие библиотеки и примеры использования веб хуков Telegram. Я нашел на GitHub один модуль — node-telegram-bot-api . Решил им воспользоваться по двум причинам: из-за его простоты и моей любви к Node. Поскольку он предоставлял библиотеку, необходимо было создать приложение Node. Отдавая предпочтения TypeScript, я создал проект соответствующим образом.

Есть один классный инструмент под названием typescript-starter, который запускается как исполняемый файл npm через npx typescript-starter. Он задает вопросы, например уточняет намерение создать библиотеку или приложение, последнее как раз представляет наш случай. Создав проект и сохранив значения по умолчанию в диалоговом окне установки typescript-starter, я задал конфигурацию запуска для отладки в VS Code. В результате ряда экспериментов она приняла следующий вид:

«type»: «node»,
«request»: «launch»,

Как сделать бота в телеграмме | Телеграм боты для начинающих


«name»: «Launch Program»,
«program»: «$/build/main/index.js»,
«console»: «integratedTerminal»,
«preLaunchTask»: «tsc: build — tsconfig.json»,
«outFiles»: [
«$/out/**/*.js»
]
>

Основная часть кода находится в src/main/index.ts. Чтобы настроить веб хуки для сообщений, отправляемых в Telegram-бот, node-telegram-bot-api предлагает отличный шаблон, который я немного адаптировал. Сначала установил нужные пакеты:

Код Telegram-бота

Далее я изменил импорты из кода примера с require на import с целью обеспечения безопасности типов для импортируемого кода и добавил свой токен. Код выглядел следующим образом и был готов к тестированию:

// const TelegramBot = require(‘node-telegram-bot-api’);
import TelegramBot from ‘node-telegram-bot-api’;

// создание бота, использующего технологию опроса сервера (polling) для получения новых обновлений
const bot = new TelegramBot(token, < polling: true >);

// Совпадения с «/echo [whatever]»
bot.onText(//echo (.+)/, (msg, match) => // ‘msg’ — это полученное сообщение из Telegram
// ‘match’ — результат выполнения вышеуказанного регулярного выражения для проверки текстового содержимого
// сообщения

const chatId = msg.chat.id;
const resp = match[1]; // перехваченный «whatever»

// отправка обратно в чат совпавшего «whatever»
bot.sendMessage(chatId, resp);
>);

// Прослушивание сообщений любого вида. Существуют разные виды
// сообщений.
bot.on(‘message’, (msg) => const chatId = msg.chat.id;

// отправка сообщения в чат и подтверждение его получения
bot.sendMessage(chatId, ‘Received your message’);
>);

С помощью хуков on и onText вызываются функции для каждого входящего сообщения (on) или сообщений, совпадающих с определенным регулярным выражением (onText). В этих функциях код отвечает, отправляя сообщения обратно в соответствующий чат. На мой взгляд, библиотека предоставляет отличный уровень абстракции. Итак, все готово к тестированию.

Сначала я создал бота: перешел в Telegram (или Web Telegram), открыл чат в BotFather (по ссылке t.me в документации), написал /newbot, дал ему имя и имя пользователя в соответствии с требованиями. BotFather предоставил токен, который присваивается const token в начале кода. Затем запустил бота Telegram API посредством ранее добавленной команды запуска в VS Code.

Далее открыл новый чат в боте. Для этого прошел по ссылке, полученной из BotFather, и нажал на Start в правом верхнем углу. После этого я смог протестировать веб хуки, отправив боту /echo Hello. Он ответил Hello (через функцию onText) и прислал другое текстовое сообщение Received your message, т.е. сообщение получено.

Отлично! Теперь сделаем код более функциональным.

Добавление обработчиков и кода для учета рабочего времени

Как ранее упоминалось, цель проекта — сохранить результаты учета времени в формате CSV для последующего редактирования в Excel. В Node работать с файлами CSV очень просто. Вместо того, чтобы воспользоваться одной из многочисленных библиотек, предназначенных для решения этой задачи, я решил ради интереса написать все с нуля. Для своего прототипа выбрал следующие команды бота:

  • /work $message -> начать работу над задачей $message;
  • /done -> завершить последнюю начатую задачу;
  • /state -> показать состояние последней задачи (начато или завершено);
  • /print-> записать весь CSV в чат.

Для чтения и записи CSV были реализованы 2 функции:

const getEntries = async () => if (!fs.existsSync(csvFilePath)) fs.writeFileSync(csvFilePath, «»);
>

const val = fs.readFileSync(csvFilePath).toString();
const entries = [];
if (val == «») return entries;
>
val.split(«n»).forEach((row, index) => if (row === «» || index == 0) return;
>
const [work, startDate, endDate, duration] = row.split(delimiter);
const entry = work,
startDate,
endDate,
duration
>;
entries.push(entry);
>);
return entries;
>

Еще по теме:  Как сменить надпись в сети в Телеграмме

const writeFile = (entries) => let str = «work;startDate;endDate;duration;n»;
entries.forEach(e => str += Object.keys(e).map(k => e[k]).join(delimiter);
str += ‘n’;
>);
fs.unlinkSync(csvFilePath);
fs.writeFileSync(csvFilePath, str);
>;

Функция getEntries возвращает содержимое CSV в виде объектов JS, а функция writeFile сохраняет объекты JS в файл CSV. Таким образом, нет никакой реальной необходимости использовать библиотеку. С помощью этих 2-х функций были реализованы 4 ранее упомянутых обработчика:

bot.onText(//work (.+)/, async (msg, match) =>

const chatId = msg.chat.id;
const work = match[1]; // перехваченный «whatever»
const startDate = new Date();
const entries = await getEntries();
entries.push( work,
startDate: startDate.toJSON(),
endDate: null,
duration: null,
>);
writeFile(entries);

bot.onText(//done(.*)/, async (msg, _match) => const chatId = msg.chat.id;
const endDate = new Date();

const entries = await getEntries();
if (entries.length < 1) bot.sendMessage(chatId, `You didn’t start any work that can be ended. Uff.`);
return;
>
const targetEntry = entries[entries.length — 1];
targetEntry.endDate = endDate.toJSON();
const startDate = new Date(targetEntry.startDate);
const diff = format(endDate.valueOf() — startDate.valueOf(), < leading: true, >);
targetEntry.duration = diff;

bot.onText(//state(.*)/, async (msg, _match) => const chatId = msg.chat.id;
const endDate = new Date();

const entries = await getEntries();
if (entries.length == 0) bot.sendMessage(chatId, `You don’t have any work saved yet. Please start by using /work $myTodo`);
return;
>
const targetEntry = entries[entries.length — 1];
if (!targetEntry.endDate) bot.sendMessage(chatId, `Your current task is $ from $.`);
return;
>
bot.sendMessage(chatId, `You recently finished $ at $. It took $.!`);
>);

bot.onText(//print(.*)/, async (msg, _match) => const chatId = msg.chat.id;

const entries = await getEntries();
let str = «work;startDate;endDate;duration;n»;
entries.forEach(e => str += Object.keys(e).map(k => e[k]).join(delimiter);
str += ‘n’;
>);
bot.sendMessage(chatId, str);

Команда work добавляет запись с начальной датой startDate и соответствующий текст, внесенный в /work. Команда /done проверяет, есть ли в файле хотя бы одна запись, и устанавливает дату окончания endDate и продолжительность. Аналогично функционируют обработчики /state и /print, выполняя вышеописанные действия. Вот и все!

Кода не так много, но зато какое классное чувство испытываешь при работе с этим инструментом! Я запустил его в режиме отладки и убедился, что все функционирует как надо. Теперь переходим к последнему этапу: развертывание.

Развертывание инструмента для учета времени в Telegram

Я добавил Dockerfile с многоэтапной сборкой для запуска на любом хосте. Также для развертывания можно передать токен как переменную env или что-то подобное. Самый простой способ запустить его на сервере (с настройкой Docker) — отправить свой репозиторий на сервер, а затем создать и запустить контейнер (после изменения токена на токен бота):

  • docker build -t telegram-timetracker:latest;
  • docker run -ti —rm telegram-timetracker:latest;

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

  • Как создать Telegram бота с помощью Python
  • Telegram-бот с помощью таблицы Google
  • Создаем бота клиентской службы с помощью Python, Flask и Pinecone

Источник: dzen.ru

Telegram-bot: моя история. Часть вторая

Доброго времени суток, Хабрахабр! Данный материал является продолжением первой части, в которой освещены инструменты и возможности разработки продукта на облачной платформе. Примером является актуальное мобильное расширение доступа к расписанию пар в университете — Telegram-bot.

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

UPD: проект успешно прошел рефакторинг с помощью авторского фреймворка для расписаний занятий университетов — «Rutetider» (статья на Хабрахабре, GitHub). Поэтому некоторые моменты в этой статье могут не совпадать, часть когда может отсутвовать или выглядеть по-другому, но концепция сохранена.

Технический обзор проекта

Параллельно с объяснениями вы можете рассчитывать на скриншоты «с мест событий» для более глубокого понимания процесса написания, также рекомендуется обращать внимание на полный исходный код (github.com) и при достаточном интересе — вникать в предоставляемые ссылки по причине отсутствия описания тех или иных, на усмотрение автора, пояснений используемых и предоставленых компонентов. Если часть описания не понятна, вопрос можно задать автору в комментариях или диалогах, или уделить две минуты на взаимодействие с предметной областью напрямую, что позволит лучше ориентироваться в статье и приведенных примерах.

Расписание пар университета

На момент проектирования архитектуры приложения не было других вариантов получения расписания лекций, кроме прямого сбора информации с официального сайта (парсинг). API для платформы, на котором располагается расписание, в наличии нет, а возможность извлечь информацию непосредственно из базы данных отсутствует.

Необходимая техническая операция (github.com) тесно связана с полезными запланированными работами на сервере, сведения о которых расположены в конце раздела.

Используемыми модулями являются:

  • Beautiful Soup — работа со структурой данных разметки HTML;
  • Requests — отправка HTTP-запросов.

groupExample =

Далее следует отправка post-запроса для получения объекта страницы и дальнейшая передача в объект soup, имеющий ряд методов для удобной работы.

for formData in dataLib.dateToDateForm(firstDay, lastDay): r = requests.post(config.url, data = formData) soup = BeautifulSoup(r.text, ‘html.parser’) dataProcessing.dataProcessing(soup)

Модуль dataProcessing имеет одноименную функцию, в которой обрабатываются необходимые данные. Например, переменная mainHtmlTable — это базовая таблица с расписанием, имеющая свой уникальный идентификатор.

mainHtmlTable = soup.find(«table», )

(часть таблицы для наглядного примера, полную версию можно «пощупать» по ссылке, предварительно выбрав факультет, курс и группу)

Еще один пример — даты, основанный на получении всех элементов блочного типа, имеющих внутри себя текст длиной равной десяти («12.12.2016» — десять символов).

divDate = [i.text[:-5] for i in mainHtmlTable.findAll(‘div’) if len(i.get_text()) == 10][:-2]

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

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

Общая концепция взаимодействия с пользователем

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

Проделанная работа не стала исключением, несмотря на обратное в исходной точке продукта, и по итогам сформировался некий концептуальный шаблон проектирования для большинства операций, включающий в себя обработчик запросов от пользователя (Handler), выполнение ряда последующих операций (Query) и генерацию исходных данных (Reply) в ответ.

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

Пример обработки запросов

В последующем участке основного файла-обработчика (github.com) всех запросов можно наблюдать post-запрос от пользователя, совершившего выбор одного из пунктов меню с названием «Обновления» (данное текстовое значение доступно как атрибут объекта сообщений «message» по причине дублирования выбора меню в чат), внесение данных о пользователе (имя, фамилия, идентификатор чата, текстовое значение «news» как выбор пункта меню и никнейм) с помощью метода otherFeature() класса middlewareUserData (github.com). Данная функция записывает действия пользователей для статистики использования функций приложения. После предыдущих обработок отсылается как ответ по привязанному идентификатору чата текстовое сообщение с информацией о месторасположении новостей проекта.

Еще по теме:  Создание обменника криптовалют в Телеграмме курсы

Иллюстрация процесса приведена ниже. Картинки, связанные с таблицами баз данных, кликабельны (можно рассмотреть лучше), потому что представлены в плохом качестве, но именно так, чтобы не терять целостность картины разработки.

Концепция получения расписания

Расписание на сегодняшний или завтрашний день доступно двумя способами. Рассмотрим первый вариант — через постепенный ввод данных: необходимо выбрать факультет, курс и группу. Напомню, что атрибут «text» объекта «message» — это текстовое значения выбора пункта меню.

1. Кнопка «Получить расписание» — пользователь присылает базовый набор данных:

middlewareUserData.getUser(message.chat.first_name, message.chat.last_name, message.chat.id, message.chat.username)

Следовательно, действие отображается в таблице базы данных в таком формате (последующие примеры работы базы данных в конце раздела):

2. Выбор факультета:

middlewareUserData.updateFaculty(message.text, str(message.chat.id))

3. Выбор курса и группы, скрипт которого несколько отличается от предыдущих, потому что отображение списка группа на экране происходит после запроса к таблице с полным расписанием, где изымается весь список групп на заданный пользователем факультет и курс:

middlewareUserData.updateCourse(message.text[:1], str(message.chat.id)) fucAndCourse = middlewareUserData.getFacultyAndGroup(str(message.chat.id)) groupList = selectData.selectGroup(fucAndCourse[0], fucAndCourse[1]) basicMarkupRows.markRowGroupList(groupList, message)

4. Кнопка «На сегодня» или «На завтра», код которой содержит актуальный набор дат (сегодня, завтра, индекс сегодняшнего дня), проверку ввода от пользователя (база данных одна для всех, необходимо взять результат определенного пользователя) и само отображение расписания (github.com):

day = selectData.selectDates() lastGroup = middlewareUserData.summaryVerification(str(message.chat.id)) bot.send_message(message.chat.id, «Расписание на сегодня ():».format(day[1])) message.text = printController.show(lastGroup, day[1]) bot.send_message(message.chat.id, message.text)

Иллюстрация поочередного заполнения таблицы к действиям пользователя:

Вернуться назад в предыдущее меню

Если вы внимательно читали предыдущий раздел, то обязательно обратили бы внимание на самый важный элемент таблицы — «empty». Функция возвращения назад отталкивается непосредственно от количества таких записей:

«Получить расписание» — формируется первоочередный объект вместе с четырьмя пустыми значениями (текстовое значение «empty»), потому что не выбран факультет, курс, группа и пункт финального меню (например, расписание на определенный день или подписка на группу);

Выбор факультета — уже на один «empty» меньше, выбор курса — уже на два.

Скрипт (github.com) определяет количество таких полей в строке таблицы для пользователя, зная заранее, к какому количеству какой метод из необходимых вызывать. Например, мы остановились на выборе курса, значит, мы совершили выбор факультета и у нас осталось три «пустых» значения:

if emptyCount == 3: backButton.cancelOperation(str(message.chat.id), 3) basicMarkupRows.markRowGetFacultyList(message)

Метод cancelOperation (github.com) определяет функцию, которая занимается очисткой поля, которое мы хотим отменить:

if self.emptyCount == 3: self.cancelFaculty(self.chatid)

Если вы ошиблись с факультетом, его нужно поменять. Под капотом ситуация следующая — по идентификатору пользователя меняем значение факультета (например, «Информационные технологии») на пустое значение («empty») через простой SQL-запрос «Update»:

def cancelFaculty(self, chatid): self.chatid = chatid self.cursor.execute(«UPDATE statistic SET faculty = (%s) WHERE id IN (SELECT max(id) FROM statistic WHERE chatid = (%s))», (’empty’, self.chatid)) self.connection.commit()

Достаточно изменить данные в таблице статистики, взять поле «факультет», где идентификатор поля таблицы является максимальным для определенного идентификатора пользователя (то есть выбор самого последней строчки таблицы для нужного пользователя — это текущее состояние меню и данных).

Подписка на расписание группы

Функция оформления доступа к расписанию группы на два дня с первого меню основана на одном внесении своей группы в таблицу, то есть необходимо выбрать желаемую группу и подтвердить подписку, которая доступна в самом последнем меню (github.com).

if message.text == «Подписаться на эту группу»: middlewareUserData.subscribe(message.chat.first_name, message.chat.last_name, message.chat.id, lastGroup, message.chat.username) message.text = ‘Вы подписались на группу .’.format(lastGroup) bot.send_message(message.chat.id, message.text)

Функция subscribe() (github.com) вставляет в отдельную, не связанную с остальными таблицу хранения подписок знакомые нам данные, но самыми главными являются идентификатор и сама группа.

def subscribe(self, firstname, lastname, chatid, group, username): * селф-переменные* self.cursor.execute(«INSERT INTO subscribers (firstname, lastname, chatid, groupa, username) VALUES (%s, %s, %s, %s, %s)», (self.firstname, self.lastname, self.chatid, self.group, self.username)) self.connection.commit()

Запланированные работы на сервере

Простая в использовании библиотека APScheduler, прекрасно совместимая с платформой, на которой расположено приложение, позволяет планировать разнообразные задачи на выполнение в определенное время.

Мой бот нуждается в ежедневном обновлении расписания пар и сегодняшних и завтрашних дат, которые успешно доступны через функцию в коде ниже. Так как сервер расположен в другом часовом поясе, мне необходимо отнять от нужного времени два часа (обновления у меня происходят в 00:01). С понедельника по пятницу изымается информация на текущую неделю, в воскресенье (индекс дня равен пяти) — на следующую.

Исходный код (github.com) не является реально действующим в боевых условиях и пока дорабатывается, но концепция определена верно (на 15.12 исправлено).

Работа с базами данных

Платформа Heroku позволяет непосредственно работать с базами данных из родной консоли (Linux Ubuntu 16.04) или же получать доступ через SQL Shell (Windows 7), предварительно вводя данные по типу паролей и логинов.

Серверная часть бота, связанная с базами данных, ограничена простыми SQL-запросами (например, select, insert, update), а необходимость создания и удаления таблиц соответствующими командами create и drop.

Выводы

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

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

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

  • Telegram bots
  • pyTelegramBotAPI
  • Heroku Cloud Platform
  • пет-проект
  • SQL
Еще по теме:  Как активировать экспорт чата на новом устройстве в Телеграмме

Источник: habr.com

Intercrus/ScheduleBotTelegram

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Бот для Telegram, который отправляет расписание пар Петрозаводского кооперативного техникума. Бот написан на Python с использованием библиотеки aiogram и базы данных PostgreSQL.

  1. Клонируйте репозиторий
  2. В /ScheduleBotTelegram/ добавьте файл .env (рядом с app.py и loader.py) (путь к .env: /ScheduleBotTelegram/.env )
  3. Настройте .env:

BOT_TOKEN= 123123asdbahsbdhb # Токен вашего бота ADMIN_ID= 6736732864 # Ваш ID в Telegram ip= 17.01.20.10 # Ваш IP PG_USER= postgres # Ваш пользователь в PostgreSQL PG_PASSWORD=passwd # Ваш пароль от пользователя postgresql DATABASE=gino # Ваша база данных в PostgreSQL

  1. В /ScheduleBotTelegram/data/ добавьте ключ-пару от гугл таблиц в формате .json. Как получить эту ключ-пару объяснено в этом видео: https://www.youtube.com/watch?v=Bf8KHZtcxnA/home/alien/PycharmProjects/ScheduleBotTelegram/data/name_groups.txt»)
    1. Скачать PostgreSQL и зайти в pgAdmin. Там создать сервер с такими настройками (если вы используете Windows, то host отличается):

    1. Установить модули, которые использует бот. Они находятся в /ScheduleBotTelegram/requirements.txt
    2. Запустить app.py

    Установка на сервер

    Я буду рассматривать установку на примере Amazon AWS EC2 с использованием docker.

    1. Создайте аккаунт на aws.amazon
    2. Создайте instance (я рассматриваю instance ubuntu)
    3. Network также добавьте PostgreSQL с любым ip
    4. Подключитесь к серверу с помощью команды:

    Если не получилось подключиться (выдает ошибку Permission Denied) попробуйте изменить права:

    chmod 600 /путь к ключу/

    Если и это не помогло, то гугл в помощь.

    1. Загрузите файлы бота на сервер:

    /home/ubuntu — директория на сервере, куда будут скопированы файлы бота После копирования выглядеть будет так: /home/ubuntu/ScheduleBotTelegram

    1. Измените пути к файлам name_groups.txt и key.json вот так:

    file_name_group = open(«/src/data/name_groups.txt»)

    То же самое и для ключа. То есть вместо /home/ubuntu/PycharmProjects/ScheduleBotTelegram/ мы пишем /src/

    1. в .env измените строчку:

    ip: db

    1. Установите docker-compose на инстанс:

    sudo apt-get update sudo apt-get install docker docker-compose

    1. Находясь в /home/ubuntu/ScheduleBotTelegram (путь к /ScheduleBotTelegram ) напишите команду:

    sudo docker-compose up

    После этого бот должен запуститься. Если этого не произошло,то смотрите логи и исправляйте обычные файлы или файл .env. После изменений файлов контейнер можно пересобрать: sudo docker-compose up —build

    1. Чтобы увидеть базу данных, в которую летят юзеры, нужно через PostgreSQL создать сервер, в котором указывается ip инстанса Amazon. Паролем является тот пароль, который указан в .env

    Как работает бот и в целом происходит парсинг

    1. Бот парсит этот сайт https://koopteh.onego.ru/student/lessons/ и достает оттуда ссылки на гугл таблицы. В зависимости от даты парсится нужная таблица
    2. С помощью Google Sheets API парсит таблицу и достает значения
    3. При помощи регулярных выражений и циклов отправляет отформатированное расписание

    . ├── data │ ├── __init__.py │ └── key.json # Ключ-пара от Google Sheets │ └── config.py # Туда загружаются переменные окружения (токен бота, id админа, postgresql и т.д.) │ └── name_groups.txt # Названия всех групп │ ├── filters # Фильтры для хендлеров (фильтрация апдейтов) │ └── __init__.py │ ├── handlers # Хендлеры (обработчики апдейтов) │ ├── channels # Хендлеры для каналов │ │ └── __init__.py │ └── errors # Хендлеры ошибок │ │ ├── __init__.py │ │ └── error_handler.py │ └── groups # Хендлеры для групп │ │ └── __init__.py │ └── users # Хендлеры для пользователей │ │ ├── __init__.py │ │ └── help.py # Команда /help │ │ └── main_menu_search_button.py # Кнопка │ │ └── main_menu_setup_button.py # Кнопка │ │ └── main_menu_today_and_tomorrow_buttons.py # Кнопки , , │ │ └── search_groups.py # «Регистрация» пользователя │ │ └── start.py # Команда /start │ └── __init__.py │ ├── keyboards # Клавиатуры │ ├── default # Обычные клавиатуры │ │ ├── __init__.py │ │ └── main_menu.py # Клавиатура главного меню с кнопками , , , , │ └── inline # Inline-клавиатуры │ │ ├── __init__.py │ │ └── cancel_button_callback.py # Коллбек кнопки │ │ └── cancel_button_inline.py # Кнопка │ │ └── search_button_inline.py # Кнопка │ │ └── search_callback.py # Коллбек кнопки │ │ └── setup_button_inline.py # Кнопка │ │ └── setup_callback.py # Коллбек кнопки │ └── __init__.py │ ├── middlewares # Промежуточные программы, они влияют на то, что попадает в хендлер. │ ├── __init__.py │ └── throttling.py # Защита от флуда │ ├── states # Состояния для машины состояний (FSM) │ ├── __init__.py │ └── botStates.py # Машина состояний для «регистрации» и некоторых хендлеров │ ├── utils # Вспомогательные модули │ ├── db_api # Работа с базой данных │ │ ├── schemas │ │ │ ├── __init__.py │ │ │ └── user.py # Создание таблицы │ │ └── __init__.py │ │ └── db_gino.py # База данных gino │ │ └── quick_commands.py # Функции для работы с базой данных (например обновление названия группы для пользователя) │ └── misc │ │ ├── __init__.py │ │ └── logging.py # Логирование │ │ └── throttling.py # Функция rate_limit для троттлинга │ └── redis # Константы для работы с redis │ │ ├── __init__.py │ │ └── consts.py │ └── __init__.py │ └── data_util.py # Парсинг │ └── notify_admins.py # Сообщения для админов │ └── scheduler.py # Реализация подписки на расписание │ └── set_bot_commands.py # Список команд бота │ ├── .env # Переменные окружения (токен бота, id админа, postgresql и т.д.) ├── .gitignore ├── app.py # Главный файл. В этом файле запускается работа бота.

    Через этот файл и запускается сам бот ├── docker-compose.yml # Файл для docker-compose ├── Dockerfile # Файл для docker ├── loader.py # Второй главный файл. В этот файл все импортируется, в нем содержатся главные переменные ├── README.md └── requirements.txt # Зависимости (модули), которые необходимы для работы бота.

    Файлы init.py нужны для правильного импорта модулей.

    Источник: github.com

Рейтинг
( Пока оценок нет )
Загрузка ...