format:format and fix code

This commit is contained in:
jiangrui
2025-02-24 15:22:43 +08:00
parent c784b562c4
commit f5106e782a
46 changed files with 2055 additions and 1172 deletions

View File

@@ -4,6 +4,23 @@ import { Logger } from "../utils/logger";
import { config } from "../config/index";
import { ShareInfoResponse } from "../types/cloud115";
interface Cloud115ListItem {
cid: string;
n: string;
s: number;
}
interface Cloud115FolderItem {
cid: string;
n: string;
ns: number;
}
interface Cloud115PathItem {
cid: string;
name: string;
}
export class Cloud115Service {
private api: AxiosInstance;
private cookie: string = "";
@@ -39,7 +56,7 @@ export class Cloud115Service {
});
}
public setCookie(cookie: string) {
public setCookie(cookie: string): void {
this.cookie = cookie;
}
@@ -56,7 +73,7 @@ export class Cloud115Service {
if (response.data?.state && response.data.data?.list?.length > 0) {
return {
data: response.data.data.list.map((item: any) => ({
data: response.data.data.list.map((item: Cloud115ListItem) => ({
fileId: item.cid,
fileName: item.n,
fileSize: item.s,
@@ -66,7 +83,9 @@ export class Cloud115Service {
throw new Error("未找到文件信息");
}
async getFolderList(parentCid = "0") {
async getFolderList(
parentCid = "0"
): Promise<{ data: { cid: string; name: string; path: Cloud115PathItem[] }[] }> {
const response = await this.api.get("/files", {
params: {
aid: 1,
@@ -87,8 +106,8 @@ export class Cloud115Service {
if (response.data?.state) {
return {
data: response.data.data
.filter((item: any) => item.cid && !!item.ns)
.map((folder: any) => ({
.filter((item: Cloud115FolderItem) => item.cid && !!item.ns)
.map((folder: Cloud115FolderItem) => ({
cid: folder.cid,
name: folder.n,
path: response.data.path,
@@ -105,7 +124,7 @@ export class Cloud115Service {
shareCode: string;
receiveCode: string;
fileId: string;
}) {
}): Promise<{ message: string; data: unknown }> {
const param = new URLSearchParams({
cid: params.cid,
user_id: config.cloud115.userId,

View File

@@ -1,6 +1,15 @@
import { AxiosHeaders, AxiosInstance } from "axios";
import { createAxiosInstance } from "../utils/axiosInstance";
interface DoubanSubject {
id: string;
title: string;
rate: string;
cover: string;
url: string;
is_new: boolean;
}
class DoubanService {
private baseUrl: string;
private api: AxiosInstance;
@@ -28,7 +37,12 @@ class DoubanService {
);
}
async getHotList(params: { type: string; tag: string; page_limit: string; page_start: string }) {
async getHotList(params: {
type: string;
tag: string;
page_limit: string;
page_start: string;
}): Promise<{ data: DoubanSubject[] }> {
try {
const response = await this.api.get("/search_subjects", {
params: params,

View File

@@ -2,6 +2,23 @@ import { AxiosInstance, AxiosHeaders } from "axios";
import { Logger } from "../utils/logger";
import { createAxiosInstance } from "../utils/axiosInstance";
interface QuarkShareInfo {
stoken?: string;
pwdId?: string;
list: {
fid: string;
file_name: string;
file_type: number;
share_fid_token: string;
}[];
}
interface QuarkFolderItem {
fid: string;
file_name: string;
file_type: number;
}
export class QuarkService {
private api: AxiosInstance;
private cookie: string = "";
@@ -34,11 +51,11 @@ export class QuarkService {
});
}
public setCookie(cookie: string) {
public setCookie(cookie: string): void {
this.cookie = cookie;
}
async getShareInfo(pwdId: string, passcode = "") {
async getShareInfo(pwdId: string, passcode = ""): Promise<{ data: QuarkShareInfo }> {
const response = await this.api.post(
`/1/clouddrive/share/sharepage/token?pr=ucpro&fr=pc&uc_param_str=&__dt=994&__t=${Date.now()}`,
{
@@ -49,7 +66,7 @@ export class QuarkService {
if (response.data?.status === 200 && response.data.data) {
const fileInfo = response.data.data;
if (fileInfo.stoken) {
let res = await this.getShareList(pwdId, fileInfo.stoken);
const res = await this.getShareList(pwdId, fileInfo.stoken);
return {
data: res,
};
@@ -58,7 +75,7 @@ export class QuarkService {
throw new Error("获取夸克分享信息失败");
}
async getShareList(pwdId: string, stoken: string) {
async getShareList(pwdId: string, stoken: string): Promise<QuarkShareInfo> {
const response = await this.api.get("/1/clouddrive/share/sharepage/detail", {
params: {
pr: "ucpro",
@@ -80,8 +97,8 @@ export class QuarkService {
});
if (response.data?.data) {
const list = response.data.data.list
.filter((item: any) => item.fid)
.map((folder: any) => ({
.filter((item: QuarkShareInfo["list"][0]) => item.fid)
.map((folder: QuarkShareInfo["list"][0]) => ({
fileId: folder.fid,
fileName: folder.file_name,
fileIdToken: folder.share_fid_token,
@@ -89,7 +106,7 @@ export class QuarkService {
return {
list,
pwdId,
stoken: stoken,
stoken,
};
} else {
return {
@@ -98,7 +115,9 @@ export class QuarkService {
}
}
async getFolderList(parentCid = "0") {
async getFolderList(
parentCid = "0"
): Promise<{ data: { cid: string; name: string; path: [] }[] }> {
const response = await this.api.get("/1/clouddrive/file/sort", {
params: {
pr: "ucpro",
@@ -116,8 +135,8 @@ export class QuarkService {
});
if (response.data?.data && response.data.data.list) {
const data = response.data.data.list
.filter((item: any) => item.fid && item.file_type === 0)
.map((folder: any) => ({
.filter((item: QuarkFolderItem) => item.fid && item.file_type === 0)
.map((folder: QuarkFolderItem) => ({
cid: folder.fid,
name: folder.file_name,
path: [],
@@ -140,7 +159,7 @@ export class QuarkService {
stoken: string;
pdir_fid: string;
scene: string;
}) {
}): Promise<{ message: string; data: unknown }> {
try {
const response = await this.api.post(
`/1/clouddrive/share/sharepage/save?pr=ucpro&fr=pc&uc_param_str=&__dt=208097&__t=${Date.now()}`,

View File

@@ -1,116 +0,0 @@
import RSSParser from "rss-parser";
import { AxiosInstance, AxiosHeaders } from "axios";
import { config } from "../config";
import { Logger } from "../utils/logger";
import { createAxiosInstance } from "../utils/axiosInstance";
import { data } from "cheerio/dist/commonjs/api/attributes";
interface RSSItem {
title?: string;
link?: string;
pubDate?: string;
content?: string;
description?: string;
image?: string;
cloudLinks?: string[];
}
export class RSSSearcher {
private parser: RSSParser;
private axiosInstance: AxiosInstance;
constructor() {
this.parser = new RSSParser({
customFields: {
item: [
["content:encoded", "content"],
["description", "description"],
],
},
});
this.axiosInstance = createAxiosInstance(
config.rss.baseUrl,
AxiosHeaders.from({
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
Accept: "application/xml,application/xhtml+xml,text/html,application/rss+xml",
}),
true
);
}
private extractCloudLinks(text: string): { links: string[]; cloudType: string } {
const links: string[] = [];
let cloudType = "";
Object.values(config.cloudPatterns).forEach((pattern, index) => {
const matches = text.match(pattern);
if (matches) {
links.push(...matches);
cloudType = Object.keys(config.cloudPatterns)[index];
}
});
return {
links: [...new Set(links)],
cloudType,
};
}
async searchAll(keyword: string) {
const allResults = [];
for (let i = 0; i < config.rss.channels.length; i++) {
const channel = config.rss.channels[i];
try {
const rssUrl = `${config.rss.baseUrl}/${
channel.id
}${keyword ? `/searchQuery=${encodeURIComponent(keyword)}` : ""}`;
const results = await this.searchInRSSFeed(rssUrl);
if (results.items.length > 0) {
const channelResults = results.items
.filter((item: RSSItem) => item.cloudLinks && item.cloudLinks.length > 0)
.map((item: RSSItem) => ({
...item,
channel: channel.name + "(" + channel.id + ")",
}));
allResults.push(...channelResults);
}
} catch (error) {
Logger.error(`搜索频道 ${channel.name} 失败:`, error);
}
}
return {
data: allResults,
message: "搜索成功",
};
}
async searchInRSSFeed(rssUrl: string) {
try {
const response = await this.axiosInstance.get(rssUrl);
const feed = await this.parser.parseString(response.data);
return {
items: feed.items.map((item: RSSItem) => {
const linkInfo = this.extractCloudLinks(item.content || item.description || "");
return {
title: item.title || "",
link: item.link || "",
pubDate: item.pubDate || "",
image: item.image || "",
cloudLinks: linkInfo.links,
cloudType: linkInfo.cloudType,
};
}),
};
} catch (error) {
Logger.error(`RSS源解析错误: ${rssUrl}`, error);
return {
items: [],
};
}
}
}

View File

@@ -27,7 +27,7 @@ export class Searcher {
this.initializeAxiosInstance();
}
private async initializeAxiosInstance(isUpdate = false) {
private async initializeAxiosInstance(isUpdate = false): Promise<void> {
let settings = null;
if (isUpdate) {
settings = await GlobalSetting.findOne();
@@ -78,7 +78,6 @@ export class Searcher {
async searchAll(keyword: string, channelId?: string, messageId?: string) {
const allResults = [];
const totalChannels = config.rss.channels.length;
const channelList = channelId
? config.rss.channels.filter((channel) => channel.id === channelId)
@@ -90,7 +89,7 @@ export class Searcher {
const messageIdparams = messageId ? `before=${messageId}` : "";
const url = `/${channel.id}${keyword ? `?q=${encodeURIComponent(keyword)}&${messageIdparams}` : `?${messageIdparams}`}`;
console.log(`Searching in channel ${channel.name} with URL: ${url}`);
const results = await this.searchInWeb(url, channel.id);
const results = await this.searchInWeb(url);
console.log(`Found ${results.items.length} items in channel ${channel.name}`);
if (results.items.length > 0) {
const channelResults = results.items
@@ -120,7 +119,7 @@ export class Searcher {
};
}
async searchInWeb(url: string, channelId: string) {
async searchInWeb(url: string) {
try {
if (!this.axiosInstance) {
throw new Error("Axios instance is not initialized");