如何在python中使用github api标记进行请求

sof*_*var 16 api github-api oauth-2.0 python-2.7 python-requests

我可以使用用户名和密码在python中获取Github api令牌,但我无法使用该API令牌来请求任何POST/DELETE/PATCH.

我们如何使用Github API-Tokens进行任何请求.例如,我有API-Token可以说'hbnajkjanjknjknh23b2jk2kj2jnkl2 ......'

现在请求

#i'm providing username and API-Token in headers like    
self.header = {'X-Github-Username': self.username,
               'X-Github-API-Token': self.api_token                  
              }
#then requesting(post) to create a gist
r = requests.post(url, headers=headers)
Run Code Online (Sandbox Code Playgroud)

但我一直都想与401 errorBad Crediantials消息.

在不输入密码的情况下使用API​​令牌的正确方法是什么

Ian*_*sco 20

首先,我建议使用API​​的包装器.你在这里问了很多问题,可以通过找到你喜欢的API的包装器来简化.还有用Python编写的包装清单在这里.

至于你实际回答你的问题,GitHub文档相当清楚你需要发送Authorization标题.你的电话实际上是这样的:

self.headers = {'Authorization': 'token %s' % self.api_token}
r = requests.post(url, headers=self.headers)
Run Code Online (Sandbox Code Playgroud)

既然你似乎在使用请求和课程,我可能会大胆地提出建议吗?假设您正在为API创建客户端.你可能有这样一个类:

class GitHub(object):
    def __init__(self, **config_options):
        self.__dict__.update(**config_options)
        self.session = requests.Session()
        if hasattr(self, 'api_token'):
           self.session.headers['Authorization'] = 'token %s' % self.api_token
        elif hasattr(self, 'username') and hasattr(self, 'password'):
           self.session.auth = (self.username, self.password)

    def call_to_the_api(self, *args):
        # do stuff with args
        return self.session.post(url)
Run Code Online (Sandbox Code Playgroud)

Session对象将为您处理身份验证(通过令牌或用户名和密码组合).

此外,如果你最终决定使用github3.py来满足你的API包装需求,那么这里有一个标签.


小智 11

这是一些可以帮助您的代码。

例子:

示例1(身份验证):

username = 'user'
token = 'token'

login = requests.get('https://api.github.com/search/repositories?q=github+api', auth=(username,token))
Run Code Online (Sandbox Code Playgroud)

示例2(标题):

headers = {'Authorization': 'token ' + token}

login = requests.get('https://api.github.com/user', headers=headers)
print(login.json())
Run Code Online (Sandbox Code Playgroud)

示例3(删除回购):

user = 'username'
repo = 'some_repo' # Delete this repo

headers = {'Authorization': 'token ' + token}

login = requests.delete('https://api.github.com/' + 'repos/' + user + '/' + repo, headers=headers)
Run Code Online (Sandbox Code Playgroud)

示例4(创建存储库):

repo = 'some_repo'
description = 'Created with api'

payload = {'name': repo, 'description': description, 'auto_init': 'true'}

login = requests.post('https://api.github.com/' + 'user/repos', auth=(user,token), data=json.dumps(payload))
Run Code Online (Sandbox Code Playgroud)

您可能想看一下以下文档:

索取文件

Github API文档

我希望这有帮助。


小智 5

我遵循 API 文档并尝试将Authorization调用中的标头设置为requests.get(). 然而,这总是返回 401 错误。Response因此,我检查了对象属性中的标头request,发现Authorization我的请求中的标头已被重写。在深入研究源代码后,我发现当请求调用 HTTP Basic Auth 时,标Authorization头会被重写(请参阅此处)。

因此,解决方案是在调用时在身份验证元组中传递令牌requests.get()。例如:

requests.get('https://api.github.com/notifications', auth=(my_username, my_token))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个答案(目前得票最高的答案)不起作用,因为该答案中的方法正是我在尝试上述解决方案之前使用的方法。