如何使用GitHub API在GitHub中搜索代码?

30

我正在尝试使用GitHub API V3仅通过关键字搜索一些代码,不限制用户、组织或存储库。

例如,如果我想搜索包含关键字“addClass”的所有代码片段,则结果将是https://github.com/search?q=addClass&type=Code&ref=searchresults(不使用 GitHub API)。

但是,如何通过GitHub API完成同样的事情?我尝试了https://api.github.com/search/code?q=addClass,但它显示“必须至少包括一个用户、组织或存储库”。我该如何解决这个问题?

3个回答

28

如果您进行身份验证,则可以在不指定用户/机构/存储库的情况下进行代码搜索。

首先,在GitHub网站上的个人资料中为此生成个人访问令牌:设置->开发人员设置->个人访问令牌->生成新令牌(您可以将所有访问选项都保持未选中状态,因为您只是用于进行Web请求)

现在,如果您将令牌附加到原始的GET请求中,则该请求将起作用并返回结果:

https://api.github.com/search/code?q=addClass&access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

更新:2021年10月

正如下面的评论所指出的那样,通过查询参数传递令牌(如上所示)已被弃用。现在,您必须将其添加为授权标头。

例如:

curl --location --request GET 'https://api.github.com/search/code?q=addClass +in:file +language:csharp' \
--header 'Authorization: Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

或者在Python中:

import requests

url = "https://api.github.com/search/code?q=addClass +in:file +language:csharp"

headers = {
  'Authorization': 'Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}

response = requests.request("GET", url, headers=headers)

print(response.text)

1
哦,我在上面评论之后才看到了你的解决方案。现在我认为你的应该是被接受的答案。点赞。干杯。 - xpt
是的,和上面的评论一样。我只看到了被选中的答案并关闭了标签页。几周后才看到了这个答案。这应该是被接受的答案。 - Arshad
1
{ "message": "Must specify access token via Authorization header. https://developer.github.com/changes/2020-02-10-deprecating-auth-through-query-param", "documentation_url": "https://docs.github.com/v3/#oauth2-token-sent-in-a-header" } - Luk Aron
@LukAron 的确如此 - 我已经更新了答案,谢谢。 - Mark Z.

16

2020年: 如Mark Z.在他的回答中详细说明的那样,使用身份验证(Authorization': 'Token xxxx')可以进行代码搜索

get /search/code

你可以使用以下方式:

ghs code --extension js "import _ from 'lodash'"
  • 或者使用官方的GitHub CLI gh (在执行gh auth login之后),如问题5117中所示:

  • gh api --method=GET "search/code?q=filename:test+extension:yaml+org:new-org"
    

    甚至更多:

    gh api --method=GET search/code -f q='filename:test extension:yaml org:new-org' \
           --jq '.items[] | [.repository.full_name,.path,.sha] | @tsv'
    

    这将会得到一个以行为基础、以制表符分隔的字段列表,按照以下顺序: 仓库名称、文件路径、git sha。(请参见gh help formatting)

    2014年(原始回答):这似乎与新的限制有关,“Beta Code Search API 新验证规则”(2013年10月)

    为了支持预期的请求量,我们正在将一个新的验证规则应用于Code Search API。从今天开始,您需要将代码查询范围限定在特定的用户、组织或存储库中。

    所以,API搜索代码的示例现在是这样的:

    假设您想要查找 jQuery 中的 addClass 函数定义。您的查询看起来会像这样:

    https://api.github.com/search/code?q=addClass+in:file+language:js+repo:jquery/jquery


    所以已经有一个被接受的答案证明你是错的,只要经过身份验证,你可以在不限定范围的情况下进行搜索。 - Luk Aron

    12

    虽然 Github 目前不支持无需存储库、用户或组织的代码搜索(请参见 VonC 的回答),但 codesearch 通过 codesearch API 索引了一些来自 Github 的源代码,尽管其 API 功能不如 Github 完善。

    例如,要搜索从 Github 索引的 wget 调用,请调用

    curl "https://searchcode.com/api/codesearch_I/?q=wget&src=2"
    

    可选的src参数用于选择要搜索的代码源(例如Github,BitBucket),通过在codesearch UI的分面搜索参数中更改其参数,您可以找到其整数值。当前Github的src值为2。

    您可以通过查看结果项的repo属性来验证上述示例返回的结果来自github.com。


    这应该是正确答案,因为被接受的答案并不正确,因为问题提出者显然需要使用仅关键字进行搜索,而不受用户、组织或存储库的限制。 - xpt
    @xpt - 不,OP问的是他如何通过Github API做同样的事情 - 而答案恰当地解释了这一点,说明它是不可能的,但是这里有你可以用它做的事情...此外,这个答案指向一个由一个人维护的非官方项目。它的结果与Github相比相形见绌。例如,如果你搜索"import tensorflow",你会在searchcode上得到24个命中,但在Github上却有3M+个。 - Mark Z.
    当我强调“仅限关键字”时,我的意思是不受用户、组织或存储库的限制,即被接受的答案仅表示这是不可能的。至于“以下是您可以做的”部分,搜索再次受存储库的限制。因此,它实际上无法为OP提供解决方案。尽管这是一个由一个人维护的非官方项目,但至少可以满足OP想要的东西。这就是我说这应该是被接受的答案的意思。完全公开,我与该项目或该人没有任何关联。我只是从这里知道了那个网站。 - xpt

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接