Pygithub: Excepciones aleatorias de credenciales incorrectas 401 recientemente

Creado en 21 mar. 2013  ·  4Comentarios  ·  Fuente: PyGithub/PyGithub

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'}
question

Todos 4 comentarios

¡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.

¿Fue útil esta página
0 / 5 - 0 calificaciones