Pygithub: github.GithubException.RateLimitExceededException

Dibuat pada 7 Mei 2019  ·  15Komentar  ·  Sumber: PyGithub/PyGithub

Saya mencoba mengambil jumlah masalah terbuka menggunakan kode berikut di aplikasi Flask saya.

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]

dan saya mendapatkan kesalahan github.GithubException.RateLimitExceededException: .

repo.get_issues() mengembalikan jumlah masalah terbuka ditambah permintaan tarik.

stale

Komentar yang paling membantu

Jika saya mengerti dengan benar, jenis pengembalian get_issues dan get_pulls adalah PaginatedList. Ini menggunakan yield element untuk iterasi. Jadi permintaan tidak dilakukan sampai open_issues = [issue for issue in open_issues if issue.title not in open_pull_titles] . Jika batas token Anda tercapai, itu akan membuang RateLimitExceedException.

Semua 15 komentar

Jika saya mengerti dengan benar, jenis pengembalian get_issues dan get_pulls adalah PaginatedList. Ini menggunakan yield element untuk iterasi. Jadi permintaan tidak dilakukan sampai open_issues = [issue for issue in open_issues if issue.title not in open_pull_titles] . Jika batas token Anda tercapai, itu akan membuang RateLimitExceedException.

Apakah ada solusi?

g = Github()
Apakah Anda mengautentikasi pada langkah ini? api publik memiliki batas kecepatan yang lebih rendah.

g = Github()
Apakah Anda mengautentikasi pada langkah ini? api publik memiliki batas kecepatan yang lebih rendah.

Ya, saya memang mengautentikasi langkah itu.

@242jainabhi
Hal-hal yang biasanya saya lakukan ketika mencapai batas tarif hanya menunda program untuk beberapa waktu.

Alih-alih menggunakan pemahaman daftar, saya mungkin hanya menggunakan loop umum dengan try-catch. Setelah pengecualian batas kecepatan ditangkap, panggil fungsi tidur untuk menunggu beberapa saat dan periksa kembali batas kecepatan dengan GitHub API. Kode hanya diproses jika batas tarif kembali ke 5000.

Saya minta maaf karena melewatkan bagian dari kode. Di bawah ini adalah kode lanjutan dari kode di komentar pertama.
Saya mengakses tanggal created_at untuk semua masalah yang terbuka. Ini lagi akan mengakses API untuk semua masalah dan karenanya akhirnya membuat panggilan lebih dari batas.

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

Saya tidak dapat menemukan solusi untuk masalah ini. Bahkan jika saya mengautentikasi permintaan, batasnya akan habis jika masalahnya terlalu banyak (katakanlah 2000).

Sesuatu seperti ini:

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

Juga memicu batas tarif. Saya berasumsi, itu melakukan pagination secara otomatis dan itu memicu batas tarif? Apakah ada cara bagi saya untuk melakukannya secara manual sehingga saya dapat menjeda?

Saya sekarang menyadari bahwa ini adalah masalah nyata.
Salah satu solusi yang mungkin adalah cuplikan kode seperti di bawah ini. Saya belum mencobanya, beri tahu saya apakah itu berhasil atau tidak.

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 Tidak berfungsi.

Untuk beberapa alasan perilaku ini sangat tidak terduga dan menjengkelkan.
Program saya dapat secara efektif menggilir dan secara preemptif memanggil api ratelimit untuk memeriksa apakah itu mematuhi dalam batas selama satu hingga dua jam sebelum secara acak memberikan 403.

Beberapa kepatuhan batas tarif asli akan disambut hangat di sini. Harus menerapkan sleep berdasarkan intuisi ketika aplikasi Anda memutuskan untuk mengungkapkan rahasia setelah dua jam berjalan dengan lancar seharusnya bukan perilaku yang diharapkan.

 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'}

Selain itu, seseorang dapat menggunakan pustaka backoff -- namun tidak dapat menjelaskan posisi saat ini dalam iterasi item dan oleh karena itu akan mulai dari awal lagi.

Yah, saya mengunjungi https://github.com/settings/tokens dan melakukan "Buat ulang token". Itu membuat saya berguling lagi, tapi saya tidak yakin untuk berapa lama.

Saya menggunakan metode otentikasi "token". Contoh:

    github = Github("19exxxxxxxxxxxxxxxxxxxxxe3ab065edae6470")

Lihat juga #1233 untuk permintaan yang berlebihan.

Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.

@wangpeipei90

Ini berfungsi untuk saya, tetapi RateLimitExceededException tidak di bawah GithubException dalam versi yang saya gunakan. Ini kode saya.

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

Berikut adalah bagian dari log:

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

Terima kasih, @Xiaoven Saya akhirnya bisa menyelesaikan ini dengan kode Anda.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat