Skip to content

Commit 1cc411e

Browse files
committed
multiple-tokens support implemented
1 parent f9b8156 commit 1cc411e

File tree

4 files changed

+88
-24
lines changed

4 files changed

+88
-24
lines changed

git_logger.py

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,55 @@ def login(token):
1818
return client
1919

2020

21-
def get_next_repo(client: Github, repositories):
21+
def get_tokens_from_file(tokens_path: str) -> list[str]:
22+
with open(tokens_path, 'r') as file:
23+
tokens = [token for token in file.read().split('\n') if token]
24+
25+
return tokens
26+
27+
28+
class GithubClients:
29+
def __init__(self, tokens: list[str]):
30+
self.clients = self._init_clients(tokens)
31+
self.cur_client = None
32+
33+
def _init_clients(self, tokens: list[str]) -> list[dict]:
34+
clients = [{"client": login(token), "token": token} for token in tokens]
35+
# нужно ли нам рейзить ошибку в случае 403, или просто временно пропускать эти токены?
36+
37+
return clients
38+
39+
def get_next_client(self) -> Github:
40+
client = None
41+
max_remaining_limit = -1
42+
43+
for client_tmp in self.clients:
44+
(remaining_limit, limit) = client_tmp["client"].rate_limiting
45+
46+
# можно добавить вывод износа токена
47+
# можно дополнительно проверять на 403 и временно пропускать эти токены,
48+
# либо завести константу "минимальный коэффициент износа" и не трогать "изношенные" токены
49+
50+
if remaining_limit > max_remaining_limit:
51+
client = client_tmp
52+
max_remaining_limit = remaining_limit
53+
54+
if client is None:
55+
raise Exception("No github-clients available")
56+
57+
self.cur_client = client
58+
print(client, max_remaining_limit)
59+
return client["client"]
60+
61+
62+
def get_next_repo(clients: GithubClients, repositories):
2263
with open(repositories, 'r') as file:
2364
list_repos = [x for x in file.read().split('\n') if x]
2465
print(list_repos)
2566
for repo_name in list_repos:
2667
try:
27-
repo = client.get_repo(repo_name)
68+
cur_client = clients.get_next_client()
69+
repo = cur_client.get_repo(repo_name)
2870
except GithubException as err:
2971
print(f'Github: Connect: error {err.data}')
3072
print(f'Github: Connect: failed to load repository "{repo_name}"')

issues_parser.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import requests
44
import json
55
from time import sleep
6-
from git_logger import get_assignee_story
6+
from git_logger import get_assignee_story, GithubClients
77
from github import Github, Repository, GithubException, PullRequest
88

