支持自定义脚本类型

This commit is contained in:
Easy
2022-06-04 15:58:27 +08:00
parent 14e46dbe82
commit 91df3393dc
24 changed files with 287 additions and 29 deletions
+4 -3
View File
@@ -12,9 +12,9 @@
## 最新版本
- 插件·Chrome/Edge2022.06.02.23.10 [下载](ckc.zip)
- Docker镜像(云端+远程桌面二合一)2022.06.02.15.53 [Docker Hub](https://hub.docker.com/repository/docker/easychen/checkchan)
- 文档:2022.06.03.00.15
- 插件·Chrome/Edge2022.06.04.15.57 [下载](ckc.zip)
- Docker镜像(云端+远程桌面二合一)2022.06.04.15.28 [Docker Hub](https://hub.docker.com/repository/docker/easychen/checkchan)
- 文档:2022.06.04.15.57
- 更新日志:[GitHub](https://github.com/easychen/checkchan-dist/commits/main)
> Docker镜像安装命令请参阅后文云端架设一节
@@ -197,6 +197,7 @@ checkchan://title=Server%E9%85%B1%E5%AE%98%E6%96%B9%E7%BD%91%E7%AB%99%E7%8A%B6%E
需要docker环境。如果你没有云服务器,可以看看[腾讯云30~50元首单的特价服务器](https://curl.qcloud.com/VPjlS4gj)。
#### 通过 Docker-compose 启动
登录服务器(假设其IP为IPB),在要安装的目录下新建目录 `data`,并使其可写:
+1
View File
@@ -197,6 +197,7 @@ checkchan://title=Server%E9%85%B1%E5%AE%98%E6%96%B9%E7%BD%91%E7%AB%99%E7%8A%B6%E
需要docker环境。如果你没有云服务器,可以看看[腾讯云30~50元首单的特价服务器](https://curl.qcloud.com/VPjlS4gj)。
#### 通过 Docker-compose 启动
登录服务器(假设其IP为IPB),在要安装的目录下新建目录 `data`,并使其可写:
+1 -1
View File
@@ -1 +1 @@
"2022.06.02.23.10"
"2022.06.04.15.57"
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
"2022.06.02.15.53"
"2022.06.04.15.28"
+3 -3
View File
@@ -1,4 +1,4 @@
FROM node:16-alpine3.15
FROM --platform=$TARGETPLATFORM node:16-alpine3.15
# ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
# ENV CHROME_BIN=/usr/bin/chromium-browser
@@ -16,7 +16,7 @@ RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" > /etc/apk/repositorie
&& echo "http://dl-cdn.alpinelinux.org/alpine/v3.12/main" >> /etc/apk/repositories
RUN apk upgrade -U -a && apk add --no-cache chromium xvfb x11vnc bash tzdata git python3 libstdc++ harfbuzz nss freetype ttf-freefont font-noto-emoji
RUN apk upgrade -U -a && apk add --no-cache chromium xvfb x11vnc bash tzdata git python3 libstdc++ harfbuzz nss freetype ttf-freefont font-noto-emoji php
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
ENV CHROME_BIN=/usr/bin/chromium-browser
@@ -36,7 +36,7 @@ RUN sed -i "/wait ${proxy_pid}/i if [ -n \"\$VNC_PASSWORD\" ]; then sed -i \"s/W
RUN sed -i "/wait ${proxy_pid}/i if [ -n \"\$VIEW_ONLY\" ]; then sed -i \"s/UI.rfb.viewOnly = UI.getSetting('view_only');/UI.rfb.viewOnly = \$VIEW_ONLY;/\" /checkchan/noVNC/app/ui.js; fi" /checkchan/noVNC/utils/novnc_proxy
RUN sed -i -- "s/ps -p/ps -o pid | grep/g" /checkchan/noVNC/utils/novnc_proxy
RUN npm install -g pm2
RUN npm install -g pm2 ts-node typescript '@types/node'
COPY api /checkchan/api
RUN cd /checkchan/api/ && npm install
+3 -3
View File
@@ -82,7 +82,7 @@ for( const item of to_checks )
if( retry_times >= item.retry )
{
// 发送通知
await send_notify( '监测点['+item.title+']多次重试失败', "已暂停执行,请检查登录状态或页面结构变动\r\n\r\n[点此查看]("+item.url+")" , item.sendkey, item.send_channel||-1);
await send_notify( '监测点['+item.title+']多次重试失败', "已暂停执行,请检查登录状态或页面结构变动。点击任务的监测按钮可以解除暂停\r\n\r\n[点此查看]("+item.url+")" , item.sendkey, item.send_channel||-1);
}
check_update_field( item.id, 'retry_times', retry_times+1, json_data );
@@ -103,9 +103,9 @@ for( const item of to_checks )
if( item.when == 'change' )
{
logit("变动时发送");
if( !last_content || (check_content?.trim() == last_content?.trim()) )
if( !last_content || (short(check_content).trim() == short(last_content).trim()) )
{
logit("内容相同或者旧内容不存在,跳过");
console.log("内容相同或者旧内容不存在,跳过");
can_send_notice = false;
}else
{
+59 -3
View File
@@ -9,13 +9,14 @@ const path = require("path");
const fs = require("fs");
const dayjs = require("dayjs");
const { JSDOM } = require("jsdom");
const spawnAsync = require('@expo/spawn-async');
get_data_dir = ()=>
{
// 兼容下旧版目录配置
const path = parseInt(process.env.DEV) > 0 ? path.join( __dirname, '/../data') : ( fs.existsSync('/data') ? '/data' : '/checkchan/data/app_data' ) ;
if( !fs.existsSync( path ) ) fs.mkdirSync( path );
return path;
const dir_path = parseInt(process.env.DEV) > 0 ? path.join( __dirname, '/../data/app_data') : ( fs.existsSync('/data') ? '/data' : '/checkchan/data/app_data' ) ;
if( !fs.existsSync( dir_path ) ) fs.mkdirSync( dir_path );
return dir_path;
}
const log_file = get_data_dir() + '/log.txt';
@@ -194,6 +195,10 @@ exports.monitor_auto = async ( item, cookies ) =>
ret = await monitor_json( item.url, item.json_query, item.json_header, item.json_data, item.json_data_format, (parseInt(item.delay)||0)*1000, the_cookies );
return {status:!!(ret&&ret.value),value:JSON.stringify(ret.value)||"",type:item.type};
break;
case 'shell':
ret = await monitor_shell( item , the_cookies );
return {status:!!(ret&&ret.status),value:ret.value||"",type:item.type};
break;
case 'dom':
default:
ret = await monitor_dom( item , the_cookies );
@@ -306,6 +311,56 @@ async function monitor_dom_low(item, cookies)
}
}
async function monitor_shell(item, cookies)
{
const { url, path, id, shell_type, shell_cookie_name, shell_code } = item;
let command = 'node';
let ext = 'js';
switch( shell_type )
{
case 'php':
command = 'php';
ext = 'php';
break;
case 'javascript':
command = 'node';
ext = 'js';
break;
case 'typescript':
command = 'ts-node';
ext = 'ts';
break;
case 'python':
command = 'python3';
ext = 'py';
break;
case 'bash':
default:
command = 'bash';
ext = 'sh';
break;
}
const shell_file = get_data_dir() + '/' + id + '.' + ext;
fs.writeFileSync( shell_file, shell_code );
const cookie_name = item.shell_cookie_name || "COOKIE";
const cookie_string = build_cookie_string(cookies)||"";
const result = await spawnAsync( command, [shell_file], {
env: {
'URL':url,
[cookie_name]:cookie_string,
}
} );
const { stdout, stderr, status } = result;
if( stderr ) console.log( stderr );
return {status:status==0,value:stdout};
}
async function monitor_dom(item , cookies)
{
const { url, path, id } = item;
@@ -493,6 +548,7 @@ function sleep(ms) {
function build_cookie_string( cookie_array )
{
let ret = [];
if( !Array.isArray(cookie_array) ) return false;
for( const cookie of cookie_array )
{
if( cookie.name ) ret.push(`${cookie.name}=${cookie.value}`)
+1
View File
@@ -4,6 +4,7 @@
"main": "index.js",
"license": "MIT",
"dependencies": {
"@expo/spawn-async": "^1.6.0",
"body-parser": "^1.20.0",
"connect-timeout": "^1.9.0",
"cors": "^2.8.5",
+45
View File
@@ -2,6 +2,13 @@
# yarn lockfile v1
"@expo/spawn-async@^1.6.0":
version "1.6.0"
resolved "https://registry.npmmirror.com/@expo/spawn-async/-/spawn-async-1.6.0.tgz#b7267af6791134d47c69bf0986f151599535309f"
integrity sha512-CynFS2y9S0OXgoBN3o6qvLSD5tBXCxEQnbByIleEocbKKYKb+/gjrjxYVvxPY8G+zqe82xG6IcmHbJoPl5g1WA==
dependencies:
cross-spawn "^7.0.3"
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -404,6 +411,15 @@ cross-fetch@3.1.5, cross-fetch@^3.1.5:
dependencies:
node-fetch "2.6.7"
cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
@@ -1050,6 +1066,11 @@ isarray@~1.0.0:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
jsdom@^19.0.0:
version "19.0.0"
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a"
@@ -1388,6 +1409,11 @@ path-is-absolute@^1.0.0:
resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
@@ -1688,6 +1714,18 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
shebang-regex "^3.0.0"
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -2030,6 +2068,13 @@ whatwg-url@^5.0.0:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
which@^2.0.1:
version "2.0.2"
resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
@@ -3,7 +3,7 @@
"message": "Check酱"
},
"appDesc": {
"message": "监控页面变动,并发送异动到微信。 Build.2022.06.02.23.10",
"message": "监控页面变动,并发送异动到微信。 Build.2022.06.04.15.57",
"description":"亦支持http status、json和rss监测。配合自架云端,关电脑后也能运行。"
}
}
@@ -1,20 +1,20 @@
{
"files": {
"main.css": "/static/css/main.792c7829.chunk.css",
"main.js": "/static/js/main.fbd1dd61.chunk.js",
"main.js": "/static/js/main.a06f3e69.chunk.js",
"runtime-main.js": "/static/js/runtime-main.17191aad.js",
"static/css/2.6a707db6.chunk.css": "/static/css/2.6a707db6.chunk.css",
"static/js/2.96508649.chunk.js": "/static/js/2.96508649.chunk.js",
"static/js/2.4c5fabd7.chunk.js": "/static/js/2.4c5fabd7.chunk.js",
"index.html": "/index.html",
"precache-manifest.8c8991604351c6479bb810d3f4782996.js": "/precache-manifest.8c8991604351c6479bb810d3f4782996.js",
"precache-manifest.4ed427464cf9e1cc5e20c6c4c063f1a8.js": "/precache-manifest.4ed427464cf9e1cc5e20c6c4c063f1a8.js",
"service-worker.js": "/service-worker.js",
"static/media/index.scss": "/static/media/icons-20.cef8cdbb.woff"
},
"entrypoints": [
"static/js/runtime-main.17191aad.js",
"static/css/2.6a707db6.chunk.css",
"static/js/2.96508649.chunk.js",
"static/js/2.4c5fabd7.chunk.js",
"static/css/main.792c7829.chunk.css",
"static/js/main.fbd1dd61.chunk.js"
"static/js/main.a06f3e69.chunk.js"
]
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
<!doctype html><html lang="zh-cn"><head><meta charset="utf-8"/><link rel="icon" href="/logo.color.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="web content monitor"/><link rel="apple-touch-icon" href="logo.color.png"/><link rel="manifest" href="/manifest.json"/><title>...</title><link rel="stylesheet" href="/tailwind.min.css"><link href="/static/css/2.6a707db6.chunk.css" rel="stylesheet"><link href="/static/css/main.792c7829.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="/static/js/runtime-main.17191aad.js"></script><script src="/static/js/2.96508649.chunk.js"></script><script src="/static/js/main.fbd1dd61.chunk.js"></script></body></html>
<!doctype html><html lang="zh-cn"><head><meta charset="utf-8"/><link rel="icon" href="/logo.color.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="web content monitor"/><link rel="apple-touch-icon" href="logo.color.png"/><link rel="manifest" href="/manifest.json"/><title>...</title><link rel="stylesheet" href="/tailwind.min.css"><link href="/static/css/2.6a707db6.chunk.css" rel="stylesheet"><link href="/static/css/main.792c7829.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="/static/js/runtime-main.17191aad.js"></script><script src="/static/js/2.4c5fabd7.chunk.js"></script><script src="/static/js/main.a06f3e69.chunk.js"></script></body></html>
@@ -0,0 +1,50 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "4fa44a9cbf66514edd637a76fa1d549d",
"url": "/index.html"
},
{
"revision": "90e3be302097a0a23e61",
"url": "/static/css/2.6a707db6.chunk.css"
},
{
"revision": "a203125857e73ff4d618",
"url": "/static/css/main.792c7829.chunk.css"
},
{
"revision": "90e3be302097a0a23e61",
"url": "/static/js/2.4c5fabd7.chunk.js"
},
{
"revision": "a203125857e73ff4d618",
"url": "/static/js/main.2b3d3a20.chunk.js"
},
{
"revision": "4d30565b04f5f2725c56",
"url": "/static/js/runtime-main.17191aad.js"
},
{
"revision": "05f1cdadfe476395f60e233b15c22155",
"url": "/static/media/icons-16.05f1cdad.eot"
},
{
"revision": "3c1c220e7a18286503fb431c7a7fe183",
"url": "/static/media/icons-16.3c1c220e.woff"
},
{
"revision": "3cde8748332d1de6b1ae1c2dc5850754",
"url": "/static/media/icons-16.3cde8748.ttf"
},
{
"revision": "0a5c76518a68c185baa2c6744456918c",
"url": "/static/media/icons-20.0a5c7651.eot"
},
{
"revision": "51ec31f302d0072808e1f83f85fea4cd",
"url": "/static/media/icons-20.51ec31f3.ttf"
},
{
"revision": "cef8cdbb9d0ba82e6e19fb0eeba2ac3d",
"url": "/static/media/icons-20.cef8cdbb.woff"
}
]);
@@ -0,0 +1,50 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "32693373f799c07a90f7601ca1a2c3cc",
"url": "/index.html"
},
{
"revision": "90e3be302097a0a23e61",
"url": "/static/css/2.6a707db6.chunk.css"
},
{
"revision": "0e25955dfee59b3e3066",
"url": "/static/css/main.792c7829.chunk.css"
},
{
"revision": "90e3be302097a0a23e61",
"url": "/static/js/2.4c5fabd7.chunk.js"
},
{
"revision": "0e25955dfee59b3e3066",
"url": "/static/js/main.a06f3e69.chunk.js"
},
{
"revision": "4d30565b04f5f2725c56",
"url": "/static/js/runtime-main.17191aad.js"
},
{
"revision": "05f1cdadfe476395f60e233b15c22155",
"url": "/static/media/icons-16.05f1cdad.eot"
},
{
"revision": "3c1c220e7a18286503fb431c7a7fe183",
"url": "/static/media/icons-16.3c1c220e.woff"
},
{
"revision": "3cde8748332d1de6b1ae1c2dc5850754",
"url": "/static/media/icons-16.3cde8748.ttf"
},
{
"revision": "0a5c76518a68c185baa2c6744456918c",
"url": "/static/media/icons-20.0a5c7651.eot"
},
{
"revision": "51ec31f302d0072808e1f83f85fea4cd",
"url": "/static/media/icons-20.51ec31f3.ttf"
},
{
"revision": "cef8cdbb9d0ba82e6e19fb0eeba2ac3d",
"url": "/static/media/icons-20.cef8cdbb.woff"
}
]);
@@ -0,0 +1,50 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "f1b32866c4a54104cc48b14eab3e1edf",
"url": "/index.html"
},
{
"revision": "90e3be302097a0a23e61",
"url": "/static/css/2.6a707db6.chunk.css"
},
{
"revision": "97e56750ca2045932c19",
"url": "/static/css/main.792c7829.chunk.css"
},
{
"revision": "90e3be302097a0a23e61",
"url": "/static/js/2.4c5fabd7.chunk.js"
},
{
"revision": "97e56750ca2045932c19",
"url": "/static/js/main.0d15f478.chunk.js"
},
{
"revision": "4d30565b04f5f2725c56",
"url": "/static/js/runtime-main.17191aad.js"
},
{
"revision": "05f1cdadfe476395f60e233b15c22155",
"url": "/static/media/icons-16.05f1cdad.eot"
},
{
"revision": "3c1c220e7a18286503fb431c7a7fe183",
"url": "/static/media/icons-16.3c1c220e.woff"
},
{
"revision": "3cde8748332d1de6b1ae1c2dc5850754",
"url": "/static/media/icons-16.3cde8748.ttf"
},
{
"revision": "0a5c76518a68c185baa2c6744456918c",
"url": "/static/media/icons-20.0a5c7651.eot"
},
{
"revision": "51ec31f302d0072808e1f83f85fea4cd",
"url": "/static/media/icons-20.51ec31f3.ttf"
},
{
"revision": "cef8cdbb9d0ba82e6e19fb0eeba2ac3d",
"url": "/static/media/icons-20.cef8cdbb.woff"
}
]);
@@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"/precache-manifest.8c8991604351c6479bb810d3f4782996.js"
"/precache-manifest.4ed427464cf9e1cc5e20c6c4c063f1a8.js"
);
self.addEventListener('message', (event) => {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -20,9 +20,9 @@
</ol>
<h2>最新版本</h2>
<ul>
<li>插件·Chrome/Edge2022.06.02.23.10 <a href="ckc.zip">下载</a></li>
<li>Docker镜像(云端+远程桌面二合一)2022.06.02.15.53 <a href="https://hub.docker.com/repository/docker/easychen/checkchan" rel="nofollow">Docker Hub</a></li>
<li>文档:2022.06.03.00.15</li>
<li>插件·Chrome/Edge2022.06.04.15.57 <a href="ckc.zip">下载</a></li>
<li>Docker镜像(云端+远程桌面二合一)2022.06.04.15.28 <a href="https://hub.docker.com/repository/docker/easychen/checkchan" rel="nofollow">Docker Hub</a></li>
<li>文档:2022.06.04.15.57</li>
<li>更新日志:<a href="https://github.com/easychen/checkchan-dist/commits/main">GitHub</a></li>
</ul>
<blockquote>
+3 -3
View File
@@ -9,9 +9,9 @@
</ol>
<h2>最新版本</h2>
<ul>
<li>插件·Chrome/Edge2022.06.02.23.10 <a href="ckc.zip">下载</a></li>
<li>Docker镜像(云端+远程桌面二合一)2022.06.02.15.53 <a href="https://hub.docker.com/repository/docker/easychen/checkchan" rel="nofollow">Docker Hub</a></li>
<li>文档:2022.06.03.00.15</li>
<li>插件·Chrome/Edge2022.06.04.15.57 <a href="ckc.zip">下载</a></li>
<li>Docker镜像(云端+远程桌面二合一)2022.06.04.15.28 <a href="https://hub.docker.com/repository/docker/easychen/checkchan" rel="nofollow">Docker Hub</a></li>
<li>文档:2022.06.04.15.57</li>
<li>更新日志:<a href="https://github.com/easychen/checkchan-dist/commits/main">GitHub</a></li>
</ul>
<blockquote>