在这里例子中,我们将会从 hacker news 中获取前 10 个故事,并保存到 NEWS 表格中。
我们需要一个表格存储 hacker news 的数据,这个表格需要具备以下字段:
我们通过 Bindings 来绑定 NEWS 表格。
这样我们可以直接使用 eidos.currentSpace.NEWS.rows.query() 来获取数据。
eidos.currentSpace.NEWS.rows.query()
我们通过 eidos.currentSpace.notify() 来发送通知。 消息会在右下角弹出。方便用户知晓当前脚本的状态。
eidos.currentSpace.notify()
// 定义输入输出的类型interface HNItem { id: number; title: string; url: string; score: number; by: string; time: number;} export const commands = [ { name: "default", description: "Fetch HackerNews Top 10 and save to NEWS table", outputJSONSchema: { type: "object", properties: { success: { type: "boolean" }, message: { type: "string" }, savedItems: { type: "array", items: { type: "object", properties: { id: { type: "number" }, title: { type: "string" }, }, }, }, }, }, },]; async function fetchHNItem(id: number): Promise<HNItem> { const response = await fetch( `https://hacker-news.firebaseio.com/v0/item/${id}.json` ); return response.json();} async function fetchTopStories(): Promise<number[]> { const response = await fetch( "https://hacker-news.firebaseio.com/v0/topstories.json" ); return response.json();} export default async function (input: Input, context: Context) { try { // 获取前10个故事的ID const topStoryIds = await fetchTopStories(); const top10Ids = topStoryIds.slice(0, 10); // 获取每个故事的详细信息 const stories = await Promise.all(top10Ids.map((id) => fetchHNItem(id))); // 保存到NEWS表 const savedItems: any[] = []; for (const story of stories) { const existing = await eidos.currentSpace.NEWS.rows.query({ id: story.id, }); if (existing.length === 0) { // 如果不存在,则创建新记录 await eidos.currentSpace.NEWS.rows.create({ id: story.id, title: story.title, url: story.url || "", score: story.score, by: story.by, time: story.time, }); savedItems.push({ id: story.id, title: story.title, }); } } // 发送通知 eidos.currentSpace.notify({ title: "HackerNews Top 10 Updated", description: `Successfully saved ${savedItems.length} new stories`, }); return { success: true, message: `Successfully saved ${savedItems.length} new stories`, savedItems, }; } catch (error) { eidos.currentSpace.notify({ title: "Error", description: `Failed to fetch and save HackerNews stories: ${error.message}`, }); return { success: false, message: `Error: ${error.message}`, savedItems: [], }; }}