├── .gitattributes ├── .gitignore ├── .gitlab-ci.yml ├── Dockerfile ├── Dockerfile.Heroku ├── README.md ├── example.start.cmd ├── heroku.yml └── src ├── appsettings.json ├── controllers ├── Home.os └── status.os ├── main.os ├── model ├── classes │ └── .gitkeep ├── modules │ ├── Команды.os │ ├── НастройкиПриложения.os │ └── ОбщегоНазначения.os └── package-loader.os ├── packagedef └── wwwroot ├── .gitkeep └── logs └── .gitkeep /.gitattributes: -------------------------------------------------------------------------------- 1 | *.bsl eol=crlf 2 | *.os eol=crlf 3 | *.sh eol=lf 4 | *.bat eol=crlf 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | src/wwwroot/*.xml 2 | *.log 3 | *.ospx 4 | /oscript_modules/ 5 | 6 | coverage/stat\.json 7 | 8 | bdd-exec\.xml 9 | 10 | coverage/ 11 | diff.txt 12 | start.cmd 13 | 14 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - deploy 3 | 4 | deploy: 5 | stage: deploy 6 | script: 7 | - git remote add heroku https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git 8 | - git push -f heroku master 9 | artifacts: 10 | when: on_failure 11 | paths: 12 | - . 13 | expire_in: 1 day 14 | only: 15 | - master 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM evilbeaver/oscript-web:dev 2 | 3 | COPY src /app -------------------------------------------------------------------------------- /Dockerfile.Heroku: -------------------------------------------------------------------------------- 1 | FROM pallid/oscript-web-heroku:dev 2 | 3 | COPY src /app 4 | 5 | ARG TELEGRAM_BOT_TOKEN 6 | ARG LOGGING_LEVEL 7 | ARG LOGGING_CONSOLE 8 | 9 | # Ставим зависимости указанные в packagedef 10 | RUN curl -o deb oscript.io/Downloads/latest/deb && dpkg -i deb && cd /app && opm install -l -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # example-telegrambot 2 | Пример реализации telegram bot на oscript.web 3 | 4 | [Демо бот](https://t.me/oswebbot?start) 5 | 6 | [Библиотека telegrambot](https://github.com/pallid/telegrambot) 7 | -------------------------------------------------------------------------------- /example.start.cmd: -------------------------------------------------------------------------------- 1 | 2 | REM Для отладки 3 | REM SET TELEGRAM_ADDRESS=https://myproxyaddres 4 | SET TELEGRAM_BOT_TOKEN=my-telegram-token 5 | SET TELEGRAM_MESSAGE_FORMAT=Markdown 6 | 7 | REM SET BACKENDLESS_ADDRESS=https://myproxyaddres 8 | REM SET BACKENDLESS_APP_ID=my-backendeless-app-id 9 | REM SET BACKENDLESS_APP_TOKEN=my-backendeless-token 10 | 11 | SET LOGGING_LEVEL=DEBUG 12 | SET LOGGING_CONSOLE=true 13 | 14 | cd /d c:\projects\example_telegrambot\src 15 | C:\osweb-night\OneScript.WebHost.exe -------------------------------------------------------------------------------- /heroku.yml: -------------------------------------------------------------------------------- 1 | build: 2 | docker: 3 | web: Dockerfile.Heroku 4 | config: 5 | TELEGRAM_BOT_TOKEN: $TELEGRAM_BOT_TOKEN 6 | LOGGING_LEVEL: $LOGGING_LEVEL 7 | LOGGING_CONSOLE: $LOGGING_CONSOLE 8 | 9 | run: 10 | web: mono /var/osp.net/OneScript.WebHost.exe --urls http://*:$PORT -------------------------------------------------------------------------------- /src/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "BackgroundJobs":{ 3 | "StorageType":"Memory" 4 | } 5 | } -------------------------------------------------------------------------------- /src/controllers/Home.os: -------------------------------------------------------------------------------- 1 | #Использовать telegrambot 2 | #Использовать json 3 | 4 | перем Бот; 5 | перем Лог; 6 | 7 | Функция Index() Экспорт 8 | 9 | Лог = НастройкиПриложения.Лог; 10 | Лог.Отладка("Путь запроса - %1", ЗапросHttp.Путь); 11 | 12 | Бот = НастройкиПриложения.Бот; 13 | 14 | Если НЕ ЗапросHttp.Путь = "/bot" + Бот.ТокенАвторизации Тогда 15 | Ответ = Новый РезультатДействияСодержимое(); 16 | Ответ.КодСостояния = 200; 17 | Ответ.ТипСодержимого = "application/json;charset=UTF-8"; 18 | Ответ.Содержимое = "{Hi, i`m telegram-bot}"; 19 | Возврат Ответ; 20 | КонецЕсли; 21 | 22 | Данные = ЗапросHttp.ПолучитьТелоКакПоток(); 23 | ОбъектЗапрос = ОбщегоНазначения.ПолучитьОбъектТелаЗапроса(Данные); 24 | 25 | Лог.Отладка("Объект запроса - %1", ОбъектЗапрос); 26 | 27 | Если ОбъектЗапрос["message"] <> Неопределено Тогда 28 | 29 | Лог.Отладка("Текст сообщения - %1", ОбъектЗапрос["message"]["text"]); 30 | Результат = ОбработатьОбычноеСообщение(ОбъектЗапрос); 31 | 32 | КонецЕсли; 33 | 34 | Если ОбъектЗапрос["callback_query"] <> Неопределено Тогда 35 | 36 | Лог.Отладка("Текст коллбека - %1", ОбъектЗапрос["callback_query"]["message"]["text"]); 37 | Результат = ОбработатьКоллбекСообщение(ОбъектЗапрос); 38 | 39 | КонецЕсли; 40 | 41 | Ответ = Новый РезультатДействияСодержимое(); 42 | Ответ.КодСостояния = 200; 43 | Ответ.ТипСодержимого = "application/json;charset=UTF-8"; 44 | Ответ.Содержимое = Результат["ok"]; 45 | 46 | Возврат Ответ; 47 | 48 | КонецФункции 49 | 50 | Функция ОбработатьОбычноеСообщение(ОбъектЗапрос) 51 | 52 | ТекстСообщения = ОбъектЗапрос["message"]["text"]; 53 | ПолучательИД = ОбъектЗапрос["message"]["chat"]["id"]; 54 | СообщениеИД = ОбъектЗапрос["message"]["message_id"]; 55 | КонтактныеДанные = ОбъектЗапрос["message"]["contact"]; 56 | ДанныеГеолокации = ОбъектЗапрос["message"]["location"]; 57 | 58 | Если ТекстСообщения = "/start" ИЛИ ТекстСообщения = "/help" Тогда 59 | 60 | ТекстСообщения = "Привет, в низу меню для навигации"; 61 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 62 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.ГлавноеМеню()); 63 | Возврат Бот.Отправить(Сообщение); 64 | 65 | КонецЕсли; 66 | 67 | Если ТекстСообщения = "Главное меню" Тогда 68 | 69 | ТекстСообщения = "В низу меню для навигации"; 70 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 71 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.ГлавноеМеню()); 72 | Возврат Бот.Отправить(Сообщение); 73 | 74 | КонецЕсли; 75 | 76 | Если ТекстСообщения = "Клавиатуры" тогда 77 | 78 | ТекстСообщения = "Здесь показываются примеры расположения кнопок в клавиатуре"; 79 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 80 | ТелеграмАПИ.УстановитьФорматСообщения(Сообщение, Бот.ФорматСообщений); 81 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.МенюКлавиатуры()); 82 | Возврат Бот.Отправить(Сообщение); 83 | 84 | КонецЕсли; 85 | 86 | Если ТекстСообщения = "Три-одна-одна кнопки в ряд" тогда 87 | 88 | ТекстСообщения = "Это пример расположения кнопок Три-одна-одна в ряд"; 89 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 90 | ТелеграмАПИ.УстановитьФорматСообщения(Сообщение, Бот.ФорматСообщений); 91 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.МенюТриОдинОдин()); 92 | Возврат Бот.Отправить(Сообщение); 93 | 94 | конецЕсли; 95 | 96 | Если ТекстСообщения = "Пять кнопок по вертикали" тогда 97 | 98 | ТекстСообщения = "Это пример расположения кнопок пяти кнопок по вертикали"; 99 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 100 | ТелеграмАПИ.УстановитьФорматСообщения(Сообщение, Бот.ФорматСообщений); 101 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.МенюПятьКнопокПоВертикали()); 102 | Возврат Бот.Отправить(Сообщение); 103 | 104 | конецЕсли; 105 | 106 | Если ТекстСообщения = "Кнопка" тогда 107 | 108 | ТекстСообщения = "Ты нажал на кнопку с надписью **Кнопка**"; 109 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 110 | ТелеграмАПИ.УстановитьФорматСообщения(Сообщение, Бот.ФорматСообщений); 111 | Возврат Бот.Отправить(Сообщение); 112 | 113 | конецЕсли; 114 | 115 | Если ТекстСообщения = "Инлайн" тогда 116 | 117 | // доставим нужную клавиатуру 118 | ТекстСообщения = "Демонстрация инлайн клавиатуры"; 119 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 120 | Сообщение.Вставить("reply_markup", Команды.МенюИнлайн()); 121 | Результат = Бот.Отправить(Сообщение); 122 | 123 | ТекстСообщения = "Ниже этой надписи расположены инлайн кнопки"; 124 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 125 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.ИнлайнКнопки()); 126 | 127 | Возврат Бот.Отправить(Сообщение); 128 | 129 | конецЕсли; 130 | 131 | Если КонтактныеДанные <> Неопределено Тогда 132 | 133 | Телефон = КонтактныеДанные["phone_number"]; 134 | Лог.Отладка("Телефон из контактных данных - %1", Телефон); 135 | 136 | Шаблон = "Ваши телефон определен как: 137 | |%1"; 138 | ТекстСообщения = СтрШаблон(Шаблон, Телефон); 139 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 140 | Возврат Бот.Отправить(Сообщение); 141 | 142 | КонецЕсли; 143 | 144 | Если ДанныеГеолокации <> Неопределено Тогда 145 | 146 | Широта = ДанныеГеолокации["latitude"]; 147 | Долгота = ДанныеГеолокации["longitude"]; 148 | 149 | Лог.Отладка("Широта - %1, Долгота -%2", Широта, Долгота); 150 | 151 | Шаблон = "Ваши координаты определены как: 152 | |долгота %1 широта %2"; 153 | ТекстСообщения = СтрШаблон(Шаблон, Долгота, Широта); 154 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 155 | Возврат Бот.Отправить(Сообщение); 156 | 157 | КонецЕсли; 158 | 159 | // если ничего из того что заложено в логике 160 | // возвращаем главное меню 161 | ТекстСообщения = "Давайте попробуем сначала, в низу меню для навигации"; 162 | Сообщение = ТелеграмАПИ.НовоеСообщение(ПолучательИД, ТекстСообщения); 163 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.ГлавноеМеню()); 164 | 165 | Возврат Бот.Отправить(Сообщение); 166 | 167 | КонецФункции 168 | 169 | Функция ОбработатьКоллбекСообщение(ОбъектЗапрос) 170 | 171 | ТекстСообщения = ОбъектЗапрос["callback_query"]["message"]["text"]; 172 | ПолучательИД = ОбъектЗапрос["callback_query"]["message"]["chat"]["id"]; 173 | СообщениеИД = ОбъектЗапрос["callback_query"]["message"]["message_id"]; 174 | ДанныеКоллбека = ОбъектЗапрос["callback_query"]["data"]; 175 | 176 | Лог.Отладка("Данные коллбека - %1", ДанныеКоллбека); 177 | 178 | Сообщение = ТелеграмАПИ.НовыйКоллбекОтвет(ПолучательИД, СообщениеИД); 179 | 180 | Если СтрНачинаетсяС(ДанныеКоллбека, "Картинка=") Тогда 181 | 182 | СтрокаКартинкаИД = Сред(ДанныеКоллбека, 10); 183 | 184 | СтруктураОписанияКартинки = новый Структура("Описание, СсылкаНаИзображение"); 185 | 186 | Если СтрокаКартинкаИД = "1" Тогда 187 | СтруктураОписанияКартинки.Описание = "текст с описанием картинки №1 в демо"; 188 | СтруктураОписанияКартинки.СсылкаНаИзображение = "https://w-dog.ru/wallpapers/2/7/479565441611455.jpg"; 189 | Иначе 190 | СтруктураОписанияКартинки.Описание = "текст с описанием картинки №2 в демо"; 191 | СтруктураОписанияКартинки.СсылкаНаИзображение = "https://mining-cryptocurrency.ru/wp-content/uploads/Telegram.jpg"; 192 | КонецЕсли; 193 | 194 | Шаблон = "**Наименование: картинка №%1** 195 | |Описание: %2 196 | |%3"; 197 | ОписаниеКартинки = СтрШаблон(Шаблон, СтрокаКартинкаИД, СтруктураОписанияКартинки.Описание, СтруктураОписанияКартинки.СсылкаНаИзображение); 198 | 199 | ТелеграмАПИ.РедактироватьТекст(Сообщение, ОписаниеКартинки); 200 | ТелеграмАПИ.УстановитьФорматСообщения(Сообщение, Бот.ФорматСообщений); 201 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.ИнлайнКартинка()); 202 | 203 | ИначеЕсли СтрНачинаетсяС(ДанныеКоллбека, "Оповещение") Тогда 204 | 205 | Уведомление = ТелеграмАПИ.НовыйКоллбекОтветНаЗапрос(ОбъектЗапрос["callback_query"]["id"], "Ты нажал кнопку оповещение"); 206 | Бот.ОправитьОтветНаКоллбекЗапрос(Уведомление); 207 | 208 | ИначеЕсли ДанныеКоллбека = "" ИЛИ СтрНачинаетсяС(ДанныеКоллбека, "Инлайн") Тогда 209 | 210 | ТекстСообщения = "Ниже этой надписи расположены инлайн кнопки"; 211 | ТелеграмАПИ.РедактироватьТекст(Сообщение, ТекстСообщения); 212 | ТелеграмАПИ.УстановитьФорматСообщения(Сообщение, Бот.ФорматСообщений); 213 | ТелеграмАПИ.ДобавитьКлавиатуру(Сообщение, Команды.ИнлайнКнопки()); 214 | 215 | КонецЕсли; 216 | 217 | Возврат Бот.ОтредактироватьСообщение(Сообщение); 218 | 219 | КонецФункции 220 | -------------------------------------------------------------------------------- /src/controllers/status.os: -------------------------------------------------------------------------------- 1 | 2 | Функция Index() Экспорт 3 | 4 | Лог = НастройкиПриложения.Лог; 5 | Лог.Отладка("Проверка статуса"); 6 | Лог.Отладка("Метод - %1", ЗапросHttp.Метод); 7 | Лог.Отладка("Путь запроса - %1", ЗапросHttp.Путь); 8 | 9 | Данные = ПолучитьСтатусПриложения(); 10 | 11 | Ответ = Новый РезультатДействияСодержимое(); 12 | Ответ.КодСостояния = 200; 13 | Ответ.ТипСодержимого = "application/json;charset=UTF-8"; 14 | Ответ.Содержимое = Данные; 15 | 16 | Возврат Ответ; 17 | 18 | КонецФункции 19 | 20 | Функция ПолучитьСтатусПриложения() 21 | 22 | Соответствие = Новый Соответствие; 23 | 24 | Соответствие.Вставить("name", "example-telegrambot"); 25 | Соответствие.Вставить("status", "ok"); 26 | Соответствие.Вставить("now", ТекущаяУниверсальнаяДатаВМиллисекундах()); 27 | Соответствие.Вставить("now2", ТекущаяДата()); 28 | Соответствие.Вставить("version", НастройкиПриложения.Версия); 29 | 30 | Парсер = НастройкиПриложения.Парсер; 31 | 32 | Результат = Парсер.ЗаписатьJSON(Соответствие); 33 | 34 | Возврат Результат; 35 | 36 | КонецФункции 37 | -------------------------------------------------------------------------------- /src/main.os: -------------------------------------------------------------------------------- 1 | #Использовать "model" 2 | 3 | Перем ТокенБота; 4 | 5 | Процедура ПриНачалеРаботыСистемы() 6 | 7 | НастройкиПриложения.Иницилизация(); 8 | ТокенБота = НастройкиПриложения.Бот.ТокенАвторизации; 9 | 10 | ИспользоватьСтатическиеФайлы(); 11 | ИспользоватьМаршруты("ОпределениеМаршрутов"); 12 | 13 | КонецПроцедуры 14 | 15 | Процедура ОпределениеМаршрутов(КоллекцияМаршрутов) 16 | 17 | КоллекцияМаршрутов.Добавить("Основной","bot" + ТокенБота + "/{controller=home}/{action=index}/"); 18 | КоллекцияМаршрутов.Добавить("Статус","{controller=status}/{action=index}/"); // для мониторинга 19 | 20 | КонецПроцедуры 21 | -------------------------------------------------------------------------------- /src/model/classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallid/example-telegrambot/2c7bdf4239da506cf9d63874c865173bb1c127fb/src/model/classes/.gitkeep -------------------------------------------------------------------------------- /src/model/modules/Команды.os: -------------------------------------------------------------------------------- 1 | #Использовать telegrambot 2 | 3 | Функция ГлавноеМеню() Экспорт 4 | 5 | КомандаКлавиатуры = ТелеграмАПИ.НоваяКнопка("Клавиатуры"); 6 | КомандаИнлайн = ТелеграмАПИ.НоваяКнопка("Инлайн"); 7 | 8 | ПервыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаКлавиатуры, КомандаИнлайн); 9 | 10 | КомандаГеолокация = ТелеграмАПИ.НоваяКнопкаОтправитьМестоположение("Геолокация"); 11 | КомандаКонтакты = ТелеграмАПИ.НоваяКнопкаОтправитьКонтакт("Контакты"); 12 | 13 | ВторойРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаГеолокация, КомандаКонтакты); 14 | 15 | МассивРядов = ТелеграмАПИ.ПолучитьМассивРядовДляКлавиатуры(ПервыйРяд, ВторойРяд); 16 | 17 | Возврат ТелеграмАПИ.ПолучитьКлавиатуру(МассивРядов); 18 | 19 | КонецФункции 20 | 21 | Функция МенюКлавиатуры() Экспорт 22 | 23 | Команда1 = ТелеграмАПИ.НоваяКнопка("Три-одна-одна кнопки в ряд"); 24 | Команда2 = ТелеграмАПИ.НоваяКнопка("Пять кнопок по вертикали"); 25 | ПервыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(Команда1, Команда2); 26 | 27 | КомандаГлавноеМеню = ТелеграмАПИ.НоваяКнопка("Главное меню"); 28 | ВторойРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаГлавноеМеню); 29 | 30 | МассивРядов = ТелеграмАПИ.ПолучитьМассивРядовДляКлавиатуры(ПервыйРяд, ВторойРяд); 31 | 32 | Возврат ТелеграмАПИ.ПолучитьКлавиатуру(МассивРядов); 33 | 34 | КонецФункции 35 | 36 | Функция МенюТриОдинОдин() Экспорт 37 | 38 | Команда = ТелеграмАПИ.НоваяКнопка("Кнопка"); 39 | ПервыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(Команда, Команда, Команда); 40 | 41 | КомандаКлавиатуры = ТелеграмАПИ.НоваяКнопка("Клавиатуры"); 42 | ВторойРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаКлавиатуры); 43 | 44 | КомандаГлавноеМеню = ТелеграмАПИ.НоваяКнопка("Главное меню"); 45 | ТретийРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаГлавноеМеню); 46 | 47 | МассивРядов = ТелеграмАПИ.ПолучитьМассивРядовДляКлавиатуры(ПервыйРяд, ВторойРяд, ТретийРяд); 48 | 49 | Возврат ТелеграмАПИ.ПолучитьКлавиатуру(МассивРядов); 50 | 51 | КонецФункции 52 | 53 | Функция МенюПятьКнопокПоВертикали() Экспорт 54 | 55 | Команда = ТелеграмАПИ.НоваяКнопка("Кнопка"); 56 | ПервыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(Команда); 57 | ВторойРяд = ТелеграмАПИ.ПолучитьРядКнопок(Команда); 58 | ТретийРяд = ТелеграмАПИ.ПолучитьРядКнопок(Команда); 59 | 60 | КомандаКлавиатуры = ТелеграмАПИ.НоваяКнопка("Клавиатуры"); 61 | ЧетвертыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаКлавиатуры); 62 | 63 | КомандаГлавноеМеню = ТелеграмАПИ.НоваяКнопка("Главное меню"); 64 | ПятыйРяд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаГлавноеМеню); 65 | 66 | МассивРядов = ТелеграмАПИ.ПолучитьМассивРядовДляКлавиатуры(ПервыйРяд, ВторойРяд, ТретийРяд, ЧетвертыйРяд, ПятыйРяд); 67 | 68 | Возврат ТелеграмАПИ.ПолучитьКлавиатуру(МассивРядов); 69 | 70 | КонецФункции 71 | 72 | Функция МенюИнлайн() Экспорт 73 | 74 | КомандаГлавноеМеню = ТелеграмАПИ.НоваяКнопка("Главное меню"); 75 | Ряд = ТелеграмАПИ.ПолучитьРядКнопок(КомандаГлавноеМеню); 76 | 77 | МассивРядов = ТелеграмАПИ.ПолучитьМассивРядовДляКлавиатуры(Ряд); 78 | 79 | Возврат ТелеграмАПИ.ПолучитьКлавиатуру(МассивРядов); 80 | 81 | КонецФункции 82 | 83 | Функция ИнлайнКнопки() Экспорт 84 | 85 | МассивРядов = Новый Массив; 86 | 87 | Для Каждого СтрокаМассива из ПолучитьМассивИнлайнКнопок() Цикл 88 | 89 | КомандаКаталога = ТелеграмАПИ.НоваяКоллбекКнопка(СтрокаМассива.ТекстКнопки, СтрокаМассива.Коллбек); 90 | РядКнопок = ТелеграмАПИ.ПолучитьРядКнопок(КомандаКаталога); 91 | МассивРядов.Добавить(РядКнопок); 92 | 93 | КонецЦикла; 94 | 95 | КомандаСсылка = ТелеграмАПИ.НоваяУРЛКнопка("Ссылка", "https://ya.ru"); 96 | РядКнопок = ТелеграмАПИ.ПолучитьРядКнопок(КомандаСсылка); 97 | МассивРядов.Добавить(РядКнопок); 98 | 99 | Возврат ТелеграмАПИ.ПолучитьИнлайнКлавиатуру(МассивРядов); 100 | 101 | КонецФункции 102 | 103 | Функция ПолучитьМассивИнлайнКнопок() 104 | 105 | Массив = Новый Массив; 106 | 107 | ПоляСтруктуры = "ТекстКнопки, Коллбек"; 108 | 109 | Структура = Новый Структура(ПоляСтруктуры, "Картинка", "Картинка=1"); 110 | Массив.Добавить(Структура); 111 | 112 | Структура = Новый Структура(ПоляСтруктуры, "Еще картинка", "Картинка=2"); 113 | Массив.Добавить(Структура); 114 | 115 | Структура = Новый Структура(ПоляСтруктуры, "Оповещение", "Оповещение"); 116 | Массив.Добавить(Структура); 117 | 118 | Возврат Массив; 119 | 120 | КонецФункции 121 | 122 | Функция ИнлайнКартинка() Экспорт 123 | 124 | МассивРядов = Новый Массив; 125 | 126 | КомандаВозврат = ТелеграмАПИ.НоваяКоллбекКнопка("Вернуться", "Инлайн"); 127 | РядКнопок = ТелеграмАПИ.ПолучитьРядКнопок(КомандаВозврат); 128 | МассивРядов.Добавить(РядКнопок); 129 | 130 | Возврат ТелеграмАПИ.ПолучитьИнлайнКлавиатуру(МассивРядов); 131 | 132 | КонецФункции -------------------------------------------------------------------------------- /src/model/modules/НастройкиПриложения.os: -------------------------------------------------------------------------------- 1 | #Использовать telegrambot 2 | #Использовать json 3 | #Использовать logos 4 | 5 | Перем Бот Экспорт; 6 | 7 | Перем Лог Экспорт; 8 | Перем Парсер Экспорт; 9 | 10 | Перем Версия Экспорт; 11 | 12 | Перем ИмяЛогаПриложения; 13 | Перем ПутьКФайлуЖурналаПриложения; 14 | 15 | Функция Иницилизация() Экспорт 16 | 17 | ИмяЛогаПриложения = "oscript.webapp.telegrambot"; 18 | ПутьКФайлуЖурналаПриложения = "./wwwroot/logs/webapp.telegrambot.log"; 19 | 20 | Парсер = Новый ПарсерJSON; 21 | 22 | ВыполнитьНастройкиЛогированияПриложения(); 23 | Лог.Информация("/// - ЗАПУСК ПРИЛОЖЕНИЯ - ///"); 24 | 25 | ИницилизацияБота(); 26 | ПолучитьВерсиюПриложения(); 27 | 28 | КонецФункции 29 | 30 | Функция ИницилизацияБота() Экспорт 31 | 32 | Б = Новый ТелеграмБот; 33 | 34 | пТелеграмАдрес = ПолучитьПеременнуюСреды("TELEGRAM_ADDRESS"); 35 | Лог.Отладка("Переменная ТелеграмАдрес - %1", пТелеграмАдрес); 36 | Если пТелеграмАдрес <> Неопределено Тогда 37 | Б.УстановитьАдресСервиса(пТелеграмАдрес); // прокси 38 | КонецЕсли; 39 | 40 | пТелеграмТокен = ПолучитьПеременнуюСреды("TELEGRAM_BOT_TOKEN"); 41 | Лог.Отладка("Переменная ТелеграмТокен - %1", пТелеграмТокен); 42 | Если пТелеграмТокен <> Неопределено Тогда 43 | Б.УстановитьТокенАвторизации(пТелеграмТокен); 44 | Иначе 45 | ВызватьИсключение "Не указан токен авторизации телеграм бота - TELEGRAM_BOT_TOKEN"; 46 | КонецЕсли; 47 | 48 | пТелеграмФормат = ПолучитьПеременнуюСреды("TELEGRAM_MESSAGE_FORMAT"); 49 | Лог.Отладка("Переменная ТелеграмФормат - %1", пТелеграмФормат); 50 | Если пТелеграмФормат <> Неопределено Тогда 51 | Б.УстановитьФорматСообщений(пТелеграмФормат); 52 | Иначе 53 | Б.УстановитьФорматСообщений("Markdown"); 54 | КонецЕсли; 55 | 56 | Бот = Б; 57 | 58 | КонецФункции 59 | 60 | Функция ПолучитьУровеньЛогированияПриложения() 61 | 62 | УровниЛогирования = Новый Соответствие; 63 | УровниЛогирования.Вставить("DEBUG", УровниЛога.Отладка); 64 | УровниЛогирования.Вставить("INFO", УровниЛога.Информация); 65 | УровниЛогирования.Вставить("WARNING", УровниЛога.Предупреждение); 66 | УровниЛогирования.Вставить("ERROR", УровниЛога.Ошибка); 67 | УровниЛогирования.Вставить("CRITICAL_ERROR", УровниЛога.КритичнаяОшибка); 68 | 69 | пУровеньЛогирования = ПолучитьПеременнуюСреды("LOGGING_LEVEL"); 70 | 71 | Если пУровеньЛогирования = Неопределено Тогда 72 | пУровеньЛогирования = "INFO"; 73 | КонецЕсли; 74 | 75 | пУровеньЛогирования = УровниЛогирования[пУровеньЛогирования]; 76 | 77 | Если пУровеньЛогирования = Неопределено Тогда 78 | ВызватьИсключение "Не установлен уровень логирования приложения"; 79 | КонецЕсли; 80 | 81 | Возврат пУровеньЛогирования; 82 | 83 | КонецФункции 84 | 85 | Функция ВыполнитьНастройкиЛогированияПриложения() 86 | 87 | Лог = Логирование.ПолучитьЛог(ИмяЛогаПриложения); 88 | 89 | ФайлЖурнала = Новый ВыводЛогаВФайл; 90 | ФайлЖурнала.ОткрытьФайл(ПутьКФайлуЖурналаПриложения); 91 | Лог.ДобавитьСпособВывода(ФайлЖурнала); 92 | 93 | пВыводитьЛогВКонсоль = ПолучитьПеременнуюСреды("LOGGING_CONSOLE"); 94 | Если пВыводитьЛогВКонсоль = Неопределено Тогда 95 | пВыводитьЛогВКонсоль = Ложь; 96 | КонецЕсли; 97 | 98 | Если пВыводитьЛогВКонсоль Тогда 99 | ВыводЛогаВКонсоль = Новый ВыводЛогаВКонсоль; 100 | Лог.ДобавитьСпособВывода(ВыводЛогаВКонсоль); 101 | КонецЕсли; 102 | 103 | пУровеньЛогирования = ПолучитьУровеньЛогированияПриложения(); 104 | Сообщить("Уровень логирования - "+пУровеньЛогирования, СтатусСообщения.Информация); 105 | 106 | Лог.УстановитьУровень(пУровеньЛогирования); 107 | 108 | Лог.УстановитьРаскладку(ЭтотОбъект); 109 | 110 | КонецФункции 111 | 112 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт 113 | 114 | Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение); 115 | 116 | КонецФункции 117 | 118 | Процедура ПолучитьВерсиюПриложения() 119 | 120 | АдресФайла = "./packagedef"; 121 | Чтение = Новый ЧтениеТекста(АдресФайла, КодировкаТекста.UTF8); 122 | Текст = Чтение.Прочитать(); 123 | Версия = ВыделитьВерсию(Текст); 124 | 125 | Лог.Информация("ВЕРСИЯ ПРИЛОЖЕНИЯ - %1", Версия); 126 | 127 | КонецПроцедуры 128 | 129 | Функция ВыделитьВерсию(Знач Данные) 130 | 131 | Лог.Отладка("Применяю регулярку к %1", Данные); 132 | РЕ = Новый РегулярноеВыражение("(\d{1,3}\.(\d{1,3}\.)*\d{1,3})"); 133 | Совпадения = РЕ.НайтиСовпадения(Данные); 134 | Если Совпадения.Количество() = 0 Тогда 135 | Возврат Неопределено; 136 | КонецЕсли; 137 | 138 | Совпадение = Совпадения[0].Группы[1]; 139 | Возврат Совпадение.Значение; 140 | 141 | КонецФункции 142 | 143 | -------------------------------------------------------------------------------- /src/model/modules/ОбщегоНазначения.os: -------------------------------------------------------------------------------- 1 | #Использовать json 2 | 3 | перем ПарсерJSON; 4 | 5 | Функция РазобратьПараметрыЗапроса(Знач Параметры) Экспорт 6 | 7 | Результат = Новый Соответствие; 8 | 9 | Пары = СтрРазделить(Сред(Параметры,2), "&"); 10 | Для Каждого Пара Из Пары Цикл 11 | Поз = СтрНайти(Пара, "="); 12 | Если Поз <> 0 Тогда 13 | Ключ = Лев(Пара, Поз-1); 14 | Значение = Сред(Пара, Поз+1); 15 | Результат.Вставить(Ключ, Значение); 16 | КонецЕсли; 17 | КонецЦикла; 18 | 19 | Возврат Результат; 20 | 21 | КонецФункции 22 | 23 | Функция ПолучитьОбъектТелаЗапроса(Данные) Экспорт 24 | 25 | Лог = НастройкиПриложения.Лог; 26 | 27 | ПотокЧтения = Данные.ПолучитьПотокТолькоДляЧтения(); 28 | Чтение = Новый ЧтениеДанных(ПотокЧтения); 29 | ДД = Чтение.Прочитать().ПолучитьДвоичныеДанные() ; 30 | ИмяФайла = ПолучитьИмяВременногоФайла(); 31 | файл = Новый Файл(ИмяФайла); 32 | ДД.Записать(ИмяФайла); 33 | 34 | Лог.Отладка("Имя временного файла - %1", ИмяФайла); 35 | 36 | Текст = Новый ТекстовыйДокумент; 37 | Текст.Прочитать(ИмяФайла, КодировкаТекста.UTF8); 38 | ТекстТелаЗапроса = Текст.ПолучитьТекст(); 39 | 40 | Лог.Отладка("Текст тела запроса - %1", ТекстТелаЗапроса); 41 | 42 | УдалитьФайлы(ИмяФайла); 43 | 44 | ОбъектЗапрос = ПарсерJSON.ПрочитатьJSON(ТекстТелаЗапроса); 45 | 46 | Возврат ОбъектЗапрос; 47 | 48 | КонецФункции 49 | 50 | Функция ПолучитьЦифрыТелефона(СтрокаТелефона) Экспорт 51 | 52 | Если ТипЗнч(СтрокаТелефона) <> Тип("Строка") Тогда 53 | Возврат ""; 54 | КонецЕсли; 55 | 56 | ЦифрыТелефона = ""; 57 | 58 | Для ПозицияСимвола = 1 По СтрДлина(СтрокаТелефона) Цикл 59 | КодСимвола = КодСимвола(Сред(СтрокаТелефона, ПозицияСимвола, 1)); 60 | Если КодСимвола >= 48 И КодСимвола <= 57 Тогда 61 | ЦифрыТелефона = ЦифрыТелефона + Символ(КодСимвола); 62 | КонецЕсли; 63 | КонецЦикла; 64 | 65 | Возврат ЦифрыТелефона; 66 | 67 | КонецФункции 68 | 69 | Функция ВремяВыполнения(Секунды) Экспорт 70 | 71 | Часов=Цел(Секунды/3600); 72 | СекОстМин= Секунды % 3600; 73 | Минут=Цел(СекОстМин/60); 74 | Сек=СекОстМин % 60; 75 | Если Часов<10 Тогда 76 | Часов="0"+СокрЛП(Часов); 77 | Иначе 78 | Часов=СокрЛП(Часов); 79 | КонецЕсли; 80 | Если Минут<10 Тогда 81 | Минут="0"+СокрЛП(Минут); 82 | Иначе 83 | Минут=СокрЛП(Минут); 84 | КонецЕсли; 85 | Если Сек<10 Тогда 86 | Сек="0"+СокрЛП(Сек); 87 | Иначе 88 | Сек=СокрЛП(Сек); 89 | КонецЕсли; 90 | 91 | Время=Часов+":"+Минут+":"+Сек; 92 | 93 | Возврат Время; 94 | 95 | КонецФункции 96 | 97 | ПарсерJSON = Новый ПарсерJSON; -------------------------------------------------------------------------------- /src/model/package-loader.os: -------------------------------------------------------------------------------- 1 | 2 | Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) 3 | 4 | СтандартнаяОбработка = Ложь; 5 | ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ); 6 | 7 | КонецПроцедуры 8 | 9 | Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ) 10 | 11 | КаталогКлассов = Новый Файл(ОбъединитьПути(Путь, "classes")); 12 | КаталогМодулей = Новый Файл(ОбъединитьПути(Путь, "modules")); 13 | 14 | Если КаталогКлассов.Существует() Тогда 15 | Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os"); 16 | Для Каждого Файл Из Файлы Цикл 17 | СтандартнаяОбработка = Ложь; 18 | ДобавитьКласс(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 19 | КонецЦикла; 20 | КонецЕсли; 21 | 22 | Если КаталогМодулей.Существует() Тогда 23 | Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os"); 24 | Для Каждого Файл Из Файлы Цикл 25 | СтандартнаяОбработка = Ложь; 26 | ДобавитьМодуль(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 27 | КонецЦикла; 28 | КонецЕсли; 29 | 30 | КонецПроцедуры -------------------------------------------------------------------------------- /src/packagedef: -------------------------------------------------------------------------------- 1 | Описание.Имя("example-telegrambot") 2 | .Версия("0.0.1") 3 | .ЗависитОт("logos") 4 | .ЗависитОт("json") 5 | .ЗависитОт("telegrambot"); -------------------------------------------------------------------------------- /src/wwwroot/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallid/example-telegrambot/2c7bdf4239da506cf9d63874c865173bb1c127fb/src/wwwroot/.gitkeep -------------------------------------------------------------------------------- /src/wwwroot/logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallid/example-telegrambot/2c7bdf4239da506cf9d63874c865173bb1c127fb/src/wwwroot/logs/.gitkeep --------------------------------------------------------------------------------