| |
| import { saveTopicData } from './db.js'; |
|
|
| |
| export function extractTopicIdFromUrl(url) { |
| const match = url.match(/\/t\/topic\/(\d+)/); |
| return match ? parseInt(match[1]) : null; |
| } |
|
|
| |
| export async function fetchTopicJson(page, topicId) { |
| try { |
| const jsonUrl = `https://linux.do/t/${topicId}.json`; |
| console.log(`正在获取话题JSON数据: ${jsonUrl}`); |
| |
| |
| const jsonPage = await page.browser().newPage(); |
| await jsonPage.goto(jsonUrl, { |
| waitUntil: "domcontentloaded", |
| timeout: 15000, |
| }); |
| |
| |
| await new Promise((r) => setTimeout(r, 1000)); |
| |
| |
| const jsonText = await jsonPage.evaluate(() => { |
| |
| const pre = document.querySelector('pre'); |
| if (pre) { |
| return pre.textContent; |
| } |
| |
| return document.body.textContent; |
| }); |
| |
| await jsonPage.close(); |
| |
| if (!jsonText) { |
| console.warn(`无法获取话题 ${topicId} 的JSON数据`); |
| return null; |
| } |
| |
| |
| const topicData = JSON.parse(jsonText); |
| console.log(`✅ 成功获取话题 ${topicId} 的JSON数据: ${topicData.title}`); |
| |
| return topicData; |
| } catch (error) { |
| console.error(`获取话题 ${topicId} JSON数据失败:`, error.message); |
| return null; |
| } |
| } |
|
|
| |
| export async function processAndSaveTopicData(page, url) { |
| try { |
| const topicId = extractTopicIdFromUrl(url); |
| if (!topicId) { |
| console.warn(`无法从URL提取话题ID: ${url}`); |
| return; |
| } |
| |
| |
| const topicData = await fetchTopicJson(page, topicId); |
| if (!topicData) { |
| return; |
| } |
| |
| |
| await saveTopicData(topicData); |
| console.log(`✅ 话题 ${topicId} 数据处理完成`); |
| |
| } catch (error) { |
| console.error(`处理话题数据失败:`, error.message); |
| } |
| } |
|
|