feat: 新增豆瓣新片榜 & add ESLint

This commit is contained in:
imsyy 2023-09-06 14:48:27 +08:00
parent 813e88c993
commit 6330914d09
21 changed files with 1788 additions and 343 deletions

19
.eslintrc.json Normal file
View File

@ -0,0 +1,19 @@
{
"env": {
"browser": true,
"es2021": true
},
"extends": ["eslint:recommended", "plugin:vue/vue3-essential"],
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["vue"],
"rules": {},
"globals": {
"require": true,
"module": true,
"process": true,
"__dirname": true
}
}

8
.prettierrc.json Normal file
View File

@ -0,0 +1,8 @@
{
"$schema": "https://json.schemastore.org/prettierrc",
"singleQuote": false,
"trailingComma": "all",
"tabWidth": 2,
"semi": true,
"printWidth": 100
}

View File

@ -24,9 +24,10 @@
| 百度 | 热搜榜 | baidu | 🟢 |
| 抖音 | 热点榜 | douyin / douyin_new | 🟢 |
| 抖音 | 热歌榜 | douyin_music | 🟢 |
| 豆瓣 | 新片榜 | douban_new | 🟢 |
| 百度贴吧 | 热议榜 | tieba | 🟢 |
| 少数派 | 热榜 | sspai | 🟢 |
| IT 之家 | 热榜 | ithome | 🟢 |
| IT 之家 | 热榜 | ithome | 🟠 |
| 澎湃新闻 | 热榜 | thepaper | 🟢 |
| 今日头条 | 热榜 | toutiao | 🟢 |
| 36 氪 | 热榜 | 36kr | 🟢 |
@ -59,7 +60,7 @@ GET https://example.com/calendar/date?month=06&day=01
## 部署
```js
```bash
// 安装依赖
pnpm install

View File

