Pygithub: github.GithubException.RateLimitExceededException

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдордИ 2019  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: PyGithub/PyGithub

рдореИрдВ рдЕрдкрдиреЗ рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

g = Github()

repo = g.get_repo(repo_name)

open_pulls = repo.get_pulls(state='open')
open_pull_titles = [pull.title for pull in open_pulls]

open_issues = repo.get_issues(state='open')
open_issues = [issue for issue in open_issues if issue.title not in open_pull_titles]

рдФрд░ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ github.GithubException.RateLimitExceededException: ред

repo.get_issues() рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ get_issues рдФрд░ get_pulls рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ PaginatedList рд╣реИред рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП yield element рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЕрдиреБрд░реЛрдз open_issues = [issue for issue in open_issues if issue.title not in open_pull_titles] рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреА рдЯреЛрдХрди рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдпрд╣ RateLimitExceedException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ get_issues рдФрд░ get_pulls рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ PaginatedList рд╣реИред рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП yield element рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЕрдиреБрд░реЛрдз open_issues = [issue for issue in open_issues if issue.title not in open_pull_titles] рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреА рдЯреЛрдХрди рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдпрд╣ RateLimitExceedException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

рдХреНрдпрд╛ рдХреЛрдИ рдЙрдкрд╛рдп рд╣реИ?

g = Github()
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛? рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреА рджрд░ рд╕реАрдорд╛ рдХрдо рд╣реИред

g = Github()
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛? рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреА рджрд░ рд╕реАрдорд╛ рдХрдо рд╣реИред

рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЙрд╕ рдЪрд░рдг рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред

@242рдЬрдпрдирд╛рднрд┐
рджрд░ рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЬреЛ рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХрдирд╛ рд╣реИред

рд╕реВрдЪреА рд╕рдордЭ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдПрдХ рдмрд╛рд░ рджрд░ рд╕реАрдорд╛ рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрд▓реАрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ GitHub API рдХреЗ рд╕рд╛рде рджрд░ рд╕реАрдорд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдХреЛрдб рддрднреА рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ рдЬрдм рджрд░ рд╕реАрдорд╛ 5000 рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИред

рдХреЛрдб рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЫреВрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЦреЗрдж рд╣реИред рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдб рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореИрдВ рд╕рднреА рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП created_at рддрд╛рд░реАрдЦ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред

for issue in open_issues:
    created_at = issue.created_at.timestamp()

рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА (рдорд╛рди рд▓реЗрдВ 2000)ред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

repositories = g.search_repositories(
    query='stars:>=10 fork:true language:python')

рджрд░ рд╕реАрдорд╛ рдХреЛ рднреА рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рджрд░ рд╕реАрдорд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рд░реБрдХ рд╕рдХреВрдВ?

рдЕрдм рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореБрджреНрджрд╛ рд╣реИред
рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

iter_obj=iter(open_issues) ## PaginatedList is a generator
 while True:
    try:   
        issue=next(iter_obj) 
        ## do something
    except StopIteration:
        break  # loop end
    except github.GithubException.RateLimitExceededException:
        sleep(3600) # sleep 1 hour
        ## check token limits
        continue

@ wangpeipei90 рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред

рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрддреНрдпрдзрд┐рдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
рдореЗрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЪрдХреНрд░ рдФрд░ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рд░реВрдк рд╕реЗ рд░реЗрдЯрд▓рд┐рдорд┐рдЯ рдПрдкреАрдЖрдИ рдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ 403 рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕реЗ рджреЛ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред

рдХреБрдЫ рджреЗрд╢реА рджрд░ рд╕реАрдорд╛ рдХрд╛ рдкрд╛рд▓рди рдпрд╣рд╛рдВ рдЧрд░реНрдордЬреЛрд╢реА рд╕реЗ рд╕реНрд╡рд╛рдЧрдд рд╣реЛрдЧрд╛ред рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдиреАрдВрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрдм рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЛ рдШрдВрдЯреЗ рдХреЗ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдмреАрдиреНрд╕ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

 File "word.py", line 126, in get_stargazers_inner
    for i in repo.get_stargazers_with_dates():
  File "/usr/local/lib/python3.6/dist-packages/github/PaginatedList.py", line 62, in __iter__
    newElements = self._grow()
  File "/usr/local/lib/python3.6/dist-packages/github/PaginatedList.py", line 74, in _grow
    newElements = self._fetchNextPage()
  File "/usr/local/lib/python3.6/dist-packages/github/PaginatedList.py", line 199, in _fetchNextPage
    headers=self.__headers
  File "/usr/local/lib/python3.6/dist-packages/github/Requester.py", line 276, in requestJsonAndCheck
    return self.__check(*self.requestJson(verb, url, parameters, headers, input, self.__customConnection(url)))
  File "/usr/local/lib/python3.6/dist-packages/github/Requester.py", line 287, in __check
    raise self.__createException(status, responseHeaders, output)
github.GithubException.RateLimitExceededException: 403 {'message': 'API rate limit exceeded for user ID xxxx.', 'documentation_url': 'https://developer.github.com/v3/#rate-limiting'}

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХреЛрдИ рдмреИрдХрдСрдлрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЖрдЗрдЯрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╣рд┐рд╕рд╛рдм рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред

рдЦреИрд░, рдореИрдВрдиреЗ https://github.com/settings/tokens рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ "рдкреБрди: рдЙрддреНрдкрдиреНрди рдЯреЛрдХрди" рдХрд┐рдпрд╛ред рдЗрд╕рдиреЗ рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рд▓реБрдврд╝рдХ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдм рддрдХред

рдореИрдВрдиреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА "рдЯреЛрдХрди" рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг:

    github = Github("19exxxxxxxxxxxxxxxxxxxxxe3ab065edae6470")

рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП #1233 рднреА рджреЗрдЦреЗрдВред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@wangpeipei90

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди RateLimitExceededException рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ GithubException рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИред

from github import RateLimitExceededException

issues = g.search_issues(query=keyword, **{'repo': repo, 'type': 'pr'})
            iter_obj = iter(issues)
            while True:
                try:
                    pr = next(iter_obj)
                    with open(pr_file, 'a+') as f:
                        f.write(pr.html_url + '\n')
                    count += 1
                    logger.info(count)
                except StopIteration:
                    break  # loop end
                except RateLimitExceededException:
                    search_rate_limit = g.get_rate_limit().search
                    logger.info('search remaining: {}'.format(search_rate_limit.remaining))
                    reset_timestamp = calendar.timegm(search_rate_limit.reset.timetuple())
                    # add 10 seconds to be sure the rate limit has been reset
                    sleep_time = reset_timestamp - calendar.timegm(time.gmtime()) + 10
                    time.sleep(sleep_time)
                    continue

рдпрд╣рд╛рдБ рд▓реЙрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:

2020/01/08 23:42:09 PM - INFO - search remaining: 0

рдзрдиреНрдпрд╡рд╛рдж, @Xiaoven рдореИрдВ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

PeterJCLaw picture PeterJCLaw  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rthill91 picture rthill91  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

surajjacob picture surajjacob  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nixoz2k7 picture nixoz2k7  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nchammas picture nchammas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