Pygithub: Exceções de 401 credenciais incorretas recentemente aleatórias

Criado em 21 mar. 2013  ·  4Comentários  ·  Fonte: PyGithub/PyGithub

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

Todos 4 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jacquev6 picture jacquev6  ·  3Comentários

BBI-YggyKing picture BBI-YggyKing  ·  5Comentários

diegotejadav picture diegotejadav  ·  5Comentários

mlainez picture mlainez  ·  7Comentários

rpocase picture rpocase  ·  5Comentários