Форум программистов, компьютерный форум, киберфорум
nekit270
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Добро пожаловать, здесь я программирую бессмысленно и беспощадно

Создание Telegram-бота с помощью BAT-файлов

Запись от nekit270 размещена 07.01.2024 в 04:46
Показов 3049 Комментарии 3
Метки bat, batch, cmd, telegram, windows, бот

Не так давно на данном форуме я увидел мнение, что язык BAT-файлов ни к чему не приспособлен. Отчасти это так, но почему бы не приспособить его к такой задаче, как создание Telegram-ботов?

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

При разработке бота необходимо иметь:
  • Инструмент для выполнения HTTP-запросов к серверу API Telegram
  • Парсер JSON для обработки ответов от API

И если с первым все просто - есть встроенная в Windows утилита curl, то с парсером JSON пришлось повозиться. Стандартных утилит для парсинга JSON нет, да и поддержка регулярных выражений, в общем говоря, отсутствует (есть findstr, но он ищет только целые строки, а вот разбить строку уже не может).
Поэтому пришлось пойти на костыльный метод - использование циклов for и замены символов ради хоть какого-то получения параметров из JSON. Вложенность он игнорирует, но для меня этого вполне достаточно.

Собственно, функция для извлечения параметров:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:get_param [jsonstr] [prefix]
    set "rtmp=%~1"
    set "pref=%~2"
 
    set "rtmp=%rtmp:{=void,%"
    set "rtmp=%rtmp:}=%"
    set "rtmp=%rtmp:]=%"
    set "rtmp=%rtmp:[=%"
    set "rtmp=%rtmp:,=" "%"
    for %%i in ("%rtmp%") do (
        for /f "tokens=1,* delims=: eol=" %%j in ("%%~i") do (
            set "%pref%.%%j=%%k"
        )
    )
goto :eof
Функция для выполнения запроса:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
set "TOKEN=..."
set "req=https://api.telegram.org/bot%TOKEN%"
:: ...
:request [str] [out]
    set "mtd=%~1"
    set "mtd=%mtd: =+%"
    set "%~2="
    for /f "tokens=*" %%i  in ('curl -s "%req%/%mtd%"') do (
        set "%~2=!%~2!%%i"
    )
    set "%~2=!%~2:"=!"
goto :eof
Для простоты я решил сделать бота, который просто отвечает на любое сообщение пользователя таким же сообщением. Полный код:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
@echo off
setlocal EnableDelayedExpansion
 
set "TOKEN=..."
set "req=https://api.telegram.org/bot%TOKEN%"
 
set updcnt=0
 
:loop
    set rnd=%random%
    call :request "getUpdates?offset=%updcnt%" updtxt
    call :get_param "%updtxt%" upd_%rnd%
 
    if not "!upd_%rnd%.id!"=="" (
        echo.Got msg: !upd_%rnd%.id! "!upd_%rnd%.text!"
        set /a updcnt=!upd_%rnd%.update_id!+1
        call :sendmsg !upd_%rnd%.id! "!upd_%rnd%.text!"
    )
goto loop
 
exit /b
 
:sendmsg [id] [text]
    call :request "sendMessage?chat_id=%~1&text=%~2" _outnull
goto :eof
 
:request [str] [out]
    set "mtd=%~1"
    set "mtd=%mtd: =+%"
    set "%~2="
    for /f "tokens=*" %%i  in ('curl -s "%req%/%mtd%"') do (
        set "%~2=!%~2!%%i"
    )
    set "%~2=!%~2:"=!"
goto :eof
 
:get_param [jsonstr] [prefix]
    set "rtmp=%~1"
    set "pref=%~2"
 
    set "rtmp=%rtmp:{=void,%"
    set "rtmp=%rtmp:}=%"
    set "rtmp=%rtmp:]=%"
    set "rtmp=%rtmp:[=%"
    set "rtmp=%rtmp:,=" "%"
    for %%i in ("%rtmp%") do (
        for /f "tokens=1,* delims=: eol=" %%j in ("%%~i") do (
            set "%pref%.%%j=%%k"
        )
    )
goto :eof
(разметка форума не справилась с кодом, но он полностью рабочий)
Метки bat, batch, cmd, telegram, windows, бот
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Высший пилотаж!

    Вношу предложение - откройте рубрику - психоделическое программирование
    Запись от sqltd1 размещена 07.01.2024 в 05:48 sqltd1 вне форума
  2. Старый комментарий
    Аватар для nekit270
    Цитата Сообщение от sqltd1
    Высший пилотаж!

    Вношу предложение - откройте рубрику - психоделическое программирование
    Предложение принято, название очень подходит
    Запись от nekit270 размещена 07.01.2024 в 17:50 nekit270 вне форума
  3. Старый комментарий
    Аватар для AlexProgramm
    Жесть как сложно
    Запись от AlexProgramm размещена 10.01.2024 в 21:20 AlexProgramm вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru