Private Repository의 Permanent URL에 접근할 경우
목차
개요
티스토리 업로드 자동화를 테스트하는 과정에서 Github API를 다뤘다. Public Repository의 특정 file의 content를 읽어들이려면 공개된 URL로 접근하면 가능했기에 간단했지만 Private Repository는 조금 다른 접근법을 취해야했다.
이 글에는 Private Repository의 특정 file content를 읽어들이기 위해 했던 방법을 기록하려한다.
Github Token 준비하기
Private Repository는 Github Token을 통해서만 접근이 가능하다. Github Token의 생성은 "Settings -> Developer Settings -> Personal access tokens -> Fine-graind tokens"에서 Github 토큰을 생성해주자.
"Generate new token"을 통해 Github Token을 생성할 수 있다. 생성 과정에는 Repository에 접근할 수 있는 3가지 옵션을 선택할 수 있다. 입맛에 맞게 선택하면된다. 내 경우엔 "All Repositories"를 체크했다.
그러나 중요한 것은 Permissions 체크 부분이다. Repository의 특정 파일을 읽어야 하기 때문에 "Contents" 항목의 권한 "Read and Write"로 변경해주자.
만약 이를 체크해주지 않는 경우 403 혹은 404 Status Code가 반환될 수 있다. 아래는 이 설정을 해주지 않아 Exception 메세지이다.
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: <https://api.github.com/repos/jak010/article/commits/cf85f9fec0945a4735eeb35fe1b3dfd88dfd0d8a>
GIthub API를 통해 Private Repository에 접근하려면 Request Header를 다음과 같이 설정해주어야한다.
1. Private Repository에 대한 file content를 읽기 - Github API
Public Repository는 URL을 쉽게 유추할 수 있고 또한 인증이 필요로 하지 않기에 직접 접근하면 file content를 읽어들일 수 있는 반면 Private Repository는 다른 방식을 취했다.
Private이다보니 앞서 준비한 Github Token을 이용해 Authorization Header를 설정하고 file content를 읽을 수 있는 Github API를 사용해야한다. Private Repository의 file content을 읽어들이는 Github API는 다음과 같다.
https://api.github.com/repos/:user/:repo/contents/:dir/:file
예를 들어 github user가 jak010이고 repo가 article이며 file content가 repo url에 “blog/1_experience/티스토리 업로드 자동화.md”와 같이 있는 경우
https://api.github.com/repos/jak010/article/contents/blog/1_experience/티스토리 업로드 자동화.md
2. Private Reposirory에 대한 file content 읽기 - Authorization Header
앞서 준비한 Github Token은 Request Header에 다음과 같이 사용한다.
headers={"Authorization": f"token {token}"}
3. Private Repository에 대한 file content 읽기 - base64 decode
인증 헤더를 포함해 요청하면 “content”라는 key에 file content가 base64 encode되어서 들어있기때문에 base64로 decode하면 된다.
import base64
file_content = r.json()["content"]
decoded_file_content = base64.b64decode(file_content).decode("utf-8")
4. Private Repository에 대한 file content 읽기 - 전체 코드
전체 코드 에시는 다음과 같다.
import base64
import requests
token = ""
url = "https://api.github.com/repos/jak010/article/contents/blog/1_experience/티스토리> 업로드 자동화.md"
r = requests.get(
url,
headers={"Authorization": f"token {token}"}
)
if r.status_code != 200:
r.raise_for_status()
content = r.json()["content"]
decoded_content = base64.b64decode(content).decode("utf-8")
Reference
Private Repository에 대해 Gtihub API 호출 시 404가 뜨는 경우