跳转到内容

与 Eidos 桌面版 API 交互

Eidos 通过其桌面端应用提供了强大的基于 RPC 的 API。配合 Bun 使用 @eidos.space/client,你可以利用其内置的 TypeScript 支持和卓越的性能,快速实现数据采集自动化。

本指南将演示如何使用 Bun 从 Hacker News 获取热门文章并将其导入 Eidos 表格中。示例包含文章内容,以支持语义化搜索功能。

  1. Eidos 桌面版: 确保 Eidos 桌面端应用正在运行。
  2. Bun: 确保你的机器上安装了 Bun

初始化一个新项目并安装 Eidos RPC 客户端:

Terminal window
# 初始化 Bun 项目
mkdir hn-ingestor && cd hn-ingestor
bun init -y
# 安装 Eidos RPC 客户端
bun add @eidos.space/client

创建一个名为 index.ts 的文件并添加以下内容。该脚本将:

  1. 使用 createEidosClient 连接到你的 Eidos 桌面版实例。
  2. 检查并创建 “Hacker News” 表格。
  3. 获取 Hacker News 热门文章,包括文章内容。
  4. 更新/插入 (Upsert) 数据:如果文章(通过 HN ID 识别)已存在,则更新其分数;否则创建新记录。
import { createEidosClient } from "@eidos.space/client"
// 你可以在 Eidos 桌面端应用的仪表盘或 URL 中找到 Space ID
const SPACE_ID = "your_space_id"
const EIDOS_PORT = 13127 // Eidos 桌面版默认 RPC 端口
// 1. 初始化 Eidos 客户端
const client = createEidosClient({
endpoint: `http://${SPACE_ID}.eidos.localhost:${EIDOS_PORT}/rpc`,
})
const space = client.space
const TABLE_NAME = "Hacker News"
// 2. 检查并创建表格
const tables = await space.schema.listTables()
let table = tables.find((t) => t.name === TABLE_NAME)
if (!table) {
console.log(`正在创建表格 "${TABLE_NAME}"...`)
table = await space.schema.createTable({
name: TABLE_NAME,
fields: [
{ name: "Content", columnName: "content", type: "text" },
{ name: "HN ID", columnName: "hn_id", type: "number" },
{ name: "URL", columnName: "url", type: "url" },
{ name: "HN 链接", columnName: "hn_link", type: "url" },
{ name: "Author", columnName: "author", type: "text" },
{ name: "Score", columnName: "score", type: "number" },
{
name: "Type",
columnName: "type",
type: "select",
property: {
options: [
{ id: "self", name: "self", color: "blue" },
{ id: "link", name: "link", color: "green" },
],
},
},
],
})
}
const hnTable = space.table(table.id)
// 3. 获取 Hacker News 数据
console.log("正在获取热门文章...")
const topIds = (await fetch(
"https://hacker-news.firebaseio.com/v0/topstories.json"
).then((res) => res.json())) as string[]
// 处理前 10 篇
for (const id of topIds.slice(0, 10)) {
const item = (await fetch(
`https://hacker-news.firebaseio.com/v0/item/${id}.json`
).then((res) => res.json())) as {
type: string
title: string
url: string
text?: string
by: string
score: number
}
if (item?.type === "story") {
// 提取内容:自托管文章(Ask HN, Show HN)有 'text' 字段
// 对于外部链接,内容将为空
const content = item.text ? item.text.replace(/<[^>]+>/g, "") : ""
const postType = item.text ? "self" : "link"
const data = {
content: content,
url: item.url,
hn_link: `https://news.ycombinator.com/item?id=${id}`,
author: item.by,
score: item.score,
type: postType,
}
// 4. 导入/更新数据到 Eidos
// 使用自定义 hn_id 字段检查记录是否存在
const existing = await hnTable.findFirst({
where: { hn_id: id },
})
if (existing) {
console.log(`正在更新: ${item.title}`)
await hnTable.update({
where: { _id: existing._id },
data,
})
} else {
console.log(`正在创建: ${item.title}`)
await hnTable.create({
data: {
hn_id: id,
...data,
},
})
}
}
}
console.log("导入完成!")

直接使用 Bun 运行该文件:

Terminal window
bun index.ts