2016-07-14 3 views
2

Ich schäle Daten von Github über PyGithub ab. Mein Problem ist, ich diesen Fehler während meiner Schaben erhalten:Github APi 403 wird empfangen, wenn ich mein Ratenlimit nicht überschritten habe

github.GithubException.GithubException: 403 { 'documentation_url': 'https://developer.github.com/v3/#rate-limiting', 'Nachricht': 'API Limit für XXXXX überschritten'}

Upon Krümmen des api I erhalten:

curl -i https://api.github.com/users/XXXXXX 
HTTP/1.1 200 OK 
Server: GitHub.com 
Date: Thu, 14 Jul 2016 15:03:51 GMT 
Content-Type: application/json; charset=utf-8 
Content-Length: 1301 
Status: 200 OK 
X-RateLimit-Limit: 60 
X-RateLimit-Remaining: 52 
X-RateLimit-Reset: 1468509718 
Cache-Control: public, max-age=60, s-maxage=60 
Vary: Accept 
Last-Modified: Wed, 08 Jun 2016 13:29:08 GMT 

Note die Ratelimit Labels:

X-RateLimit-Limit: 60 
X-RateLimit-Remaining: 52 
X-RateLimit-Reset: 1468509718 

Wenn ich meine Python-Programm laufen wieder werde ich eine andere API-Rate lim erhalten es hat die Nachricht überschritten. Ich habe die API-Dokumentation für GitHub gelesen und soweit ich weiß, habe ich noch 52 Anfragen übrig. Wenn ich mehr Informationen zur Verfügung stellen kann, lassen Sie es mich wissen. Vielen Dank.

Edit: Um zu klären, verwende ich Anmeldeinformationen zum Anmelden in Github.

ORGANIZATION = "ORG" 
PERSONAL_ACCESS_TOKEN = "TOKEN" 
g = Github(PERSONAL_ACCESS_TOKEN, per_page = 100) 
github_organization = g.get_organization(ORGANIZATION) 

Antwort

0

Also war das Problem nicht mit meinem Ratenlimit, sondern mit der Nachricht, die der PyGithub-Wrapper zurückgab. Ich verfolgte meine Fehler zurück und fand diese Klasse im Quellcode: https://github.com/PyGithub/PyGithub/blob/master/github/Requester.py

Auf in die __createException Funktion Peaking ich dies bemerkt:

def __createException(self, status, headers, output): 
    if status == 401 and output.get("message") == "Bad credentials": 
     cls = GithubException.BadCredentialsException 
    elif status == 401 and 'x-github-otp' in headers and re.match(r'.*required.*', headers['x-github-otp']): 
     cls = GithubException.TwoFactorException # pragma no cover (Should be covered) 
    elif status == 403 and output.get("message").startswith("Missing or invalid User Agent string"): 
     cls = GithubException.BadUserAgentException 
    elif status == 403 and output.get("message").startswith("API Rate Limit Exceeded"): 
     cls = GithubException.RateLimitExceededException 
    elif status == 404 and output.get("message") == "Not Found": 
     cls = GithubException.UnknownObjectException 
    else: 
     cls = GithubException.GithubException 
    return cls(status, output) 

bei der Botschaft der Ausnahme der Suche ich erhielt ich davon ausgegangen, es war die RateLimitExceededException.

Wenn ich jedoch auf die eigentliche Ausnahme selbst schaue, bemerkte ich, dass es sich um die GithubException.GithubException handelte, die eine pauschale Ausnahme zu sein scheint, wenn keine der anderen Ausnahmen ausgelöst wird.

Dies beantwortet meine Fragen, weil es nicht ein API-Rate überschritten Problem war, weil ich noch mehr Anfragen übrig hatte, als ich diese Ausnahme erhielt.

Es ist leider eine nicht spezifische Ausnahme. Dies beantwortet meine erste Frage vorerst.

Update: Ich habe auch die API ohne ein Token Curling, so dass es mir nicht die richtigen Informationen weitergeleitet wurde. Mit dem Token zeigt sich, dass ich alle meine Anfragen aufgebraucht habe.

0

ich dieses Problem mit meiner früheren Arbeit gelöst hatte ... hier ist es ..

Der 403 HTTP-Status eine verbotene Anforderung bezeichnet, so haben Sie zur Verfügung gestellt Anmeldeinformationen, die nicht zulassen, können Sie einige zugreifen Endpunkte.

So müssen Sie eine gültige Anmeldeinformationen angeben (Benutzername/Passwort), wenn das Objekt Github zu schaffen:

#!/usr/bin/env python3 
from github import Github 

ACCESS_USERNAME = 'username' 
ACCESS_PWD = "password" 
client = Github(ACCESS_USERNAME, ACCESS_PWD, per_page=100) 
user = client.get_user('ELLIOTTCABLE') 
repo_list = [repo.name for repo in user.get_repos() if not repo.fork] 
print(repo_list) 

for j in repo_list: 
    repo = user.get_repo(j) 
    lang = repo.language 
    print(j,':',lang) 

hoffen, dass Sie es nützlich finden.

+0

Hey Farhan. Danke für die Antwort, ich weiß es zu schätzen. Ich stelle jedoch Anmeldeinformationen zur Verfügung - sehen Sie sich meine Bearbeitung an. Ich denke, deine verbotene Bitte ist etwas, über das ich nicht nachgedacht habe. Meine einzige Sorge damit ist, sollte es nicht innerhalb der Nachricht angeben, welche Art von verbotenen Anfrage ich mache? In meinem 403 gibt es "Nachricht" an: "API-Ratenlimit für XXXXX überschritten." – ChillMurray

Verwandte Themen