Привет,
PyGithub является частью https://github.com/Borkason/google-code-issues-migrator , который сам по себе является форком заброшенного проекта, и недавно я получаю случайные исключения 401 Bad Credentials с этим скриптом. Это исключение не отображалось в прошлом, поэтому я думаю, что это может быть связано с тем, как PyGithub обрабатывает учетные данные. Может быть, Github что-то изменил за последние 1 или 2 месяца?
Я пока не смог найти закономерности в появлении исключений. Я думаю, это случайно.
Это то, что я делаю
Я аутентифицирую один раз в __main__
: https://github.com/Borkason/google-code-issues-migrator/blob/master/migrateissues.py#L493.
Затем я начинаю переносить все проблемы. Скрипт выявляет все проблемы, выполняет некоторые действия с API кода Google, а затем создает новые проблемы в github, включая комментарии. В основном при создании задачи я получаю исключения. Всегда в случайном месте (иногда после добавления 2 задач, иногда после добавления 100 задач ...
_ Я надеюсь, что вы можете чем-нибудь помочь. _
Это исключение
Traceback (most recent call last):
File "migrateissues.py", line 529, in <module>
process_gcode_issues(existing_issues)
File "migrateissues.py", line 332, in process_gcode_issues
add_comments_to_issue(github_issue, gid)
File "migrateissues.py", line 236, in add_comments_to_issue
existing_comments = [ comment.body for comment in github_issue.get_comments() ]
File "/usr/local/lib/python2.7/dist-packages/PyGithub-1.12.2-py2.7.egg/github/PaginatedList.py", line 35, in __iter__
newElements = self.__grow()
File "/usr/local/lib/python2.7/dist-packages/PyGithub-1.12.2-py2.7.egg/github/PaginatedList.py", line 47, in __grow
newElements = self._fetchNextPage()
File "/usr/local/lib/python2.7/dist-packages/PyGithub-1.12.2-py2.7.egg/github/PaginatedList.py", line 104, in _fetchNextPage
headers, data = self.__requester.requestJsonAndCheck("GET", self.__nextUrl, self.__nextParams, None)
File "/usr/local/lib/python2.7/dist-packages/PyGithub-1.12.2-py2.7.egg/github/Requester.py", line 84, in requestJsonAndCheck
return self.__check(*self.requestJson(verb, url, parameters, input))
File "/usr/local/lib/python2.7/dist-packages/PyGithub-1.12.2-py2.7.egg/github/Requester.py", line 92, in __check
raise GithubException.GithubException(status, output)
github.GithubException.GithubException: 401 {u'message': u'Bad credentials'}
Привет!
Я также столкнулся с этой проблемой в последние несколько дней. Это должно быть ошибка на стороне GIthub, она не связана с PyGithub. Его можно воспроизвести с помощью следующего сценария оболочки (вызовите его с вашим логином и паролем в качестве аргументов):
#!/bin/sh
USER=$1
PASSWORD=$2
CONTINUE=1
while [ $CONTINUE == "1" ]
do
OUTPUT=$(curl --include https://$USER:[email protected]/user 2>&1)
if echo "$OUTPUT" | grep "200 OK" >/dev/null
then
echo OK
else
date
echo "$OUTPUT"
CONTINUE=0
fi
done
Он выводит определенное количество «OK» и заканчивается сообщением об ошибке, приводящем к исключению, выданному PyGithub:
[...]
OK
OK
OK
OK
Thu Mar 21 20:35:50 RST 2013
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 35 100 35 0 0 57 0 --:--:-- --:--:-- --:--:-- 70HTTP/1.1 401 Unauthorized
Server: GitHub.com
Date: Thu, 21 Mar 2013 19:35:53 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Status: 401 Unauthorized
X-GitHub-Media-Type: github.beta
Content-Length: 35
{
"message": "Bad credentials"
}
Возможно, вы захотите сообщить об ошибке напрямую в Github.
Вчера проблем не было, сегодня опять полностью глючит.
Я сделал быстрый и грязный взлом, чтобы обойти проблему Github в PaginatedList.py
def _fetchNextPage(self):
myWorkaround = True
while myWorkaround:
try:
headers, data = self.__requester.requestJsonAndCheck("GET", self.__nextUrl, self.__nextParams, None)
myWorkaround = False
except:
pass
[…]
Сегодня у меня также возникла проблема с простым скриптом, выполняющим только несколько (без разбивки на страницы) запросов к API. Для меня это абсолютно не критично, поэтому я не буду тратить время на то, чтобы лично связываться с GitHub.
Проблема более общая, чем разбивка на страницы, поэтому, если вам действительно нужен обходной путь, вы можете предпочесть сделать это в Requester.py :
Заменить строку 143
status, responseHeaders, output = self.__requestRaw(verb, url, requestHeaders, encoded_input)
чем-то вроде
status = 401
retries = 5
while retries > 0 and status == 401:
status, responseHeaders, output = self.__requestRaw(verb, url, requestHeaders, encoded_input)
retries -= 1
(Вообще не тестировал)
Спасибо за предоставленный фрагмент: +1:
Я связался с Github, но, похоже, они не смогли воспроизвести эту проблему. Но так как у меня есть обходной путь, я тоже не буду тратить больше времени :)
Ваше здоровье.