Current Path : /var/www/axolotl/data/www/msk.axolotls.ru/bitrix/modules/ml/lib/ |
Current File : /var/www/axolotl/data/www/msk.axolotls.ru/bitrix/modules/ml/lib/client.php |
<?php namespace Bitrix\Ml; use Bitrix\Main\ArgumentException; use Bitrix\Main\Config\Option; use Bitrix\Main\Error; use Bitrix\Main\Loader; use Bitrix\Main\Result; use Bitrix\Main\Web\HttpClient; use Bitrix\Main\Web\Json; use CUpdateClient; /** * Class Client * @package Bitrix\Ml * * @method Result test(array $params) * @method Result createModel(array $params) * @method Result deleteModel(array $params) * @method Result appendLearningData(array $params) * @method Result startTraining(array $params) * @method Result predictRecord(array $params) * @method Result predictBatch(array $params) */ class Client { const DEFAULT_SERVER = "https://ml.bitrix.info"; const TYPE_BITRIX24 = "B24"; const TYPE_CP = "CP"; protected $serverAddress; public function __construct() { $this->serverAddress = defined("ML_SERVER") ? ML_SERVER : static::DEFAULT_SERVER; } /** * @param string $name * @param array $arguments * @return Result * @throws ArgumentException */ public function __call($name, array $arguments) { $parameters = $arguments[0]; if(!is_array($parameters)) { throw new ArgumentException("Call parameters should be an array"); } $action = "mlserver.api." . $name; return $this->performRequest($action, $parameters); } /** * @param string $action * @param array $parameters * @return Result * @throws ArgumentException */ protected function performRequest($action, array $parameters) { $result = new Result(); $httpClient = new HttpClient([ "socketTimeout" => 10, "streamTimeout" => 30, "disableSslVerification" => true ]); $url = $this->serverAddress . "/api/?action=".$action; $request = [ "action" => $action, "serializedParameters" => base64_encode(gzencode(Json::encode($parameters))), ]; //$request += $parameters; $request["BX_TYPE"] = static::getPortalType(); $request["BX_LICENCE"] = static::getLicenseCode(); $request["SERVER_NAME"] = (\CMain::isHTTPS() ? "https" : "http")."://".((defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0) ? SITE_SERVER_NAME : Option::get("main", "server_name")); $request["BX_HASH"] = static::signRequest($request); $queryResult = $httpClient->query(HttpClient::HTTP_POST, $url, $request); if(!$queryResult) { $errors = $httpClient->getError(); foreach ($errors as $code => $message) { $result->addError(new Error($message, $code)); } return $result; } $returnCode = $httpClient->getStatus(); if($returnCode != 200) { $result->addError(new Error("Server returned " . $returnCode . " code", "WRONG_SERVER_RESPONSE")); return $result; } $response = $httpClient->getResult(); if($response == "") { $result->addError(new Error("Empty server response", "EMPTY_SERVER_RESPONSE")); return $result; } try { $parsedResponse = Json::decode($response); } catch (\Exception $e) { $result->addError(new Error("Could not parse server response. Raw response: " . $response)); return $result; } if($parsedResponse["status"] === "error") { foreach ($parsedResponse["errors"] as $error) { $result->addError(new Error($error["message"], $error["code"], $error["customData"])); } } else if(is_array($parsedResponse["data"])) { $result->setData($parsedResponse["data"]); } return $result; } public static function getPortalType() { if(Loader::includeModule("bitrix24") && defined("BX24_HOST_NAME")) { return static::TYPE_BITRIX24; } else { return static::TYPE_CP; } } /** * Return license code of the portal (to be used as a part of request verification scheme). * * @return string */ public static function getLicenseCode() { if(defined('BX24_HOST_NAME')) { return BX24_HOST_NAME; } else { require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php"); return md5("BITRIX".\CUpdateClient::GetLicenseKey()."LICENCE"); } } /** * Returns request authorization hash string. * * @param array $parameters Array or request parameters to be signed. * @param string $suffix Suffix to append to signed string * @return string */ public static function signRequest(array $parameters, $suffix = "") { $paramStr = md5(implode("|", $parameters) . ($suffix ? "|" . $suffix : "")); $portalType = static::getPortalType(); if ($portalType == self::TYPE_BITRIX24 && function_exists('bx_sign')) { return bx_sign($paramStr); } else { include($_SERVER["DOCUMENT_ROOT"]."/bitrix/license_key.php"); return md5($paramStr.md5($LICENSE_KEY)); } } }