0. 들어가기 앞서

 드디어! 오늘은! 코딩을 통해 트위터 계정을 컨트롤 해볼 거다! 🎉 

 코딩! 파이썬! 프로그래밍! 이라고 하면 겁날 수도 있겠지만, 어차피 만들고 싶은 기능은 정해져 있고, 효율이 떨어질 수는 있지만 굴러가게는 만들 수 있다. 코드의 이해를 원한다면 주석이나 설명을 상세히 읽고, 굴러가기만 하면 된다! 라고 하면 복붙만 해도 충분하다. 참고로 이해에 성공한다면 구글링-파이썬 을 통해 이 시리즈에서 다루지 않을 복잡한 기능까지 직접 만들어 볼 수 있을 거다. 다들 그러다 코딩에 눈 뜨고 프로그래밍을 배우고 멋진 프로그래머가 되고....

 니즈에 따라 어디까지 읽어야 하는지 구분하기 쉽도록 하기 위해 이해에 필요한, 혹은 스스로 기능을 구현하기 위해 알면 좋을 기능들은 제목 앞에 🍊이모지를 붙였다. 이후의 과정을 해보기 위해서 필수적이지 않으며, 하다 보면뒤늦게 이해되기도 하므로 꼭 전부 이해하겠다고 부담감을 갖진 말자!!!


 마지막으로, 프로그래밍이라는 걸 해보기 전에, 이거 하나만 되새기자! 좋은 코드란 동작하는 코드다. 이 시리즈를 따라 하고, 혹은 직접 무언가를 변경 및 추가해서 만든 코드가 원하는 대로 동작한다? 그럼 무조건 성공이다! 이 글의 코드는 정답이 아니다. 동작만 하면 성공한 거다! 당신은 천재다, 천재! 대박와방개쩔어주는멋쟁이천재!



1. 내 계정 인증 및 퍼블릭 트윗하기


1-1. 파일 열기

지난번에 만들어둔 폴더에 들어가 우클릭 - Code(으)로 열기를 눌러 파일을 연다. (파일의 아이콘은 사진과 다른게 정상이다! 난 다른 프로그램이 기본으로 설정되어 있어 아이콘이 저렇게 생겼다.)


1-2. 코드 작성

 파이썬 파일에다가 다음과 같이 입력한다. 새 파일이어도 괜찮고, test.py에 덮어써도 괜찮다. 이해 안돼도 된다! 일단 복붙하고, 키와 토큰에 저장했던걸 복붙하자. 주의! 큰따옴표 안에 넣어야 한다! (ex: API_KEY="123ASDJF2SDUF") 

참고로 # 표시가 붙은 줄은 주석처리가 되며, 우리는 읽을 수 있지만 컴퓨터는 읽지 못하는 줄이 된다. 주로 메모, 혹은 코드의 일부분을 잠깐 비활성화 시켜 테스트 하는 용으로 쓴다.


여기서 잠깐!!!!! 저장한 것 중에 access token과 access secret token이 없다면 02번 게시글의 2-11을 보자!!!!!!! 업데이트 됐다!!!! 🙏🙏🙏

# 1. 설치한 tweepy를 불러온다.
import tweepy

# 2. 발급받은 키와 토큰을 변수에 저장한다
API_KEY = "저장했던 API Key"
API_KEY_SECRET = "저장했던 API Key Secret"

ACCESS_TOKEN = "저장했던 AccessToken"
ACCESS_SECRET = "저장했던 Access Token Secret"

# 3. OAuth1
# 3-1. OAuthHandler 인스턴스를 생성, 변수에 저장한 API 키를 집어넣고, 마지막 콜백함수 자리에 'oob'를 입력한다.
auth = tweepy.OAuthHandler(API_KEY, API_KEY_SECRET, callback='oob') 
# 3-2. OAuthHandler 인스턴스에 ACCESS, ACCESS SECRET 토큰 세팅 
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
# 3-3. Twitter API wrapper 생성
api = tweepy.API(auth)

