代码中只监控了香港和日本低价服务器,如果要监控其他的自行修改
const puppeteer = require('puppeteer');
const notify = require('./sendNotify.js');
let axios = require('axios');
const title = "获取Akile ";
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox']
});
const page = await browser.newPage();
// 设置请求头
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36');
// 导航到目标 URL
await page.goto('https://api.akile.io');
// 等待特定的元素加载(根据页面内容调整选择器)
await page.waitForSelector('body');
try{
// 模拟请求
const response = await page.evaluate(async () => {
const res = await fetch('https://api.akile.io/api/v1/store/GetVpsStoreV2', {
method: 'GET',
headers: {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive'
}
});
return res.json();
});
const japanVpsInfo = response.data.areas.find(item => item.area_name === '日本').nodes;
const hkVpsInfo = response.data.areas.find(item => item.area_name === '中国香港').nodes;
const japanStockPlans = japanVpsInfo.flatMap(node => {
// 确保 node.plans 是一个有效的数组
if (!Array.isArray(node.plans)) {
return []; // 如果不是数组,返回空数组
}
return node.plans
.filter(plan =>
plan && // 确保 plan 不为 null
plan.stock > 0 &&
plan.price_datas && // 确保 price_datas 存在
plan.price_datas.some(priceData => priceData.price < 1300)
)
.map(plan => {
const priceData = plan.price_datas.find(priceData => priceData.price < 1300);
const price = priceData ? priceData.price : null; // 确保 priceData 不为 null
return {
node_name: node.group_name,
plan_name: plan.plan_name,
price: price,
stock:plan.stock
};
});
});
const hkStockPlans = hkVpsInfo.flatMap(node => {
// 确保 node.plans 是一个有效的数组
if (!Array.isArray(node.plans)) {
return []; // 如果不是数组,返回空数组
}
return node.plans
.filter(plan =>
plan && // 确保 plan 不为 null
plan.stock > 0 &&
plan.price_datas && // 确保 price_datas 存在
plan.price_datas.some(priceData => priceData.price < 600)
)
.map(plan => {
const priceData = plan.price_datas.find(priceData => priceData.price < 600);
const price = priceData ? priceData.price : null; // 确保 priceData 不为 null
return {
node_name: node.node_name,
plan_name: plan.plan_name,
price: price,
stock:plan.stock
};
});
});
console.log(japanStockPlans);
console.log(hkStockPlans);
// 如果 stockPlans 不是空数组,发送 GET 请求
if (japanStockPlans.length > 0) {
const content = JSON.stringify(japanStockPlans); // 将内容转为字符串
axios.get(`http://192.168.0.190:5700/send_group_msg?group_id=464885769&message=${encodeURIComponent(title+"JP库存")}%0D${encodeURIComponent(content)}`)
.then(response => {
console.log('消息发送成功:', response.data);
})
.catch(error => {
console.error('发送消息时出错:', error);
});
}else{
notify.sendNotify(title + "库存成功,没有JP13元以下库存", '');
}
if (hkStockPlans.length > 0) {
const content = JSON.stringify(hkStockPlans); // 将内容转为字符串
axios.get(`http://192.168.0.190:5700/send_group_msg?group_id=464885769&message=${encodeURIComponent(title+"HK库存")}%0D${encodeURIComponent(content)}`)
.then(response => {
console.log('消息发送成功:', response.data);
})
.catch(error => {
console.error('发送消息时出错:', error);
});
}else{
notify.sendNotify(title + "库存成功,没有HK6元以下库存", '');
}
}catch (error) {
console.log("调用api发生错误"+error)
notify.sendNotify(title + "接口调用失败,请检查", '');
}
await browser.close();
})();