트위터 개발자 계정 신청을 하고 메일을 기다렸는데 존나 아무리 기다려도 안오길래 다른 방법 없나 찾아보다가 2021년 11월? 쯤 올라온 한 글에... 요새는 절차가 간편해져서 키가 바로 나온다~ 라길래 호오오옹ㄱ시나 해서 개발자 계정 만들면서 나왔던 키들로 대충 눈치로 때려맞춰서 넣어봤는데 호고곡........ 나 왜 기다림?
twitter_consumer_key = "API Key"
twitter_consumer_secret = "API Key Secret"
twitter_access_token = "Access Token"
twitter_access_secret = "Access Token Secret"
그랬다... 이미 키를 줬는데 그냥 아무 의미 없이 기다린거였다...
아무튼 그래서 이 키를 가지고 트위터 api 크롤링 실습을 해봤다. 아주 간단함
파이썬과 트위터 API를 활용한 트위터 크롤링 (코드 예제) 를 참고해서 했다.
pip install python-twitter
API 키는 .env 파일에 숨겨서 넣었다.
# .env
twitter_consumer_key=API Key
twitter_consumer_secret=API Key Secret
twitter_access_token=Access Token
twitter_access_secret=Access Token Secret
# api/twitter_api.py
# window (secret key)
from pathlib import Path
import os
import environ
BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env(
DEBUG=(bool, False)
)
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
twitter_consumer_key = env('twitter_consumer_key')
twitter_consumer_secret = env('twitter_consumer_secret')
twitter_access_token = env('twitter_access_token')
twitter_access_secret = env('twitter_access_secret')
원래 env 코드는 settings.py에 넣어서 from disaster_map.settings import *
만 넣어도 잘 돌아가야 하는데 자꾸 disaster_map
이라는 모듈이 없다고 에러를 내서 그냥 필요한 부분만 따와서 또 넣었다.
# api/twitter_api.py
import twitter
twitter_api = twitter.Api(consumer_key=twitter_consumer_key,
consumer_secret=twitter_consumer_secret,
access_token_key=twitter_access_token,
access_token_secret=twitter_access_secret)
twitter.Api
메소드에 키값만 잘 맞춰서 넣어주면 연결이 되고, 이후에 사용할 때는 twitter_api
에 메소드를 붙여서 사용한다. 아 그리고 파일 이름을 twitter.py
라고 하니까 import twitter
를 제대로 못시켜서 파일명을 twitter_api.py
로 바꿔줬다.
# api/twitter_api.py
account = "@DrStrange"
statuses = twitter_api.GetUserTimeline(screen_name=account, count=200, include_rts=True, exclude_replies=False)
for status in statuses:
print(status.text)
account
에 가져올 계정을 적고 다른 메타데이터 없이 실제 트윗 텍스트만 보기 위해 뒤에 .text
를 붙여서 출력하면
얘는 닥터스트레인지 공식계정
얘는 스파이더맨 공식계정
이렇게 가져온다 닥스 개봉 빨리
기존에 있는 문서를 긁어오는 크롤링과는 다르게 실시간으로 대기하면서 트윗들을 추적한다.
# api/twitter_api.py
query = ["벚꽃"]
output_file_name = "stream_result.txt"
with open(output_file_name, "w", encoding="utf-8") as output_file:
stream = twitter_api.GetStreamFilter(track=query)
while True:
for tweets in stream:
tweet = json.dumps(tweets, ensure_ascii=False)
print(tweet, file=output_file, flush=True)
이러면 실시간으로 '벚꽃'이라는 단어가 포함된 트윗들을 json 형식으로 stream_result.txt에 저장한다. 파일이 저장되는 위치는 현재 내 위치. 어쩔땐 트윗 하나당 한줄씩 예쁘게 나오고 어쩔땐 우다다다 못생기게 나오는데 그 패턴을 잘 모르겠다.
시크릿키나 GDAL 관련해서 맥이랑 윈도우랑 달라서 환경 세팅에 시간을 좀 들였는데 윈도우에서만 필요한 파일은 깃에 올릴 필요가 없으니까 .gitignore
에 추가해줬다. 무슨 문법이 있을 줄 알았는데 그냥 깃에 안올리고 싶은 파일명만 띡 써주면 됐다. (setup.bat 파일을 안올리고 싶으면 그냥 .gitignore 파일 맨밑에 setup.bat이라고 써주면 된다.) 이미 올린 파일을 지워서 반영하려면 git rm --cached 파일명
을 하고 커밋을 해야했다.
그리고 GDAL을 한번 설치한 상태에서 새 프로젝트에도 쓰려면 wheel 파일을 이용한 GDAL 설치와 libgdal.py 수정만 해주면 됐다. 사실 wheel 파일을 로컬 컴퓨터 아무데나 저장해두고 절대경로로 설치해주면 되고, setup.bat 같은 경우는 최초설치때만 하면 되기 때문에 .gitignore까지 써가면서 이 파일들을 프로젝트에 넣어서 사용할 필요가 없었다. 사실상 libgdal.py 수정만 좀 귀찮은 편? 다만 wheel 파일 같은 경우에는 pip freeze를 하면 requirements.txt에 wheel 파일의 절대경로가 들어가서 맥이든 윈도우든 사람마다 컴퓨터마다 달라서 따로따로 해주긴 해야겠다.
안녕하세요 api를 설정하고 싶은데 이런경우도 가능한가요? 잘몰라서 여쭙니다
감사합니다 봇? 매크로 관련해서 궁금한점입니다
A라는 사이트에서 무작위 아니고 딱 정해진 글 사진 입니다
글이나 사진 클릭하면 공유하기 (트위터) 뜨는데
정해진 글 사진을 매일 한번씩 트위터로 공유하기 가능한가요?
그렇다면 어떻게 설정 해야 할까요?
감사합니다