@ -24,7 +24,7 @@ app.use(views(__dirname + "/public"));
app.use(
cors({
origin: domain,
})
}),
);
app.use(async (ctx, next) => {

View File

@ -4,6 +4,8 @@
"description": "一个今日热榜",
"main": "index.js",
"scripts": {
"format": "prettier --write .",
"lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
"start": "node index.js",
"dev": "npx nodemon index.js",
"prd": "pm2 start index.js",
@ -22,6 +24,9 @@
"koa-views": "^8.0.0",
"koa2-cors": "^2.0.6",
"node-cache": "^5.1.2",
"nodemon": "^2.0.22"
"nodemon": "^2.0.22",
"eslint": "^8.48.0",
"eslint-plugin-vue": "^9.17.0",
"prettier": "^3.0.2"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,9 @@
<!DOCTYPE html>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>404 | Linkbook API</title>
<link
rel="shortcut icon"
href="https://img.imsyy.top/logo/imsyy.png"
type="image/x-icon"
/>
<link rel="shortcut icon" href="https://img.imsyy.top/logo/imsyy.png" type="image/x-icon" />
<link
rel="stylesheet"
href="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/6.0.0/css/all.min.css"
@ -38,7 +34,9 @@
background-color: var(--text-color-hover);
color: var(--text-color);
font-family: "PingFang SC", "Open Sans", "Microsoft YaHei", sans-serif;
transition: background-color 0.5s, color 0.5s;
transition:
background-color 0.5s,
color 0.5s;
display: flex;
flex-direction: column;
align-items: center;
@ -149,16 +147,12 @@
<a href="https://imsyy.top/" target="_blank">無名</a>
</div>
<div class="icp">
<a href="https://beian.miit.gov.cn/" target="_blank"
>豫ICP备2022018134号-1</a
>
<a href="https://beian.miit.gov.cn/" target="_blank">豫ICP备2022018134号-1</a>
</div>
</footer>
<script>
// 跟随系统主题
const darkModeMediaQuery = window.matchMedia(
"(prefers-color-scheme: dark)"
);
const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
const toggleDarkMode = (darkModeMediaQuery) => {
if (darkModeMediaQuery.matches) {
document.documentElement.classList.add("dark-mode");

View File

@ -1,13 +1,9 @@
<!DOCTYPE html>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>DailyHot API</title>
<link
rel="shortcut icon"
href="./favicon.svg"
type="image/x-icon"
/>
<link rel="shortcut icon" href="./favicon.svg" type="image/x-icon" />
<link
rel="stylesheet"
href="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/6.0.0/css/all.min.css"
@ -38,7 +34,9 @@
background-color: var(--text-color-hover);
color: var(--text-color);
font-family: "PingFang SC", "Open Sans", "Microsoft YaHei", sans-serif;
transition: background-color 0.5s, color 0.5s;
transition:
background-color 0.5s,
color 0.5s;
display: flex;
flex-direction: column;
align-items: center;
@ -155,16 +153,12 @@
<a href="https://imsyy.top/" target="_blank">無名</a>
</div>
<div class="icp">
<a href="https://beian.miit.gov.cn/" target="_blank"
>豫ICP备2022018134号-1</a
>
<a href="https://beian.miit.gov.cn/" target="_blank">豫ICP备2022018134号-1</a>
</div>
</footer>
<script>
// 跟随系统主题
const darkModeMediaQuery = window.matchMedia(
"(prefers-color-scheme: dark)"
);
const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
const toggleDarkMode = (darkModeMediaQuery) => {
if (darkModeMediaQuery.matches) {
document.documentElement.classList.add("dark-mode");

View File

@ -20,7 +20,7 @@ const getData = (data) => {
if (!data) return [];
const dataList = [];
try {
const pattern = /<\!--s-data:(.*?)-->/s;
const pattern = /<!--s-data:(.*?)-->/s;
const matchResult = data.match(pattern);
const jsonObject = JSON.parse(matchResult[1]).cards[0].content;
jsonObject.forEach((v) => {

View File

@ -1,7 +1,7 @@
const Router = require("koa-router");
const calendarRouter = new Router();
const axios = require("axios");
const { get, set, del } = require("../utils/cacheData");
const { get, set } = require("../utils/cacheData");
// 缓存键名
const cacheKey = "calendarData";
@ -96,7 +96,7 @@ calendarRouter.get("/calendar/date", async (ctx) => {
}
// 从服务器拉取最新数据
const response = await axios.get(
`https://baike.baidu.com/cms/home/eventsOnHistory/${month}.json`
`https://baike.baidu.com/cms/home/eventsOnHistory/${month}.json`,
);
const newData = getData(response.data[month][month + day]);
updateTime = new Date().toISOString();

View File

@ -1,3 +1,10 @@
/*
* @author: MyFaith
* @date: 2023-09-06
* @customEditors: imsyy
* @lastEditTime: 2023-09-06
*/
const Router = require("koa-router");
const doubanNewRouter = new Router();
const axios = require("axios");
@ -8,7 +15,7 @@ const { get, set, del } = require("../utils/cacheData");
const routerInfo = {
name: "douban",
title: "豆瓣",
subtitle: "新片榜"
subtitle: "新片榜",
};
// 缓存键名
@ -20,7 +27,8 @@ let updateTime = new Date().toISOString();
// 调用路径
const url = "https://movie.douban.com/chart/";
const headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1"
"User-Agent":
"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1",
};
// 豆瓣新片榜单特殊处理 - 标题
@ -45,7 +53,7 @@ const getData = (data) => {
comments: $(item).find("span.pl").text().match(/\d+/)[0] ?? "",
pic: $(item).find("img").attr("src") ?? "",
url: $(item).find("a").attr("href") ?? "",
mobileUrl: `https://m.douban.com/movie/subject/${id}`
mobileUrl: `https://m.douban.com/movie/subject/${id}`,
});
});
return dataList;
@ -73,7 +81,7 @@ doubanNewRouter.get("/douban_new", async (ctx) => {
ctx.body = {
code: 500,
...routerInfo,
message: "获取失败"
message: "获取失败",
};
return false;
}
@ -87,14 +95,14 @@ doubanNewRouter.get("/douban_new", async (ctx) => {
from,
total: data.length,
updateTime,
data
data,
};
} catch (error) {
console.error(error);
ctx.body = {
code: 500,
...routerInfo,
message: "获取失败"
message: "获取失败",
};
}
});
@ -116,7 +124,7 @@ doubanNewRouter.get("/douban_new/new", async (ctx) => {
...routerInfo,
updateTime,
total: newData.length,
data: newData
data: newData,
};
// 删除旧数据
@ -134,14 +142,14 @@ doubanNewRouter.get("/douban_new/new", async (ctx) => {
...routerInfo,
total: cachedData.length,
updateTime,
data: cachedData
data: cachedData,
};
} else {
// 如果缓存中也没有数据,则返回错误信息
ctx.body = {
code: 500,
...routerInfo,
message: "获取失败"
message: "获取失败",
};
}
}

View File

@ -22,8 +22,7 @@ const url =
"https://www.douyin.com/aweme/v1/web/hot/search/list/?device_platform=webapp&aid=6383&channel=channel_pc_web&detail_list=1&round_trip_time=50";
// Token 获取路径
const cookisUrl =
"https://www.douyin.com/passport/general/login_guiding_strategy/?aid=6383";
const cookisUrl = "https://www.douyin.com/passport/general/login_guiding_strategy/?aid=6383";
// 数据处理
const getData = (data) => {
@ -37,9 +36,7 @@ const getData = (data) => {
pic: `${v.word_cover.url_list[0]}`,
hot: Number(v.hot_value),
url: `https://www.douyin.com/hot/${encodeURIComponent(v.sentence_id)}`,
mobileUrl: `https://www.douyin.com/hot/${encodeURIComponent(
v.sentence_id
)}`,
mobileUrl: `https://www.douyin.com/hot/${encodeURIComponent(v.sentence_id)}`,
});
});
return dataList;

View File

@ -46,9 +46,7 @@ const getData = (data) => {
pic: `${v.word_cover.url_list[0]}`,
hot: Number(v.hot_value),
url: `https://www.douyin.com/hot/${encodeURIComponent(v.sentence_id)}`,
mobileUrl: `https://www.douyin.com/hot/${encodeURIComponent(
v.sentence_id
)}`,
mobileUrl: `https://www.douyin.com/hot/${encodeURIComponent(v.sentence_id)}`,
};
});
} catch (error) {

View File

@ -129,7 +129,7 @@ itHomeRouter.get("/ithome/new", async (ctx) => {
...routerInfo,
updateTime,
total: newData.length,
data: newData
data: newData,
};
// 删除旧数据
@ -147,7 +147,7 @@ itHomeRouter.get("/ithome/new", async (ctx) => {
...routerInfo,
total: cachedData.length,
updateTime,
data: cachedData
data: cachedData,
};
} else {
// 如果缓存中也没有数据,则返回错误信息

View File

@ -17,8 +17,7 @@ const cacheKey = "juejinData";
let updateTime = new Date().toISOString();
// 调用路径
const url =
"https://api.juejin.cn/content_api/v1/content/article_rank?category_id=1&type=hot";
const url = "https://api.juejin.cn/content_api/v1/content/article_rank?category_id=1&type=hot";
// 数据处理
const getData = (data) => {

View File

@ -29,7 +29,7 @@ const url = "https://www.kuaishou.com/?isHome=1";
// Unicode 解码
const decodedString = (encodedString) => {
return encodedString.replace(/\\u([\d\w]{4})/gi, (match, grp) =>
String.fromCharCode(parseInt(grp, 16))
String.fromCharCode(parseInt(grp, 16)),
);
};
@ -44,8 +44,7 @@ const getData = (data) => {
const jsonObject = JSON.parse(matchResult[1])["defaultClient"];
// 获取所有分类
const allItems =
jsonObject['$ROOT_QUERY.visionHotRank({"page":"home"})']["items"];
const allItems = jsonObject['$ROOT_QUERY.visionHotRank({"page":"home"})']["items"];
// 遍历所有分类
allItems.forEach((v) => {
// 基础数据

View File

@ -34,12 +34,8 @@ const getData = (data) => {
desc: v.sAuthor,
pic: `https:${v.sIMG}`,
hot: Number(v.iTotalPlay),
url: `https://lol.qq.com/news/detail.shtml?docid=${encodeURIComponent(
v.iDocID
)}`,
mobileUrl: `https://lol.qq.com/news/detail.shtml?docid=${encodeURIComponent(
v.iDocID
)}`,
url: `https://lol.qq.com/news/detail.shtml?docid=${encodeURIComponent(v.iDocID)}`,
mobileUrl: `https://lol.qq.com/news/detail.shtml?docid=${encodeURIComponent(v.iDocID)}`,
});
});
return dataList;

View File

@ -30,11 +30,9 @@ const getData = (data) => {
title: v.word,
desc: key,
hot: v.raw_hot,
url: `https://s.weibo.com/weibo?q=${encodeURIComponent(
key
)}&t=31&band_rank=1&Refer=top`,
url: `https://s.weibo.com/weibo?q=${encodeURIComponent(key)}&t=31&band_rank=1&Refer=top`,
mobileUrl: `https://s.weibo.com/weibo?q=${encodeURIComponent(
key
key,
)}&t=31&band_rank=1&Refer=top`,
};
});

View File

@ -33,9 +33,7 @@ const getData = (data) => {
hot: v.readingCount,
author: book.author,
url: `https://weread.qq.com/web/bookDetail/${getWereadID(book.bookId)}`,
mobileUrl: `https://weread.qq.com/web/bookDetail/${getWereadID(
book.bookId
)}`,
mobileUrl: `https://weread.qq.com/web/bookDetail/${getWereadID(book.bookId)}`,
};
});
};

View File

@ -2,7 +2,6 @@ const Router = require("koa-router");
const zhihuRouter = new Router();
const axios = require("axios");
const { get, set, del } = require("../utils/cacheData");
const router = require(".");
// 接口信息
const routerInfo = {
@ -28,8 +27,7 @@ const getData = (data) => {
if (!data) return [];
const dataList = [];
try {
const pattern =
/<script id="js-initialData" type="text\/json">(.*?)<\/script>/;
const pattern = /<script id="js-initialData" type="text\/json">(.*?)<\/script>/;
const matchResult = data.match(pattern);
const jsonObject = JSON.parse(matchResult[1]).initialState.topstory.hotList;
jsonObject.forEach((v) => {

View File

@ -47,8 +47,7 @@ const getWereadID = (bookId) => {
const subLength = sub.length.toString(16);
// 如果长度只有一位数则在前面添加0
const subLengthPadded =
subLength.length === 1 ? "0" + subLength : subLength;
const subLengthPadded = subLength.length === 1 ? "0" + subLength : subLength;
// 将长度和子字符串添加到初始值中
strSub += subLengthPadded + sub;