PHPackages                             denisok94/telegram-bot - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. denisok94/telegram-bot

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

denisok94/telegram-bot
======================

php telegram bot

0.1.3(9mo ago)00MITPHPPHP ^8.3

Since Aug 15Pushed 7mo agoCompare

[ Source](https://github.com/Denisok94/php-telegram-bot)[ Packagist](https://packagist.org/packages/denisok94/telegram-bot)[ RSS](/packages/denisok94-telegram-bot/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (6)Dependencies (1)Versions (7)Used By (0)

php telegram bot
================

[](#php-telegram-bot)

Телеграм бот на чистом php, без 2х десяток других сторонних библиотек. Подойдёт для любого фреймворка (можно оформить как модуль или сервис) или другого проекта.

Установка
---------

[](#установка)

Run:

```
composer require --prefer-dist denisok94/telegram-bot
# or
php composer.phar require --prefer-dist denisok94/telegram-bot
```

or add to the `require` section of your `composer.json` file:

```
"denisok94/telegram-bot": "*"
```

```
composer update
# or
php composer.phar update
```

Описание
--------

[](#описание)

MethodDescriptionsetData(string $data)Сообщение от пользователя которое прислал ТелеграмgetChatId(): ?intИд чата в котором идёт беседаgetType(): stringТип присланного сообщения/событияisAdmin()Является автор сообщения адсином ботаgetText(): ?stringТекст сообщенияsendMessage(string|array $data)Отправить сообщениеsendPhoto(array $data)Отправить картинкуsendDocument(array $data)Отправить файл (фото/видео/музыку/гифку и т.д.)sendChatAction(string $action)Отправка индикации набора текстаeditMessage(string $message\_id, string|array $data)Обновить сообщение (только собственные сообщения бота)deleteMessage(int $chat\_id, int $message\_id)Удалить сообщениеdeleteMessages(int $chat\_id, array $message\_id)Удалить сообщенияsendInlineResults(InlineQuery $query, array $results)Ответ на inline-запросgetFileInfo(string $file\_id)Получить информацию о файле и ссылку для скачиванияdownloadFileById(string $file\_id, string $savePath)Скачать файл по его идdownloadFileByUrl(string $url, string $savePath)Скачать файл по urlsendApiQuery(string $method, $data = \[\], bool $raw = false)Отправляем свой кастомный запрос к API Telegram, [подробнее обо всех методах на руском](https://botphp.ru/docs/api)PropertyTupeDescription$bot\_namestring$admin\_idint|null$dataarrayОригинальное сообщение от Telegram$update\_idint|null$typestring|boolТип сообщения$messageMessage|nullКласс сообщеия$eventCallbackQuery|InlineQuery|nullКласс события### Планы

[](#планы)

- ☑ Обработка `inline_query` сообщений
- ☑ Отправка фото/изображений
- ☐ Массовая отправка фото (галереи)
- ☐ Отдельные методы отправки для каждого типа файла (видео, аудио, стикеров и тд)
- ☐ Обработка api mini app
- ☐ Массовая отправка других типов файлов (*если возможно*)
- ☐ Доработка шаблонов ответа для `inline_query`
- ☐ Реакции на сообщения
- ☐ Реакции на события в группах/каналах
- ☐ Поддержка типов событий `edited_channel_post`, `my_chat_member` и других
- ☐ Всё переделать

checkeduncheckedcrossed✓\_✗☑☐☒Использование
-------------

[](#использование)

### Регистрация webhook

[](#регистрация-webhook)

Указывает Телеграму url, куда ему отправлять нам сообщения отправленные боту

```
$bot = new Bot('123456:qwerty');
$url = "https://ваш-домен.ru/webhook.php";
$bot->setWebhook($url);
// or
$bot->setWebhook([
    'url' => $url,
    'max_connections' => 5,
    'allowed_updates' => json_encode(["message", "callback_query"]),
]);
// удалить текущий webhook
$bot->deleteWebhook();
```

### Примеры

[](#примеры)

```
// webhook.php
use denisok94\telegram\Bot;

$bot = new Bot([
    'bot_token' => $botToken,
    'bot_name' => $bot_name,
    'admin_id' => $admin_id,
]);
// получаем сообщение от Телеграмма
$bot->setData(file_get_contents('php://input'));

if ($chat_id = $bot->getChatId()) {
    $type = $bot->getType();
    if ($type == 'bot_command') { // отправлена команда "/command"
        $message = $bot->getText();
        $message = str_replace($bot_name, "", $message);
        switch ($message) {
            case '/start':
                // Получили текст start и проверяем, от админа сообщение или нет
                if ($bot->isAdmin()) {
                    $text = 'Привет, создатель!';
                } else {
                    $text = 'Здравствуйте, товарищ!';
                }
                $resp = $bot->sendMessage([ // сообщение с кнопками в меню
                    'chat_id' => $chat_id,
                    'text' => $text,
                    'reply_markup' => json_encode([
                        'keyboard' => [
                            [
                                [
                                    'text' => 'Button 1',
                                    'callback_data' => 'keyboard_test_2',
                                ],
                                [
                                    'text' => 'Button 2',
                                    'callback_data' => 'keyboard_test_2',
                                ]
                            ]
                        ],
                        'one_time_keyboard' => true,
                        'resize_keyboard' => true,
                    ])
                ]);
                break;
            case '/help':
                $resp = $bot->sendMessage('Чем я могу Вам помочь?');
                break;
        }
    } else if ($type == 'message') { // Простой текст
        $message = $bot->getText();
        switch ($message) {
            case 'Button 1': // реакция на кнопки (имя кнопок из меню отправляються как текст)
            case 'Button 2':
                $resp = $bot->sendMessage('Button =)');
                break;
            case 'Свяжи с оператором!!':
                $resp = $bot->sendMessage('Все операторы заняты! =)');
                break;
        }
    } else {
        $resp = $bot->sendMessage([
            'chat_id' => $chat_id,
            'text' => 'Я пока не умею обрабатывать такие данные. Подождите, когда разработчик придумает, как реагировать на такие сообщения.',
            "reply_to_message_id" => $bot->message->id ?? null,
            'reply_markup' => json_encode([
                'keyboard' => [
                    [
                        [
                            'text' => 'Свяжи с оператором!!',
                            'callback_data' => 'keyboard_help',
                        ],
                    ]
                ],
                'one_time_keyboard' => true,
                'resize_keyboard' => true,
            ]),
        ]);
    }
    if ($resp->ok != true) {
        $bot->sendMessage([
            'chat_id' => $bot->admin_id,
            'text' => "\n" . print_r($resp,true) . "\n",
            'parse_mode' => 'html',
        ]);
    }
}
```

[![Ekeyboard.png](doc/keyboard.png)](doc/keyboard.png)

Работа с файлами
----------------

[](#работа-с-файлами)

### Отправить/загрузить файлы в чат

[](#отправитьзагрузить-файлы-в-чат)

```
$chat_id = $bot->getChatId();
$file_path = __DIR__ . '/files/denis_Charlotte.png';
if (file_exists($file_path)) {
    $resp = $bot->sendDocument([
        'chat_id' => $chat_id,
        'caption' => 'Отправка картинки документом',
        'document' => curl_file_create($file_path, 'image/png', basename($file_path))
    ]);
    $resp = $bot->sendPhoto([
        'chat_id' => $chat_id,
        'caption' => 'Отправка картинки',
        'photo' => curl_file_create($file_path, 'image/png', basename($file_path))
    ]);
}
```

### Повторно отправить файл используя ид телеграма

[](#повторно-отправить-файл-используя-ид-телеграма)

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

```
$chat_id = $bot->getChatId();
$file_id = "FILE_ID_ОТ_ТЕЛЕГРАМ";
if (file_exists($file_path)) {
    $resp = $bot->sendDocument([
        'chat_id' => $chat_id,
        'caption' => 'Отправка картинки документом',
        'document' => $file_id
    ]);
    $resp = $bot->sendPhoto([
        'chat_id' => $chat_id,
        'caption' => 'Отправка картинки',
        'photo' => $file_id
    ]);
}
```

### Отправить несколько фото (до 10)

[](#отправить-несколько-фото-до-10)

> *Пример, в будующем оптимизирую* =)

```
$chat_id = $bot->getChatId();
// Показываем, что бот отправляет фото
$resp = $bot->sendChatAction('upload_photo');
// Массив путей к файлам
$photo_paths = [
   __DIR__. '/files/screenshots0.jpg',
   __DIR__. '/files/screenshots1.jpg',
   __DIR__. '/files/screenshots2.jpg',
];
$arrayQuery = [
    'chat_id' => $chat_id,
    'media' => json_encode([
        ['type' => 'photo', 'media' => 'attach://screenshots0.jpg', 'caption' => 'Описание альбома'],
        ['type' => 'photo', 'media' => 'attach://screenshots1.jpg'],
        ['type' => 'photo', 'media' => 'attach://screenshots2.jpg'],
    ]),
    'screenshots0.jpg' => curl_file_create($photo_paths[0], 'image/jpeg', basename($photo_paths[0])),
    'screenshots1.jpg' => curl_file_create($photo_paths[1], 'image/jpeg', basename($photo_paths[1])),
    'screenshots2.jpg' => curl_file_create($photo_paths[2], 'image/jpeg', basename($photo_paths[2])),
];

$resp = $bot->sendApiQuery('sendMediaGroup', $arrayQuery, true);
```

### Скачать полученный файл

[](#скачать-полученный-файл)

```
$message = $bot->message;
$type = $message->document_type;
if ($type != 'photo') {
    $file_id = $message->{$type}->file_id;
    $file_name = $message->{$type}->file_name;
    $savePath = __DIR__ . '/' . $file_name;
    try {
        // бот сам получить информацию о файле и скачает его в нужное место
        $bot->downloadFileById($file_id, $savePath);
    } catch (Throwable $th) {
        // Ошибка при скачивании файла
    }
} else if ($message->photo) { // вариант 2
    $photo = $message->photo[array_key_last($message->photo)];
    $file_id = $photo->file_id;
    // сами получаем информацию об файле
    $file = $bot->getFileInfo($file_id);
    if ($file instanceof \denisok94\telegram\model\FileInfo) {
        // проверяем что всё ли ок
        $extension = pathinfo($file->file_path, PATHINFO_EXTENSION);
        $file_name = pathinfo($file->file_path, PATHINFO_BASENAME);
        $savePath = __DIR__ ."/$file_name.$extension";
        // и скачиваем по ссывлке куда нам надо и потом прверяем
        $bot->downloadFileByUrl($file->file_url, $savePath);
        if (file_exists($savePath)) {
            // code
        } else {
            // Ошибка при скачивании файла
        }
    } else {
        // Не удалось получить информацию об файле, см $file->description
    }
}
```

inline\_keyboard и callback\_query
----------------------------------

[](#inline_keyboard-и-callback_query)

Интерактивные кнопки и реакция на них

[![inline_keyboard.png](doc/inline_keyboard.png)](doc/inline_keyboard.png)

```
$type = $bot->getType();
$chat_id = $bot->getChatId();
if ($type == 'bot_command') {
    $message = $bot->getText();
    switch ($message) {
        case '/start':
            $resp = $bot->sendMessage([
                    'chat_id' => $chat_id,
                    'text' => 'test inline_keyboard',
                    'reply_markup' => json_encode([
                        'inline_keyboard' => [
                            [
                                [
                                    'text' => 'Button 1',
                                    'callback_data' => 'inline_test_1',
                                ]
                            ],
                            [
                                [
                                    'text' => 'Button 2',
                                    'callback_data' => 'inline_test_2',
                                ],
                                [
                                    'text' => 'Button 3',
                                    'callback_data' => 'inline_test_3',
                                ]
                            ]
                        ],
                        'resize_keyboard' => true,
                    ]),
                ]);
            break;
    }
} else if ($type == 'callback_query') {
    $message = $bot->getText();
    switch ($message) {
        case 'inline_test_1':
        case 'inline_test_2':
        case 'inline_test_3':
            $resp = $bot->editMessage($bot->message->id, [
                "text" => "Реакция принята!\n а теперь этап 2й)",
                'reply_markup' => json_encode([
                    'inline_keyboard' => [
                        [
                            [
                                'text' => '1',
                                'callback_data' => 'inline_test_4',
                            ],
                            [
                                'text' => '2',
                                'callback_data' => 'inline_test_5',
                            ]
                        ]
                    ],
                    'resize_keyboard' => true,
                ]),
            ]);
            break;
        case 'inline_test_4':
        case 'inline_test_5':
            $resp = $bot->editMessage($bot->message->id, "Спасибо за участие в опросе!");
            break;
    }
}
```

inline\_query
-------------

[](#inline_query)

> в разработке...

[![inline_query.png](doc/inline_query.png)](doc/inline_query.png)

```
$bot = new Bot('123456:qwerty');
$type = $bot->getType();
if ($type == 'inline_query') {
    $results = [];
    $search = $this->bot->getText();
    if (mb_strlen($search) < 10) {
        // испольование готовых шаблонов
        $article = new \denisok94\telegram\inline\Article();
        $article->id = uniqid();
        $article->title = "Маловато будет!";
        $article->description = "Для поиска необходимо минимум 10 символов";
        $article->thumb_url = 'https://example.com/photo.jpg';
        $article->input_message_content = [
            'message_text' => "-article: " . $article->id
        ];
        $results[] = $article;
    } else {
        // свой вариант, если шаблонов мало
        for ($i = 0; $i < 10; $i++) {
            $results[] = [
                'type' => 'article',
                'id' => uniqid(),
                'title' => "Результат $i",
                'description' => 'Описание',
                'thumb_url' => 'https://example.com/photo.jpg',
                'input_message_content' => [
                    'message_text' => 'Текст сообщения ' . $i // что будет отправлено при выборе пользователем
                ]
            ];
        }
    }
    $resp = $this->bot->sendInlineResults($results); // максимум 50 результатов за раз
} else if ($type == 'message') {
    $message = $bot->getText();
    // получит выбранный объект
    if (isset($bot->data['message']['via_bot'])) {
        $bot_id = $bot->data['message']['via_bot']['id'];
        // проверяем, что это выбор от нашего бота (малолди в чате есть другие)
        switch ($message) {
            case 'Текст сообщения 1':
            case 'Текст сообщения 2':
            default:
                $resp = $this->bot->sendMessage('Выбранный объект: "' . $message . '"');
                break;
        }
    }
}
```

[![inline_query_2.png](doc/inline_query_2.png)](doc/inline_query_2.png)

MiniApp
-------

[](#miniapp)

> Мини pwa web приложение запускаемоев в самом телеграме

Получение и валидация полученых данных при запуске приложения:

```

    document.addEventListener('DOMContentLoaded', function ()
    {
        const tg = Telegram.WebApp;
        // Получаем данные initData
        const initData = tg.initData;
        tg.ready(); // сообщаем Telegram, что готовы
        // отправляем данные на валидацию
        fetch("api/get-user", {
            method: "POST",
            headers: {"Content-Type": "application/json"},
            body: JSON.stringify({ initData })
        })
            .then(response => response.json())
            .then(data => {
                console.log("Ответ:", data);
            })
            .catch(error => {
                console.error("Ошибка запроса:", error);
            });
    });

```

```
// ~ApiController
public function actionGetUser()
{
    try {
        // Получаем данные из параметра tgWebAppData
        $initData = json_decode(file_get_contents('php://input') ?? '', true)['initData'] ?? '';
        // Проверяем и декодируем данные
        $result = \denisok94\telegram\app\InitData::isValid($initData, $botToken, true);
        if ($result['isValid'] == true) {
            return $this->sendSuccess($result['data']['parsed']); // 200
        } else {
            $result['data'] = $result['data']['parsed'] ?? $initData;
            return $this->sendError("Bad Request", $result); // 400
        }
    } catch (\Exception $e) {
        return $this->sendError($e->getMessage()); // 500
    }
}
```

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance61

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

6

Last Release

274d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/59793012?v=4)[Денис](/maintainers/Denisok94)[@Denisok94](https://github.com/Denisok94)

---

Top Contributors

[![Denisok94](https://avatars.githubusercontent.com/u/59793012?v=4)](https://github.com/Denisok94 "Denisok94 (33 commits)")

---

Tags

bottelegram botphp-telegram-bot

### Embed Badge

![Health badge](/badges/denisok94-telegram-bot/health.svg)

```
[![Health](https://phpackages.com/badges/denisok94-telegram-bot/health.svg)](https://phpackages.com/packages/denisok94-telegram-bot)
```

###  Alternatives

[botman/botman

Create messaging bots in PHP with ease.

6.2k1.5M97](/packages/botman-botman)[jaybizzle/laravel-crawler-detect

A Laravel package to detect web crawlers via the user agent

3232.6M17](/packages/jaybizzle-laravel-crawler-detect)[tg-bot-api/bot-api-base

Clear and simple Telegram bot API

22278.8k2](/packages/tg-bot-api-bot-api-base)[botman/driver-web

Web driver for BotMan

86658.7k7](/packages/botman-driver-web)[botman/tinker

BotMan tinker command for your Laravel BotMan project

102201.2k4](/packages/botman-tinker)[crwlr/crawler

Web crawling and scraping library.

37214.8k2](/packages/crwlr-crawler)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
