Spaces:
Paused
Paused
ngoctuanai
commited on
Commit
•
45030dc
1
Parent(s):
1216dc3
Upload 6 files
Browse files- .env +1 -0
- LICENSE +21 -0
- README-EN.md +50 -0
- README-VN.md +49 -0
- index.js +91 -0
- package.json +35 -0
.env
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
Timezone=Asia/Ho_Chi_Minh
|
LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MIT License
|
2 |
+
|
3 |
+
Copyright (c) 2024 ngoctuanai
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6 |
+
of this software and associated documentation files (the "Software"), to deal
|
7 |
+
in the Software without restriction, including without limitation the rights
|
8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9 |
+
copies of the Software, and to permit persons to whom the Software is
|
10 |
+
furnished to do so, subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21 |
+
SOFTWARE.
|
README-EN.md
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div align="center">
|
2 |
+
<a name="readme-top"></a>
|
3 |
+
|
4 |
+
# Keep Online
|
5 |
+
|
6 |
+
**English** · [Vietnamese](./README-VN.md)
|
7 |
+
|
8 |
+
### Deploying with Replit
|
9 |
+
|
10 |
+
| Deploy with Replit |
|
11 |
+
| :-------------------------------------: |
|
12 |
+
| [![][deploy-button-image]][deploy-link] |
|
13 |
+
|
14 |
+
<div align="center">
|
15 |
+
This script is built on a Node.js environment, performing periodic access to websites, including both continuous and intermittent access, to ensure the container remains active.
|
16 |
+
</div>
|
17 |
+
|
18 |
+
<div align="left">
|
19 |
+
|
20 |
+
## Usage Instructions
|
21 |
+
|
22 |
+
> # NOTE
|
23 |
+
> Set the time zone <a href="/.env">Env.Example</a>
|
24 |
+
|
25 |
+
--------------
|
26 |
+
|
27 |
+
1. Run on a container or VPS with a Node.js environment (Node.js environment needs to be installed manually).
|
28 |
+
2. Upload the `index.js` and `package.json` files to the root directory of the running environment.
|
29 |
+
3. URL for continuous access 24 hours
|
30 |
+
|
31 |
+
- In index.js, from line 10 to 14, the URLs are defined in the urls array, used for continuous access throughout 24 hours. You can add more URLs to this array without any limit on the number. Each URL will be accessed in cycles, with a default of 2 minutes (120 seconds), but you can adjust this cycle according to your needs by changing the parameter in the setInterval function on line 42.
|
32 |
+
|
33 |
+
4. URLs pause access from 00:00 to 06:00
|
34 |
+
|
35 |
+
- In index.js, from line 23 to 26, the URLs are defined in the websites array, used for scheduled access. These URLs will pause access from 00:00 to 06:00. During this time, the application will not make any requests to the URLs in the websites array. At other times of the day, these URLs will be accessed normally. The access cycle for these URLs is also 2 minutes (120 seconds), and you can adjust it according to your needs by changing the parameter in the setInterval function on line 36.
|
36 |
+
|
37 |
+
## Application Platform
|
38 |
+
|
39 |
+
- Supports unlimited Node.js deployment. Does not support physical containers that are inactive.
|
40 |
+
|
41 |
+
|
42 |
+
## LICENSE
|
43 |
+
|
44 |
+
MIT © [LICENSE](./LICENSE).
|
45 |
+
|
46 |
+
</div>
|
47 |
+
|
48 |
+
<!-- LINK -->
|
49 |
+
[deploy-button-image]: https://img.shields.io/badge/Run_on_Repl.it-grey?logo=replit&size=large
|
50 |
+
[deploy-link]: https://replit.com/login?source=%2Fgithub%2F*&goto=%2Fnew%2F%3FgithubRepo%3Dchokiproai%2Fkeep-online
|
README-VN.md
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div align="center">
|
2 |
+
<a name="readme-top"></a>
|
3 |
+
|
4 |
+
# Keep online
|
5 |
+
|
6 |
+
**Vietnamese** · [English](./README.md)
|
7 |
+
|
8 |
+
### Deploying with Replit
|
9 |
+
|
10 |
+
| Deploy with Replit |
|
11 |
+
| :-------------------------------------: |
|
12 |
+
| [![][deploy-button-image]][deploy-link] |
|
13 |
+
|
14 |
+
<div align="center">
|
15 |
+
Script này được xây dựng trên môi trường Node.js, thực hiện truy cập định kỳ vào các trang web, bao gồm cả chế độ truy cập liên tục và gián đoạn, nhằm đảm bảo container luôn hoạt động.
|
16 |
+
</div>
|
17 |
+
|
18 |
+
<div align="left">
|
19 |
+
|
20 |
+
## Hướng dẫn sử dụng
|
21 |
+
|
22 |
+
> # NOTE
|
23 |
+
> Thiết lập múi giờ <a href="/.env">Env.Example</a>
|
24 |
+
|
25 |
+
--------------
|
26 |
+
|
27 |
+
1. Chạy trên container hoặc VPS có môi trường Node.js (cần tự cài đặt môi trường Node.js).
|
28 |
+
2. Tải lên các tệp `index.js` và `package.json` vào thư mục gốc của môi trường chạy.
|
29 |
+
3. URL để truy cập liên tục 24 giờ
|
30 |
+
|
31 |
+
- Trong index.js, từ dòng 10 đến 14 là các URL được định nghĩa trong mảng urls, dùng để truy cập liên tục trong suốt 24 giờ. Bạn có thể thêm nhiều URL khác vào mảng này mà không bị giới hạn số lượng. Mỗi URL sẽ được truy cập theo chu kỳ, mặc định là 2 phút (120 giây), nhưng bạn có thể điều chỉnh chu kỳ này theo nhu cầu của mình bằng cách thay đổi tham số trong hàm setInterval ở dòng 42.
|
32 |
+
|
33 |
+
4. URL tạm dừng truy cập từ 00:00 đến 06:00
|
34 |
+
|
35 |
+
- Trong index.js, từ dòng 23 đến 26 là các URL được định nghĩa trong mảng websites, dùng để truy cập theo lịch trình. Các URL này sẽ tạm dừng truy cập từ 00:00 đến 06:00. Trong khoảng thời gian này, ứng dụng sẽ không thực hiện bất kỳ yêu cầu nào đến các URL trong mảng websites. Các thời gian khác trong ngày, các URL này sẽ được truy cập bình thường. Chu kỳ truy cập cho các URL này cũng là 2 phút (120 giây), và bạn có thể điều chỉnh theo nhu cầu của mình bằng cách thay đổi tham số trong hàm setInterval ở dòng 36.
|
36 |
+
|
37 |
+
## Nền tảng áp dụng
|
38 |
+
|
39 |
+
- Hỗ trợ không giới hạn triển khai node.js. Không hỗ trợ các container ngừng hoạt động vật lý.
|
40 |
+
|
41 |
+
## LICENSE
|
42 |
+
|
43 |
+
MIT © [LICENSE](./LICENSE).
|
44 |
+
|
45 |
+
</div>
|
46 |
+
|
47 |
+
<!-- LINK -->
|
48 |
+
[deploy-button-image]: https://img.shields.io/badge/Run_on_Repl.it-grey?logo=replit&size=large
|
49 |
+
[deploy-link]: https://replit.com/login?source=%2Fgithub%2F*&goto=%2Fnew%2F%3FgithubRepo%3Dchokiproai%2Fkeep-online
|
index.js
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
const axios = require('axios');
|
2 |
+
const http = require('http');
|
3 |
+
const cron = require('node-cron');
|
4 |
+
const moment = require('moment-timezone');
|
5 |
+
require('dotenv').config(); // Load environment variables from .env file
|
6 |
+
|
7 |
+
const port = process.env.PORT || 7860;
|
8 |
+
const timezone = process.env.Timezone // Default to Asia/Ho_Chi_Minh if not set
|
9 |
+
|
10 |
+
// Array of URLs for 24-hour access
|
11 |
+
const urls = [
|
12 |
+
'https://www.google.com',
|
13 |
+
// Add more URLs for continuous 24-hour access
|
14 |
+
];
|
15 |
+
|
16 |
+
// Array of URLs for scheduled access
|
17 |
+
const websites = [
|
18 |
+
'https://www.google.com',
|
19 |
+
// Add more URLs for scheduled access
|
20 |
+
];
|
21 |
+
|
22 |
+
// Function to visit websites
|
23 |
+
const visitWebsites = async () => {
|
24 |
+
for (const url of websites) {
|
25 |
+
try {
|
26 |
+
const response = await axios.get(url);
|
27 |
+
console.log(`${moment().tz(timezone).format('YYYY-MM-DD HH:mm:ss')} Successfully visited: ${url} - Status code: ${response.status}`);
|
28 |
+
} catch (error) {
|
29 |
+
console.error(`Error visiting ${url}: ${error.message}`);
|
30 |
+
}
|
31 |
+
}
|
32 |
+
};
|
33 |
+
|
34 |
+
// Check and set timer
|
35 |
+
const checkAndSetTimer = () => {
|
36 |
+
const currentMoment = moment().tz(timezone);
|
37 |
+
if (currentMoment.hours() >= 0 && currentMoment.hours() < 6) {
|
38 |
+
console.log(`Stopping access from 00:00 to 06:00 --- ${currentMoment.format('YYYY-MM-DD HH:mm:ss')}`);
|
39 |
+
clearInterval(visitIntervalId);
|
40 |
+
const nextVisitTime = currentMoment.clone().hours(6).minutes(0).seconds(0);
|
41 |
+
const nextVisitInterval = nextVisitTime.diff(currentMoment);
|
42 |
+
setTimeout(startVisits, nextVisitInterval);
|
43 |
+
} else {
|
44 |
+
startVisits();
|
45 |
+
}
|
46 |
+
};
|
47 |
+
|
48 |
+
let visitIntervalId;
|
49 |
+
const startVisits = () => {
|
50 |
+
clearInterval(visitIntervalId);
|
51 |
+
visitIntervalId = setInterval(visitWebsites, 2 * 60 * 1000); // Perform access every 2 minutes
|
52 |
+
};
|
53 |
+
|
54 |
+
const runScript = () => {
|
55 |
+
setInterval(checkAndSetTimer, 2 * 60 * 1000); // Check every 2 minutes
|
56 |
+
};
|
57 |
+
|
58 |
+
// Continuous 24-hour access
|
59 |
+
const scrapeAndLog = async (url) => {
|
60 |
+
try {
|
61 |
+
const response = await axios.get(url);
|
62 |
+
console.log(`${moment().tz(timezone).format('YYYY-MM-DD HH:mm:ss')} Successfully visited: ${url} - Status code: ${response.status}`);
|
63 |
+
} catch (error) {
|
64 |
+
console.error(`${moment().tz(timezone).format('YYYY-MM-DD HH:mm:ss')}: Error visiting web: ${url}: ${error.message}`);
|
65 |
+
}
|
66 |
+
};
|
67 |
+
|
68 |
+
// Access every 2 minutes
|
69 |
+
cron.schedule('*/2 * * * *', () => {
|
70 |
+
console.log('Performing website access...');
|
71 |
+
urls.forEach(scrapeAndLog);
|
72 |
+
});
|
73 |
+
|
74 |
+
// Create HTTP service
|
75 |
+
const server = http.createServer((req, res) => {
|
76 |
+
if (req.url === '/') {
|
77 |
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
78 |
+
res.end('Hello, World!\n');
|
79 |
+
} else {
|
80 |
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
81 |
+
res.end('Not Found\n');
|
82 |
+
}
|
83 |
+
});
|
84 |
+
|
85 |
+
server.listen(port, () => {
|
86 |
+
console.log(`Server is running on port: ${port}`);
|
87 |
+
});
|
88 |
+
|
89 |
+
// Start the script
|
90 |
+
checkAndSetTimer();
|
91 |
+
runScript();
|
package.json
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "keep-online",
|
3 |
+
"version": "1.0.0",
|
4 |
+
"description": "Automatically keep your services online.",
|
5 |
+
"main": "index.js",
|
6 |
+
"author": "chokiproai",
|
7 |
+
"license": "MIT",
|
8 |
+
"private": false,
|
9 |
+
"repository": {
|
10 |
+
"type": "git",
|
11 |
+
"url": "https://github.com/chokiproai/keep-online.git"
|
12 |
+
},
|
13 |
+
"scripts": {
|
14 |
+
"start": "node index.js"
|
15 |
+
},
|
16 |
+
"dependencies": {
|
17 |
+
"axios": "^1.6.2",
|
18 |
+
"node-cron": "^2.0.1",
|
19 |
+
"moment-timezone": "^0.5.34",
|
20 |
+
"dotenv": "^10.0.0"
|
21 |
+
},
|
22 |
+
"engines": {
|
23 |
+
"node": ">=14"
|
24 |
+
},
|
25 |
+
"keywords": [
|
26 |
+
"keep online",
|
27 |
+
"auto",
|
28 |
+
"monitor",
|
29 |
+
"service"
|
30 |
+
],
|
31 |
+
"homepage": "https://github.com/chokiproai/keep-online#readme",
|
32 |
+
"bugs": {
|
33 |
+
"url": "https://github.com/chokiproai/keep-online/issues"
|
34 |
+
}
|
35 |
+
}
|