mirror of
https://github.com/hlt1995/qlScripts.git
synced 2026-11-05 23:26:44 +08:00
Create EpicGamesNotify.js
This commit is contained in:
1 file changed
+212
@@ -0,0 +1,212 @@
|
|||||||
|
//name: Epic免费游戏领取提醒
|
||||||
|
//cron: 30 7 * * 5
|
||||||
|
|
||||||
|
const axios = require('axios');
|
||||||
|
|
||||||
|
// 从环境变量获取Bark Key
|
||||||
|
const BARK_KEY = process.env.BARK_PUSH || process.env.BARK_KEY;
|
||||||
|
if (!BARK_KEY) {
|
||||||
|
console.error('❌ 未找到BARK_PUSH环境变量,请先在青龙面板的配置文件config.sh中配置变量export BARK_PUSH=""');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
const BARK_API = `https://api.day.app/${BARK_KEY}`;
|
||||||
|
|
||||||
|
async function getEpicFreeGames() {
|
||||||
|
try {
|
||||||
|
const response = await axios.get(
|
||||||
|
'https://store-site-backend-static.ak.epicgames.com/freeGamesPromotions',
|
||||||
|
{
|
||||||
|
params: {
|
||||||
|
locale: 'zh-CN',
|
||||||
|
country: 'CN',
|
||||||
|
allowCountries: 'CN'
|
||||||
|
},
|
||||||
|
timeout: 10000
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const elements = response.data?.data?.Catalog?.searchStore?.elements || [];
|
||||||
|
const freeGames = [];
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
elements.forEach(game => {
|
||||||
|
if (!game.promotions) return;
|
||||||
|
|
||||||
|
// 检查促销信息
|
||||||
|
const promotionalOffers = game.promotions.promotionalOffers || [];
|
||||||
|
const upcomingOffers = game.promotions.upcomingPromotionalOffers || [];
|
||||||
|
|
||||||
|
// 查找有效的免费促销
|
||||||
|
let isFree = false;
|
||||||
|
let endDate = null;
|
||||||
|
|
||||||
|
// 检查当前促销
|
||||||
|
for (const offerSet of promotionalOffers) {
|
||||||
|
for (const offer of offerSet.promotionalOffers) {
|
||||||
|
if (offer.discountSetting.discountPercentage === 0) {
|
||||||
|
const startDate = new Date(offer.startDate);
|
||||||
|
const endDateObj = new Date(offer.endDate);
|
||||||
|
if (now >= startDate && now <= endDateObj) {
|
||||||
|
isFree = true;
|
||||||
|
endDate = endDateObj;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isFree) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查即将开始的促销
|
||||||
|
if (!isFree) {
|
||||||
|
for (const offerSet of upcomingOffers) {
|
||||||
|
for (const offer of offerSet.promotionalOffers) {
|
||||||
|
if (offer.discountSetting.discountPercentage === 0) {
|
||||||
|
const startDate = new Date(offer.startDate);
|
||||||
|
const endDateObj = new Date(offer.endDate);
|
||||||
|
// 如果即将在24小时内开始的免费游戏也显示
|
||||||
|
if (startDate.getTime() - now.getTime() < 24 * 60 * 60 * 1000) {
|
||||||
|
isFree = true;
|
||||||
|
endDate = endDateObj;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isFree) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加到免费游戏列表
|
||||||
|
if (isFree) {
|
||||||
|
// 获取游戏图片
|
||||||
|
let imageUrl = '';
|
||||||
|
const keyImages = game.keyImages || [];
|
||||||
|
const offerImage = keyImages.find(img => img.type === 'OfferImageWide');
|
||||||
|
const thumbnail = keyImages.find(img => img.type === 'Thumbnail');
|
||||||
|
|
||||||
|
if (offerImage) imageUrl = offerImage.url;
|
||||||
|
else if (thumbnail) imageUrl = thumbnail.url;
|
||||||
|
|
||||||
|
// 修复游戏链接问题 - 使用更可靠的链接格式
|
||||||
|
let gameUrl = '';
|
||||||
|
|
||||||
|
// 方法1: 尝试从catalogNs获取
|
||||||
|
if (game.catalogNs?.mappings?.length > 0) {
|
||||||
|
gameUrl = `https://store.epicgames.com/zh-CN/p/${game.catalogNs.mappings[0].pageSlug}`;
|
||||||
|
}
|
||||||
|
// 方法2: 尝试从自定义属性获取
|
||||||
|
else if (game.customAttributes?.length > 0) {
|
||||||
|
const productSlugAttr = game.customAttributes.find(
|
||||||
|
attr => attr.key === 'com.epicgames.app.productSlug'
|
||||||
|
);
|
||||||
|
if (productSlugAttr) {
|
||||||
|
gameUrl = `https://store.epicgames.com/zh-CN/p/${productSlugAttr.value}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 方法3: 回退到使用ID
|
||||||
|
else {
|
||||||
|
gameUrl = `https://store.epicgames.com/p/${game.id}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 格式化结束日期为北京时间
|
||||||
|
const beijingOffset = 8 * 60 * 60 * 1000; // UTC+8
|
||||||
|
const beijingDate = new Date(endDate.getTime() + beijingOffset);
|
||||||
|
const endDateStr =
|
||||||
|
`${beijingDate.getUTCFullYear()}-${(beijingDate.getUTCMonth() + 1).toString().padStart(2, '0')}-` +
|
||||||
|
`${beijingDate.getUTCDate().toString().padStart(2, '0')} ` +
|
||||||
|
`${beijingDate.getUTCHours().toString().padStart(2, '0')}:${beijingDate.getUTCMinutes().toString().padStart(2, '0')}`;
|
||||||
|
|
||||||
|
freeGames.push({
|
||||||
|
title: game.title,
|
||||||
|
url: gameUrl,
|
||||||
|
image: imageUrl,
|
||||||
|
endDate: endDateStr
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return freeGames;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取EPIC游戏数据失败:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendBarkNotification(games) {
|
||||||
|
if (games.length === 0) {
|
||||||
|
console.log('本周没有免费游戏');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 构造消息内容
|
||||||
|
const title = `Epic本周免费游戏 (${games.length}款)`;
|
||||||
|
let content = '';
|
||||||
|
|
||||||
|
// 添加通用提示
|
||||||
|
content += `\n🔗 领取地址:${games.length === 1 ? "点击通知直达" : "点击通知直达"}`;
|
||||||
|
|
||||||
|
games.forEach((game, index) => {
|
||||||
|
content += `\n🎮 ${index + 1}. ${game.title}`;
|
||||||
|
content += `\n⏳ 截止: ${game.endDate} (北京时间)\n`;
|
||||||
|
// 不再显示单独的链接行,避免重复
|
||||||
|
});
|
||||||
|
|
||||||
|
// 智能设置点击行为
|
||||||
|
let clickUrl = 'https://store.epicgames.com/free-games'; // 默认跳转总览页
|
||||||
|
let copyContent = clickUrl; // 默认复制总览页链接
|
||||||
|
|
||||||
|
if (games.length === 1) {
|
||||||
|
// 只有一款游戏时,点击直接跳转游戏页面
|
||||||
|
clickUrl = games[0].url;
|
||||||
|
copyContent = games[0].url; // 复制游戏页链接
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送Bark通知
|
||||||
|
const payload = {
|
||||||
|
title: title,
|
||||||
|
body: content,
|
||||||
|
url: clickUrl, // 智能设置点击跳转
|
||||||
|
automaticallyCopy: 1,
|
||||||
|
copy: copyContent, // 智能设置复制内容
|
||||||
|
group: 'Epic免费游戏领取提醒', // 修改分组名称
|
||||||
|
isArchive: 1 // 保存到历史记录
|
||||||
|
};
|
||||||
|
|
||||||
|
// 设置通知图标(使用第一个游戏的图片)
|
||||||
|
if (games[0].image) {
|
||||||
|
payload.icon = games[0].image;
|
||||||
|
}
|
||||||
|
|
||||||
|
await axios.post(BARK_API, payload);
|
||||||
|
|
||||||
|
console.log(`✅ 成功推送 ${games.length} 款免费游戏通知`);
|
||||||
|
console.log(`📎 分组名称: Epic周免领取提醒`);
|
||||||
|
console.log(`📎 点击跳转: ${clickUrl}`);
|
||||||
|
console.log(`📋 复制内容: ${copyContent}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Bark推送失败:', error.message);
|
||||||
|
if (error.response) {
|
||||||
|
console.error('Bark响应数据:', error.response.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
try {
|
||||||
|
console.log('🚀 开始获取EPIC免费游戏信息...');
|
||||||
|
const freeGames = await getEpicFreeGames();
|
||||||
|
|
||||||
|
// 打印调试信息
|
||||||
|
console.log(`🎮 找到 ${freeGames.length} 款免费游戏:`);
|
||||||
|
freeGames.forEach(game => {
|
||||||
|
console.log(`- ${game.title} (截止: ${game.endDate})`);
|
||||||
|
console.log(` 🔗 ${game.url}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
await sendBarkNotification(freeGames);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ 脚本执行失败:', error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
Reference in new issue
Block a user