트위터로 trpg/게임용 봇을 만들어보자 [1] authentification

오터넛·2022년 5월 6일
1

※ 모든 글은 다음의 목차로 이루어져있습니다.
1. 코딩에 대한 기본적인 지식이 있는 분들/혹은 상세한 설명 없이 단지 코드를 사용하기 만하고 싶은 분들을 위한 간략한 요약문
2. 코딩에 대한 아무런 지식이 없는 초보자를 위한 입문글

💡 이 글에서 다루는 프로젝트 파일

src/auth 경로의 아래 두 파일

  • twitter.py
  • google_drive.py

1. 빠른 실행을 위한 간단한 설명

  1. 프로젝트를 다운 받습니다.
  2. project의 경로에서 terminal 을 열고 아래의 명령어를 입력합니다. (library 설치를 위한 명령어, 자세한 내용은 (https://spoqa.github.io/2019/08/09/brand-new-python-dependency-manager-poetry.html) 참고
mac/linux
> curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
> poetry install

window
> (Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -
> poetry install
  1. 트위터 developers, 구글 gcp 의 api 로부터 key와 secret 을 얻어온다.

참고 페이지:

  1. 아래의 코드에 받아온 key와 secret, google key file의 경로를 입력한다. (경로가 무엇인지 잘 모를 경우 auth 폴더에 넣은 후 src/auth+파일명을 적어넣을 것, 파일명은 [파일이름].json 양식을 지켜야함)

  2. 다음으로 넘어간다. 😎

2. 입문자를 위한 자세한 설명

Authentification? key? secret?

첫 번째 단계는 authentification 입니다. 한국어로는 '인증'입니다. 트위터로 봇을 만들거나 구글 스프레드 시트에 자동으로 데이터를 업데이트하기 위해서는 인증의 단계가 첫 번째로 필요합니다. 누구나 어느 제품이든 아무렇게나 사용할 수 있다고 한다면 보안의 측면에서 심각한 문제를 초래하게 되니까요.

그래서 트위터 등에 자신의 코드를 연결하여 봇으로 사용하고 싶다면 사용하고자하는 특정 (봇)계정에 대한 key와 secret이라는 열쇠가 필요합니다. 그리고 이 열쇠를 통해 내가 자격이 있다는 것을 증명하는 일련의 코드 과정을 authetification 이라고 합니다.

간단히 말하자면 봇을 사용하기 위한 로그인 계정 id와 password 라고 이해하시면 됩니다.

authetification은 트위터, 스프레드시트 뿐 아니라 모든 통용되는 제품들에 사용되니 잘 기억해두시면 큰 도움이 됩니다.

  • code를 통해 특정 프로그램에 접근하기 위해서는 authetification (인증) 절차가 필요하다.
  • 인증은 key(=id)와 secret(=password)를 통해 로그인하는 과정이다.

Authetification 을 위한 인증키 받아오기

그렇다면 해당 key 와 secret는 어디서 얻을 수 있을까요? 제품마다 다르지만 트위터와 구글스프레드시트의 경우 '개발자 계정'으로 인증받은 계정에 한하여 key와 secret를 발급하여 제공해주고 있습니다.

다시 말하면 트위터와 구글 스프레드 시트의 authentification을 얻기 위해서는 아래의 절차를 거쳐야합니다.

  1. 트위터 developers(https://developer.twitter.com/en ) 에 가입하기
  2. developers 신청 후 승인 받기.
  3. 개인 설정 페이지에서 ket, secret를 확인하기.

인증 절차에 대해서도 설명하려고 했지만 그렇게 되니 코드에 대한 설명을 하려는 본 목적이 묻힐만큼 길어져 트위터 인증 절차를 다루는 다른 블로글 글들을 링크로 달아 대체하겠습니다. 다만 저는 api 인증 중 겪을 수 있는 문제에 대해 간략하게 설명하는 것으로 대체하겠습니다.

링크는 아래를 확인해주세요.

💡 인증시 주의 사항

  • twitter 는 다른 사람의 데이터를 다루는 작업에 매우 민감합니다. 크롤링 등을 목적으로 하는 develop 계정의 경우 목적을 명확히 설명하지 않으면 허가가 잘 나지 않으니 단순히 커뮤를 위한 봇을 생성할 목적일 경우 개발자 선택지는 모두 No! 로 체크해주세요.
  • twitter api 는 학생에게 관대합니다. 본인이 api 를 공부하는 학생이며, 해당 봇으로 어떤 공부를 할 것인지를 설명하면 쉽게 인증 허가가 납니다.
  • 구글 드라이브의 경우 절차가 복잡해보일수도 있지만 트위터와 다르게 기본 사용의 경우에는 특별한 확인 절차나 결제를 필요로 하지 않습니다.
  • 구글 드라이브의 key는 .json 파일의 형태로 발급됩니다! 파일을 다운로드 받은 후 경로 지정이 중요한데 이는 아래에서 자세히 다루겠습니다.

이제 위의 절차를 거쳐 필요한 key와 secret등의 값을 받았다면 인증 코드는 작성해 봅시다.

authentification 코드 작성하기

twitter authetification
	consumer_key = ""
    consumer_secret = ""
    access_token = ""
    access_token_secret = ""
    
    # 트위터에 인증키를 입력하여 접근 허가 받기
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    
    #  client object 만들기 = 트위터 api와 소통할 수 있는 "object(=계정)" 만들기
    client = tweepy.API(auth, wait_on_rate_limit=True,
        wait_on_rate_limit_notify=True)
google authetification
	key_file = "(여기에 file의 경로를 입력하세요.)"
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    
    # use creds to create a client to interact with the Google Drive API
    creds = ServiceAccountCredentials.from_json_keyfile_name(key_file, scope)
    client = gspread.authorize(creds)

    return client

💡 여기서 잠깐! API가 도대체 뭔가요?

봇을 만들기 위해 관련된 문서들을 찾다보면 api 라는 단어를 자주 마주하게 됩니다. 하지만 봇을 작성하기 위해 처음으로 코드를 작성하는 입장에선 api 라는 말이 쉽게 다가오지 않습니다. api가 뭘까요?

api는 application programming interface 의 줄임말입니다. 그게 도대체 뭔데요? 간단히 말하면 트위터등의 복잡한 프로그램을 외부에서 사용하고자 하는 개발자들을 위해 제공되는 조작키 같은 거라고 이해하시면 됩니다. 컴퓨터를 사용할 때 컴퓨터의 내부가 어떻게 만들어져 있는지 이해하지 못해도 단순히 키보드와 마우스만 움직이면 작동시킬 수 있듯, api를 통해 간단한 명령문으로 제품을 사용할 수 있게끔 만들어놓은 url/명령어의 집합을 api라고 합니다.

즉, 우리는 트위터가 제공해주는 이 api 들을 통해 자동으로 트윗을 생성하는 봇을 만들고 있는 것이고, 이러한 api를 사용하기 위해 가져야하는 자격 절차가 authentification 입니다.

  • API 는 게임의 스킬과 같은 조작 명령어이다.
  • Authetification(인증절차)는 이와 같은 api를 사용하기 위한 권리를 얻기 위한 과정이다.

이제 코드를 다시 한 번 확인합시다. 먼저 twitter authetification 입니다.

twitter authetification
	consumer_key = "(여기에 consumer_key를 입력하세요.)"
    consumer_secret = "(여기에 consumer_secret 입력하세요.)"
    access_token = "(여기에 access_token 입력하세요.)"
    access_token_secret = "(여기에 access_token_secret 입력하세요.)"
    
    # 트위터에 인증키를 입력하여 접근 허가 받기
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    
    #  client object 만들기 = 트위터 api와 소통할 수 있는 "object(=계정)" 만들기
    client = tweepy.API(auth, wait_on_rate_limit=True,
        wait_on_rate_limit_notify=True)

위의 네 줄은 twitter developers 페이지로부터 받은 key 와 secret을 모두 입력하는 곳입니다. 괄호는 제외하고 큰따옴표 안에 여러분이 받아온 값을 입력하시면 됩니다. 트위터는 까다롭게 4개의 key와 secret을 요구합니다.

그 다음 두 줄은 twitter에게 내가 이 열쇠들을 모두 가지고 있다! 라고 주장하는 과정입니다. 이때 tweepy 라는 library 가 사용되었고, library 에 대한 설명은 아래에서 계속하겠습니다.

마지막 줄은 이렇게 만들어낸 auth 토큰으로 twitter의 API를 사용하겠다는 선언을 하는 부분입니다. tweepy 에 API라는 명령어로 코드를 보내면 twitter에 사용이 허가된 유저 정보를 하나 던져줍니다. 우리는 이 데이터 덩어리를 client, 한국어로 고객이라고 부르며 이 client를 이용하여 원하는 다양한 api 를 사용합니다.

아래는 google 의 인증 절차입니다. 트위터와 비슷한 절차를 가지는 것이 보이나요?

google authetification
	key_file = "(여기에 file의 경로를 입력하세요.)"
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    
    # use creds to create a client to interact with the Google Drive API
    creds = ServiceAccountCredentials.from_json_keyfile_name(key_file, scope)
    client = gspread.authorize(creds)

    return client

비슷하지만 어딘가 다른 점이 있죠.

먼저 트위터와 다르게 key_file 하나만을 가지고 있습니다. 그리고 두번째로 scope라는 이상한 이름이 하나 끼어있고요. twitter과는 다르게 auth 라는 단어 대신 creds라는 단어를 쓰고 있네요.

하지만 다같은 내용입니다. 무슨 뜻이냐면, 회사마다 공식 문서에서 지칭하는 말이 달라서 코드를 찾다보면 이와 같은 상황들을 많이 마주할 수 있단 뜻입니다. 마치 빨강색을 누구는 붉은색, 누구는 빨강 누구는 사과색 이라고 표시하듯이요. 그러니 코드를 계속 공부하시려면 문맥을 파악하는 것이 중요합니다. 이것을 말씀드리기 위해 일부러 절차는 동일하지만 이름이 다소 다른 두 코드를 보여드렸습니다.

구글은 트위터가 하나하나 일일히 입력해줘야하는 key와 secret을 하나의 파일로 묶어서 전달해줍니다. 이 파일이 위에서 받았던 json이라는 확장자의 파일입니다. 해당 공란에는 코드가 작성된 파일이 위치한 폴더로부터의 '상대 경로'를 입력하시면 됩니다. 상대 경로가 무엇인지 잘 모르겠다면 그냥 코드가 작성된 파일과 같은 폴더에 json 파일을 넣고 [src/auth/(파일명)]만 적어넣으셔도 좋습니다. (단, 파일명은 [파일명].json의 형식입니다.)

💡 경로에 대하여
참고 문서: https://mommoo.tistory.com/82
글이 길어지는 것을 막기 위해 외부링크로 대체합니다. 본 프로젝트에서는 '절대경로'를 사용하며 최상위 디렉토리(root directory) 는 'tweet-commu-bot'입니다.

다음으로 scope는 구글드라이브에서 여러분이 사용할 서비스의 범위를 설정하는 변수입니다. 저는 보안을 위해 까다롭게 설정했는데, 여러분도 다른 구글 스프레드 시트 이외에 다른 서비스를 이용하지 않을 것이라면 무시하셔도 좋습니다.

🛠 정리!

  • key, secret의 괄호를 포함하여 괄호안을 모두 지우고 따옴표 사이에 위에서 받아온 key와 secret값을 적어넣는다.
  • key_file에는 코드가 작성된 'auth' 파일 안에 받아온 key file을 저장하고 [파일명].json 형식으로 파일명을 적는다.

이제 드디어 마지막 절차입니다. 그리고 처음 프로그래밍을 시작할 때 가장 머리가 아픈 부분이기도 합니다.

library 설치하기

아마 제 코드를 다운받으셨다면 바로 실행이 되지 않을 것입니다. 1차적으로 코드 곳곳에 붉은 줄이 생길 것입니다. 그리고 실행을 누르는 순간 버그와 함께 프로그램이 터질 것입니다. 왜일까요? 크게 두 가지 이유가 있습니다.

  1. 비어있는 key, secret, key_file 란을 채우지 않았다.
  2. library가 설치되지 않았다.

1번은 어렵지 않습니다. 하지만 모든 공란을 채우고도 여전히 붉은 줄은 사라지지 않을 것입니다. 왜냐하면 library가 아직 여러분의 컴퓨터에 설치되지 않았기 때문입니다. 지금부터 library에 대해 간략하게 이야기해봅시다.

library?

라이브러리(library) 한국어로 도서관입니다. 현실에서 도서관은 책을 대여해주는 곳입니다. 프로그래밍에서도 비슷합니다. 프로그래밍에서 라이브러리는 누군가가 써놓은 코드 뭉치를 의미합니다. 여러분이 무언가의 코드를 작성하고자 할 때 전에 비슷한 코드를 작성한 사람이 여러분의 편의를 위해 만들어준 코드를 쓸 수 있다면 훨씬 편하지 않을까요? 그래서 라이브러리가 탄생했습니다. 간단히 말하면 라이브러리는 코드 작성을 도와주는 도구(tool)입니다.

라이브러리(library): 코드 작성에 편의를 위해 누군가가 만들어둔 코드 뭉치, 도구(tool)

문제는 이와 같은 라이브러리는 설치 의 과정을 거쳐야한다는 것입니다. 단순히 프로젝트 폴더에 포함되어있는 것이 아니라, 설치하는 과정이 필요합니다. pycharm을 사용할 경우 붉은줄에 마우스 커서를 가져다 대면 설치되지 않는 라이브러리를 자동으로 깔아주겠다는 친절한 선택지를 제공해주지만 세상은 그리 평탄하지 않습니다. 대개는 모든 라이브러리를 직접 깔아야하죠.

이 프로젝트에서는 10개 미만의 라이브러리를 사용하고 있습니다. 하지만 10개도 일일히 명령어를 입력하여 설치하기에는 많습니다. 그래서 사람들은 library 의존성 도구 를 사용합니다.

라이브러리 의존성 도구: 프로젝트에 사용된 라이브러리들을 자동으로 관리해주며 간단한 명령어를 통해 설치, 삭제, 업그레이드를 수행해준다.
ex) pipenv, poetry

여러분의 편의를 위해 저는 poetry라는 라이브러리 의존성 도구를 사용했습니다. 자세한 공부를 원하시면 구글창에 "python poetry"를 검색하시면 됩니다. 하지만 거기까지 원치 않으시면 아래의 간단한 명령어를 python 프로젝트의 터미널에 입력하시면 됩니다.

> curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
> poetry install

위의 한줄로 poetry는 프로젝트에 사용된 모든 라이브러리를 여러분의 컴퓨터에 설치해줄 것입니다. 그러면 일차적으로 library에 의해 만들어진 붉은 줄은 전부 해결됩니다.

그리고 축하드립니다! 프로젝트의 모든 과정에서 가장 머리 아픈 인증과 라이브러리 세팅 과정을 끝마쳤습니다.

여기까지 너무 힘드셨다면 당연합니다. 앞으로의 모든 과정은 지금까지의 절반정도로 쉽습니다.

이따금씩 어려운 일도 있겠지만 여러분이 스스로 봇 만들기에 성공하셨으면 좋겠습니다. 모두가 코딩을 할 수 있게 되는 날까지 화이팅99

profile
당신의 친절한 오타쿠

0개의 댓글