# 4.퍼블릭 트윗 작성
api.update_status("트윗 작성")
+ 22.02.05 tweepy 업데이트로 인한 코드 수정 (13줄)

1-3. 실행 및 결과 확인

컨트롤 백틱 (ctrl+`)으로 터미널을 열고 파일을 실행시켜보자. 03에서 했듯이 python {파일이름} 을 적으면 실행된다. 빨간 박스를 참고하자. (경로명 중간의 흰 박스는... 실명이 영어로 적혀있어서 가렸다.)

결과 확인은 02번 포스팅에서 트위터 개발자 계정 발급을 위해 사용한 그 트위터 계정에서 한다! 두구두구

쨔잔! 우리는 트위터 앱이 아닌, VS Code에서 트윗 작성하는 걸 성공했다!


1-4. 코드 분석

방금 전에 붙여넣은 코드 (1-2. 코드작성)를 띄워놓고 같이 보며 분석해보자.


🍊 1. import 

import는 무언가를 불러오는 작업이다. 여기에서 '무언가'는 tweepy로,  03에서 깔았던 그거 맞다! 

🍊 2. 변수 

파이썬에서 변수(수학의 x, y 같은 그거)에 뭔가를 저장하려면 [변수이름 = 변수내용] 라고 적는다. 예시 코드의 5번 줄에서는 API_KEY가 변수 이름, 등호 우측이 변수 내용이 된다. 저렇게 변수를 선언한 이후, 변수 이름을 적으면 컴퓨터는 변수 내용을 읽는다. 길고 복잡한 토큰을 매번 다시 적으려면 귀찮으니 변수에 담아둔다고 생각하면 된다. 큰따옴표("")안에 넣는 건 변숫값이 문자열이기 때문인데... 그냥 그렇다고만 생각하자. (더 알아보고 싶다면 파이썬 자료형을 구글링 해보면 된다.) 

중요한 건 앞으로 변수 이름을 적으면 컴퓨터가 변수 내용을 떠올릴 거란 거다!

🍊 3. 메소드 

13번째 줄을 보면 auth라는 변수에 tweepy.OAuthHandler(API_KEY, API_KEY_SECRET, 'oob') 라는 내용이 저장된다. 그런데 여기엔 ""가 없다. 색도 다르고, 중간에 점(.) 이랑 괄호도 있다! 

정확하게 해석하자면 tweepy에서 제공하는 OAuthHandler라는 메소드에 인자로 API_KEY, API_KEY_SECRET, 'oob'를 전달해서 반환되는 것을 auth에 저장한다.... 인데, 비유하자면 다음과 같다

tweepy라는 푸드코트에서 음식을 만든다. 대표 메뉴는 햄버거, 라면, 김밥이 있다. 햄버거가 먹고 싶다면 tweepy에게 가서 햄버거 기계(메소드)를 작동시킨다. 기계를 잘 살펴보면 재료로 뭘 넣어야 하는지가 적힌 설명서가 옆에 붙어 있을거고, 설명서에 적힌 대로 빵, 패티, 야채를 넣고 동작시키면 햄버거가 튀어나온다! 이건 내 거니까, 헷갈리지 않도록 내가 받은 햄버거라고 이름을 붙여놓자.

이 내용을 코드와 함께 비교하자면 다음과 같다.

내가받은햄버거 = tweepy.햄버거메소드(빵, 패티, 야채)

tweepy는 푸드코트 이름, 점 . 은 tweepy 메뉴판에서 메뉴를 고르겠다는 선언, OAuthHandler() 는 고른 메뉴 기계, 괄호 안의 값들은 재료라고 생각하면 된다. 

여기서 기억해야 할 건 저런 형식으로 적힌 것이 결과를 우리에게 돌려줄 수도 있다는 (햄버거!)과, tweepy푸드코트가 제공하는 음식 외에는 만들 수 없으니 설명서를 매우 잘 읽어야 한다는 점이다. 우리는 이를 공식문서 라고 부른다. (tweepy 공식문서 링크)

🍊 4. Oauth

함수 개념을 이해한 채로 13, 15, 17, 20번째 줄을 이해해보자.

13 위에서 설명했다. 기능을 이야기 하자면, auth라는 변수에 OAuthHandler인스턴스를 생성, 저장한다.

15 13번째 줄과 다르게 [변수 = 내용] 형태가 아니다. 이건 auth라는 OAuthHandler인스턴스에 access 토큰과 access secret 토큰을 세팅하는 메소드다. 이런 형식의 메소드는 auth안에 담긴 것을 변경하는 경우가 많으며, 무언가를 반환하지 않는다. 여기서 기억해야 할 건 auth안에 두 토큰을 세팅 했다는 점이다. 어떤 변화가 일어나는지는 공식 문서를 찾아보면 알 수 있다.

17 tweepy의 API라는 메소드에 auth를 전달해서 돌아오는 값을 api라는 변수에 저장하는 코드다.

20 api에 저장된 오브젝트가 쓸 수 있는 메소드 중 updata_status에 트윗 작성 이라는 문자열을 전달해 실행시키는 코드다. update_status는 트윗을 작성하는 기능을 한다! 






2. 타계정 액세스 승인 및 트윗하기

 1번에서 우리가 제어할 수 있는 계정은 '개발자 계정'을 만들 때 사용한 계정 뿐이다. 그러면 봇을 두 개 동시에 만들고 싶을 땐 개발자 계정을 둘 만들고 각각 코딩해야 할까? 아니다! 트위터에서 2차 지인 판별하는 앱이나, 몇 명과 맞블락인지 확인해주는 앱 등을 처음 사용할 때 다음과 같은 화면을 본 적 있을 거다. 이건 어떤 앱이 다른 계정을 '대신 조작'할 수 있도록 승인 받는 화면이다. 이 기능을 활용하면, 우리가 만들 자동봇 앱이 동시에 열 개의 자동봇도 굴릴 수 있다!

이제 요걸 해볼거다


2-1. 코드 작성1 및 실행

하단의 코드를 새 파일에 붙여넣고, 키를 잘 입력한다음,  터미널 창에 python {파일이름} 을 입력하여 실행시킨다. 그러면....

# 1. 설치한 tweepy를 불러온다.
import tweepy

# 2. 발급받은 키와 토큰을 변수에 저장한다
API_KEY = "키"
API_KEY_SECRET = "키"

# 3. OAuth1
auth = tweepy.OAuthHandler(API_KEY, API_KEY_SECRET, callback='oob') 

# 4. 엑세스 권한 요청 url 
try: # 성공 했을 때
    redirect_url = auth.get_authorization_url() 
    print(redirect_url)
except tweepy.TweepError: # 에러 떴을 때 
    print('리퀘스트 토큰을 가져오는 데에 실패했습니다.')


# 5. 받은 핀 번호 저장 및 세팅
pin_number = input("핀 번호:")
auth.get_access_token(pin_number)

# 6. 사용자의 토큰을 세팅, Twitter API wrapper 생성
USER_ACCESS_TOKEN = auth.access_token
USER_ACCESS_SECRET= auth.access_token_secret
auth.set_access_token(USER_ACCESS_TOKEN, USER_ACCESS_SECRET)
print(USER_ACCESS_TOKEN)
print(USER_ACCESS_SECRET)
api = tweepy.API(auth)

# 7. 트윗하기 
api.update_status("다른 계정 트윗 작성")
+ 22.02.05 tweepy 업데이트로 인한 코드 수정 (9줄)


이런 게 터미널에 찍힌다. 코드가 실행되다 말고 중간에 멈춰 있는 모습니다. 두 번째 줄의 url을 복사하자


2-2. 앱 인증 및 핀번호 확인

복사한 url을 주소창에 붙여넣으면 다음과 같은 화면이 나타난다! 이때 로그인되어 있는 계정이 '봇으로 굴리고 싶은 정' 이어야 하므로, 지금 어떤 계정인지 잘 확인한 후 앱 인증을 누르자. 그러면 두 번째 사진처럼 PIN번호를 알 수 있다. 


2-3. 핀번호 입력 및 결과 확인

위에서 확인한 핀번호를 입력하고 (사진에서는 아무거나 적었다. 저러면 안된다!) 엔터를 누르면, 코드가 마저 동작한다. 완료된걸 확인하고 아까 승인했던 계정으로 들어가면,

이렇게 우리가 원했던 내용이 트윗되어 있다! 성공! 🎉🎉🎉🎊🎊🎊

2-4. 토큰 저장

여기서 끝이 아니다! 매번 새로 핀번호를 달라고 할 수 없으므로, 사용자의 엑세스/시크릿 토큰을 저장해야한다. 터미널창을 보면 적혀있을건데, 꼭! 복사해서 저장하고, 어떤 트위터 아이디의 토큰인지도 기록해두자. 

2-5. 코드 분석 및 기타 내용

위에서 복붙한 코드를 살펴보며 읽어보자.

🍊1. 변경된 토큰들 (24~26)

상단의 ACCESS_TOKEN과 ACCESS_SECRET에 토큰이 사라지고, 24~26번째 줄에서 다른 토큰을 입력한다. 우리가 계속 get_access_token 메소드 안에 넣는 토큰들은 '본인 확인 증명서' 같은 거다. 이전에 썼던 건 '개발자 계정'의 증명서이므로, 우리가 굴리고 싶은 계정의 본인 확인 증명서를 새로 발급받고 세팅해야 한다.

🍊2. 엑세스 권한 요청 url (12~16)

try: A except B

A에서 문제가 생기지 않으면 쭉 실행시킨 뒤 except는 건너뛰고, A를 실행시키던 도중 문제가 생기면 A를 중지시키고 B로 넘어간다.

따라서 우리의 코드에서는 auth.get_authorization_url() 을 redirect_url에 저장하고 터미널에 실행시키는 걸 성공하면 try만 실행, 오류가 생기면 리퀘스트 토큰을 가져오는 데에 실패했습니다. 라는 문장을 출력한다. 

redirect_url은 아까 위에서 봤던 앱 인증 페이지를 여는 url이다.

🍊3. 핀 번호 저장 및 세팅(20~21)

터미널에 핀 번호를 직접 입력하는 건 컴퓨터한테 '이게 내가 권한을 가져오고 싶은 유저의 핀 번호야!' 하고 알려주는 행위이며, input 함수때문에 잠깐 멈춰있던 코드가 핀번호를 받으면 마저 동작한다.

핀번호를 넣어야 개발자 계정 외의 다른 사용자의 엑세스 토큰도 받아올 수 있다.

이때 굳이 input으로 넣는 이유는, 프로그램이 실행 - 종료된 후 터미널창에 있는 url로 들어가 pin번호를 받고 직접 변수에 넣으면...... 유효기간이 만료되는건지, 에러가 뜨기 때문이다. 그래서 강제로 코드를 중간에 멈추고 입력을 기다리는 input() 함수를 쓴다.



5. 마치며

드디어 온갖 🐶고생 끝에 코딩으로 트위터 계정을 컨트롤! 처음 보는 외계어(파이썬)가 등장했으니 좀 울렁증이 밀려올 수 있겠지만 힘내보자! 사실 별거 아니다. 구글링이라는 엑스칼리버를 옆구리에 끼면 뭐든 할 수 있다! 


+ 다음 포스팅 예고 : 자동봇이라면 답멘을 해야지! 답멘 기능 만들기.

++ 질문 언제든지 환영합니다! 문의는 @jamong_yami가 더 빠릅니다.



함께 보면 좋을 사이트 및 참고한 사이트

최신판 tweepy 공식문서 : https://tweepy-ko.readthedocs.io/ko/latest/auth_tutorial.html

타 계정 인증 : https://medium.com/geekculture/how-to-create-multiple-bots-with-a-single-twitter-developer-account-529eaba6a576

'oob'가 무엇인지 알고싶다면 : https://stackoverflow.com/questions/13522497/what-is-oob-in-oauth


코딩하는 자몽

자몽님의 창작활동을 응원하고 싶으세요?