UNPKG

rsshub

Version:
269 lines (259 loc) 6.5 kB
import { config } from '@/config'; import { Route, ViewType } from '@/types'; import got from '@/utils/got'; import timezone from '@/utils/timezone'; import { getHeaders } from './utils'; import ConfigNotFoundError from '@/errors/types/config-not-found'; const getTrueHour = (rank_type, rank_id, hour) => { const rank_two_hour = ['11', '17', '28', '29']; const rank_four_hour = ['12', '13', '14', '15', '17', '74', '75', '71', '25']; const flag = ['pinlei', 'dianshang'].includes(rank_type) && [...rank_two_hour, ...rank_four_hour].includes(rank_id) && hour === '3'; if (flag) { return rank_two_hour.includes(rank_id) ? '2' : '4'; } else { return hour; } }; const typeOptions = [ { value: 'pinlei', label: '好价品类榜', }, { value: 'dianshang', label: '好价电商榜', }, { value: 'haitao', label: '海淘 TOP 榜', }, { value: 'haowen', label: '好文排行榜', }, { value: 'haowu', label: '好物排行榜', }, ]; const idOptions = [ { label: '好价品类榜-全部', value: '11', }, { label: '好价品类榜-食品生鲜', value: '12', }, { label: '好价品类榜-电脑数码', value: '13', }, { label: '好价品类榜-运动户外', value: '14', }, { label: '好价品类榜-家用电器', value: '15', }, { label: '好价品类榜-白菜', value: '17', }, { label: '好价品类榜-服饰鞋包', value: '74', }, { label: '好价品类榜-日用百货', value: '75', }, { label: '好价电商榜-券活动', value: '24', }, { label: '好价电商榜-京东', value: '23', }, { label: '好价电商榜-天猫', value: '25', }, { label: '好价电商榜-亚马逊中国', value: '26', }, { label: '好价电商榜-国美在线', value: '27', }, { label: '好价电商榜-苏宁易购', value: '28', }, { label: '好价电商榜-网易', value: '29', }, { label: '好价电商榜-西集网', value: '30', }, { label: '好价电商榜-美国亚马逊', value: '31', }, { label: '好价电商榜-日本亚马逊', value: '32', }, { label: '好价电商榜-ebay', value: '33', }, { label: '海淘 TOP 榜-全部', value: '39', }, { label: '海淘 TOP 榜-海外直邮', value: '34', }, { label: '海淘 TOP 榜-美国榜', value: '35', }, { label: '海淘 TOP 榜-欧洲榜', value: '36', }, { label: '海淘 TOP 榜-澳新榜', value: '37', }, { label: '海淘 TOP 榜-亚洲榜', value: '38', }, { label: '海淘 TOP 榜-晒物榜', value: 'hsw', }, { label: '好文排行榜-原创', value: 'yc', }, { label: '好文排行榜-资讯', value: 'zx', }, { label: '好物排行榜-新晋榜', value: 'hwall', }, { label: '好物排行榜-消费众测', value: 'zc', }, { label: '好物排行榜-新锐品牌', value: 'nb', }, { label: '好物排行榜-好物榜单', value: 'hw', }, ]; export const route: Route = { path: '/ranking/:rank_type/:rank_id/:hour', categories: ['shopping'], view: ViewType.Notifications, example: '/smzdm/ranking/pinlei/11/3', parameters: { rank_type: { description: '榜单类型', options: typeOptions, }, rank_id: { description: '榜单ID', options: idOptions, }, hour: { description: '时间跨度', options: [ { value: '3', label: '3 小时', }, { value: '12', label: '12 小时', }, { value: '24', label: '24 小时', }, ], }, }, features: { requireConfig: [ { name: 'SMZDM_COOKIE', description: '什么值得买登录后的 Cookie 值', }, ], requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false, }, name: '排行榜', maintainers: ['DIYgod'], handler, }; async function handler(ctx) { if (!config.smzdm.cookie) { throw new ConfigNotFoundError('什么值得买排行榜 is disabled due to the lack of SMZDM_COOKIE'); } const { rank_type, rank_id, hour } = ctx.req.param(); // When the hour is 3, some special rank_id require a special hour num const true_hour = getTrueHour(rank_type, rank_id, hour); const response = await got(`https://www.smzdm.com/top/json_more`, { headers: { Referer: 'https://www.smzdm.com/top', ...getHeaders(), }, searchParams: { rank_type, rank_id, hour: true_hour, }, }); const data = response.data.data.list; const list1 = []; const list2 = []; for (let i = 0; i < Math.min(6, data.length); i++) { if (data[i][0].length !== 0) { list1.push(data[i][0]); } if (data[i][1].length !== 0) { list2.push(data[i][1]); } } const list = [...list1, ...list2]; return { title: `什么值得买${typeOptions.find((item) => item.value === rank_type)?.label}-${idOptions.find((item) => item.value === rank_id)?.label}-${hour}小时`, link: 'https://www.smzdm.com/top/', allowEmpty: true, item: list.map((item) => ({ title: `${item.article_title} - ${item.article_price}`, description: `${item.article_title} - ${item.article_price}<br><img src="${item.article_pic}">`, pubDate: timezone(item.article_pubdate, +8), link: item.article_url, })), }; }