99
EMPTY_FIELD = 'Empty field'
@@ -172,17 +172,27 @@ def log_repository_issues(repository: Repository, csv_name, token, start, finish
172172
sleep(TIMEDELTA)
173173

174174

175-
def log_issues(client: Github, working_repo, csv_name, token, start, finish, fork_flag):
175+
def log_issues(
176+
clients: GithubClients, working_repo, csv_name, start, finish, fork_flag
177+
):
176178
logger.log_to_csv(csv_name, FIELDNAMES)
177179

178180
for repo in working_repo:
179181
try:
180182
logger.log_title(repo.full_name)
181-
log_repository_issues(repo, csv_name, token, start, finish)
183+
log_repository_issues(
184+
repo, csv_name, clients.cur_client["token"], start, finish
185+
)
182186
if fork_flag:
183187
for forked_repo in repo.get_forks():
184188
logger.log_title("FORKED:", forked_repo.full_name)
185-
log_repository_issues(forked_repo, csv_name, token, start, finish)
189+
log_repository_issues(
190+
forked_repo,
191+
csv_name,
192+
clients.cur_client["token"],
193+
start,
194+
finish,
195+
)
186196
sleep(TIMEDELTA)
187197
sleep(TIMEDELTA)
188198
except Exception as e:

main.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ def parse_args():
3131
help="export table to google sheets",
3232
action="store_true",
3333
)
34-
parser.add_argument(
35-
'-t', '--token', type=str, required=True, help='token github account'
36-
)
34+
35+
token = parser.add_mutually_exclusive_group(required=True)
36+
token.add_argument('-t', '--token', type=str, help='token github account')
37+
token.add_argument('--tokens', type=str, help='path to your tokens')
38+
3739
parser.add_argument(
3840
'-l',
3941
'--list',
@@ -126,48 +128,52 @@ def parse_time(datetime_str):
126128

127129
def main():
128130
args = parse_args()
129-
token = args.token
131+
132+
if args.token:
133+
tokens = [args.token]
134+
else:
135+
tokens = git_logger.get_tokens_from_file(args.tokens)
136+
130137
repositories = args.list
131138
csv_name = args.out
132139
path_drepo = args.download_repos
133140
fork_flag = args.forks_include
134141
log_pr_comments = args.pr_comments
135142

136143
try:
137-
client = git_logger.login(token=token)
144+
clients = git_logger.GithubClients(tokens)
138145
except Exception as e:
139146
print(e)
140147
else:
141-
working_repos = git_logger.get_next_repo(client, repositories)
148+
working_repos = git_logger.get_next_repo(clients, repositories)
142149
start = parse_time(args.start.split('-'))
143150
finish = parse_time(args.finish.split('-'))
144151

145152
if args.commits:
146153
commits_parser.log_commits(
147-
client, working_repos, csv_name, start, finish, args.branch, fork_flag
154+
clients, working_repos, csv_name, start, finish, args.branch, fork_flag
148155
)
149156
if args.pull_requests:
150157
pull_requests_parser.log_pull_requests(
151-
client,
158+
clients,
152159
working_repos,
153160
csv_name,
154-
token,
155161
start,
156162
finish,
157163
fork_flag,
158164
log_pr_comments,
159165
)
160166
if args.issues:
161167
issues_parser.log_issues(
162-
client, working_repos, csv_name, token, start, finish, fork_flag
168+
clients, working_repos, csv_name, start, finish, fork_flag
163169
)
164170
if args.invites:
165-
invites_parser.log_invitations(client, working_repos, csv_name)
171+
invites_parser.log_invitations(clients, working_repos, csv_name)
166172
if args.wikis:
167-
wikipars.wikiparser(client, repositories, path_drepo, csv_name)
173+
wikipars.wikiparser(clients, repositories, path_drepo, csv_name)
168174
if args.contributors:
169175
contributors_parser.log_contributors(
170-
client, working_repos, csv_name, fork_flag
176+
clients, working_repos, csv_name, fork_flag
171177
)
172178
if args.export_google_sheets:
173179
export_sheets.write_data_to_table(

pull_requests_parser.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import requests
44
import json
55
from time import sleep
6-
from git_logger import get_assignee_story
6+
from git_logger import get_assignee_story, GithubClients
77
from github import Github, Repository, GithubException, PullRequest
88

99
EMPTY_FIELD = 'Empty field'
@@ -161,10 +161,9 @@ def log_repositories_pr(
161161

162162

163163
def log_pull_requests(
164-
client: Github,
164+
clients: GithubClients,
165165
working_repos,
166166
csv_name,
167-
token,
168167
start,
169168
finish,
170169
fork_flag,
@@ -175,12 +174,19 @@ def log_pull_requests(
175174
for repo in working_repos:
176175
try:
177176
logger.log_title(repo.full_name)
178-
log_repositories_pr(repo, csv_name, token, start, finish)
177+
log_repositories_pr(
178+
repo, csv_name, clients.cur_client["token"], start, finish
179+
)
179180
if fork_flag:
180181
for forked_repo in repo.get_forks():
181182
logger.log_title("FORKED:", forked_repo.full_name)
182183
log_repositories_pr(
183-
forked_repo, csv_name, token, start, finish, log_comments
184+
forked_repo,
185+
csv_name,
186+
clients.cur_client["token"],
187+
start,
188+
finish,
189+
log_comments,
184190
)
185191
sleep(TIMEDELTA)
186192
sleep(TIMEDELTA)

0 commit comments

Comments
 (0)