2022-03-17 01:16:26 +08:00
|
|
|
|
import webbrowser
|
|
|
|
|
import requests
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
def githubOauth(GitHubClientID, GitHubClientSecret, githubProxies, timeout):
|
|
|
|
|
print("################################ GitHub 授权 ################################")
|
2022-03-17 13:35:58 +08:00
|
|
|
|
input("按回车开始进行GitHub账号授权,注意如果账号Organization中的仓库也需要同步,那么您点击Authorize绿色按钮前需要点击Organization access部分对应组织的Grant按钮:")
|
2022-03-17 01:16:26 +08:00
|
|
|
|
|
|
|
|
|
# ######################################## 获取GitHub用户的 access_token ########################################
|
|
|
|
|
# Api文档:
|
|
|
|
|
# https://docs.github.com/cn/developers/apps/building-oauth-apps/authorizing-oauth-apps
|
|
|
|
|
# https://docs.github.com/cn/developers/apps/building-oauth-apps/scopes-for-oauth-apps
|
|
|
|
|
# 认证地址
|
2022-03-17 13:35:58 +08:00
|
|
|
|
oauth_url = 'https://github.com/login/oauth/authorize?client_id={ClientID}&redirect_uri={redirect_uri}&response_type=code&scope=user repo' \
|
2022-03-17 01:16:26 +08:00
|
|
|
|
.format(ClientID=GitHubClientID, redirect_uri='https://www.only4.work/appHelper/github_show_code_param.php')
|
|
|
|
|
|
|
|
|
|
# 打开浏览器让用户授权
|
|
|
|
|
webbrowser.open(oauth_url)
|
|
|
|
|
|
|
|
|
|
# 让用户手动输入授权码
|
|
|
|
|
print("请在新打开的页面进行授权,授权完成后,请将授权码拷贝到此处,然后按回车继续")
|
|
|
|
|
code = input("您的授权码:")
|
|
|
|
|
|
|
|
|
|
r = None # 定义变量
|
|
|
|
|
|
|
|
|
|
tryTime = 10
|
|
|
|
|
while(tryTime > 0):
|
|
|
|
|
tryTime = tryTime - 1
|
|
|
|
|
try:
|
|
|
|
|
r = requests.post('https://github.com/login/oauth/access_token', headers = {
|
|
|
|
|
'Accept': 'application/json'
|
|
|
|
|
}, params = {
|
|
|
|
|
"code": code,
|
|
|
|
|
"client_id": GitHubClientID,
|
|
|
|
|
"redirect_uri": "https://www.only4.work/appHelper/github_show_code_param.php",
|
|
|
|
|
"client_secret": GitHubClientSecret,
|
|
|
|
|
}, proxies = githubProxies, timeout = timeout)
|
|
|
|
|
break
|
|
|
|
|
except Exception as err:
|
|
|
|
|
print(err)
|
|
|
|
|
print("出错啦,正在重试,还剩{}次机会".format(tryTime))
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
print("[info] GitHub账号授权完成")
|
|
|
|
|
|
|
|
|
|
# print(r.text)
|
|
|
|
|
access_token = r.json()['access_token']
|
|
|
|
|
print("您的access_token为:" + access_token)
|
|
|
|
|
# {"access_token":"ghu_NgIJEFtrQz4FtTqfewVaHlR9Xnb30R26oMwM","expires_in":28800,"refresh_token":"ghr_mu8iw6A33ae1AoIo3hMFVX7VssbPmGIlfSKyc2CTQIPootRSMnr48c3WVevQpYfwLL9MaQ0vWvTR","refresh_token_expires_in":15897600,"token_type":"bearer","scope":""}
|
|
|
|
|
|
|
|
|
|
# ######################################## 获得用户仓库信息 ########################################
|
|
|
|
|
tryTime = 10
|
|
|
|
|
while(tryTime > 0):
|
|
|
|
|
tryTime = tryTime - 1
|
|
|
|
|
try:
|
|
|
|
|
# Api文档: https://docs.github.com/cn/rest/reference/repos#list-repositories-for-the-authenticated-user
|
|
|
|
|
r = requests.get('https://api.github.com/user/repos', headers = {
|
|
|
|
|
'Accept': 'application/vnd.github.v3+json',
|
|
|
|
|
"Authorization": "token " + access_token,
|
|
|
|
|
# 👆 https://developer.github.com/changes/2020-02-10-deprecating-auth-through-query-param/
|
|
|
|
|
}, params = {
|
|
|
|
|
"access_token": access_token,
|
|
|
|
|
"visibility": "all",
|
|
|
|
|
"sort": "full_name",
|
|
|
|
|
"page": 1,
|
|
|
|
|
"per_page": 100,
|
|
|
|
|
}, proxies = githubProxies, timeout = timeout)
|
|
|
|
|
break
|
|
|
|
|
except Exception as err:
|
|
|
|
|
print(err)
|
|
|
|
|
print("出错啦,正在重试,还剩{}次机会".format(tryTime))
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
# print(r.text)
|
|
|
|
|
print()
|
|
|
|
|
print("################################ 成功获取到您的仓库信息 ################################")
|
|
|
|
|
githubRepos = {}
|
|
|
|
|
for repo in r.json():
|
|
|
|
|
print(repo['full_name'])
|
|
|
|
|
print(repo['html_url'])
|
|
|
|
|
# githubRepos.append()
|
|
|
|
|
githubRepos[repo['full_name']] = {
|
|
|
|
|
# 'human_name': repo['human_name'],
|
|
|
|
|
'html_url': repo['html_url'],
|
|
|
|
|
'ssh_url': repo['ssh_url'],
|
|
|
|
|
'full_name': repo['full_name'],
|
|
|
|
|
# 'path': repo['path'], # 仓库的路径 如 /only4/appHelper 的 appHelper
|
|
|
|
|
'name': repo['name'], # 仓库名称 如 仓库同步助手
|
|
|
|
|
# 'public': repo['public'], # 是否公开
|
|
|
|
|
'private': repo['private'], # 是否私有
|
|
|
|
|
# 'internal': repo['internal'], # 是否内部仓库
|
|
|
|
|
# 'empty_repo': repo['empty_repo'], # 是否为空仓库
|
|
|
|
|
'pushed_at': repo['pushed_at'], # 最后提交时间
|
|
|
|
|
}
|
|
|
|
|
print()
|
|
|
|
|
print("[info] GitHub仓库读取完成")
|
|
|
|
|
return [r.json(), githubRepos]
|