Oi,
PyGithub é uma parte de https://github.com/Borkason/google-code-issues-migrator , que é uma bifurcação por si só de um projeto abandonado e, recentemente, recebo 401 exceções de credenciais ruins aleatórias com esse script. Essa exceção não apareceu no passado, por isso acho que pode ter a ver com a forma como o PyGithub lida com as credenciais. Talvez o Github tenha mudado algo nos últimos 1 ou 2 meses?
Não consegui encontrar nenhum padrão na aparência das exceções, ainda. Eu acho que é aleatório.
Isto é o que eu faço
Eu me autentico uma vez em __main__
: https://github.com/Borkason/google-code-issues-migrator/blob/master/migrateissues.py#L493.
Então começo a migrar todos os problemas. O script busca todos os problemas, faz algumas coisas com a API de código do google e, em seguida, cria novos problemas no github, incluindo comentários. Principalmente durante a criação do problema, recebo as exceções. Sempre em um ponto aleatório (às vezes após adicionar 2 questões, às vezes após adicionar 100 questões ...
_Espero que você possa ajudar de alguma forma._
Esta é a exceção
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'}
Olá!
Eu também tive esse problema nos últimos dias. Deve ser um bug do GIthub, não está relacionado ao PyGithub. Ele pode ser reproduzido com o seguinte script de shell (chame-o com seu login e senha como argumentos):
#!/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
Ele produz um certo número de "OK" e termina com a mensagem de erro que leva à exceção lançada por 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"
}
Você pode querer enviar um bug diretamente para o Github.
Ontem não tive problemas, hoje está totalmente grampeado de novo.
Eu fiz um hack rápido e sujo para contornar o problema do Github em 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
[…]
Hoje também experimentei o problema em um script simples fazendo apenas algumas solicitações (não paginadas) para a API. Isso não é absolutamente crítico para mim, então não perderei tempo para entrar em contato com o GitHub por conta própria.
O problema é mais geral do que a paginação, portanto, se você realmente precisa de uma solução alternativa, pode preferir fazê-lo em Requester.py :
Substituir linha 143
status, responseHeaders, output = self.__requestRaw(verb, url, requestHeaders, encoded_input)
por algo como
status = 401
retries = 5
while retries > 0 and status == 401:
status, responseHeaders, output = self.__requestRaw(verb, url, requestHeaders, encoded_input)
retries -= 1
(Eu não testei nada)
Obrigado por fornecer esse snippet: +1:
Entrei em contato com o Github, mas eles não parecem ser capazes de replicar esse problema. Mas, uma vez que tenho uma solução alternativa, também não vou investir mais tempo :)
Saúde.