@hkai-ai/weibo-api
Version:
香港人工智能协会封装的新浪微博API
127 lines (121 loc) • 4.25 kB
JavaScript
import { Option } from "effect";
export function multiply(a, b) {
return a * b;
}
/**
* 目前看起来只有发原创推文和转发推文的情况
*/
/**
* 原创推文
*/
/**
* 转发的推文
*/
/**
* 从 init 响应体中解析出 tab 信息,通过 tab 信息中的 ContainerId 获取用户主页中不同分类的微博信息(精选、微博、视频、相册等)
* @param res
* @returns
*/
export const parseTabInfoFromInitResponseBody = res => {
return res.data.tabsInfo.tabs.reduce((acc, tab) => {
return {
...acc,
[tab.tabKey]: tab.containerid
};
}, {});
};
export const extractUserWeiboContainerId = parsedTabInfo => Option.fromNullable(parsedTabInfo.weibo);
export const extractCardInfosFromWeiboResponseBody = res => Option.fromNullable(res.data.cards);
export const isWeiboBeBlocked = weibo => weibo.visible.list_id != 0;
/**
* 将卡片信息解析为微博推文信息
* 需要注意的是微博可能会存在被屏蔽的问题
* @param cardInfos
* @returns
*/
export const parseCardInfosToWeiboInfos = cardInfos => {
return cardInfos.filter(card => card.card_type === 9).map((card, index) => {
try {
if (isWeiboBeBlocked(card.mblog)) {
return null;
}
const baseInfo = {
user: {
id: card.mblog.user.id,
name: card.mblog.user.screen_name,
avatar: card.mblog.user.avatar_hd,
description: card.mblog?.user.description
},
text: card.mblog.text,
rawText: card.mblog.raw_text,
attitudesCount: card.mblog.attitudes_count,
commentsCount: card.mblog.comments_count,
retweetCount: card.mblog.reposts_count,
createdAt: card.mblog.created_at,
weiboId: card.mblog.id,
region: card.mblog.region_name,
pics: card.mblog.pics ?? []
};
if (card.mblog?.retweeted_status && !isWeiboBeBlocked(card.mblog?.retweeted_status) && card.mblog?.retweeted_status.user != null) {
if (card.mblog.retweeted_status.user === null) {
return null;
}
return {
...baseInfo,
action: 'retweet',
retweetedWeibo: {
action: 'tweet',
user: {
id: card.mblog.retweeted_status.user.id,
name: card.mblog.retweeted_status.user.screen_name,
avatar: card.mblog.retweeted_status.user.avatar_hd,
description: card.mblog.retweeted_status.user.description
},
pics: card.mblog.retweeted_status.pics ?? [],
text: card.mblog.retweeted_status.text,
rawText: card.mblog.retweeted_status.raw_text,
commentsCount: card.mblog.retweeted_status.comments_count,
retweetCount: card.mblog.retweeted_status.reposts_count,
attitudesCount: card.mblog.retweeted_status.attitudes_count,
createdAt: card.mblog.retweeted_status.created_at,
weiboId: card.mblog.retweeted_status.id,
region: card.mblog.retweeted_status.region_name
}
};
}
if (card.mblog?.retweeted_status && isWeiboBeBlocked(card.mblog.retweeted_status)) {
return {
...baseInfo,
action: 'retweet',
retweetedWeibo: {
...baseInfo,
action: 'tweet',
text: '该微博已被屏蔽',
rawText: '该微博已被屏蔽',
commentsCount: 0,
retweetCount: 0,
attitudesCount: 0,
createdAt: card.mblog.retweeted_status.created_at,
weiboId: card.mblog.retweeted_status.id,
pics: card.mblog.retweeted_status.pics ?? []
}
};
}
return {
...baseInfo,
action: 'tweet'
};
} catch (error) {
throw new Error(`解析第 ${index + 1} 个微博信息时出错:${error} \n 微博text:${card.mblog?.text}`);
}
}).filter(Boolean);
};
/**
* 判断微博文本是否是全文
* @param text 微博文本
* @returns 如果是全文返回 true,否则返回 false
*/
export const isFetchedWeiboTextWereFullText = text => {
const fullTextPattern = /<a href="\/status\/\d+">全文<\/a>/;
return !fullTextPattern.test(text);
};