Ошибка получения Github APi 403, когда я не превысил свой предел скорости
Я собираю данные с Github через PyGithub. Моя проблема заключается в том, что я получаю эту ошибку во время очистки:
github.GithubException.GithubException: 403 {'document_url': ' https://developer.github.com/v3/', 'message': 'Превышен предел скорости API для XXXXX.'}
После керлинга API я получаю:
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
обратите внимание на метки Ratelimit:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 52
X-RateLimit-Reset: 1468509718
Если я снова запустлю свою программу на Python, я получу еще одно сообщение об превышении предела скорости API. Я прочитал документацию по API для github и, насколько я могу судить, у меня осталось 52 запроса. Если я могу предоставить больше информации, чтобы сделать это лучше, дайте мне знать. Спасибо.
Изменить: чтобы уточнить, я использую учетные данные для входа в GitHub.
ORGANIZATION = "ORG"
PERSONAL_ACCESS_TOKEN = "TOKEN"
g = Github(PERSONAL_ACCESS_TOKEN, per_page = 100)
github_organization = g.get_organization(ORGANIZATION)
2 ответа
Таким образом, проблема была не с моим ограничением скорости, а с сообщением, которое возвращала оболочка PyGithub. Я отследил свою ошибку и нашел этот класс в исходном коде: https://github.com/PyGithub/PyGithub/blob/master/github/Requester.py
После пика в функцию __createException я заметил это:
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)
Глядя на сообщение об исключении, которое я получил, я предположил, что это исключение RateLimitExceededException.
Однако, глядя на само фактическое исключение, я заметил, что это исключение GithubException.GithubException, которое выглядит как общее исключение, если не сработало ни одно из других исключений.
Это отвечает на мои вопросы, потому что это не проблема превышения скорости API, потому что у меня все еще оставалось больше запросов, когда я получил это исключение.
К сожалению, это не конкретное исключение. Это отвечает на мой первоначальный вопрос на данный момент.
Обновление: я также свернул API без токена, чтобы он не передавал мне правильную информацию. С токеном видно, что я исчерпал все свои запросы.
Я решил эту проблему с моей предыдущей работой... вот она..
HTTP-статус 403 обозначает запрещенный запрос, поэтому вы предоставили учетные данные, которые не позволяют получить доступ к некоторым конечным точкам.
Поэтому вам может потребоваться предоставить действительные учетные данные (имя пользователя / пароль) при создании объекта Github:
#!/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)
Надеюсь, вы найдете это полезным.