์๋ ํ์ธ์,
PyGithub๋ ๋ฒ๋ ค์ง ํ๋ก์ ํธ์ ํฌํฌ ์ธ https://github.com/Borkason/google-code-issues-migrator ์ ์ผ๋ถ์ด๋ฉฐ ์ต๊ทผ์๋ ํด๋น ์คํฌ๋ฆฝํธ์์ ์์์ 401 ์๋ชป๋ ์๊ฒฉ ์ฆ๋ช ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ์์ธ๋ ๊ณผ๊ฑฐ์ ๋ํ๋์ง ์์๊ธฐ ๋๋ฌธ์ PyGithub๊ฐ ์๊ฒฉ ์ฆ๋ช ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ์ด์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Github๊ฐ ์ง๋ 1 ~ 2 ๊ฐ์ ๋์ ๋ญ๊ฐ๋ฅผ ๋ณ๊ฒฝํ์๊น์?
์์ธ์ ๋ชจ์์์ ์์ง ํจํด์ ์ฐพ์ ์ ์์ต๋๋ค. ๋ฌด์์๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ์ ๊ฐํ๋ ๊ฒ์
๋๋ค
__main__
์์ ํ ๋ฒ ์ธ์ฆํฉ๋๋ค : https://github.com/Borkason/google-code-issues-migrator/blob/master/migrateissues.py#L493.
๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ ์์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์ค๊ณ Google ์ฝ๋ API๋ก ๋ช ๊ฐ์ง ์์
์ ์ํ ํ ๋ค์ ์ฃผ์์ ํฌํจํ์ฌ 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'}
์๋ ํ์ธ์!
์ง๋ ๋ฉฐ์น ๋์์ด ๋ฌธ์ ๋ ๊ฒฝํํ์ต๋๋ค. GIthub ์ธก์ ๋ฒ๊ทธ ์ผ ๊ฒ์ ๋๋ค. PyGithub์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ค์ ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌํ ํ ์ ์์ต๋๋ค (๋ก๊ทธ์ธ ๋ฐ ์ํธ๋ฅผ ์ธ์๋ก ์ฌ์ฉํ์ฌ ํธ์ถ).
#!/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"๋ฅผ ์ถ๋ ฅํ๊ณ 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"
}
Github์ ์ง์ ๋ฒ๊ทธ๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค.
์ด์ ๋ ๋ฌธ์ ๊ฐ ์์๊ณ ์ค๋๋ ์์ ํ ๋์ฒญ๋์์ต๋๋ค.
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
[โฆ]
์ค๋ ๋๋ ๋ํ API์ ๋ช ๊ฐ์ง (ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง์ง ์์) ์์ฒญ ๋ง ์ํํ๋ ๊ฐ๋จํ ์คํฌ๋ฆฝํธ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. ๋์๊ฒ ์ ๋์ ์ผ๋ก ์ค์ํ์ง ์์ผ๋ฏ๋ก 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 :
Github์ ์ฐ๋ฝํ์ง๋ง ํด๋น ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ๋ ์ด์ ์๊ฐ์ ํฌ์ํ์ง ์์ ๊ฒ์
๋๋ค. :)
๊ฑด๋ฐฐ.