From 991ca7ce8c4da7ce3198948c0e3b1975dc6f7add Mon Sep 17 00:00:00 2001 From: wyn <1074145239@qq.com> Date: Tue, 2 Jun 2026 17:59:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E7=8C=AE=E6=A0=A1=E5=AF=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/Author.php | 303 ++++++++++++++++++++++ composer.json | 13 +- vendor/composer/autoload_psr4.php | 3 + vendor/composer/autoload_static.php | 19 ++ vendor/composer/installed.json | 346 +++++++++++++++++++++++++- vendor/composer/installed.php | 48 +++- 6 files changed, 726 insertions(+), 6 deletions(-) create mode 100644 application/api/controller/Author.php diff --git a/application/api/controller/Author.php b/application/api/controller/Author.php new file mode 100644 index 00000000..2ea83479 --- /dev/null +++ b/application/api/controller/Author.php @@ -0,0 +1,303 @@ + 0, 'msg' => '请输入作者姓名']); + } + + // 1) 获取 freelookup 页面,用于拿到真实提交地址和隐藏字段。 + $lookupUrl = 'https://www.scopus.com/freelookup/form/author.uri?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED'; + $lookupRes = $this->httpRequest($lookupUrl, null, true, '', $cookieFile); + if (!$lookupRes['ok']) { + @unlink($cookieFile); + $ret = ['code' => 0, 'msg' => '访问 Scopus 失败:' . $lookupRes['msg']]; + if ($debug === 1) { + $ret['debug'] = $this->buildDebugInfo($lookupRes['url'], $lookupRes['http_code'], $lookupRes['body']); + } + return json($ret); + } + + $formInfo = $this->extractScopusLookupForm($lookupRes['body']); + if (empty($formInfo['action'])) { + @unlink($cookieFile); + $ret = ['code' => 0, 'msg' => 'Scopus 页面结构已变化,未找到查询表单']; + if ($debug === 1) { + $ret['debug'] = $this->buildDebugInfo($lookupRes['url'], $lookupRes['http_code'], $lookupRes['body']); + } + return json($ret); + } + + // 2) 组装查询参数(姓名 + 机构),并携带隐藏字段提交。 + $postData = $formInfo['hidden_fields']; + $postData['authLast'] = $name; + $postData['affil'] = $affil; + + $searchRes = $this->httpRequest($formInfo['action'], $postData, true, $lookupUrl, $cookieFile); + if (!$searchRes['ok']) { + @unlink($cookieFile); + $ret = ['code' => 0, 'msg' => '查询 Scopus 失败:' . $searchRes['msg']]; + if ($debug === 1) { + $ret['debug'] = $this->buildDebugInfo($searchRes['url'], $searchRes['http_code'], $searchRes['body']); + } + return json($ret); + } + + $blockMsg = $this->detectScopusBlocking($searchRes['body']); + if (!empty($blockMsg)) { + @unlink($cookieFile); + $ret = ['code' => 0, 'msg' => $blockMsg]; + $fallback = $this->fallbackByOpenAlex($name, $affil); + if ($fallback !== null) { + $ret = array_merge($fallback, [ + 'msg' => $blockMsg . ',已自动降级 OpenAlex 结果' + ]); + } + if ($debug === 1) { + $ret['debug'] = $this->buildDebugInfo($searchRes['url'], $searchRes['http_code'], $searchRes['body']); + } + return json($ret); + } + + // 3) 从返回页提取 h-index(优先匹配“h-index”关键词附近数字)。 + $hIndex = $this->extractHIndexFromHtml($searchRes['body']); + if ($hIndex === null) { + @unlink($cookieFile); + $ret = [ + 'code' => 0, + 'msg' => '未从 Scopus 结果页解析到 H 指数(可能需要人工登录或页面结构调整)' + ]; + if ($debug === 1) { + $ret['debug'] = $this->buildDebugInfo($searchRes['url'], $searchRes['http_code'], $searchRes['body']); + } + return json($ret); + } + + @unlink($cookieFile); + + $ret = [ + 'code' => 1, + 'name' => $name, + 'affil' => $affil, + 'h_index_scopus' => $hIndex, + 'source' => 'scopus_freelookup', + ]; + if ($debug === 1) { + $ret['debug'] = $this->buildDebugInfo($searchRes['url'], $searchRes['http_code'], $searchRes['body']); + } + return json($ret); + } + + private function httpRequest($url, $postData = null, $followLocation = true, $referer = '', $cookieFile = '') + { + $ch = curl_init(); + $options = [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_FOLLOWLOCATION => $followLocation, + CURLOPT_MAXREDIRS => 8, + CURLOPT_TIMEOUT => 30, + CURLOPT_CONNECTTIMEOUT => 15, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', + CURLOPT_ENCODING => '', + CURLOPT_HTTPHEADER => [ + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8', + ], + ]; + + if (!empty($referer)) { + $options[CURLOPT_REFERER] = $referer; + } + + if (!empty($cookieFile)) { + $options[CURLOPT_COOKIEJAR] = $cookieFile; + $options[CURLOPT_COOKIEFILE] = $cookieFile; + } + + if (is_array($postData)) { + $options[CURLOPT_POST] = true; + $options[CURLOPT_POSTFIELDS] = http_build_query($postData); + } + + curl_setopt_array($ch, $options); + $body = curl_exec($ch); + $error = curl_error($ch); + $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + $finalUrl = (string) curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); + curl_close($ch); + + if ($error) { + if (strpos($error, 'Maximum (') !== false && strpos($error, 'redirects followed') !== false) { + return [ + 'ok' => false, + 'msg' => 'Scopus 跳转过多(可能触发登录/验证页面),请稍后重试或先在浏览器登录 Scopus', + 'body' => '', + 'http_code' => $httpCode, + 'url' => $finalUrl + ]; + } + return ['ok' => false, 'msg' => $error, 'body' => '', 'http_code' => $httpCode, 'url' => $finalUrl]; + } + + if ($httpCode >= 400 || $httpCode === 0) { + return ['ok' => false, 'msg' => 'HTTP ' . $httpCode, 'body' => (string) $body, 'http_code' => $httpCode, 'url' => $finalUrl]; + } + + return ['ok' => true, 'msg' => '', 'body' => (string) $body, 'http_code' => $httpCode, 'url' => $finalUrl]; + } + + private function detectScopusBlocking($html) + { + if (empty($html)) { + return ''; + } + + $text = strtolower(strip_tags($html)); + if (strpos($text, 'sign in') !== false || strpos($text, 'institutional sign in') !== false) { + return 'Scopus 返回登录页,当前环境未授权访问作者详情页面'; + } + if (strpos($text, 'captcha') !== false || strpos($text, 'are you a robot') !== false) { + return 'Scopus 触发了人机验证,当前接口无法自动通过'; + } + + return ''; + } + + private function buildDebugInfo($finalUrl, $httpCode, $html) + { + $normalized = html_entity_decode(strip_tags((string) $html), ENT_QUOTES, 'UTF-8'); + $normalized = preg_replace('/\s+/u', ' ', $normalized); + $snippet = mb_substr($normalized, 0, 300, 'UTF-8'); + + return [ + 'final_url' => (string) $finalUrl, + 'http_code' => (int) $httpCode, + 'page_snippet' => $snippet, + 'contains_signin' => stripos($normalized, 'sign in') !== false ? 1 : 0, + 'contains_captcha' => stripos($normalized, 'captcha') !== false ? 1 : 0, + ]; + } + + private function extractScopusLookupForm($html) + { + $ret = [ + 'action' => '', + 'hidden_fields' => [], + ]; + + if (empty($html)) { + return $ret; + } + + // 优先定位包含 author 的 form,减少解析误匹配。 + if (preg_match('/]*action=["\']([^"\']+)["\'][^>]*>.*?<\/form>/is', $html, $formMatch)) { + $action = trim($formMatch[1]); + if (!preg_match('/^https?:\/\//i', $action)) { + $action = 'https://www.scopus.com' . (substr($action, 0, 1) === '/' ? '' : '/') . $action; + } + $ret['action'] = $action; + + if (preg_match_all('/]*type=["\']hidden["\'][^>]*>/is', $formMatch[0], $inputs)) { + foreach ($inputs[0] as $inputTag) { + if (preg_match('/name=["\']([^"\']+)["\']/i', $inputTag, $nameMatch)) { + $fieldName = trim($nameMatch[1]); + $fieldVal = ''; + if (preg_match('/value=["\']([^"\']*)["\']/i', $inputTag, $valMatch)) { + $fieldVal = $valMatch[1]; + } + $ret['hidden_fields'][$fieldName] = $fieldVal; + } + } + } + } + + return $ret; + } + + private function extractHIndexFromHtml($html) + { + if (empty($html)) { + return null; + } + + $text = html_entity_decode(strip_tags($html), ENT_QUOTES, 'UTF-8'); + $text = preg_replace('/\s+/u', ' ', $text); + + $patterns = [ + '/h[\-\s]?index[^0-9]{0,20}([0-9]{1,3})/iu', + '/([0-9]{1,3})[^0-9]{0,20}h[\-\s]?index/iu', + ]; + foreach ($patterns as $pattern) { + if (preg_match($pattern, $text, $m)) { + return (int) $m[1]; + } + } + + return null; + } + + private function fallbackByOpenAlex($name, $affil) + { + $search = urlencode($name); + $url = "https://api.openalex.org/authors?search={$search}&limit=8"; + $res = $this->httpRequest($url, null, true); + if (!$res['ok']) { + return null; + } + + $data = json_decode($res['body'], true); + $list = $data['results'] ?? []; + if (empty($list)) { + return null; + } + + $targetAffil = strtolower((string) $affil); + $match = null; + foreach ($list as $item) { + if (empty($targetAffil)) { + $match = $item; + break; + } + $insts = $item['affiliations'] ?? []; + foreach ($insts as $inst) { + $instName = strtolower($inst['display_name'] ?? ''); + if ($instName !== '' && strpos($instName, $targetAffil) !== false) { + $match = $item; + break 2; + } + } + } + + if ($match === null) { + $match = $list[0]; + } + + return [ + 'code' => 1, + 'name' => $match['display_name'] ?? $name, + 'affil' => !empty($match['affiliations'][0]['display_name']) ? $match['affiliations'][0]['display_name'] : $affil, + 'h_index_scopus' => $match['summary_stats']['h_index_scopus'] ?? null, + 'h_index_openalex' => $match['summary_stats']['h_index'] ?? null, + 'source' => 'openalex_fallback', + ]; + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index 521fb0a8..cd86d23c 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,7 @@ "phpoffice/phpspreadsheet": "^1.12", "paypal/paypal-server-sdk": "^0.6.1", "guzzlehttp/guzzle": "^7.9", + "php-amqplib/php-amqplib": "^2.12", "tectalic/openai": "^1.6" }, "autoload": { @@ -42,6 +43,14 @@ "allow-plugins": { "topthink/think-installer": true, "php-http/discovery": true - } - } + }, + "secure-http": false + }, + "repositories": [{ + "name": "aliyun", + "type": "composer", + "url": "http://mirrors.aliyun.com/composer/" + },{ + "packagist": false + }] } diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index ee3d45d2..6db206ef 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -9,6 +9,7 @@ return array( 'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'), 'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'), 'think\\' => array($vendorDir . '/topthink/think-queue/src', $vendorDir . '/topthink/think-image/src', $vendorDir . '/topthink/think-helper/src', $baseDir . '/thinkphp/library/think'), + 'phpseclib3\\' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'), 'app\\' => array($baseDir . '/application'), 'apimatic\\jsonmapper\\' => array($vendorDir . '/apimatic/jsonmapper/src'), 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'), @@ -25,7 +26,9 @@ return array( 'PhpOffice\\PhpWord\\' => array($vendorDir . '/phpoffice/phpword/src/PhpWord'), 'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'), 'PhpOffice\\Math\\' => array($vendorDir . '/phpoffice/math/src/Math'), + 'PhpAmqpLib\\' => array($vendorDir . '/php-amqplib/php-amqplib/PhpAmqpLib'), 'PaypalServerSdkLib\\' => array($vendorDir . '/paypal/paypal-server-sdk/src'), + 'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'), 'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'), 'Nyholm\\Psr7\\' => array($vendorDir . '/nyholm/psr7/src'), 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 836bb54e..fc6d53f6 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -14,6 +14,7 @@ class ComposerStaticInit7020b987d316c2076c2a6f439a1140f9 '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', '8cff32064859f4559445b89279f3199c' => __DIR__ . '/..' . '/php-http/message/src/filters.php', + 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', '9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php', @@ -27,6 +28,10 @@ class ComposerStaticInit7020b987d316c2076c2a6f439a1140f9 'think\\captcha\\' => 14, 'think\\' => 6, ), + 'p' => + array ( + 'phpseclib3\\' => 11, + ), 'a' => array ( 'app\\' => 4, @@ -60,7 +65,9 @@ class ComposerStaticInit7020b987d316c2076c2a6f439a1140f9 'PhpOffice\\PhpWord\\' => 18, 'PhpOffice\\PhpSpreadsheet\\' => 25, 'PhpOffice\\Math\\' => 15, + 'PhpAmqpLib\\' => 11, 'PaypalServerSdkLib\\' => 19, + 'ParagonIE\\ConstantTime\\' => 23, 'PHPMailer\\PHPMailer\\' => 20, ), 'N' => @@ -109,6 +116,10 @@ class ComposerStaticInit7020b987d316c2076c2a6f439a1140f9 2 => __DIR__ . '/..' . '/topthink/think-helper/src', 3 => __DIR__ . '/../..' . '/thinkphp/library/think', ), + 'phpseclib3\\' => + array ( + 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib', + ), 'app\\' => array ( 0 => __DIR__ . '/../..' . '/application', @@ -174,10 +185,18 @@ class ComposerStaticInit7020b987d316c2076c2a6f439a1140f9 array ( 0 => __DIR__ . '/..' . '/phpoffice/math/src/Math', ), + 'PhpAmqpLib\\' => + array ( + 0 => __DIR__ . '/..' . '/php-amqplib/php-amqplib/PhpAmqpLib', + ), 'PaypalServerSdkLib\\' => array ( 0 => __DIR__ . '/..' . '/paypal/paypal-server-sdk/src', ), + 'ParagonIE\\ConstantTime\\' => + array ( + 0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src', + ), 'PHPMailer\\PHPMailer\\' => array ( 0 => __DIR__ . '/..' . '/phpmailer/phpmailer/src', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 103df237..bcd37877 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -953,6 +953,141 @@ }, "install-path": "../nyholm/psr7" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.8.2", + "version_normalized": "2.8.2.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "e30811f7bc69e4b5b6d5783e712c06c8eabf0226" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/e30811f7bc69e4b5b6d5783e712c06c8eabf0226", + "reference": "e30811f7bc69e4b5b6d5783e712c06c8eabf0226", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "time": "2025-09-24T15:12:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "install-path": "../paragonie/constant_time_encoding" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "version_normalized": "9.99.100.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2020-10-15T08:29:30+00:00", + "type": "library", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "install-path": "../paragonie/random_compat" + }, { "name": "paypal/paypal-server-sdk", "version": "0.6.1", @@ -999,6 +1134,96 @@ }, "install-path": "../paypal/paypal-server-sdk" }, + { + "name": "php-amqplib/php-amqplib", + "version": "v2.12.3", + "version_normalized": "2.12.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-amqplib/php-amqplib.git", + "reference": "f746eb44df6d8f838173729867dd1d20b0265faa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/f746eb44df6d8f838173729867dd1d20b0265faa", + "reference": "f746eb44df6d8f838173729867dd1d20b0265faa", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-mbstring": "*", + "ext-sockets": "*", + "php": ">=5.6.3,<8.0", + "phpseclib/phpseclib": "^2.0|^3.0" + }, + "conflict": { + "php": "7.4.0 - 7.4.1" + }, + "replace": { + "videlalvaro/php-amqplib": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "nategood/httpful": "^0.2.20", + "phpunit/phpunit": "^5.7|^6.5|^7.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "time": "2021-03-01T12:21:31+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.12-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpAmqpLib\\": "PhpAmqpLib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Alvaro Videla", + "role": "Original Maintainer" + }, + { + "name": "Raúl Araya", + "email": "nubeiro@gmail.com", + "role": "Maintainer" + }, + { + "name": "Luke Bakken", + "email": "luke@bakken.io", + "role": "Maintainer" + }, + { + "name": "Ramūnas Dronga", + "email": "github@ramuno.lt", + "role": "Maintainer" + } + ], + "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", + "homepage": "https://github.com/php-amqplib/php-amqplib/", + "keywords": [ + "message", + "queue", + "rabbitmq" + ], + "support": { + "issues": "https://github.com/php-amqplib/php-amqplib/issues", + "source": "https://github.com/php-amqplib/php-amqplib/tree/v2.12.3" + }, + "install-path": "../php-amqplib/php-amqplib" + }, { "name": "php-http/discovery", "version": "1.20.0", @@ -1693,6 +1918,125 @@ }, "install-path": "../phpoffice/phpword" }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.48", + "version_normalized": "3.0.48.0", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "64065a5679c50acb886e82c07aa139b0f757bb89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/64065a5679c50acb886e82c07aa139b0f757bb89", + "reference": "64065a5679c50acb886e82c07aa139b0f757bb89", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "time": "2025-12-15T11:51:42+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.48" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "install-path": "../phpseclib/phpseclib" + }, { "name": "psr/http-client", "version": "1.0.3", @@ -2712,6 +3056,6 @@ "install-path": "../topthink/think-queue" } ], - "dev": false, + "dev": true, "dev-package-names": [] } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 6ab50d37..91616f00 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,11 +3,11 @@ 'name' => 'topthink/think', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'fa878334cd151a29627aac8f2e01d8ce27770606', + 'reference' => '94b212fe7c6ec47113eeff7ab2125e0e1636d328', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'dev' => false, + 'dev' => true, ), 'versions' => array( 'apimatic/core' => array( @@ -136,6 +136,24 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'paragonie/constant_time_encoding' => array( + 'pretty_version' => 'v2.8.2', + 'version' => '2.8.2.0', + 'reference' => 'e30811f7bc69e4b5b6d5783e712c06c8eabf0226', + 'type' => 'library', + 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'paragonie/random_compat' => array( + 'pretty_version' => 'v9.99.100', + 'version' => '9.99.100.0', + 'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../paragonie/random_compat', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'paypal/paypal-server-sdk' => array( 'pretty_version' => '0.6.1', 'version' => '0.6.1.0', @@ -145,6 +163,15 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'php-amqplib/php-amqplib' => array( + 'pretty_version' => 'v2.12.3', + 'version' => '2.12.3.0', + 'reference' => 'f746eb44df6d8f838173729867dd1d20b0265faa', + 'type' => 'library', + 'install_path' => __DIR__ . '/../php-amqplib/php-amqplib', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'php-http/async-client-implementation' => array( 'dev_requirement' => false, 'provided' => array( @@ -244,6 +271,15 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'phpseclib/phpseclib' => array( + 'pretty_version' => '3.0.48', + 'version' => '3.0.48.0', + 'reference' => '64065a5679c50acb886e82c07aa139b0f757bb89', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpseclib/phpseclib', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'psr/http-client' => array( 'pretty_version' => '1.0.3', 'version' => '1.0.3.0', @@ -385,7 +421,7 @@ 'topthink/think' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'fa878334cd151a29627aac8f2e01d8ce27770606', + 'reference' => '94b212fe7c6ec47113eeff7ab2125e0e1636d328', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -436,5 +472,11 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'videlalvaro/php-amqplib' => array( + 'dev_requirement' => false, + 'replaced' => array( + 0 => 'v2.12.3', + ), + ), ), );