fix(route): apple iap (#20404)

This commit is contained in:
Tony 2025-11-02 01:30:43 +08:00 committed by GitHub
parent 94834e685a
commit 4e93cf357b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 34 additions and 36 deletions

View File

@ -1,6 +1,5 @@
import { Route } from '@/types';
import got from '@/utils/got';
import * as url from 'node:url';
import ofetch from '@/utils/ofetch';
import { load } from 'cheerio';
export const route: Route = {
@ -24,56 +23,55 @@ export const route: Route = {
handler,
};
const getMediaApiToken = (metaContent) => {
if (!metaContent) {
throw new Error('Empty web experience config meta content');
}
const config = JSON.parse(decodeURIComponent(metaContent));
return config.MEDIA_API.token;
};
async function handler(ctx) {
const country = ctx.req.param('country');
const id = ctx.req.param('id');
const link = `https://apps.apple.com/${country}/app/${id}`;
const target = url.resolve(link, '?mt=8#see-all/in-app-purchases');
const res = await got.get(target);
const $ = load(res.data);
const res = await ofetch(link);
const $ = load(res);
const lang = $('html').attr('lang');
const mediaToken = getMediaApiToken($('meta[name="web-experience-app/config/environment"]').attr('content'));
const apiResponse = (
await got({
method: 'get',
url: `https://amp-api.apps.apple.com/v1/catalog/${country}/apps/${id.replace('id', '')}?platform=web&include=Cmerchandised-in-apps%2Ctop-in-apps%2Ceula&l=${lang}`,
headers: {
authorization:
'Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IkNSRjVITkJHUFEifQ.eyJpc3MiOiI4Q1UyNk1LTFM0IiwiaWF0IjoxNjA3MDMxMTcwLCJleHAiOjE2MTAwNTUxNzB9.qzq2PKkPBNDwHbShoBY3T7J2IjgWsR_MyAvTnZtQB5FZjsH_ZY5esBa0qXbA9kUiq_90GkRoNVMR03meOQQ7SQ',
authority: 'amp-api.apps.apple.com',
referer: target,
},
})
).data.data[0];
const apiResponse = await ofetch(`https://amp-api-edge.apps.apple.com/v1/catalog/${country}/apps/${id.replace('id', '')}`, {
query: {
platform: 'web',
include: 'merchandised-in-apps,top-in-apps,eula',
l: lang,
},
headers: {
authorization: `Bearer ${mediaToken}`,
origin: 'https://apps.apple.com',
},
});
const attributes = apiResponse.attributes;
const titleTemp = attributes.name;
const appData = apiResponse.data[0];
const attributes = appData.attributes;
const platform = attributes.deviceFamilies.includes('mac') ? 'macOS' : 'iOS';
let title;
let item = [];
const iap = apiResponse.relationships['top-in-apps'].data;
const iap = appData.relationships['top-in-apps'].data;
if (iap) {
title = `${country === 'cn' ? '内购限免提醒' : 'IAP price watcher'}: ${titleTemp} for ${platform}`;
item = iap.map((e) => {
const title = `${e.attributes.name} is now ${e.attributes.offers[0].priceFormatted}`;
const result = {
link,
guid: e.attributes.url,
description: e.attributes.artwork ? e.attributes.description.standard + `<br><img src=${e.attributes.artwork.url.replace('{w}x{h}{c}.{f}', '320x0w.jpg')}>` : e.attributes.description.standard,
title,
pubDate: new Date().toUTCString(),
};
return result;
});
item = iap.map(({ attributes }) => ({
title: `${attributes.name} is now ${attributes.offers[0].priceFormatted}`,
link: attributes.url,
guid: `${attributes.url}:${attributes.offerName}:${attributes.offers[0].priceString}`,
description: attributes.artwork ? attributes.description.standard + `<br><img src=${attributes.artwork.url.replace('{w}x{h}{c}.{f}', '3000x3000bb.webp')}>` : attributes.description.standard,
}));
}
return {
title,
title: `${country.toLowerCase() === 'cn' ? '内购限免提醒' : 'IAP price watcher'}: ${attributes.name} for ${platform}`,
link,
item,
};