fmynj commited on
Commit
d2afcd3
·
verified ·
1 Parent(s): 5b98652

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +13 -0
  2. index.js +91 -0
  3. package.json +21 -0
Dockerfile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:alpine
2
+
3
+ WORKDIR /app
4
+
5
+ COPY . .
6
+
7
+ EXPOSE 7860
8
+
9
+ RUN apk update && apk add --no-cache openssl curl &&\
10
+ chmod +x index.js &&\
11
+ npm install
12
+
13
+ CMD ["node", "index.js"]
index.js ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const axios = require('axios');
2
+ const moment = require('moment-timezone');
3
+ const http = require('http');
4
+ const cron = require('node-cron');
5
+ const port = process.env.PORT || 7860;
6
+
7
+ // 添加24小时是不间断访问的url数组
8
+ const webpages = [
9
+ 'https://www.google.com',
10
+
11
+ // ... 添加更多url
12
+ ];
13
+
14
+ // 添加1:00-6:00暂停,其他时间正常访问的url数组
15
+ const urls = [
16
+ 'https://www.yahoo.com',
17
+
18
+ // ... 添加更多url
19
+ ];
20
+
21
+ // 遍历网页数组并发请求访问网页
22
+ const visit = async (url) => {
23
+ try {
24
+ const response = await axios.get(url);
25
+ console.log(`${moment().tz('Asia/Hong_Kong').format('YYYY-MM-DD HH:mm:ss')} Visited web successfully: ${url} --- Status: ${response.status}\n`);
26
+ } catch (error) {
27
+ console.error(`Failed to visit ${url}: ${error.message}\n`);
28
+ }
29
+ };
30
+ const visitAll = async () => {
31
+ for (let url of urls) {
32
+ await visit(url);
33
+ }
34
+ };
35
+
36
+ // 定判断是否在访问时间段内
37
+ const isWithinTime = () => {
38
+ const now = moment().tz('Asia/Hong_Kong');
39
+ const hour = now.hour();
40
+ if (hour >= 1 && hour < 6) {
41
+ return false;
42
+ }
43
+ return true;
44
+ };
45
+
46
+ // 创建http服务
47
+ const createServer = () => {
48
+ const server = http.createServer((req, res) => {
49
+ if (req.url === '/') {
50
+ res.writeHead(200, {'Content-Type': 'text/plain'});
51
+ res.end('Hello world!');
52
+ } else {
53
+ res.writeHead(404, {'Content-Type': 'text/plain'});
54
+ res.end('404 Not Found');
55
+ }
56
+ });
57
+ server.listen(port, () => {
58
+ console.log(`Server started on port ${port}`);
59
+ });
60
+ };
61
+
62
+ // 执行访问逻辑
63
+ const main = async () => {
64
+ createServer();
65
+ setInterval(async () => {
66
+ if (isWithinTime()) {
67
+ await visitAll();
68
+ } else {
69
+ console.log(`Stop visiting at ${moment().tz('Asia/Hong_Kong').format('YYYY-MM-DD HH:mm:ss')}`);
70
+ }
71
+ }, 2 * 60 * 1000); // 指定时间段访问的间隔2分钟
72
+ };
73
+ main();
74
+
75
+ //24小时不间断访问部分
76
+ async function access(url) {
77
+ try {
78
+ const response = await axios.get(url);
79
+ console.log(`${moment().tz('Asia/Hong_Kong').format('YYYY-MM-DD HH:mm:ss')} Web visited successfully: ${url} --- status:${response.status}`);
80
+ } catch (error) {
81
+ console.error(`${moment().tz('Asia/Hong_Kong').format('YYYY-MM-DD HH:mm:ss')} Failed to visit ${url}, Error ${error.message}`);
82
+ }
83
+ }
84
+
85
+ async function batchVisit() {
86
+
87
+ for (let url of webpages) {
88
+ await access(url);
89
+ }
90
+ }
91
+ cron.schedule('*/2 * * * *', batchVisit); // 24小时访问任务间隔周期,默认2分钟
package.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "keep-alive",
3
+ "version": "1.0.0",
4
+ "description": "keep-web-alive",
5
+ "main": "index.js",
6
+ "author": "eoovve",
7
+ "repository": "",
8
+ "license": "MIT",
9
+ "private": false,
10
+ "scripts": {
11
+ "start": "node index.js"
12
+ },
13
+ "dependencies": {
14
+ "axios": "^1.6.2",
15
+ "node-cron": "^2.0.1",
16
+ "moment-timezone": "latest"
17
+ },
18
+ "engines": {
19
+ "node": ">=14"
20
+ }
21
+ }