/
grayhoax
/
phptelebot
Обзор
Документация
Войти
/
grayhoax
/
phptelebot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PHPTelebot.php
299 строк
8 KB
Claude
Update PHPTelebot to v2.0 with full Telegram Bot API 9.2 support
23 ноя 2025, 17:47
23 ноя 2025, 17:47
54e0654
Код
Авторство
О чём код?
<?php /** * PHPTelebot.php. * * * @author Radya <radya@gmx.com> * * @link https://github.com/radyakaze/phptelebot * * @license GPL-3.0 */ /** * Class PHPTelebot. */ class PHPTelebot { /** * @var array */ public static $getUpdates = []; /** * @var array */ protected $_command = []; /** * @var array */ protected $_onMessage = []; /** * Bot token. * * @var string */ public static $token = ''; /** * Bot username. * * @var string */ protected static $username = ''; /** * Debug. * * @var bool */ public static $debug = true; /** * PHPTelebot version. * * @var string */ protected static $version = '2.0'; /** * PHPTelebot Constructor. * * @param string $token * @param string $username */ public function __construct($token, $username = '') { // Check php version if (version_compare(phpversion(), '5.4', '<')) { die("PHPTelebot needs to use PHP 5.4 or higher.\n"); } // Check curl if (!function_exists('curl_version')) { die("cURL is NOT installed on this server.\n"); } // Check bot token if (empty($token)) { die("Bot token should not be empty!\n"); } self::$token = $token; self::$username = $username; } /** * Command. * * @param string $command * @param callable|string $answer */ public function cmd($command, $answer) { if ($command != '*') { $this->_command[$command] = $answer; } if (strrpos($command, '*') !== false) { $this->_onMessage['text'] = $answer; } } /** * Events. * * @param string $types * @param callable|string $answer */ public function on($types, $answer) { $types = explode('|', $types); foreach ($types as $type) { $this->_onMessage[$type] = $answer; } } /** * Custom regex for command. * * @param string $regex * @param callable|string $answer */ public function regex($regex, $answer) { $this->_command['customRegex:'.$regex] = $answer; } /** * Run telebot. * * @return bool */ public function run() { try { if (php_sapi_name() == 'cli') { echo 'PHPTelebot version '.self::$version; echo "\nMode\t: Long Polling\n"; $options = getopt('q', ['quiet']); if (isset($options['q']) || isset($options['quiet'])) { self::$debug = false; } echo "Debug\t: ".(self::$debug ? 'ON' : 'OFF')."\n"; $this->longPoll(); } else { $this->webhook(); } return true; } catch (Exception $e) { echo $e->getMessage()."\n"; return false; } } /** * Webhook Mode. */ private function webhook() { if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_SERVER['CONTENT_TYPE'] == 'application/json') { self::$getUpdates = json_decode(file_get_contents('php://input'), true); echo $this->process(); } else { http_response_code(400); throw new Exception('Access not allowed!'); } } /** * Long Poll Mode. * * @throws Exception */ private function longPoll() { $offset = 0; while (true) { $req = json_decode(Bot::send('getUpdates', ['offset' => $offset, 'timeout' => 30]), true); // Check error. if (isset($req['error_code'])) { if ($req['error_code'] == 404) { $req['description'] = 'Incorrect bot token'; } throw new Exception($req['description']); } if (!empty($req['result'])) { foreach ($req['result'] as $update) { self::$getUpdates = $update; $process = $this->process(); if (self::$debug) { $line = "\n--------------------\n"; $outputFormat = "$line %s $update[update_id] $line%s"; echo sprintf($outputFormat, 'Query ID :', json_encode($update)); echo sprintf($outputFormat, 'Response for :', Bot::$debug?: $process ?: '--NO RESPONSE--'); // reset debug Bot::$debug = ''; } $offset = $update['update_id'] + 1; } } // Delay 1 second sleep(1); } } /** * Process the message. * * @return string */ private function process() { $get = self::$getUpdates; $run = false; if (isset($get['message']['date']) && $get['message']['date'] < (time() - 120)) { return '-- Pass --'; } if (Bot::type() == 'text') { $customRegex = false; foreach ($this->_command as $cmd => $call) { if (substr($cmd, 0, 12) == 'customRegex:') { $regex = substr($cmd, 12); // Remove bot username from command if (self::$username != '') { $get['message']['text'] = preg_replace('/^\/(.*)@'.self::$username.'(.*)/', '/$1$2', $get['message']['text']); } $customRegex = true; } else { $regex = '/^(?:'.addcslashes($cmd, '/\+*?[^]$(){}=!<>:-').')'.(self::$username ? '(?:@'.self::$username.')?' : '').'(?:\s(.*))?$/'; } if ($get['message']['text'] != '*' && preg_match($regex, $get['message']['text'], $matches)) { $run = true; if ($customRegex) { $param = [$matches]; } else { $param = isset($matches[1]) ? $matches[1] : ''; } break; } } } if (isset($this->_onMessage) && $run === false) { if (in_array(Bot::type(), array_keys($this->_onMessage))) { $run = true; $call = $this->_onMessage[Bot::type()]; } elseif (isset($this->_onMessage['*'])) { $run = true; $call = $this->_onMessage['*']; } if ($run) { switch (Bot::type()) { case 'callback': $param = $get['callback_query']['data']; break; case 'inline': $param = $get['inline_query']['query']; break; case 'location': $param = [$get['message']['location']['longitude'], $get['message']['location']['latitude']]; break; case 'text': $param = $get['message']['text']; break; default: $param = ''; break; } } } if ($run) { if (is_callable($call)) { if (!is_array($param)) { $count = count((new ReflectionFunction($call))->getParameters()); if ($count > 1) { $param = array_pad(explode(' ', $param, $count), $count, ''); } else { $param = [$param]; } } return call_user_func_array($call, $param); } else { if (!isset($get['inline_query'])) { return Bot::send('sendMessage', ['text' => $call]); } } } } } require_once __DIR__.'/Bot.php';