我正在使用github3.py
访问我组织的Github帐户,并且我们启用了双因素身份验证。我首先列出存储库。代码如下:
import os
import github3
USER = os.environ['GITHUB_USERNAME']
PASS = os.environ['GITHUB_PASSWORD']
try:
# Python 2
prompt = raw_input
except NameError:
# Python 3
prompt = input
def get_second_factor():
print("Authenticator called")
code = ''
while not code:
# The user could accidentally press Enter before being ready
code = prompt('Enter 2FA code: ')
print("Received code:", code)
return code
gh = github3.login(USER, PASS, two_factor_callback=get_second_factor)
org = gh.organization("<ORGNAME>")
for repo in org.iter_repos(type="all"):
print(repo.ssh_url)
不幸的是,似乎不仅对github3.login
的调用会触发对第二个因素的请求,而且对org.iter_repos
的调用还会触发第二个请求。
这是预期行为吗?如何确保程序仅在第一次需要时才尝试 2FA?
因此,简短的回答是,为了避免需要输入第二因素代码,您可以通过访问网站上的设置来创建"个人访问令牌"。当你有它时,你可以把它作为token
参数传递给github3.login
。
长答案是,调用login
不会调用这个,而是调用organization
和iter_repos
触发两个 2FA 请求。事实上,如果您有超过 100 个存储库,之后每 100 个存储库就会要求您提供它。原因是每次向 API 发出请求时,GitHub API 都会提示您输入第二因素令牌。这意味着每次 github3.py 向 API 发出请求时,我们都会收到一个特定的响应,这是一个挑战。发生这种情况时,我们会使用您输入的令牌重复请求。因此,为了避免多次输入,需要使用个人访问令牌。