This commit is contained in:
net909
2024-04-03 21:29:42 +08:00
parent 9fd3a7d3b7
commit 9e3f934701
40 changed files with 342 additions and 1060 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ class ViewOutput
{
View::assign('islogin', $request->islogin);
View::assign('user', $request->user);
View::assign('cdn_cdnjs', config_get('cdn_cdnjs', '//cdn.staticfile.org/'));
View::assign('cdn_cdnjs', config_get('cdn_cdnjs', '//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/'));
View::assign('cdn_npm', config_get('cdn_npm', 'https://unpkg.com/'));
View::config(['view_path' => template_path_get()]);
return $next($request)->header([
Generated
+60 -57
View File
@@ -8,20 +8,20 @@
"packages": [
{
"name": "cccyun/think-captcha",
"version": "3.0.7",
"version": "3.0.9",
"source": {
"type": "git",
"url": "https://github.com/netcccyun/think-captcha.git",
"reference": "ba2997f1c3fbcf2aae3dd5a80c8285a957121523"
"reference": "dcbc3f2cc29749c962cc8ad5d12ae59a30d73b24"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/netcccyun/think-captcha/zipball/ba2997f1c3fbcf2aae3dd5a80c8285a957121523",
"reference": "ba2997f1c3fbcf2aae3dd5a80c8285a957121523",
"url": "https://api.github.com/repos/netcccyun/think-captcha/zipball/dcbc3f2cc29749c962cc8ad5d12ae59a30d73b24",
"reference": "dcbc3f2cc29749c962cc8ad5d12ae59a30d73b24",
"shasum": ""
},
"require": {
"topthink/framework": "^6.0.0"
"topthink/framework": "^6.0|^8.0"
},
"type": "library",
"extra": {
@@ -54,9 +54,9 @@
],
"description": "captcha package for thinkphp",
"support": {
"source": "https://github.com/netcccyun/think-captcha/tree/3.0.7"
"source": "https://github.com/netcccyun/think-captcha/tree/3.0.9"
},
"time": "2022-10-21T03:33:53+00:00"
"time": "2023-06-02T03:38:07+00:00"
},
{
"name": "khanamiryan/qrcode-detector-decoder",
@@ -163,25 +163,25 @@
},
{
"name": "psr/http-message",
"version": "1.0.1",
"version": "1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -210,9 +210,9 @@
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/master"
"source": "https://github.com/php-fig/http-message/tree/1.1"
},
"time": "2016-08-06T14:39:51+00:00"
"time": "2023-04-04T09:50:52+00:00"
},
{
"name": "psr/log",
@@ -317,16 +317,16 @@
},
{
"name": "topthink/framework",
"version": "v6.1.2",
"version": "v6.1.4",
"source": {
"type": "git",
"url": "https://github.com/top-think/framework.git",
"reference": "67235be5b919aaaf1de5aed9839f65d8e766aca3"
"reference": "66eb9cf4d627df12911344cd328faf9bb596bf2c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/top-think/framework/zipball/67235be5b919aaaf1de5aed9839f65d8e766aca3",
"reference": "67235be5b919aaaf1de5aed9839f65d8e766aca3",
"url": "https://api.github.com/repos/top-think/framework/zipball/66eb9cf4d627df12911344cd328faf9bb596bf2c",
"reference": "66eb9cf4d627df12911344cd328faf9bb596bf2c",
"shasum": ""
},
"require": {
@@ -376,9 +376,9 @@
],
"support": {
"issues": "https://github.com/top-think/framework/issues",
"source": "https://github.com/top-think/framework/tree/v6.1.2"
"source": "https://github.com/top-think/framework/tree/v6.1.4"
},
"time": "2023-02-08T02:24:01+00:00"
"time": "2023-07-11T15:16:03+00:00"
},
{
"name": "topthink/think-helper",
@@ -428,24 +428,27 @@
},
{
"name": "topthink/think-migration",
"version": "v3.0.5",
"version": "v3.1.1",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-migration.git",
"reference": "7a5ec3952ea97bf1a5d8872e1bd10f2abf6294ca"
"reference": "22c44058e1454f3af1d346e7f6524fbe654de7fb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/top-think/think-migration/zipball/7a5ec3952ea97bf1a5d8872e1bd10f2abf6294ca",
"reference": "7a5ec3952ea97bf1a5d8872e1bd10f2abf6294ca",
"url": "https://api.github.com/repos/top-think/think-migration/zipball/22c44058e1454f3af1d346e7f6524fbe654de7fb",
"reference": "22c44058e1454f3af1d346e7f6524fbe654de7fb",
"shasum": ""
},
"require": {
"topthink/framework": "^6.0",
"php": ">=7.2",
"topthink/framework": "^6.0 || ^8.0",
"topthink/think-helper": "^3.0.3"
},
"require-dev": {
"fzaninotto/faker": "^1.8"
"composer/composer": "^2.5.8",
"fzaninotto/faker": "^1.8",
"robmorgan/phinx": "^0.13.4"
},
"suggest": {
"fzaninotto/faker": "Required to use the factory builder (^1.8)."
@@ -460,7 +463,7 @@
},
"autoload": {
"psr-4": {
"Phinx\\": "phinx/src/Phinx",
"Phinx\\": "phinx",
"think\\migration\\": "src"
}
},
@@ -476,22 +479,22 @@
],
"support": {
"issues": "https://github.com/top-think/think-migration/issues",
"source": "https://github.com/top-think/think-migration/tree/v3.0.5"
"source": "https://github.com/top-think/think-migration/tree/v3.1.1"
},
"time": "2023-02-26T13:16:22+00:00"
"time": "2023-09-14T05:51:31+00:00"
},
{
"name": "topthink/think-orm",
"version": "v2.0.60",
"version": "v2.0.61",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-orm.git",
"reference": "8bc34a4307fa27186c0e96a9b3de3cb23aa1ed46"
"reference": "10528ebf4a5106b19c3bac9c6deae7a67ff49de6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/top-think/think-orm/zipball/8bc34a4307fa27186c0e96a9b3de3cb23aa1ed46",
"reference": "8bc34a4307fa27186c0e96a9b3de3cb23aa1ed46",
"url": "https://api.github.com/repos/top-think/think-orm/zipball/10528ebf4a5106b19c3bac9c6deae7a67ff49de6",
"reference": "10528ebf4a5106b19c3bac9c6deae7a67ff49de6",
"shasum": ""
},
"require": {
@@ -531,9 +534,9 @@
],
"support": {
"issues": "https://github.com/top-think/think-orm/issues",
"source": "https://github.com/top-think/think-orm/tree/v2.0.60"
"source": "https://github.com/top-think/think-orm/tree/v2.0.61"
},
"time": "2023-03-19T04:51:56+00:00"
"time": "2023-04-20T14:27:51+00:00"
},
{
"name": "topthink/think-template",
@@ -621,16 +624,16 @@
"packages-dev": [
{
"name": "symfony/polyfill-mbstring",
"version": "v1.27.0",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
"reference": "42292d99c55abe617799667f454222c54c60e229"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
"reference": "42292d99c55abe617799667f454222c54c60e229",
"shasum": ""
},
"require": {
@@ -645,7 +648,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -684,7 +687,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
},
"funding": [
{
@@ -700,20 +703,20 @@
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
"time": "2023-07-28T09:04:16+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.27.0",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
"reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
"reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
"shasum": ""
},
"require": {
@@ -722,7 +725,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -760,7 +763,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
"source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0"
},
"funding": [
{
@@ -776,20 +779,20 @@
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
"time": "2023-01-26T09:26:14+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.27.0",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
"shasum": ""
},
"require": {
@@ -798,7 +801,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -843,7 +846,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
},
"funding": [
{
@@ -859,7 +862,7 @@
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
"time": "2023-01-26T09:26:14+00:00"
},
{
"name": "symfony/var-dumper",
+1 -1
View File
@@ -48,7 +48,7 @@ INSERT INTO `toolbox_config` (`key`, `value`) VALUES
('captcha_id', ''),
('captcha_key', ''),
('ip_type', '0'),
('cdn_cdnjs', '//cdn.staticfile.org/'),
('cdn_cdnjs', '//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/'),
('cdn_npm', 'https://unpkg.com/'),
('description', '这是一个非常Nice的在线工具箱'),
('foot_code', ''),
+40 -2
View File
@@ -29,6 +29,36 @@
<div class="form-group">
<label class="form-label">下载链接</label>
<div class="form-control-wrap">
<select v-model="set.nodeurl" type="text" class="form-control">
<optgroup label="运营商">
<option value="https://freeserver.migufun.com/resource/beta/apk/20231114094513/MiguPlay-V3.69.1.1_miguzsj.apk">
咪咕快游①</option>
<option value="https://freeserver.migufun.com/resource/beta/video/system/20210924112351666.mp4">
咪咕快游②</option>
<option value="https://im.zdxlz.com/downloadmi/file-im-sdk/apk/mobile/%E9%87%8F%E5%AD%90%E5%AF%86%E4%BF%A1.apk">
量子密信</option>
<option value="https://img.mcloud.139.com/material_prod/material_media/20221128/1669626861087.png">
和彩云</option>
<option value="https://vod-origin-rjzy.gdoss.xstore.ctyun.cn/1de5da90486f42e8939deed107fd64a3.mp4">
天翼云</option>
</optgroup>
<optgroup label="其他">
<option value="https://vipspeedtest8.wuhan.net.cn:8080/download?size=1073741824" selected>
电信测速</option>
<option value="https://mirrors.sjtug.sjtu.edu.cn/speedtest/garbage?ckSize=1024">
上海交大</option>
</optgroup>
<optgroup label="全球[Global]">
<option value="https://speed.cloudflare.com/__down?bytes=104857600">
Cloudflare</option>
<option value="https://akamtrans-a.akamaihd.net/delivery/2023/08/30/brand-protector-2500k-00004.ts">
Akamai</option>
<option value="https://gh.con.sh/https://github.com/AaronFeng753/Waifu2x-Extension-GUI/releases/download/v2.21.12/Waifu2x-Extension-GUI-v2.21.12-Portable.7z">
Cloudflare Workers</option>
<option value="https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RW16Ptm">
Microsoft Akamai</option>
</optgroup>
</select>
<input type="text" v-model="set.input" placeholder="下载链接" class="form-control" autocomplete="off">
</div>
</div>
@@ -91,12 +121,14 @@ new Vue({
el: '#app',
data: {
set: {
input: 'https://web1.cachefly.net/speedtest/downloading',
nodeurl: 'https://vipspeedtest8.wuhan.net.cn:8080/download?size=1073741824',
input: '',
output: '',
infinite: true,
status: false,
thread: 1,
thread: 4,
},
node_list: [],
tasks: [],
speed: '0.00B/s',
spend: 0,
@@ -127,8 +159,14 @@ new Vue({
clearInterval(this.timer)
this.cancelSource.cancel()
}
},
'set.nodeurl'(newVal) {
this.set.input = newVal
}
},
mounted() {
this.set.input = this.set.nodeurl
},
methods: {
run() {
this.set.status = !this.set.status
@@ -41,6 +41,9 @@ class dianping implements api
if($url){
$visitid = getSubstr($url, 'visitId=', '&');
if($visitid){
$url = 'https://kf.dianping.com/api/portal/message/init?visitId='.$visitid.'&accessToken=undefined';
$post = '{"type":"Init","parameters":{"isPreview":true,"build":null}}';
get_curl($url, $post);
cache('dianping_visitid', $visitid, 86400);
return $visitid;
}
-87
View File
@@ -1,87 +0,0 @@
<?php
/**
* uniCloud文件快传
*/
namespace plugin\utility\unicloud;
use app\Plugin;
use think\facade\Db;
use plugin\utility\unicloud\UnicloudClient;
use Exception;
class App extends Plugin
{
private $unicloud;
public function index()
{
return $this->view();
}
public function preUpload(){
if(!input('?post.filename'))exit('{"code":-1,"msg":"请选择文件"}');
try{
$this->getSession();
} catch (Exception $e) {
return ['code'=>-1, 'msg'=>'获取AccessToken失败:' . $e->getMessage()];
}
try{
$result = $this->unicloud->pre_upload_file(input('post.filename'));
$fileurl = 'https://'.$result['cdnDomain'].'/'.$result['ossPath'];
session('unicloud_filename', input('post.filename'));
session('unicloud_fileurl', $fileurl);
return json(['code'=>0, 'data'=>$result]);
} catch (Exception $e) {
return json(['code'=>-1, 'msg'=>'准备文件上传失败:' . $e->getMessage()]);
}
}
public function completeUpload(){
if(!input('?post.id'))exit('{"code":-1,"msg":"no id"}');
try{
$this->getSession();
} catch (Exception $e) {
return ['code'=>-1, 'msg'=>'获取AccessToken失败:' . $e->getMessage()];
}
try{
$result = $this->unicloud->complete_upload_file(input('post.id'));
Db::name('uploadlog')->insert([
'uid' => request()->islogin ? request()->user['id'] : 0,
'type' => 'file',
'source' => 'unicloud',
'filename' => session('unicloud_filename'),
'fileurl' => session('unicloud_fileurl'),
'ip' => $this->clientip,
'addtime' => date("Y-m-d H:i:s")
]);
session('unicloud_filename', null);
session('unicloud_fileurl', null);
return json(['code'=>0, 'data'=>$result]);
} catch (Exception $e) {
return json(['code'=>-1, 'msg'=>'完成文件上传失败:' . $e->getMessage()]);
}
}
private function getSession(){
include dirname(__FILE__).'/config.php';
$this->unicloud = new UnicloudClient($spaceId, $clientSecret);
if(session('access_token') && session('access_token_expire') && session('access_token_expire')>time()){
$access_token = session('access_token');
$this->unicloud->set_access_token($access_token);
}else{
$access_token = $this->unicloud->get_access_token();
session('access_token', $access_token);
session('access_token_expire', time()+600);
}
return null;
}
}
-144
View File
@@ -1,144 +0,0 @@
<?php
// uniCloud云存储客户端
namespace plugin\utility\unicloud;
use Exception;
class UnicloudClient {
private $spaceId;
private $clientSecret;
private $endpoint = "https://api.bspapp.com";
private $accessToken = null;
function __construct($spaceId, $clientSecret){
$this->spaceId = $spaceId;
$this->clientSecret = $clientSecret;
}
public function set_access_token($accessToken){
$this->accessToken = $accessToken;
}
// 获取AccessToken
public function get_access_token(){
if(!empty($this->accessToken)) return $this->accessToken;
$param = [
'method' => 'serverless.auth.user.anonymousAuthorize',
'params' => '{}',
'spaceId' => $this->spaceId,
'timestamp' => $this->msec_time()
];
$sign = $this->get_sign($param);
$payload = json_encode($param);
$header = [
'x-serverless-sign: '.$sign
];
$result = $this->curl_post($payload, $header);
$this->accessToken = $result['accessToken'];
return $this->accessToken;
}
// 获取文件上传信息
public function pre_upload_file($filename){
$method = 'serverless.file.resource.generateProximalSign';
$params = [
'env' => 'public',
'filename' => $filename
];
$result = $this->send_request($method, $params);
return $result;
}
// 完成文件上传
public function complete_upload_file($id){
$method = 'serverless.file.resource.report';
$params = [
'id' => $id
];
$this->send_request($method, $params);
return true;
}
// 删除文件(不支持阿里云)
public function delete_file($id){
$method = 'serverless.file.resource.delete';
$params = [
'id' => $id
];
$this->send_request($method, $params);
return true;
}
private function send_request($method, $params){
$access_token = $this->get_access_token();
$postparam = [
'method' => $method,
'params' => json_encode($params),
'spaceId' => $this->spaceId,
'timestamp' => $this->msec_time(),
'token' => $access_token
];
$sign = $this->get_sign($postparam);
$payload = json_encode($postparam);
$header = [
'x-basement-token: '.$access_token,
'x-serverless-sign: '.$sign
];
$result = $this->curl_post($payload, $header);
return $result;
}
private function get_sign($param){
$signPars = "";
ksort($param);
foreach ($param as $k => $v) {
if ($v != '') {
$signPars .= $k . '=' . $v . '&';
}
}
$signPars = substr($signPars, 0, -1);
$sign = hash_hmac('md5', $signPars, $this->clientSecret);
return $sign;
}
private function msec_time() {
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
}
private function curl_post($payload, $header){
$url = $this->endpoint.'/client';
$httpheader[] = "accept: */*";
$httpheader[] = "accept-encoding: gzip,deflate,sdch";
$httpheader[] = "accept-language: zh-CN,zh;q=0.8";
$httpheader[] = "cache-control: no-cache";
$httpheader[] = "content-type: application/json";
$httpheader[] = "pragma: no-cache";
$httpheader[] = "connection: close";
$httpheader = array_merge($httpheader, $header);
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36');
$json=curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpCode==200){
$arr=json_decode($json,true);
if($arr['success'] == true){
return $arr['data'];
}else{
throw new Exception($arr['error']['message'] ? $arr['error']['message'] : '未知错误');
}
}else{
throw new Exception('curl error! httpcode='.$httpCode);
}
}
}
-5
View File
@@ -1,5 +0,0 @@
<?php
$spaceId = '10b3891b-be67-4103-a60f-9da1d057470c';
$clientSecret = '6H2YuHYH4Cju+/5K8YIJjA==';
-312
View File
@@ -1,312 +0,0 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
.btn-block {
white-space:normal;
}
.btn-active {background-color: #1c2b46;color: #fff;}
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-9 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">uniCloud文件快传</span>
</div>
<div class="progress progress-lg mt-1 mb-1">
<div class="progress-bar progress-bar-striped progress-bar-animated" v-bind:style="{ width: progress + '%' }">{{progress}}%</div>
</div>
<div class="form-group">
<div class="text-center pt-5 pb-5 btn btn-lg btn-block btn-outline-light mb-4 d-block" id="fileInput">
<div class="preview-icon-wrap"><em class="ni ni-upload"></em></div><span>点击选择文件/Ctrl+V粘贴/拖拽到此处</span>
<input type="file" id="file" style="opacity: 0;position: absolute;cursor: pointer;width: 100%;height: 100%;left: 0;top: 0;" @change="selectFile">
</div>
</div>
<div class="form-group">
<div class="btn-group">
<button v-for="v in set.output_types.items" class="btn btn-outline-dark btn-sm"
:class="{'btn-active':set.output_types.current===v.key}"
@click="set.output_types.current=v.key"
>
{{v.title}}
</button>
</div>
<div class="form-control-wrap">
<textarea class="form-control" id="output" v-model="result" rows="8" placeholder="这里显示上传的结果"></textarea>
</div>
<div class="text-center"><button class="btn btn-sm btn-outline-light" @click="copy"><em class="icon ni ni-copy"></em>点此复制</button>&nbsp;&nbsp;&nbsp;&nbsp;<button class="btn btn-sm btn-outline-light" @click="reset"><em class="icon ni ni-reload"></em>清空</button></div>
</div>
</div>
</div>
<div class="card card-preview">
<div class="card-inner">
<h6><em class="icon ni ni-info"></em> 工具说明</h6>
<div class="accordion-inner">
<p>uniCloud文件快传底层使用阿里云OSS存储,支持任何格式的文件,也可以当图床使用。</p>
<p>一次只能上传1个文件,文件大小限制100M。一经上传,将无法删除,本站也不会保存。</p>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdn_cdnjs}vue/2.6.14/vue.min.js"></script>
<script>
new Vue({
el: '#app',
data: {
set: {
output_types: {
current: 'URL',
items: [
{
title: 'URL',
key: 'URL',
template: '#url#',
},
{
title: 'HTML',
key: 'HTML',
template: '<a href="#url#" target="_blank">#name#</a>',
},
{
title: 'BBCode',
key: 'BBCode',
template: '[url=#url#]#name#[/url]',
},
{
title: 'Markdown',
key: 'Markdown',
template: '[#name#](#url#)',
},
]
},
output: [],
},
progress: 0,
urls: {},
result: '',
},
mounted() {
var that=this;
document.addEventListener('paste', function(e) {
var items = ((e.clipboardData || window.clipboardData).items) || [];
var file = null;
if (items && items.length) {
for (var i = 0; i < items.length; i++) {
if (items[i].type.indexOf('text/') === -1) {
file = items[i].getAsFile();
break;
}
}
}
if (!file) {
return;
}
that.pasteFile(file)
});
},
watch: {
'set.output'(newVal) {
let list = {}
for (item of this.set.output_types.items) {
let arr = []
for (const v of newVal) {
arr.push(item.template.replaceAll('#url#', v.url).replaceAll('#name#', v.name))
}
list[item.key] = arr;
}
this.urls = list
},
'urls'(newVal) {
this.result = newVal[this.set.output_types.current].join('\n')
},
'set.output_types.current'(newVal) {
this.result = this.urls[newVal] ? this.urls[newVal].join('\n') : '';
}
},
methods: {
async preUpload(filename){
var that = this;
return new Promise((resolve, reject) => {
$.ajax({
type : "POST",
url : "/api/{$plugin.alias}/preUpload",
data : {filename: filename},
dataType : 'json',
success : function(data) {
if(data.code == 0){
resolve(data.data);
}else{
reject(data.msg);
}
},
error : function(){
reject('准备文件上传失败:接口错误');
}
});
})
},
async completeUpload(id){
var that = this;
return new Promise((resolve, reject) => {
$.ajax({
type : "POST",
url : "/api/{$plugin.alias}/completeUpload",
data : {id: id},
dataType : 'json',
success : function(data) {
if(data.code == 0){
resolve(data.data);
}else{
reject(data.msg);
}
},
error : function(){
reject('完成文件上传失败:接口错误');
}
});
})
},
async uploadFile(url, postdata, file){
var that = this;
return new Promise((resolve, reject) => {
var data = new FormData();
for(key in postdata){
data.append(key, postdata[key]);
}
data.append('file', file);
$.ajax({
type : "POST",
url : url,
data : data,
processData: false,
contentType: false,
dataType : 'html',
success : function(data) {
resolve();
},
error : function(){
reject('文件上传失败!');
},
xhr: function() {
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function (e) {
//console.log(e);
progressRate = Math.round(e.loaded / e.total * 100);
that.progress = progressRate;
})
return xhr;
}
});
})
},
async selectFile(e) {
var total = e.target.files.length;
if(total == 0) return;
var file = e.target.files[0];
if(file.size > 104857600){
layer.alert('文件大小限制100M');return;
}
this.progress = 0;
var url,postdata,fileid,fileurl;
var loading = layer.msg('正在准备文件上传', {icon: 16,shade: 0.3,time: 0});
await this.preUpload(file.name).then(data => {
fileid = data.id;
postdata = {'Cache-Control':'max-age=2592000', 'Content-Disposition':'attachment', 'OSSAccessKeyId':data.accessKeyId, 'Signature':data.signature, 'host':data.host, 'id':data.id, 'key':data.ossPath, 'policy':data.policy, 'success_action_status':'200'};
url = 'https://' + data.host + '/';
fileurl = 'https://' + data.cdnDomain + '/' + data.ossPath;
}, error => {
layer.close(loading);
layer.alert(error, {icon: 2});
$("#file").val('');
throw Error();
});
loading = layer.msg('正在上传文件,请稍候...', {icon: 16,shade: 0.3,time: 0});
await this.uploadFile(url, postdata, file).then(() => {
}, error => {
layer.close(loading);
layer.alert(error, {icon: 2});
$("#file").val('');
throw Error();
});
loading = layer.msg('上传成功,正在保存', {icon: 16,shade: 0.3,time: 0});
await this.completeUpload(fileid).then(data => {
layer.close(loading);
}, error => {
layer.close(loading);
layer.alert(error, {icon: 2});
$("#file").val('');
throw Error();
});
var res = { url: fileurl, name: file.name };
this.set.output.push(res)
},
async pasteFile(file) {
if(file.size > 104857600){
layer.alert('文件大小限制100M');return;
}
this.progress = 0;
var url,postdata,fileid,fileurl;
var loading = layer.msg('正在准备文件上传', {icon: 16,shade: 0.3,time: 0});
await this.preUpload(file.name).then(data => {
fileid = data.id;
postdata = {'Cache-Control':'max-age=2592000', 'Content-Disposition':'attachment', 'OSSAccessKeyId':data.accessKeyId, 'Signature':data.signature, 'host':data.host, 'id':data.id, 'key':data.ossPath, 'policy':data.policy, 'success_action_status':'200'};
url = 'https://' + data.host + '/';
fileurl = 'https://' + data.cdnDomain + '/' + data.ossPath;
}, error => {
layer.close(loading);
layer.alert(error, {icon: 2});
$("#file").val('');
throw Error();
});
loading = layer.msg('正在上传文件,请稍候...', {icon: 16,shade: 0.3,time: 0});
await this.uploadFile(url, postdata, file).then(() => {
}, error => {
layer.close(loading);
layer.alert(error, {icon: 2});
$("#file").val('');
throw Error();
});
loading = layer.msg('上传成功,正在保存', {icon: 16,shade: 0.3,time: 0});
await this.completeUpload(fileid).then(data => {
layer.close(loading);
}, error => {
layer.close(loading);
layer.alert(error, {icon: 2});
$("#file").val('');
throw Error();
});
var res = { url: fileurl, name: file.name };
this.set.output.push(res)
},
copy(){
if(!this.result) return;
$("#output").select();
document.execCommand("Copy");
layer.msg('复制成功', {icon:1, time:600})
},
reset(){
this.set.output = [];
this.progress = 0;
}
},
})
</script>
{/block}
+76 -1
View File
@@ -28,7 +28,7 @@ class App extends Plugin
try{
if($type == 'wx'){
$msg = $this->query_wx($link);
$msg = $this->query_wx2($link);
}else{
$msg = $this->query_qq($link);
}
@@ -39,6 +39,21 @@ class App extends Plugin
return msg('ok','success',$msg);
}
public function queryqq(){
$link = input('post.url', null, 'trim');
$randstr = input('post.randstr', null, 'trim');
$ticket = input('post.ticket', null, 'trim');
if(!$link) return msg('error','no url');
try{
$msg = $this->query_qq_new($link, $ticket, $randstr);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg('ok','success',$msg);
}
private function query_qq_old($link){
$url = 'https://cgi.urlsec.qq.com/index.php?m=gwComplainMergeIntoWechat&a=checkBlackStatus&callback=url_query&url='.urlencode($link);
$data=$this->guanjia_curl($url);
@@ -97,7 +112,53 @@ class App extends Plugin
}
}else{
$msg['检测URL'] = $link;
$msg['查询失败'] = $arr['data'];
}
return $msg;
}
private function query_qq_new($link, $ticket, $randstr){
$url='https://cgi.urlsec.qq.com/index.php?m=check&a=gw_check&callback=url_query&url='.urlencode($link).'&ticket='.$ticket.'&randstr='.urlencode($randstr).'&_='.time().'123';
$data=$this->guanjia_curl($url);
$arr = jsonp_decode($data, true);
if(!$arr) throw new Exception('查询接口返回数据解析失败');
if(isset($arr['reCode']) && $arr['reCode']==0) {
$arr = $arr['data']['results'];
//print_r($arr);
$msg['检测URL'] = $arr['url'];
if($arr['whitetype']==3||$arr['whitetype']==4){
$msg['域名状态'] = '<font color="green">白名单</font>';
}elseif($arr['whitetype']==2){
$msg['域名状态'] = '<font color="red">已拦截</font>';
$msg['拦截原因'] = $arr['WordingTitle'];
$msg['拦截详情'] = $arr['Wording'];
}elseif($arr['whitetype']==1){
if($arr['eviltype']!=0){
if($arr['eviltype']==2800 || $arr['eviltype']==2804)
$msg['域名状态'] = '<font color="orange">QQ内拦截</font>';
else
$msg['域名状态'] = '<font color="orange">其他拦截('.$arr['eviltype'].')</font>';
}else{
$msg['域名状态'] = '<font color="green">未拦截</font><br/>';
}
$msg['安全联盟认证'] = ($arr['certify']==1?'是':'否');
}
if($arr['detect_time']!=0){
$msg['记录时间'] = date("Y-m-d H:i:s", $arr['detect_time']);
}
if($arr['isDomainICPOk']==1){
$msg['是否已备案'] = '是';
$msg['备案主体'] = $arr['Orgnization'];
$msg['备案号'] = $arr['ICPSerial'];
}else{
$msg['是否已备案'] = '否';
}
}else{
$msg['检测URL'] = $link;
$msg['查询失败'] = $arr['data'];
}
@@ -129,6 +190,20 @@ class App extends Plugin
return $msg;
}
private function query_wx2($link){
$url = 'https://cgi.urlsec.qq.com/index.php?m=url&a=validUrl&url='.urlencode($link);
$data = get_curl($url);
$arr = json_decode($data, true);
if(!$arr) throw new Exception('查询接口返回数据解析失败');
$msg['检测URL'] = $link;
if(isset($arr['data']) && $arr['data']=='ok'){
$msg['微信拦截状态'] = '<font color="red">已拦截</font>';
}else{
$msg['微信拦截状态'] = '<font color="green">未拦截</font>';
}
return $msg;
}
private function guanjia_curl($url)
{
$ch = curl_init();
+41 -2
View File
@@ -16,7 +16,7 @@
</div>
<div class="row">
<div class="col-6">
<button class="btn btn-dim btn-outline-info btn-block btn-lg card-link" @click="query('qq')" :disabled="query_disabled">
<button class="btn btn-dim btn-outline-info btn-block btn-lg card-link" @click="queryqq()" :disabled="query_disabled">
查询管家&QQ拦截
</button>
</div>
@@ -44,6 +44,7 @@
{block name="script"}
<script src="{$cdn_cdnjs}vue/2.6.14/vue.min.js"></script>
<script src="https://static.geetest.com/v4/gt4.js"></script>
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
<script>
new Vue({
el: '#app',
@@ -53,7 +54,8 @@ new Vue({
type: '',
showresult: false,
result_info: [],
captcha: null
captcha: null,
captcha1: null,
},
mounted() {
this.$refs.input.focus();
@@ -101,6 +103,36 @@ new Vue({
alert('验证码加载失败,请刷新页面重试');
})
});
var tcaptchaCallback = function(res){
if (res.ret === 0) {
layer.load(0, {shade:0.1});
var data = { url: that.input, ticket: res.ticket, randstr: res.randstr};
$.ajax({
url: '/api/{$plugin.alias}/queryqq',
type: 'post',
dataType: 'json',
data: data,
cache: false,
success: function (data) {
layer.closeAll();
if(data.status=='ok'){
that.showresult = true;
that.result_info = data.data;
}else{
layer.alert(data.message, {icon: 5});
}
},
error: function () {
layer.closeAll();
layer.msg('服务器错误', {icon: 5});
}
});
}else{
layer.msg('请先完成验证',{time:800,icon:2});
}
}
this.captcha1 = new TencentCaptcha('2046626881', tcaptchaCallback);
},
methods: {
checkURL()
@@ -123,6 +155,13 @@ new Vue({
this.type = type;
this.captcha.showCaptcha();
},
queryqq(){
if(this.input.trim() == ''){
layer.alert('要查询的网址不能为空');return;
}
this.checkURL();
this.captcha1.show();
}
},
})
</script>
+28 -109
View File
@@ -22,7 +22,7 @@ class App extends Plugin
public function query(){
$domain = input('post.domain', null, 'trim');
if(!$domain) return msg('error','no domain');
if(strpos($domain,'.') && !checkdomain($domain)){
if(!checkdomain($domain)){
return msg('error', '域名格式不正确!');
}
@@ -31,129 +31,48 @@ class App extends Plugin
return msg('error', '验证失败,请重新验证');
}
$cache = Db::name('querycache')->where('type', 'icplist')->where('key|subkey', $domain)->find();
$cache = Db::name('querycache')->where('type', 'icp')->where('key', $domain)->find();
if($cache && time() - strtotime($cache['uptime']) <= self::CACHE_TIME){
$array = json_decode($cache['content'], true);
$data = Db::name('querycache')->where('type', 'icpitem')->whereIn('id', implode(',',$array['list']))->select();
$list = [];
foreach($data as $row){
$list[] = json_decode($row['content'], true);
}
return msg('ok','success',['total'=>$array['total'], 'list'=>$list]);
}
$cache = Db::name('querycache')->where('type', 'icpitem')->where('key|subkey', $domain)->find();
if($cache && time() - strtotime($cache['uptime']) <= self::CACHE_TIME){
$array = json_decode($cache['content'], true);
return msg('ok','success',['total'=>1, 'list'=>[$array]]);
return msg('ok','success',$array);
}
try{
$result = $this->execapi($domain);
$result = $this->queryapi($domain);
if(!$result){
return msg('ok','success',null);
}
}catch(Exception $e){
return msg('error', $e->getMessage());
}
if($result['total'] > 1 && count($result['data']) > 1){
$i = 0;
foreach($result['data'] as $row){
$id = Db::name('querycache')->duplicate([
'subkey' => $row['webLicence'],
'content' => json_encode($row),
'uptime' => date('Y-m-d H:i:s')
])->insertGetId([
'type' => 'icpitem',
'key' => $row['domain'],
'subkey' => $row['webLicence'],
'content' => json_encode($row),
'uptime' => date('Y-m-d H:i:s')
]);
$result['data'][$i++]['id'] = $id;
$ids[] = $id;
}
Db::name('querycache')->duplicate([
'subkey' => $result['data'][0]['mainLicence'],
'content' => json_encode(['total'=>$result['total'], 'list'=>$ids]),
'uptime' => date('Y-m-d H:i:s')
])->insert([
'type' => 'icplist',
'key' => $result['data'][0]['unitName'],
'subkey' => $result['data'][0]['mainLicence'],
'content' => json_encode(['total'=>$result['total'], 'list'=>$ids]),
'uptime' => date('Y-m-d H:i:s')
]);
}elseif($result['total'] == 1 && count($result['data']) > 0){
$id = Db::name('querycache')->duplicate([
'subkey' => $result['data'][0]['webLicence'],
'content' => json_encode($result['data'][0]),
'uptime' => date('Y-m-d H:i:s')
])->insertGetId([
'type' => 'icpitem',
'key' => $result['data'][0]['domain'],
'subkey' => $result['data'][0]['webLicence'],
'content' => json_encode($result['data'][0]),
'uptime' => date('Y-m-d H:i:s')
]);
$result['data'][0]['id'] = $id;
}
Db::name('querycache')->duplicate([
'type' => 'icp',
'key' => $result['Domain'],
'content' => json_encode($result),
'uptime' => date('Y-m-d H:i:s')
])->insert([
'type' => 'icp',
'key' => $result['Domain'],
'content' => json_encode($result),
'uptime' => date('Y-m-d H:i:s')
]);
return msg('ok','success',['total'=>$result['total'], 'list'=>$result['data']]);
return msg('ok','success',$result);
}
public function item(){
$id = input('post.id');
if(!$id) return msg('error','no id');
$cache = Db::name('querycache')->where('id', $id)->find();
if($cache){
$array = json_decode($cache['content'], true);
return msg('ok','success',['total'=>1, 'list'=>[$array]]);
}else{
return msg('ok','success',['total'=>0, 'list'=>[]]);
}
}
private function execapi($domain){
$timeStamp = time();
$authKey = md5("testtest" . $timeStamp);
$referer = 'https://beian.miit.gov.cn/';
$headers = ['Origin: https://beian.miit.gov.cn'];
$url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/auth';
$post = 'authKey='.$authKey.'&timeStamp='.$timeStamp;
$response = get_curl($url, $post, $referer, 0, 1, 0, 0, $headers);
$body = substr($response, strpos($response, '{"'));
$arr = json_decode($body, true);
if(isset($arr['code']) && $arr['code']==200){
$cookie = '';
preg_match_all('/set-cookie: (.*?);/i', $response, $matchs);
foreach ($matchs[1] as $val) {
if(substr($val,-1)=='=')continue;
$cookie.=$val.'; ';
}
$token = $arr['params']['bussiness'];
$url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/icpAbbreviateInfo/queryByCondition';
$post = json_encode(['pageNum'=>'','pageSize'=>'','unitName'=>$domain,'serviceType'=>1]);
$headers[] = 'Content-Type: application/json; charset=UTF-8';
$headers[] = 'token: '.$token;
$response = get_curl($url, $post, $referer, $cookie, 0, 0, 0, $headers);
$arr = json_decode($response, true);
if(isset($arr['code']) && $arr['code']==200){
$list = [];
foreach($arr['params']['list'] as $row){
$list[] = ['domain'=>$row['domain'], 'mainLicence'=>$row['mainLicence'], 'webLicence'=>$row['serviceLicence'], 'unitName'=>$row['unitName'], 'unitType'=>$row['natureName'], 'updateTime'=>$row['updateRecordTime'], 'limitAccess'=>$row['limitAccess'], 'contentTypeName'=>$row['contentTypeName']];
}
return ['code'=>0, 'total'=>$arr['params']['total'], 'data'=>$list];
}elseif(isset($arr['msg'])){
throw new Exception($arr['msg']);
}else{
throw new Exception('查询接口(query)请求失败');
}
private function queryapi($domain){
$url = config_get('qqapi_url').'api.php?act=icpquery';
$post = 'key='.config_get('qqapi_key').'&domain='.$domain;
$data = get_curl($url, $post);
$arr = json_decode($data, true);
if(isset($arr['code']) && $arr['code']==0){
return $arr['data'];
}elseif(isset($arr['msg'])){
throw new Exception($arr['msg']);
}else{
throw new Exception('查询接口(auth)请求失败');
throw new Exception('接口请求失败');
}
}
}
+23 -71
View File
@@ -2,22 +2,19 @@
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
.query-title {
text-align: right;
}
.table-title th{word-break: keep-all;}
td{text-align: center;}
</style>
<div class="container-xl" id="app">
<div class="col-md-12 col-xl-10 center-block">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">ICP备案查询</span>
</div>
<div class="form-group">
<label class="form-label">输入域名/备案号/单位名称</label>
<label class="form-label">输入域名:</label>
<div class="form-control-wrap">
<input type="text" v-model="input" placeholder="请输入域名或备案号或单位名称查询,请勿使用子域名或者带http://www等字符的网址查询" class="form-control form-control-lg" @keyup.enter="query" ref="input" autocomplete="off">
<input type="text" v-model="input" placeholder="请输入域名查询,请勿使用子域名或者带http://www等字符的网址查询" class="form-control form-control-lg" @keyup.enter="query" ref="input" autocomplete="off">
</div>
</div>
<button class="btn btn-dim btn-outline-primary btn-block card-link mb-3" @click="query" :disabled="query_disabled">
@@ -30,48 +27,20 @@
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">查询结果</span>
</div>
<div class="alert alert-warning text-center" v-if="result_total==0"><h6><em class="icon ni ni-info"></em> 没有查询到备案记录</h6></div>
<div v-if="result_total==1">
<h6>域名 <span class="text-primary">{{result_info.domain}}</span> 的信息:</h6>
<div class="alert alert-warning text-center" v-if="result_code==0"><h6><em class="icon ni ni-info"></em> 没有查询到备案信息</h6></div>
<div class="col-sm-12 col-md-10 col-xl-8 center-block" v-if="result_code==1">
<div class="table-responsive">
<table class="table table-hover table-bordered">
<tbody>
<tr><td class="query-title">网站域名</td><td>{{result_info.domain}}</td></tr>
<tr><td class="query-title">ICP备案/许可证</td><td>{{result_info.webLicence}}</td></tr>
<tr><td class="query-title">主办单位名称</td><td>{{result_info.unitName}}</td></tr>
<tr><td class="query-title">主办单位性质</td><td>{{result_info.unitType}}</td></tr>
<tr><td class="query-title">审核日期</td><td>{{result_info.updateTime}}</td></tr>
<tr><td class="query-title">是否限制接入</td><td>{{result_info.limitAccess}}</td></tr>
<tr><td class="query-title">网站前置审批项</td><td>{{result_info.contentTypeName}}</td></tr>
</tbody>
</table>
<table class="table table-hover table-bordered">
<tbody>
<tr><td class="query-title">域名</td><td>{{result_info.Domain}}</td></tr>
<tr><td class="query-title">备案</td><td>{{result_info.DomainIcpNum}}</td></tr>
<tr><td class="query-title">主办单位名称</td><td>{{result_info.CompanyName}}</td></tr>
<tr><td class="query-title">主办单位性质</td><td>{{result_info.CompanyType}}</td></tr>
<tr><td class="query-title">审核日期</td><td>{{result_info.AuditTime}}</td></tr>
</tbody>
</table>
</div>
</div>
<div v-if="result_total>1">
<h6><span class="text-primary">{{result_input}}</span> 共查询到 <span class="text-primary">{{result_total}}</span> 条备案信息:</h6>
<div class="table-responsive">
<table class="table table-hover table-bordered">
<thead class="table-title">
<th>网站域名</th><th>网站备案号</th><th>主办单位名称</th><th>审核日期</th><th>操作</th>
</thead>
<tbody>
<tr v-for="(item,index) in result_list" :key="index">
<td>{{item.domain}}</td><td>{{item.webLicence}}</td><td>{{item.unitName}}</td><td>{{item.updateTime}}</td><td><button class="btn btn-dim btn-outline-info btn-xs" @click="show_item(index)">详情</button></td>
</tr>
</tbody>
</table>
</div>
<p v-if="result_total>10" class="text-info">当前只支持查询最新10条记录,剩余记录请使用域名或网站备案号进行精确查询。</p>
</div>
</div>
</div>
<div class="card card-preview">
<div class="card-inner">
<h6><em class="icon ni ni-info"></em> 简介</h6>
<div class="accordion-inner">
<p>支持输入域名、网站备案号、主体备案号、单位名称(个人姓名、企业名称)进行查询</p>
<p>此ICP查询工具直接对接工信部官网,非第三方接口。<a href="https://blog.cccyun.cn/post-445.html" target="_blank">查询源码下载</a>,请勿对本站进行恶意抓取</p>
</div>
</div>
</div>
</div>
@@ -86,21 +55,9 @@ new Vue({
data: {
query_disabled: true,
input: '',
result_input: '',
showresult: false,
result_info: {
id: '',
domain: '',
mainLicence: '',
webLicence: '',
unitName: '',
unitType: '',
updateTime: '',
limitAccess: '',
contentTypeName: '',
},
result_list: [],
result_total: 0,
result_info: [],
result_code: 0,
captcha: null
},
mounted() {
@@ -136,13 +93,12 @@ new Vue({
success: function (data) {
layer.closeAll();
if(data.status=='ok'){
var data = data.data;
that.result_input = that.input;
that.showresult = true;
that.result_total = data.total;
that.result_list = data.list;
if(data.list.length > 0){
that.result_info = data.list[0];
if(data.data == null){
that.result_code = 0;
}else{
that.result_code = 1;
that.result_info = data.data;
}
captcha.reset();
}else{
@@ -184,15 +140,11 @@ new Vue({
},
query() {
this.checkURL();
if(this.input == ''){
if(this.input.trim() == ''){
alert('查询内容不能为空');return;
}
layer.load(0, {shade:0.1});
this.captcha.showCaptcha();
},
show_item(index){
this.result_info = this.result_list[index];
this.result_total = 1;
}
},
})
-12
View File
@@ -1,12 +0,0 @@
yum -y install python3
yum -y install mesa-libGL
python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install opencv-python==4.3.0.38
pip3 install requests
pip3 install flask
pip3 install gevent
nohup python3 ./server.py >> ./server.log 2>&1 &
-165
View File
@@ -1,165 +0,0 @@
# -*- coding: utf-8 -*-
import requests,hashlib,time,base64,cv2,os
def icpquery(info):
if(info == None or len(info) == 0):
return {'code':-1,'msg':'no domain'}
info_data = {
'pageNum':'',
'pageSize':'',
'unitName':info,
'serviceType':1
}
#构造AuthKey
timeStamp = int(round(time.time()*1000))
authSecret = 'testtest' + str(timeStamp)
authKey = hashlib.md5(authSecret.encode(encoding='UTF-8')).hexdigest()
#获取Cookie
cookie_headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42'
}
cookie = requests.utils.dict_from_cookiejar(requests.get('https://beian.miit.gov.cn/',headers=cookie_headers,verify=False).cookies)['__jsluid_s']
#请求获取Token
t_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/auth'
t_headers = {
'Host': 'hlwicpfwc.miit.gov.cn',
'Connection': 'keep-alive',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"',
'Accept': '*/*',
'DNT': '1',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.46',
'Origin': 'https://beian.miit.gov.cn',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://beian.miit.gov.cn/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': '__jsluid_s=' + cookie
}
data = {
'authKey': authKey,
'timeStamp': timeStamp
}
t_response = requests.post(t_url,data=data,headers=t_headers,verify=False)
try:
get_token = t_response.json()['params']['bussiness']
except:
return {'code':-1,'msg':'请求被禁止,请稍后或更换头部与IP后再试('+t_response.status_code+')'}
#获取验证图像、UUID
p_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/getCheckImage'
p_headers = {
'Host': 'hlwicpfwc.miit.gov.cn',
'Connection': 'keep-alive',
'Content-Length': '0',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"',
'Accept': 'application/json, text/plain, */*',
'DNT': '1',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.46',
'token': get_token,
'Origin': 'https://beian.miit.gov.cn',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://beian.miit.gov.cn/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': '__jsluid_s=' + cookie
}
p_request = requests.post(p_url,data='',headers=p_headers,verify=False)
try:
p_uuid = p_request.json()['params']['uuid']
big_image = p_request.json()['params']['bigImage']
small_image = p_request.json()['params']['smallImage']
except KeyError:
return {'code':-1,'msg':'获取验证图像失败,请重试('+p_request.status_code+')'}
#解码图片,写入并计算图片缺口位置
with open('bigImage.jpg','wb') as f:
f.write(base64.b64decode(big_image))
f.close()
with open('smallImage.jpg','wb') as f:
f.write(base64.b64decode(small_image))
f.close()
background_image = cv2.imread('bigImage.jpg',cv2.COLOR_GRAY2RGB)
fill_image = cv2.imread('smallImage.jpg',cv2.COLOR_GRAY2RGB)
background_image_canny = cv2.Canny(background_image, 100, 200)
fill_image_canny = cv2.Canny(fill_image, 100, 300)
position_match = cv2.matchTemplate(background_image, fill_image, cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(position_match)
position = max_loc
mouse_length = position[0]+1
os.remove('bigImage.jpg')
os.remove('smallImage.jpg')
#通过拼图验证,获取sign
check_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/checkImage'
check_headers = {
'Host': 'hlwicpfwc.miit.gov.cn',
'Accept': 'application/json, text/plain, */*',
'Connection': 'keep-alive',
'Content-Length': '60',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"',
'DNT': '1',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42',
'token': get_token,
'Content-Type': 'application/json',
'Origin': 'https://beian.miit.gov.cn',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://beian.miit.gov.cn/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': '__jsluid_s=' + cookie
}
check_data = {
'key':p_uuid,
'value':mouse_length
}
check_request = requests.post(check_url,json=check_data,headers=check_headers,verify=False)
try:
sign = check_request.json()['params']
except Exception:
return {'code':-1,'msg':'校验图片信息失败,请重试('+check_request.status_code+')'}
#获取备案信息
info_url = 'https://hlwicpfwc.miit.gov.cn/icpproject_query/api/icpAbbreviateInfo/queryByCondition'
info_headers = {
'Host': 'hlwicpfwc.miit.gov.cn',
'Connection': 'keep-alive',
'Content-Length': '78',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Microsoft Edge";v="90"',
'DNT': '1',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42',
'Content-Type': 'application/json',
'Accept': 'application/json, text/plain, */*',
'uuid': p_uuid,
'token': get_token,
'sign': sign,
'Origin': 'https://beian.miit.gov.cn',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://beian.miit.gov.cn/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': '__jsluid_s=' + cookie
}
info_request = requests.post(info_url,json=info_data,headers=info_headers,verify=False)
domain_total = info_request.json()['params']['total']
result_list = []
for info_base in info_request.json()['params']['list']:
result_list.append({'domain':info_base['domain'], 'mainLicence':info_base['mainLicence'], 'webLicence':info_base['serviceLicence'], 'unitName':info_base['unitName'], 'unitType':info_base['natureName'], 'updateTime':info_base['updateRecordTime'], 'limitAccess':info_base['limitAccess'], 'contentTypeName':info_base['contentTypeName']})
return {'code':0,'msg':'success','data':result_list, 'total':domain_total}
-34
View File
@@ -1,34 +0,0 @@
# -*- coding: utf-8 -*-
import icp,json,flask
HOST='127.0.0.1'
PORT=9088
app = flask.Flask(__name__)
json_header = {'Content-Type':'application/json; charset=utf-8'}
@app.route('/',methods=['GET'])
def home():
domain = flask.request.args.get('domain')
result = icp.icpquery(domain)
return flask.Response(json.dumps(result),headers=json_header)
@app.errorhandler(404)
def notfound(e):
errorStr = '''<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>server</center>
</body>
</html>'''
headers = {
"Content-Type":"text/html"
}
return flask.Response(errorStr,status=404,headers=headers)
if __name__ == '__main__':
from gevent.pywsgi import WSGIServer
http_server = WSGIServer((HOST, PORT), app)
http_server.serve_forever()
#app.run(port=PORT,host=HOST)
+2 -3
View File
@@ -49,9 +49,8 @@ class App extends Plugin
}
private function queryapi($uin){
//此处需填写QQAPI的接口地址(https://github.com/netcccyun/qqapi
$url = 'http://qqapiurl/api.php?act=getqqlevel';
$post = 'key=查询密钥&uin='.$uin;
$url = config_get('qqapi_url').'api.php?act=getqqlevel';
$post = 'key='.config_get('qqapi_key').'&uin='.$uin;
$data = get_curl($url, $post);
$arr = json_decode($data, true);
if(isset($arr['code']) && $arr['code']==0){
+1 -1
View File
@@ -6,7 +6,7 @@
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<meta name="renderer" content="webkit"/>
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,500,600,700,800">
<link rel="stylesheet" href="//cdn.staticfile.org/normalize/5.0.0/normalize.min.css">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/normalize/5.0.0/normalize.min.css">
<style>
+5 -5
View File
@@ -10,13 +10,13 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="css/layuimini.css?v=2.0.4.2" media="all">
<link rel="stylesheet" href="css/themes/default.css" media="all">
<link rel="stylesheet" href="//cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/4.7.0/css/font-awesome.min.css" media="all">
<!--[if lt IE 9]>
<script src="//cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="//cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/html5shiv/r29/html5.min.js"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<style id="layuimini-bg-color">
</style>
@@ -123,7 +123,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="js/lay-config.js?v=2.0.0" charset="utf-8"></script>
<script src="js/common.js" charset="utf-8"></script>
<script>
+5 -5
View File
@@ -9,10 +9,10 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<!--[if lt IE 9]>
<script src="//cdn.staticfile.org/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<style>
html, body {width: 100%;height: 100%;overflow: hidden}
@@ -61,8 +61,8 @@
</div>
</div>
</div>
<script src="//cdn.staticfile.org/jquery/3.6.0/jquery.min.js" charset="utf-8"></script>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="./lib/jq-module/jquery.particleground.min.js" charset="utf-8"></script>
<script>
layui.use(['form'], function () {
+2 -2
View File
@@ -9,7 +9,7 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<style>
.error .clip .shadow {height:180px;}
.error .clip:nth-of-type(2) .shadow {width:130px;}
@@ -71,7 +71,7 @@
</div>
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script>
function randomNum() {
return Math.floor(Math.random() * 9) + 1;
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<style>
body {
@@ -62,7 +62,7 @@
<option value="{{item}}">{{item}}</option>
{{# }}}
</script>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/common.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<script src="../js/common.js" charset="utf-8"></script>
</head>
@@ -54,7 +54,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
layui.use(['form', 'table'], function () {
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -55,7 +55,7 @@
</div>
</div>
</form>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -62,7 +62,7 @@
</div>
</div>
</form>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<script src="../js/common.js" charset="utf-8"></script>
</head>
@@ -63,7 +63,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/lay-config.js?v=2.0.0" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -62,7 +62,7 @@
</div>
</div>
</form>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<style>
@@ -186,7 +186,7 @@
</script>
<!--</div>-->
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="../js/common.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<script src="../js/common.js" charset="utf-8"></script>
</head>
@@ -55,7 +55,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
layui.use(['form', 'table'], function () {
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -53,7 +53,7 @@
</div>
</div>
</form>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -60,7 +60,7 @@
</div>
</div>
</form>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<script src="../js/common.js" charset="utf-8"></script>
<style>
@@ -90,7 +90,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -117,7 +117,7 @@
{{# }); }}
</select>
</script>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
@@ -124,7 +124,7 @@
{{# }); }}
</select>
</script>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<link rel="stylesheet" href="../../js/lay-module/step-lay/step.css" media="all">
</head>
@@ -123,7 +123,7 @@
{{# }); }}
</select>
</script>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="../../js/api.js" charset="utf-8"></script>
<script src="../../js/common.js" charset="utf-8"></script>
+15 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<style>
body {
@@ -125,6 +125,19 @@
<input type="text" name="captcha_key" placeholder="请输入极验KEY" class="layui-input">
</div>
</div>
<blockquote class="layui-elem-quote"><a href="https://github.com/netcccyun/qqapi" target="_blank">QQ-API</a>接口配置(ICP备案查询、QQ等级查询等工具使用)</blockquote>
<div class="layui-form-item">
<label class="layui-form-label">接口地址:</label>
<div class="layui-input-block">
<input type="text" name="qqapi_url" placeholder="必须以http://或https://开头,以/结尾" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">接口密钥:</label>
<div class="layui-input-block">
<input type="text" name="qqapi_key" placeholder="请输入API接口密钥" class="layui-input">
</div>
</div>
<blockquote class="layui-elem-quote">CDN地址配置
</blockquote>
<div class="layui-form-item">
@@ -159,7 +172,7 @@
<option value="{{item}}">{{item}}</option>
{{# }}}
</script>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/common.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<style>
body {
@@ -63,7 +63,7 @@
</div>
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/common.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<script src="../js/common.js" charset="utf-8"></script>
</head>
@@ -70,7 +70,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/lay-config.js?v=2.0.0" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
<script src="../js/common.js" charset="utf-8"></script>
</head>
@@ -63,7 +63,7 @@
</div>
</div>
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.6.3/layui.js" charset="utf-8"></script>
<script src="../js/api.js" charset="utf-8"></script>
<script>
+5 -5
View File
@@ -5,11 +5,11 @@
<link rel="icon" href="/favicon.ico"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link href="https://cdn.staticfile.org/daisyui/2.2.2/full.min.css" rel="stylesheet" type="text/css"/>
<link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet" type="text/css"/>
<script src="https://cdn.staticfile.org/limonte-sweetalert2/11.4.4/sweetalert2.all.min.js"></script>
<script src="https://cdn.staticfile.org/vue/2.6.14/vue.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.26.0/axios.min.js"></script>
<link href="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/daisyui/2.2.2/full.min.css" rel="stylesheet" type="text/css"/>
<link href="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet" type="text/css"/>
<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/limonte-sweetalert2/11.4.4/sweetalert2.all.min.js"></script>
<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.min.js"></script>
<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.min.js"></script>
<style>
body {
background-image: url("static/images/install_background.jpg");