Skip to content

Commit

Permalink
optimize: api request
Browse files Browse the repository at this point in the history
  • Loading branch information
snowtafir committed Feb 10, 2025
1 parent 285ece2 commit 5720643
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 31 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# 2.0.6
* 优化api请求
* 优化消息发送
* 优化文字动态图片资源的发送
* 依赖升级
Expand Down
10 changes: 5 additions & 5 deletions apps/bilibili.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { BiliQuery } from '@/models/bilibili/bilibili.main.query';
import { BiliTask } from '@/models/bilibili/bilibili.main.task';
import Config from '@/utils/config';
import { _paths } from '@/utils/paths';
import { BiliGetWebData } from '@/models/bilibili/bilibili.main.get.web.data';
import { BilibiliWebDataFetcher } from '@/models/bilibili/bilibili.main.get.web.data';
import {
applyLoginQRCode,
checkBiliLogin,
Expand Down Expand Up @@ -144,7 +144,7 @@ export default class YukiBili extends Plugin {
}

// 获取 Bilibili 动态信息
const res = await new BiliGetWebData(this.e).getBiliDynamicListDataByUid(uid);
const res = await new BilibiliWebDataFetcher(this.e).getBiliDynamicListDataByUid(uid);

if (res.statusText !== 'OK') {
this.e.reply('出了点网络问题,等会再试试吧~');
Expand All @@ -163,7 +163,7 @@ export default class YukiBili extends Plugin {
if (code === 0 && has_more === false) {
this.e.reply(`检测到该uid的主页空间动态内容为空,\n执行uid:${uid} 校验...`);

const resp = await new BiliGetWebData(this.e).getBilibiUserInfoByUid(uid);
const resp = await new BilibiliWebDataFetcher(this.e).getBilibiUserInfoByUid(uid);

if (resp.statusText !== 'OK') {
this.e.reply('出了点网络问题,发起uid校验失败,等会再试试吧~');
Expand Down Expand Up @@ -575,7 +575,7 @@ export default class YukiBili extends Plugin {
async getBilibiUserInfoByUid() {
let uid = this.e.msg.replace(/^(#|\/)(yuki|)?(b|B|bili|bilibili||)(up|UP)/g, '').trim();

const res = await new BiliGetWebData(this.e).getBilibiUserInfoByUid(uid);
const res = await new BilibiliWebDataFetcher(this.e).getBilibiUserInfoByUid(uid);

if (res.statusText !== 'OK') {
this.e.reply('诶嘿,出了点网络问题,等会再试试吧~');
Expand Down Expand Up @@ -613,7 +613,7 @@ export default class YukiBili extends Plugin {
async searchBiliUserInfoByKeyword() {
let keyword = this.e.msg.replace(/^(#|\/)(yuki|)?(b|B|bili|bilibili||)(up|UP)/g, '').trim();

const res = await new BiliGetWebData(this.e).searchBiliUserInfoByKeyword(keyword);
const res = await new BilibiliWebDataFetcher(this.e).searchBiliUserInfoByKeyword(keyword);

if (res.statusText !== 'OK') {
this.e.reply('诶嘿,出了点网络问题,等会再试试吧~');
Expand Down
8 changes: 4 additions & 4 deletions apps/weibo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { WeiboQuery } from '@/models/weibo/weibo.main.query';
import { WeiboTask } from '@/models/weibo/weibo.main.task';
import Config from '@/utils/config';
import { _paths } from '@/utils/paths';
import { WeiboGetWebData } from '@/models/weibo/weibo.main.get.web.data';
import { WeiboWebDataFetcher } from '@/models/weibo/weibo.main.get.web.data';

declare const logger: any;

Expand Down Expand Up @@ -97,7 +97,7 @@ export default class YukiWeibo extends Plugin {
}

// 获取 微博 博主信息
const res = await new WeiboGetWebData(this.e).getBloggerInfo(uid);
const res = await new WeiboWebDataFetcher(this.e).getBloggerInfo(uid);

if (res.statusText !== 'OK') {
this.e.reply('出了点网络问题,等会再试试吧~');
Expand Down Expand Up @@ -296,7 +296,7 @@ export default class YukiWeibo extends Plugin {
async getWeiboUserInfoByUid() {
let uid = this.e.msg.replace(/^(#|\/)(yuki|)?(|weibo|WEIBO)(|bo|BO)/g, '').trim();

const res = await new WeiboGetWebData(this.e).getBloggerInfo(uid);
const res = await new WeiboWebDataFetcher(this.e).getBloggerInfo(uid);

if (res.statusText !== 'OK') {
this.e.reply('诶嘿,出了点网络问题,等会再试试吧~');
Expand Down Expand Up @@ -334,7 +334,7 @@ export default class YukiWeibo extends Plugin {
async searchWeiboUserInfoByKeyword() {
let keyword = this.e.msg.replace(/^(#|\/)(yuki|)?(|weibo|WEIBO)(|bo|BO)/g, '').trim();

const res = await new WeiboGetWebData(this.e).searchBloggerInfo(keyword);
const res = await new WeiboWebDataFetcher(this.e).searchBloggerInfo(keyword);

if (res.statusText !== 'OK') {
this.e.reply('诶嘿,出了点网络问题,等会再试试吧~');
Expand Down
53 changes: 46 additions & 7 deletions models/bilibili/bilibili.main.get.web.data.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,49 @@
import axios from 'axios';
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
import lodash from 'lodash';
import https from 'https';
import BiliApi from '@/models/bilibili/bilibili.main.api';
import { cookieWithBiliTicket, readSavedCookieItems, readSavedCookieOtherItems, readSyncCookie } from '@/models/bilibili/bilibili.mian.models';
import { getWbiSign } from '@/models/bilibili/bilibili.risk.wbi';
import { getDmImg } from '@/models/bilibili/bilibili.risk.dm.img';
import { getWebId } from '@/models/bilibili/bilibili.risk.w_webid';

export class BiliGetWebData {
constructor(e?) {}
class BiliHttpClient {
httpsAgent: https.Agent;
client: AxiosInstance;

constructor() {
this.initializeClient();
}

private initializeClient() {
this.httpsAgent = new https.Agent({
keepAlive: true,
maxSockets: 100,
timeout: 20000
});

this.client = axios.create({
httpsAgent: this.httpsAgent,
timeout: 20000
});
}

async request(url: string, config?: AxiosRequestConfig) {
try {
const response = await this.client.request({ url, ...config });
return response;
} catch (error) {
console.error('BiliHttpClient Request failed:', error);
// 重新创建 AxiosInstance
this.initializeClient();
}
}
}

export class BilibiliWebDataFetcher extends BiliHttpClient {
constructor(e?) {
super();
}

/**通过uid获取up动态数据表*/
async getBiliDynamicListDataByUid(uid: any) {
Expand All @@ -34,9 +70,10 @@ export class BiliGetWebData {
w_rid: w_rid,
wts: time_stamp
};
const res = await axios.get(url, {
const res = await this.request(url, {
method: 'GET',
params,
timeout: 10000,
timeout: 20000,
headers: lodash.merge(BiliApi.BILIBILI_HEADERS, {
Cookie: `${cookie}`,
Host: `api.bilibili.com`,
Expand Down Expand Up @@ -70,7 +107,8 @@ export class BiliGetWebData {
w_rid: w_rid,
wts: time_stamp
};
const res = await axios.get(url, {
const res = await this.request(url, {
method: 'GET',
params,
timeout: 5000,
headers: lodash.merge(BiliApi.BILIBILI_HEADERS, {
Expand Down Expand Up @@ -102,7 +140,8 @@ export class BiliGetWebData {
w_rid: w_rid,
wts: time_stamp
};
const res = await axios.get(url, {
const res = await this.request(url, {
method: 'GET',
params,
timeout: 5000,
headers: lodash.merge(BiliApi.BILIBILI_HEADERS, {
Expand Down
6 changes: 4 additions & 2 deletions models/bilibili/bilibili.main.task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MainProps } from '@/components/dynamic/MainPage';
import Config from '@/utils/config';
import { renderPage } from '@/utils/image';
import { ScreenshotOptions } from '@/utils/puppeteer.render';
import { BiliGetWebData } from '@/models/bilibili/bilibili.main.get.web.data';
import { BilibiliWebDataFetcher } from '@/models/bilibili/bilibili.main.get.web.data';
import { postGateway, readSyncCookie } from '@/models/bilibili/bilibili.mian.models';
import { BiliQuery } from '@/models/bilibili/bilibili.main.query';

Expand All @@ -14,16 +14,18 @@ export class BiliTask {
taskName: string;
groupKey: string;
privateKey: string;
BilibiliWebDataFetcher: BilibiliWebDataFetcher;
e?: EventType;
constructor(e?: EventType) {
this.taskName = 'biliTask';
this.groupKey = 'Yz:yuki:bili:upPush:group:';
this.privateKey = 'Yz:yuki:bili:upPush:private:';
this.BilibiliWebDataFetcher = new BilibiliWebDataFetcher();
}

async hendleEventDynamicData(uid: string | number, count: number = 0): Promise<any> {
let { cookie } = await readSyncCookie();
const resp = await new BiliGetWebData().getBiliDynamicListDataByUid(uid);
const resp = await this.BilibiliWebDataFetcher.getBiliDynamicListDataByUid(uid);
const resjson = await resp.data;

if (!resjson || resjson.code !== 0 || resjson.code === -352) {
Expand Down
2 changes: 1 addition & 1 deletion models/bilibili/bilibili.mian.models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ export async function checkBiliLogin(e: EventType) {
const LoginCookieTTLStr =
LoginCookieTTL === -1 ? '永久' : LoginCookieTTL === -2 ? '-' : `${new Date(Date.now() + LoginCookieTTL * 1000).toLocaleString()}`;
e.reply(
`~B站账号已登陆~,有效期至${LoginCookieTTLStr}。\n昵称:${uname}\nuid:${mid}\n硬币:${money}\n经验等级:${current_level}\n当前经验值exp:${current_exp}\n下一等级所需exp:${next_exp}`
`~B站账号已登陆~\n有效期至${LoginCookieTTLStr}。\n昵称:${uname}\nuid:${mid}\n硬币:${money}\n经验等级:${current_level}\n当前经验值exp:${current_exp}\n下一等级所需exp:${next_exp}`
);
} else {
// 处理其他情况
Expand Down
54 changes: 45 additions & 9 deletions models/weibo/weibo.main.get.web.data.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,58 @@
import axios from 'axios';
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
import https from 'https';
import { EventType } from 'yunzaijs';
import { WeiboApi } from '@/models/weibo/weibo.main.api';
import { WeiboQuery } from '@/models/weibo/weibo.main.query';

declare const logger: any;

export class WeiboGetWebData {
class WeiboHttpClient {
httpsAgent: https.Agent;
client: AxiosInstance;

constructor() {
this.initializeClient();
}

private initializeClient() {
this.httpsAgent = new https.Agent({
keepAlive: true,
maxSockets: 100,
timeout: 20000
});

this.client = axios.create({
httpsAgent: this.httpsAgent,
timeout: 20000
});
}

async request(url: string, config?: AxiosRequestConfig) {
try {
const response = await this.client.request({ url, ...config });
return response;
} catch (error) {
console.error('WeiboHttpClient Request failed:', error);
// 重新创建 AxiosInstance
this.initializeClient();
}
}
}

export class WeiboWebDataFetcher extends WeiboHttpClient {
e?: EventType;
constructor(e?: EventType) {}
constructor(e?: EventType) {
super();
}

/**通过uid获取博主信息 */
async getBloggerInfo(target: any) {
const param = { containerid: '100505' + target };
const url = new URL(WeiboApi.WEIBO_API.weiboGetIndex);
url.search = new URLSearchParams(param).toString();

const resp = await axios.get(url.toString(), {
timeout: 10000,
const resp = await this.request(url.toString(), {
method: 'GET',
headers: { 'accept': '*/*', 'Content-Type': 'application/json', 'referer': 'https://m.weibo.cn' }
});
return resp;
Expand All @@ -30,9 +66,9 @@ export class WeiboGetWebData {
q: keyword
};

const resp = await axios.get(url, {
const resp = await this.request(url, {
method: 'GET',
params,
timeout: 10000,
headers: { 'accept': '*/*', 'Content-Type': 'application/json', 'referer': 'https://s.weibo.com' }
});
return resp;
Expand All @@ -47,8 +83,8 @@ export class WeiboGetWebData {
await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * (6500 - 1000 + 1) + 1000)));

try {
const response = await axios.get(url.toString(), {
timeout: 15000,
const response = await this.request(url.toString(), {
method: 'GET',
headers: { 'accept': '*/*', 'Content-Type': 'application/json', 'referer': 'https://m.weibo.cn' }
});
const { ok, data, msg } = response.data;
Expand Down
6 changes: 4 additions & 2 deletions models/weibo/weibo.main.task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MainProps } from '@/components/dynamic/MainPage';
import Config from '@/utils/config';
import { renderPage } from '@/utils/image';
import { ScreenshotOptions } from '@/utils/puppeteer.render';
import { WeiboGetWebData } from '@/models/weibo/weibo.main.get.web.data';
import { WeiboWebDataFetcher } from '@/models/weibo/weibo.main.get.web.data';
import { WeiboQuery } from '@/models/weibo/weibo.main.query';

declare const logger: any;
Expand All @@ -13,11 +13,13 @@ export class WeiboTask {
taskName: string;
groupKey: string;
privateKey: string;
WeiboWebDataFetcher: WeiboWebDataFetcher;
e?: EventType;
constructor(e?) {
this.taskName = 'weiboTask';
this.groupKey = 'Yz:yuki:weibo:upPush:group:';
this.privateKey = 'Yz:yuki:weibo:upPush:private:';
this.WeiboWebDataFetcher = new WeiboWebDataFetcher(e);
}

/**
Expand Down Expand Up @@ -96,7 +98,7 @@ export class WeiboTask {
const dynamicData = resp || [];
dynamicList[subInfoOfup.uid] = dynamicData;
} else {
resp = await await new WeiboGetWebData().getBloggerDynamicList(subInfoOfup.uid); // 获取指定 uid 的动态列表
resp = await this.WeiboWebDataFetcher.getBloggerDynamicList(subInfoOfup.uid); // 获取指定 uid 的动态列表
if (resp) {
requestedDataOfUids.set(subInfoOfup.uid, resp); // 将响应数据存储到映射中
const dynamicData = resp || [];
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "yuki-plugin",
"version": "2.0.6-12",
"version": "2.0.6-13",
"author": "snowtafir",
"description": "优纪插件,yunzai-V4 关于 微博推送、B站推送 等功能的拓展插件",
"main": "./index",
Expand Down

0 comments on commit 5720643

Please sign in to comment.