AR/VR Engineer
@arvrdesign
2 8 1.5K
try {// ПРОВЕРКА ЛИМИТОВ ПЕРЕД ОТПРАВКОЙ ЗАПРОСАif (!ApiRateLimiter::checkAndThrottle()) {// Лимит исчерпан! Возвращаем безопасный "пустой" ответ,// чтобы сайт не упал с фатальной ошибкой, а просто показал 0 результатов$httpCode = 429;throw new Exception("Исчерпан суточный лимит запросов", 429);}// Выбор доступного API-сервера через пул Битрикса$server = $serverManager->getAvailableServer();if ($server === null) {throw new Exception("Нет доступных API серверов для выполнения запроса.", 503);}
-rw-r--r-- 600 600 20303 May 25 04:50 /home/bitrix/www/public/local/modules/tggo.api/lib/api/apifacade.php
* @param string $identifier Username, телефон, ID или хэш ссылки.* @param bool $debug Если true, возвращает сырые данные от Telethon.* @return array* @throws Exception*/public static function getEntityFullInfo(string $identifier, bool $debug = false, bool $useCache = true, ?int $cacheTtl = null, ?int &$httpCode = 200): array{return self::request('/entity/info', ['identifier' => $identifier, 'detailed' => true, 'debug' => $debug], $useCache, $cacheTtl, $httpCode);}/*** Получает публичную информацию по пригласительной ссылке.* @param string $invite_hash Хэш из пригласительной ссылки.* @return array* @throws Exception
self::saveEntityError($identifier, $statusCode);return null;}// 1. Делаем запрос к API через фасад// Устанавливаем useCache=false, так как ApiFacade использует свой кеш (memcached),// а мы строим свой, более долгосрочный, на уровне БД.$entityInfo = ApiFacade::getEntityFullInfo($identifier, false, true, $cacheTtl, $httpCode);d($entityInfo, $httpCode);$entityId = (int)$entityInfo['id'];$mainUsername = $entityInfo['username'] ?? null;if (empty($entityInfo) || empty($entityInfo['id'])) {self::saveEntityError($identifier, $httpCode);return null;
// СИНХРОННЫЙ РЕЖИМ (прямой вызов API)$freshData = null;if ($isInvite) {$freshData = \Tggo\TelegramRepository::fetchFromInvite($identifier, $cacheTtl);} else {$freshData = \Tggo\Username::isValid($identifier)? \Tggo\TelegramRepository::fetchAndSaveEntity($identifier, $cacheTtl): null;}if ($freshData) {return \Tggo\User::getById($freshData['id']);}}
/*** Основной метод для получения и подготовки данных.*/protected function prepareResult(): bool{// 1. Получаем информацию о канале через EntityManager$this->arResult = EntityManager::getEntity($this->arParams['USERNAME'], $this->arParams['CACHE_TIME']);if ((int)$this->arResult['BLOCKED']) {return false;}if (empty($this->arResult['ID']) || !in_array($this->arResult['TYPE'], ['channel', 'megagroup', 'gigagroup'])) {return false; // Канал не найден или это не канал
if (!$this->checkRequiredParams()) {// Если обязательные параметры не переданы, показываем 404$this->show404();return;}// Вся логика получения данных теперь инкапсулирована здесьif ($this->prepareResult()) {// Если это виджет, подключаем специальный шаблон 'embed', иначе дефолтный$templatePage = $this->arResult['IS_EMBED'] ? 'embed' : '';$this->IncludeComponentTemplate($templatePage);} else {$this->show404();return;}
if($returnResult){$component->executeComponent();$result = $component->arResult;}else{$result = $component->executeComponent();}$this->__arIncludeAreaIcons = $component->__arIncludeAreaIcons;$frameMode = $component->getFrameMode();$componentFrame->end();}
{if (($arParams['AJAX_MODE'] ?? '') == 'Y'){$obAjax = new CComponentAjax($componentName, $componentTemplate, $arParams, $parentComponent);}$this->__componentStack[] = $component;$result = $component->IncludeComponent($componentTemplate, $arParams, $parentComponent, $returnResult);array_pop($this->__componentStack);}if ($bDrawIcons){$panel = new CComponentPanel($component, $componentName, $componentTemplate, $parentComponent, $bComponentEnabled);
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();//d($arResult);define("HIDE_FOOTER", true);$APPLICATION->IncludeComponent("tggo:channel.post","",array("USERNAME" => $arResult['VARIABLES']['USERNAME'],"POST_ID" => $arResult['VARIABLES']['POST_ID'],"SEF_FOLDER" => $arParams["SEF_FOLDER"],"SEF_URL_TEMPLATES" => $arParams["SEF_URL_TEMPLATES"],
{include($_SERVER["DOCUMENT_ROOT"].$this->__fileAlt);return null;}$templateData = false;include($_SERVER["DOCUMENT_ROOT"].$this->__file);for ($i = count($this->frames) - 1; $i >= 0; $i--){$frame = $this->frames[$i];if ($frame->isStarted() && !$frame->isEnded()){$frame->end();
-rw-r--r-- 600 600 460 May 19 18:20 /home/bitrix/www/public/local/components/tggo/main/templates/.default/post.php
$this->__folder,$parentTemplateFolder,$this);}else{$result = $this->__IncludePHPTemplate($arResult, $arParams, $parentTemplateFolder);}return $result;}/*** Includes template language file.
*/final public function showComponentTemplate(){if (!$this->__bInited)return null;if ($this->__template)$this->__template->includeTemplate($this->arResult);if(is_array($this->arResultCacheKeys)){$arNewResult = array();foreach($this->arResultCacheKeys as $key)if(array_key_exists($key, $this->arResult))$arNewResult[$key] = $this->arResult[$key];
final public function includeComponentTemplate($templatePage = "", $customTemplatePath = ""){if (!$this->__bInited)return null;if ($this->initComponentTemplate($templatePage, $this->getSiteTemplateId(), $customTemplatePath)){$this->showComponentTemplate();if($this->__component_epilog)$this->includeComponentEpilog($this->__component_epilog);}else{$this->abortResultCache();$this->__showError(str_replace(
$arResult = array("FOLDER" => $SEF_FOLDER,"URL_TEMPLATES" => $arUrlTemplates,"VARIABLES" => $arVariables,"ALIASES" => $arVariableAliases);//d($componentPage);$this->IncludeComponentTemplate($componentPage);
else{$parentComponentName = "";$parentComponentPath = "";$parentComponentTemplate = "";}return include($_SERVER["DOCUMENT_ROOT"].$this->__path."/component.php");}/*** Function executes the component. Returns the result of it's execution.** <p>Note: component must be inited by initComponent method.</p>* @param string $componentTemplate* @param array $arParams
-rw-r--r-- 600 600 1960 May 19 18:20 /home/bitrix/www/public/local/components/tggo/main/component.php
if($returnResult){$this->__IncludeComponent();$result = $this->arResult;}else{$result = $this->__IncludeComponent();}$frameMode = $this->getFrameMode();$componentFrame->end();}
{if (($arParams['AJAX_MODE'] ?? '') == 'Y'){$obAjax = new CComponentAjax($componentName, $componentTemplate, $arParams, $parentComponent);}$this->__componentStack[] = $component;$result = $component->IncludeComponent($componentTemplate, $arParams, $parentComponent, $returnResult);array_pop($this->__componentStack);}if ($bDrawIcons){$panel = new CComponentPanel($component, $componentName, $componentTemplate, $parentComponent, $bComponentEnabled);
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");$APPLICATION->SetTitle("Telegram global search");?><?$APPLICATION->IncludeComponent("tggo:main",".default",array("COMPONENT_TEMPLATE" => ".default","SEF_MODE" => "Y","SEF_FOLDER" => "/","AJAX_MODE" => "N",
}else{header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");}$_SERVER["REAL_FILE_PATH"] = $url;include_once $io->GetPhysicalName($_SERVER['DOCUMENT_ROOT'] . $url);die();}}}//admin section 404if (str_starts_with($requestUri, "/bitrix/admin/"))
-rw-r--r-- 600 600 858 May 19 18:28 /home/bitrix/www/public/username/index.php
<?include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');if(file_exists($_SERVER['DOCUMENT_ROOT'].'/404.php'))include_once($_SERVER['DOCUMENT_ROOT'].'/404.php');?>
-rw-r--r-- 600 600 3650 May 19 18:19 /home/bitrix/www/public/bitrix/modules/main/include/urlrewrite.php
Exception: Исчерпан суточный лимит запросов in /home/bitrix/www/public/local/modules/tggo.api/lib/api/apifacade.php:382
Stack trace:
#0 /home/bitrix/www/public/local/modules/tggo.api/lib/api/apifacade.php(37): Tggo\Api\ApiFacade::request()
#1 /home/bitrix/www/public/local/modules/tggo.api/lib/telegramrepository.php(59): Tggo\Api\ApiFacade::getEntityFullInfo()
#2 /home/bitrix/www/public/local/modules/tggo.api/lib/entitymanager.php(81): Tggo\TelegramRepository::fetchAndSaveEntity()
#3 /home/bitrix/www/public/local/components/tggo/channel.post/class.php(151): Tggo\EntityManager::getEntity()
#4 /home/bitrix/www/public/local/components/tggo/channel.post/class.php(63): TggoChannelPost->prepareResult()
#5 /home/bitrix/www/public/bitrix/modules/main/classes/general/component.php(675): TggoChannelPost->executeComponent()
#6 /home/bitrix/www/public/bitrix/modules/main/classes/general/main.php(1188): CBitrixComponent->includeComponent()
#7 /home/bitrix/www/public/local/components/tggo/main/templates/.default/post.php(6): CAllMain->IncludeComponent()
#8 /home/bitrix/www/public/bitrix/modules/main/classes/general/component_template.php(790): include('...')
#9 /home/bitrix/www/public/bitrix/modules/main/classes/general/component_template.php(885): CBitrixComponentTemplate->__IncludePHPTemplate()
#10 /home/bitrix/www/public/bitrix/modules/main/classes/general/component.php(791): CBitrixComponentTemplate->IncludeTemplate()
#11 /home/bitrix/www/public/bitrix/modules/main/classes/general/component.php(731): CBitrixComponent->showComponentTemplate()
#12 /home/bitrix/www/public/local/components/tggo/main/component.php(63): CBitrixComponent->includeComponentTemplate()
#13 /home/bitrix/www/public/bitrix/modules/main/classes/general/component.php(622): include('...')
#14 /home/bitrix/www/public/bitrix/modules/main/classes/general/component.php(699): CBitrixComponent->__includeComponent()
#15 /home/bitrix/www/public/bitrix/modules/main/classes/general/main.php(1188): CBitrixComponent->includeComponent()
#16 /home/bitrix/www/public/username/index.php(5): CAllMain->IncludeComponent()
#17 /home/bitrix/www/public/bitrix/modules/main/include/urlrewrite.php(128): include_once('...')
#18 /home/bitrix/www/public/bitrix/urlrewrite.php(2): include_once('...')
#19 {main}
Обсуждение 2
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram