Pygithub: github.GithubException.RateLimitExceededException

تم إنشاؤها على ٧ مايو ٢٠١٩  ·  15تعليقات  ·  مصدر: PyGithub/PyGithub

أحاول جلب عدد المشكلات المفتوحة باستخدام الكود التالي في تطبيق Flask الخاص بي.

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() عدد المشكلات المفتوحة بالإضافة إلى طلبات السحب.

stale

التعليق الأكثر فائدة

إذا فهمت بشكل صحيح ، فإن نوع إرجاع 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()
هل قمت بالمصادقة في هذه الخطوة؟ واجهة برمجة التطبيقات العامة لديها حدود معدل أقل.

نعم ، لقد قمت بمصادقة هذه الخطوة.

@ 242jainabhi
الأشياء التي أفعلها عادةً عند الوصول إلى الحد الأقصى للسعر هي إيقاف البرنامج لبعض الوقت.

بدلاً من استخدام قائمة الفهم ، يمكنني استخدام حلقة شائعة مع try-catch. بمجرد اكتشاف استثناء لحد السعر ، اتصل بوظيفة السكون للانتظار لفترة من الوقت وتحقق من حد السعر باستخدام 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

@ wangpeibe90 لا يعمل.

لسبب ما ، لا يمكن التنبؤ بهذا السلوك بشكل كبير وهو أمر مثير للجنون.
يمكن لبرنامجي أن يدور بشكل فعال ويستدعي بشكل استباقي واجهة api الخاصة بالراتب للتحقق مما إذا كان يلتزم بالحدود لمدة ساعة إلى ساعتين قبل إعطاء 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 للطلبات الزائدة.

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.

MustafaHosny اللهم امين

إنه يعمل بالنسبة لي ، لكن 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 التقييمات