Hola,
PyGithub es parte de https://github.com/Borkason/google-code-issues-migrator , que es una bifurcación en sí misma de un proyecto abandonado, y recientemente recibí excepciones aleatorias 401 Bad Credentials con ese script. Esta excepción no apareció en el pasado, por eso creo que podría tener que ver con la forma en que PyGithub maneja las Credenciales. ¿Quizás Github cambió algo en los últimos 1 o 2 meses?
Todavía no pude encontrar ningún patrón en la apariencia de las excepciones. Creo que es aleatorio.
Esto es lo que hago
Me autentico una vez en __main__
: https://github.com/Borkason/google-code-issues-migrator/blob/master/migrateissues.py#L493.
Luego comienzo a migrar todos los problemas. El script recupera todos los problemas, hace algunas cosas con la API de código de Google y luego crea nuevos problemas en github, incluidos los comentarios. Sobre todo durante la creación del problema, recibo las excepciones. Siempre en un punto aleatorio (a veces después de agregar 2 problemas, a veces después de agregar 100 problemas ...
_Espero que puedas ayudar de alguna manera._
Esta es la excepcion
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'}
¡Hola!
También he experimentado este problema en los últimos días. Debe ser un error del lado de GIthub, no está relacionado con PyGithub. Se puede reproducir con el siguiente script de shell (llámelo con su nombre de usuario y contraseña 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
Produce un cierto número de "OK" y termina con el mensaje de error que conduce a la excepción lanzada 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"
}
Es posible que desee enviar un error a Github directamente.
Ayer no tuve ningún problema, hoy vuelve a estar lleno de errores.
Hice un truco rápido y sucio para solucionar el problema de Github en 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
[…]
Hoy también experimenté el problema en un script simple que realiza solo unas pocas solicitudes (no paginadas) a la API. No es absolutamente crítico para mí, por lo que no me tomaré el tiempo para contactar a GitHub yo mismo.
El problema es más general que la paginación, por lo que si realmente necesita una solución alternativa, es posible que prefiera hacerlo en Requester.py :
Reemplace la línea 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
(No he probado nada)
Gracias por proporcionar ese fragmento: +1:
Me puse en contacto con Github, pero no parecía que pudieran replicar ese problema. Pero como obtuve una solución alternativa, tampoco invertiré más tiempo :)
Salud.