通过 Github Graphql v4 API 列出所有用户

Posted

技术标签:

【中文标题】通过 Github Graphql v4 API 列出所有用户【英文标题】:List all users via Github Graphql v4 API 【发布时间】:2020-03-26 01:35:11 【问题描述】:

尝试查找文档或弄清楚如何通过 v4 graphql API 复制 GitHub 的 v3 API Get all users 端点。

查询特定用户的任何内容很容易,但如何检索列出所有用户的有效负载,类似于 v3 API 有效负载?

有人可以指出正确的文档,或者更好地提供一个返回用户列表的示例吗?

【问题讨论】:

【参考方案1】:

据我所知,在 v4 api 中没有等效于“获取所有用户”的功能,但是,您可以使用节点查询来接近它。

首先,您需要能够生成节点 ID 以进行迭代。查看 mojombo(数据库 ID 的第一个用户),您可以看到节点 ID 是如何派生的。

$ curl https://api.github.com/users/mojombo

  "login": "mojombo",
  "id": 1,
  "node_id": "MDQ6VXNlcjE=",
  ...

$ echo -n "MDQ6VXNlcjE=" | base64 -d
04:User1

它是字符串04:User,后跟用户id(数据库ID)。

知道了这一点,我们现在可以一次为 100 个用户生成节点查询。注意:并非所有数据库 ID 都是用户,有些是组织或已删除用户,因此您收到很多 NOT_FOUND 错误。

query($ids:[ID!]!) 
    nodes(ids:$ids) 
        ... on User 
            login
        
    


variables 
    "ids": ["MDQ6VXNlcjE=", "MDQ6VXNlcjI=", ...]

如果您不仅限于使用 v4 api,但仍想利用 v4 api 的改进性能,那么还有一个稍微不那么 hacky 的替代方案,即使用 v3 api 一次获取 100 个用户,然后使用返回的 node_id 字段使用上述技术对所有 100 个用户执行批量 v4 查询。使用这种方法可以大大减少NOT_FOUND 错误,因此可以更好地利用您的速率限制。

为了了解使用 v4 api 和这种技术可以获得的性能改进,我执行的任务从使用 v3 api 大约需要 474 天减少到使用这种方法不到 5 天。

【讨论】:

【参考方案2】:

搜索查询对此非常有效。您可以根据特定字段进行查询,它会返回一个用户列表。如果您正在寻找一个特定的用户,这通常很好。如果您正在寻找大量用户,则搜索 api 不是您想要的,因为它已针对根据输入查找一个值进行了优化。请参阅下面的示例:


  search(query: "location:toronto language:Go", type: USER, first: 10) 
    userCount
    edges 
      node 
        ... on User 
          login
          name
          location
          email
          company
        
      
    
  

【讨论】:

请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。见:How do I write a good answer?。谢谢

以上是关于通过 Github Graphql v4 API 列出所有用户的主要内容,如果未能解决你的问题,请参考以下文章