通过 API 抓取 linear.app 的任务生成周报

背景

某个项目用了 linear.app 来做任务分配和跟踪,为了写周报,想利用 API 来自动获取任务信息。

准备工作

获取 API 密钥

在 linear.app 里,点击自己的头像->Settings,点击左边导航栏的 API,在右边页面的 Personal API keys 下面 Create key 一下,然后记住。

安装 SDK

linear.app 的官方的 SDK 是 TypeScript 写的,但实际上 JavaScript 也是兼容的吧。官方给的安装 SDK 的命令就是下面这个:

1
2
npm install @linear/sdk
# 安装 SDK

GraphQL 介绍

linear.app 的公开的 API 都是用 GraphQL 搭建的,官方也建议用 GraphQL 来获取数据

实现代码

前方高能预警:调包侠再次上线!

核心实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { LinearClient } from '@linear/sdk'

// 用你的linear.app API密钥替换这里的YOUR_API_KEY
const apiKey = 'lin_api_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const linearClient = new LinearClient({ apiKey });
const graphQLClient = linearClient.client;

// 定义一个GraphQL查询来获取上一周完成的工作列表
const queryLastWeekWork = `
query GetLastWeekWork($startDate: DateTime, $endDate: DateTime) {
viewer {
assignedIssues(filter: {
state: { type: { eq: "completed" } }
completedAt: {
gte: $startDate
lte: $endDate
}
}) {
nodes {
id
title
completedAt
url
creator { id }
assignee { id }
}
}
}
}
`;

// 定义一个函数来获取上周的日期范围
function getLastWeekDates() {
const today = new Date();
const lastWeekStart = new Date(today);
lastWeekStart.setDate(today.getDate() - 7);
const lastWeekEnd = new Date(today);
lastWeekEnd.setDate(today.getDate());
return { startDate: lastWeekStart.toISOString(), endDate: lastWeekEnd.toISOString() };
}

// 执行查询并生成工作周报
async function generateWeeklyReport() {
try {
const { startDate, endDate } = getLastWeekDates(); // 调用函数获取上周日期范围
const response = await graphQLClient.rawRequest(queryLastWeekWork);
const tasks = response.data.viewer.assignedIssues.nodes;
console.log('工作周报:\n');
tasks.forEach((task) => {
console.log(`- [${task.title}](${task.url}) 完成于 ${task.completedAt}`);
});
} catch (error) {
console.error('生成工作周报时出错:', error);
} finally {
}
}

把以上代码存为文件:linear.js,再用 Node.Js 来跑一下:

1
node linear.js

周报出炉!