Pygithub: рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ 401 рдЦрд░рд╛рдм рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдЕрдкрд╡рд╛рдж

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдорд╛рд░реНрдЪ 2013  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: PyGithub/PyGithub

рдирдорд╕реНрддреЗ,

PyGithub https://github.com/Borkason/google-code-issues-migrator рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЫреЛрдбрд╝реА рд╣реБрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рдХрд╛рдВрдЯрд╛ рд╣реИ, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ 401 рдЦрд░рд╛рдм рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗред рдпрд╣ рдЕрдкрд╡рд╛рдж рдЕрддреАрдд рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ PyGithub рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдЧрд┐рддреБрдм рдиреЗ рдкрд┐рдЫрд▓реЗ 1 рдпрд╛ 2 рдорд╣реАрдиреЛрдВ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛ рд╣реИ?

рдореИрдВ рдЕрднреА рддрдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рдЦреЛрдЬ рд╕рдХрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИред

рдореИрдВ рдпрд╣ рдХрд░рддрд╛ рд╣реВрдВ
рдореИрдВ __main__ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ: https://github.com/Borkason/google-code-issues-migrator/blob/master/migrateissues.py#L493ред
рдлрд┐рд░ рдореИрдВ рд╕рднреА рдореБрджреНрджреЛрдВ рдкрд░ рдкрд▓рд╛рдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рд▓реЗрддреА рд╣реИ, 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'}

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣реИрд▓реЛ!

рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрднрд╡ рднреА рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЬреАрдердм рдХреА рддрд░рдл рдПрдХ рдмрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдкрд╛рдЗрдЧрдереБрдм рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдирд┐рдореНрди рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ):

#!/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
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"
}

рдЖрдк рд╕реАрдзреЗ рдЬреАрдердм рдХреЛ рдмрдЧ рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХрд▓ рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рдЖрдЬ рдпрд╣ рдлрд┐рд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдореИрдВрдиреЗ PaginatedList.py рдореЗрдВ Github рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╣реИрдХ рдХрд┐рдпрд╛

def _fetchNextPage(self):
        myWorkaround = True
        while myWorkaround:
                try:
                        headers, data = self.__requester.requestJsonAndCheck("GET", self.__nextUrl, self.__nextParams, None)
                        myWorkaround = False
                except:
                        pass

        [тАж]

рдЖрдЬ рдореИрдВрдиреЗ рднреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреБрдЫ (рдиреЙрди-рдкреЗрдЬреЗрдЯреЗрдб) рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЦреБрдж 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:
рдореИрдВрдиреЗ рдЧрд┐рддреБрдм рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдереЗред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореБрдЭреЗ рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдорд┐рд▓рд╛ рд╣реИ, рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╕рдордп рдХрд╛ рдирд┐рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ :)

рдЪрд┐рдпрд░реНрд╕ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

xpdable picture xpdable  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jacquev6 picture jacquev6  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sfdye picture sfdye  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hsluoyz picture hsluoyz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nixoz2k7 picture nixoz2k7  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