UNPKG

@hkai-ai/weibo-api

Version:

香港人工智能协会封装的新浪微博API

127 lines (121 loc) 4.25 kB
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); };