专门用于解析 V2EX 帖子内容的 npm 包,支持提取发帖人信息、ID、标题和回复内容。
- 支持解析 V2EX 用户信息页面和帖子页面
- 自动识别页面类型(用户信息页面或帖子页面)
- 支持多页帖子抓取
- 批量用户信息解析
- 提取 Solana 地址信息
- 支持解析帖子打赏(patronage)信息
- 保持原始换行格式
- 支持 ES Module 和 CommonJS
npm install v2ex-api-parserimport V2exParser from "v2ex-api-parser";
const parser = new V2exParser();
const userInfo = await parser.parseUserInfo("username");
const postInfo = await parser.parsePost("123456");const V2exParser = require("v2ex-api-parser");
const parser = new V2exParser();
const userInfo = await parser.parseUserInfo("username");
const postInfo = await parser.parsePost("123456");const userInfo = await parser.parseUserInfo("username");
console.log(userInfo);
// 输出: {
// type: 'user_info',
// username: 'username',
// userId: 'username',
// memberId: '12345',
// avatar: 'https://...',
// signature: '个人签名',
// joinTime: '2023-01-01',
// activeRank: '123',
// isPro: false,
// socialLinks: {...},
// solanaAddress: '...',
// recentReplies: [...]
// }const postInfo = await parser.parsePost("123456");
console.log(postInfo);
// 输出: {
// type: 'post',
// postId: '123456',
// title: '帖子标题',
// author: {...},
// content: '帖子内容',
// patronage: {
// users: [{username, id, profileUrl, avatar}, ...],
// count: 39,
// summaryText: 'ElevenQAQ、rawburuser 等 39 位会员一共打赏了 800 $V2EX',
// totals: {
// totalPatrons: 39,
// totalAmount: 800
// }
// },
// replies: [...],
// statistics: {...}
// }const postInfo = await parser.parsePost("123456", { useMultiPage: true });
console.log(`总页数: ${postInfo.statistics.totalPages}`);
console.log(`总回复数: ${postInfo.statistics.replyCount}`);const usernames = ["user1", "user2", "user3"];
const results = await parser.parseMultipleUsers(usernames, {
timeout: 15000,
delay: 1000,
retryCount: 2,
showProgress: true,
});const usernames = ["user1", "user2", "user3"];
const results = await parser.parseMultipleUsers(usernames, {
timeout: 15000,
delay: 1000,
retryCount: 2,
showProgress: true,
onProgress: (progressInfo) => {
const { currentIndex, totalUsers, username, status, message, userInfo } =
progressInfo;
switch (status) {
case "start": // 开始解析用户
case "success": // 解析成功
case "retry": // 重试中
case "error": // 最终失败
case "complete": // 全部完成
console.log(`[${currentIndex}/${totalUsers}] ${message}`);
break;
}
},
});进度回调参数说明:
currentIndex: 当前处理的用户索引(从 1 开始)totalUsers: 总用户数量username: 当前处理的用户名status: 状态(start/success/retry/error/complete)message: 状态描述信息
parser.setBaseUrl("https://global.v2ex.co");V2EX 新增的主题打赏功能,会在帖子页面显示打赏用户头像和汇总信息,解析器会自动提取这些信息:
const postInfo = await parser.parsePost("1159225");
// 打赏信息
console.log('打赏用户数量:', postInfo.patronage.count);
console.log('总打赏人数:', postInfo.patronage.totals.totalPatrons);
console.log('总打赏金额:', postInfo.patronage.totals.totalAmount);
console.log('汇总文案:', postInfo.patronage.summaryText);
// 前5位打赏用户信息
postInfo.patronage.users.slice(0, 5).forEach(user => {
console.log(`${user.username} - ${user.avatar}`);
});打赏信息数据结构:
users: 打赏用户列表,包含用户名、ID、头像和个人主页链接count: 头像列表中的用户数量summaryText: 原始汇总文案totals.totalPatrons: 从汇总文案中提取的总打赏人数totals.totalAmount: 从汇总文案中提取的总打赏金额
- CommonJS:
dist/index.js- 适用于 Node.js 环境 - ES Module:
dist/index.esm.js- 适用于现代打包工具和 ES 模块环境
# 安装依赖
npm install
# 构建
npm run build
# 开发模式构建(监听文件变化)
npm run build:dev
# 运行测试
npm run test:all
# 运行单独的打赏功能测试
npm run test:patronageMIT