|
@ -1,8 +1,50 @@ |
|
|
<?php |
|
|
<?php |
|
|
|
|
|
|
|
|
class kmsCheck { |
|
|
class kmsCheck { |
|
|
private $api = 'https://kms.343.re'; |
|
|
private $api = 'https://kms.343.re/'; |
|
|
|
|
|
|
|
|
|
|
|
public function getKmsKeys($type) { |
|
|
|
|
|
switch ($type) { |
|
|
|
|
|
case '': |
|
|
|
|
|
$url = $this->api . 'json'; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'win': |
|
|
|
|
|
case 'win-server': |
|
|
|
|
|
$url = $this->api . $type . '/json'; |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
return array(); |
|
|
|
|
|
} |
|
|
|
|
|
return json_decode(file_get_contents($url), true); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public function kmsStatus($host, $port) { |
|
|
|
|
|
$server = $host . ':' . $port; |
|
|
|
|
|
$url = $this->api . 'check?host=' . $host . '&port=' . $port; |
|
|
|
|
|
$content = json_decode(file_get_contents($url), true); // 请求上游接口 |
|
|
|
|
|
switch ($content['status']) { |
|
|
|
|
|
case 'ok': |
|
|
|
|
|
return array( |
|
|
|
|
|
'status' => 'ok', |
|
|
|
|
|
'online' => true, |
|
|
|
|
|
'server' => $server |
|
|
|
|
|
); |
|
|
|
|
|
case 'error': |
|
|
|
|
|
return array( |
|
|
|
|
|
'status' => 'ok', |
|
|
|
|
|
'online' => false, |
|
|
|
|
|
'server' => $server |
|
|
|
|
|
); |
|
|
|
|
|
default: |
|
|
|
|
|
return array( |
|
|
|
|
|
'status' => 'error', |
|
|
|
|
|
'message' => 'Server error' |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class kmsCheckEntry { |
|
|
private function isHost($host) { // 判断host是否合法 |
|
|
private function isHost($host) { // 判断host是否合法 |
|
|
preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/', $host, $match); |
|
|
preg_match('/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/', $host, $match); |
|
|
if (count($match) !== 0) { // 域名 |
|
|
if (count($match) !== 0) { // 域名 |
|
@ -14,10 +56,9 @@ class kmsCheck { |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public function check($server) { |
|
|
private function formatCheck($server) { |
|
|
$temp = explode(':', $server); |
|
|
$temp = explode(':', $server); |
|
|
if (count($temp) === 1) { // 不带:的请求 |
|
|
if (count($temp) === 1) { // 不带:的请求 |
|
|
|
|
|
|
|
|
if ($this->isHost($temp[0])) { |
|
|
if ($this->isHost($temp[0])) { |
|
|
$host = $server; |
|
|
$host = $server; |
|
|
$port = 1688; |
|
|
$port = 1688; |
|
@ -61,8 +102,8 @@ class kmsCheck { |
|
|
return implode('', $match[0]); |
|
|
return implode('', $match[0]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public function getKmsVersions($type) { |
|
|
private function getKmsVersions($type) { // 获取win或win-server的版本列表 |
|
|
$kmsKeys = json_decode(file_get_contents($this->api . '/' . $type . '/json'), true); |
|
|
$kmsKeys = (new kmsCheck)->getKmsKeys($type); |
|
|
foreach ($kmsKeys as $version => $kmsKey) { |
|
|
foreach ($kmsKeys as $version => $kmsKey) { |
|
|
$buttons[] = array([ // 生成按钮列表 |
|
|
$buttons[] = array([ // 生成按钮列表 |
|
|
'text' => $version, |
|
|
'text' => $version, |
|
@ -81,8 +122,8 @@ class kmsCheck { |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public function getKmsKeys($targetVersion) { // 显示指定版本的KMS密钥列表 |
|
|
private function getKmsKeys($targetVersion) { // 显示指定版本的KMS密钥列表 |
|
|
$kmsKeys = json_decode(file_get_contents($this->api . '/json'), true); |
|
|
$kmsKeys = (new kmsCheck)->getKmsKeys(''); |
|
|
foreach ($kmsKeys as $version => $kmsKey) { // 比对压缩以后的名称 |
|
|
foreach ($kmsKeys as $version => $kmsKey) { // 比对压缩以后的名称 |
|
|
if ($this->simpStr($version) === $targetVersion) { break; } // 匹配成功 |
|
|
if ($this->simpStr($version) === $targetVersion) { break; } // 匹配成功 |
|
|
} |
|
|
} |
|
@ -96,117 +137,110 @@ class kmsCheck { |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public function checkKms($host, $port) { |
|
|
private function checkKms($host, $port) { // 检查KMS服务器状态 |
|
|
$server = $host . ':' . $port; |
|
|
$content = (new kmsCheck)->kmsStatus($host, $port); |
|
|
$url = $this->api . '/check?host=' . $host . '&port=' . $port; |
|
|
if ($content['status'] === 'ok') { |
|
|
$content = json_decode(file_get_contents($url), true); // 请求上游接口 |
|
|
if ($content['online'] === true) { |
|
|
switch ($content['status']) { |
|
|
|
|
|
case 'ok': |
|
|
|
|
|
return array( |
|
|
return array( |
|
|
'parse_mode' => 'Markdown', |
|
|
'parse_mode' => 'Markdown', |
|
|
'text' => '`' . $server . '`' . PHP_EOL . 'KMS服务*正常运行*' |
|
|
'text' => '`' . $content['server'] . '`' . PHP_EOL . 'KMS服务*正常运行*' |
|
|
); |
|
|
); |
|
|
case 'error': |
|
|
} else { |
|
|
return array( |
|
|
return array( |
|
|
'parse_mode' => 'Markdown', |
|
|
'parse_mode' => 'Markdown', |
|
|
'text' => '`' . $server . '`' . PHP_EOL . 'KMS服务*无法使用*' |
|
|
'text' => '`' . $content['server'] . '`' . PHP_EOL . 'KMS服务*无法使用*' |
|
|
); |
|
|
|
|
|
default: |
|
|
|
|
|
return array( |
|
|
|
|
|
'text' => 'Server error' |
|
|
|
|
|
); |
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
return array( |
|
|
|
|
|
'text' => $content['message'] |
|
|
|
|
|
); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function kmsCheck($rawParam) { // KMS测试入口 |
|
|
public function query($rawParam) { // kmsCheck查询入口 |
|
|
global $chatId; |
|
|
if ($rawParam == '' || $rawParam === 'help') { // 显示使用说明 |
|
|
if ($rawParam == '' || $rawParam === 'help') { // 显示使用说明 |
|
|
tgApi::sendMessage(array( |
|
|
sendMessage($chatId, array( |
|
|
|
|
|
'parse_mode' => 'Markdown', |
|
|
|
|
|
'text' => '*Usage:* `/kms IP/Domain[:port]`', |
|
|
|
|
|
'reply_markup' => json_encode(array( // 获取KMS密钥按钮 |
|
|
|
|
|
'inline_keyboard' => array([[ |
|
|
|
|
|
'text' => 'Get KMS Keys', |
|
|
|
|
|
'callback_data' => '/kms keys' |
|
|
|
|
|
]]) |
|
|
|
|
|
)) |
|
|
|
|
|
)); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
$check = (new kmsCheck)->check($rawParam); |
|
|
|
|
|
if ($check['status'] === 'error') { // 输入格式有误 |
|
|
|
|
|
sendMessage($chatId, array( |
|
|
|
|
|
'text' => $check['message'] |
|
|
|
|
|
)); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
$message = json_decode(sendMessage($chatId, array( |
|
|
|
|
|
'parse_mode' => 'Markdown', |
|
|
|
|
|
'text' => '`' . $rawParam . '`' . PHP_EOL . 'KMS服务检测中...' |
|
|
|
|
|
)), true); |
|
|
|
|
|
sendPayload(array( |
|
|
|
|
|
'method' => 'editMessageText', |
|
|
|
|
|
'chat_id' => $chatId, |
|
|
|
|
|
'message_id' => $message['result']['message_id'], |
|
|
|
|
|
) + (new kmsCheck)->checkKms($check['host'], $check['port'])); // 发起查询并返回结果 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function kmsCheckCallback($rawParam) { // KMS测试回调入口 |
|
|
|
|
|
global $chatId, $messageId; |
|
|
|
|
|
$selectMsg = array( |
|
|
|
|
|
'text' => 'Which one did you need?', |
|
|
|
|
|
'reply_markup' => json_encode(array( |
|
|
|
|
|
'inline_keyboard' => array( |
|
|
|
|
|
array([ |
|
|
|
|
|
'text' => 'Windows', |
|
|
|
|
|
'callback_data' => '/kms win' |
|
|
|
|
|
]), |
|
|
|
|
|
array([ |
|
|
|
|
|
'text' => 'Windows Server', |
|
|
|
|
|
'callback_data' => '/kms win-server' |
|
|
|
|
|
]), |
|
|
|
|
|
array([ |
|
|
|
|
|
'text' => 'Activation Command', |
|
|
|
|
|
'callback_data' => '/kms cmd' |
|
|
|
|
|
]) |
|
|
|
|
|
) |
|
|
|
|
|
)) |
|
|
|
|
|
); |
|
|
|
|
|
$actiCmd = '```' . PHP_EOL . 'slmgr /upk' . PHP_EOL . 'slmgr /ipk {KMS_KEY}' . PHP_EOL; |
|
|
|
|
|
$actiCmd .= 'slmgr /skms {KMS_HOST}' . PHP_EOL . 'slmgr /ato' . PHP_EOL . 'slmgr /dlv'; |
|
|
|
|
|
$actiCmd .= PHP_EOL . '```'; |
|
|
|
|
|
switch ($rawParam) { |
|
|
|
|
|
case 'keys': |
|
|
|
|
|
sendPayload(array( |
|
|
|
|
|
'method' => 'editMessageText', |
|
|
|
|
|
'chat_id' => $chatId, |
|
|
|
|
|
'message_id' => $messageId, |
|
|
|
|
|
) + $selectMsg); |
|
|
|
|
|
return; |
|
|
|
|
|
case 'cmd': |
|
|
|
|
|
sendPayload(array( |
|
|
|
|
|
'method' => 'editMessageText', |
|
|
|
|
|
'chat_id' => $chatId, |
|
|
|
|
|
'message_id' => $messageId, |
|
|
|
|
|
'parse_mode' => 'Markdown', |
|
|
'parse_mode' => 'Markdown', |
|
|
'text' => $actiCmd |
|
|
'text' => '*Usage:* `/kms IP/Domain[:port]`', |
|
|
|
|
|
'reply_markup' => json_encode(array( // 获取KMS密钥按钮 |
|
|
|
|
|
'inline_keyboard' => array([[ |
|
|
|
|
|
'text' => 'Get KMS Keys', |
|
|
|
|
|
'callback_data' => '/kms keys' |
|
|
|
|
|
]]) |
|
|
|
|
|
)) |
|
|
)); |
|
|
)); |
|
|
return; |
|
|
return; |
|
|
case 'win': |
|
|
} |
|
|
case 'win-server': |
|
|
$check = $this->formatCheck($rawParam); |
|
|
sendPayload(array( |
|
|
if ($check['status'] === 'error') { // 输入格式有误 |
|
|
'method' => 'editMessageText', |
|
|
tgApi::sendText($check['message']); |
|
|
'chat_id' => $chatId, |
|
|
|
|
|
'message_id' => $messageId, |
|
|
|
|
|
) + (new kmsCheck)->getKmsVersions($rawParam)); |
|
|
|
|
|
return; |
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
$message = json_decode(tgApi::sendMessage(array( |
|
|
|
|
|
'parse_mode' => 'Markdown', |
|
|
|
|
|
'text' => '`' . $rawParam . '`' . PHP_EOL . 'KMS服务检测中...' |
|
|
|
|
|
)), true); |
|
|
|
|
|
fastcgi_finish_request(); // 断开连接 |
|
|
|
|
|
tgApi::editMessage(array( |
|
|
|
|
|
'message_id' => $message['result']['message_id'], |
|
|
|
|
|
) + $this->checkKms($check['host'], $check['port'])); // 发起查询并返回结果 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public function callback($rawParam) { // kmsCheck回调入口 |
|
|
|
|
|
global $tgEnv; |
|
|
|
|
|
$selectMsg = array( |
|
|
|
|
|
'text' => 'Which one did you need?', |
|
|
|
|
|
'reply_markup' => json_encode(array( |
|
|
|
|
|
'inline_keyboard' => array( |
|
|
|
|
|
array([ |
|
|
|
|
|
'text' => 'Windows', |
|
|
|
|
|
'callback_data' => '/kms win' |
|
|
|
|
|
]), |
|
|
|
|
|
array([ |
|
|
|
|
|
'text' => 'Windows Server', |
|
|
|
|
|
'callback_data' => '/kms win-server' |
|
|
|
|
|
]), |
|
|
|
|
|
array([ |
|
|
|
|
|
'text' => 'Activation Command', |
|
|
|
|
|
'callback_data' => '/kms cmd' |
|
|
|
|
|
]) |
|
|
|
|
|
) |
|
|
|
|
|
)) |
|
|
|
|
|
); |
|
|
|
|
|
$actiCmd = '```' . PHP_EOL . 'slmgr /upk' . PHP_EOL . 'slmgr /ipk {KMS_KEY}' . PHP_EOL; |
|
|
|
|
|
$actiCmd .= 'slmgr /skms {KMS_HOST}' . PHP_EOL . 'slmgr /ato' . PHP_EOL . 'slmgr /dlv'; |
|
|
|
|
|
$actiCmd .= PHP_EOL . '```'; |
|
|
|
|
|
switch ($rawParam) { |
|
|
|
|
|
case 'keys': |
|
|
|
|
|
tgApi::editMessage(array( |
|
|
|
|
|
'message_id' => $tgEnv['messageId'], |
|
|
|
|
|
) + $selectMsg); |
|
|
|
|
|
return; |
|
|
|
|
|
case 'cmd': |
|
|
|
|
|
tgApi::editMessage(array( |
|
|
|
|
|
'message_id' => $tgEnv['messageId'], |
|
|
|
|
|
'parse_mode' => 'Markdown', |
|
|
|
|
|
'text' => $actiCmd, |
|
|
|
|
|
'reply_markup' => json_encode(array( |
|
|
|
|
|
'inline_keyboard' => array([[ |
|
|
|
|
|
'text' => '<< Go back <<', |
|
|
|
|
|
'callback_data' => '/kms keys' |
|
|
|
|
|
]]) |
|
|
|
|
|
)) |
|
|
|
|
|
)); |
|
|
|
|
|
return; |
|
|
|
|
|
case 'win': |
|
|
|
|
|
case 'win-server': |
|
|
|
|
|
tgApi::editMessage(array( |
|
|
|
|
|
'message_id' => $tgEnv['messageId'], |
|
|
|
|
|
) + $this->getKmsVersions($rawParam)); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
tgApi::editMessage(array( |
|
|
|
|
|
'message_id' => $tgEnv['messageId'] |
|
|
|
|
|
) + $this->getKmsKeys($rawParam)); |
|
|
} |
|
|
} |
|
|
sendPayload(array( |
|
|
|
|
|
'method' => 'editMessageText', |
|
|
|
|
|
'chat_id' => $chatId, |
|
|
|
|
|
'message_id' => $messageId |
|
|
|
|
|
) + (new kmsCheck)->getKmsKeys($rawParam)); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
?> |
|
|
?> |
|
|