파이썬으로 넘어와서 필수 라이브러리는
import tweepy
import requests
import os
import sys
요건 선택사항
import re
from io import BytesIO
from PIL import Image
트위터 API 설정 해줍니다.
CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Tweepy 라이브러리를 사용한
X(트위터) api 공식 설정
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
client = tweepy.Client(consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET, access_token=ACCESS_KEY, access_token_secret=ACCESS_SECRET)
sys.argv[0] 은 스크립트 파일명이고 나머지는 php에 정의한 인수다.
if len(sys.argv) < 4:
print("뭔가 이상해요!!!")
sys.exit(1)
주석 처리해두면 안 헷갈린다 php에 만든 인수 순서와 sys.argv[숫자] 숫자와 맞아야 한다.
media_url = sys.argv[3] # 미디어 URL
tweet_subject = sys.argv[2] # 제목
tweet_content = sys.argv[1] # 내용
참고사항: php에서 인수 1번이 escapeshellarg($board_url) 내용으로 한건 twitter:card가 표시되게 내용에 url을 넣을 거기 때문에
내 url에 get 요청을 보내 미디어를 다운로드한다.
# 미디어 다운로드
response = requests.get(media_url)
if response.status_code != 200:
print(f"미디어 다운로드 실패: 상태 코드 {response.status_code}")
sys.exit(1)
뭔가 비효율적 적인 거 같지만
aws s3에 미디어 파일을 저장해 놓아서 데이터베이스에서 바로 가져올 수 없어서 이렇게 설정했다.
db에 있는 링크를 서버에 다운로드한 다음 트윗 날릴 것이다
media_url에서 확장자 찾기
file_extension = os.path.splitext(media_url)[1].lower()
# 이미지 파일 확장자 리스트
image_extensions = ['.jpg', '.jpeg', '.png', '.gif']
# 동영상 파일 확장자 리스트
video_extensions = ['.mp4', '.mov', '.avi']
초기화
media_id = None
tweet_text = ""
이미지인 경우 이미지 업로드를 하지 않고 텍스트만 트윗 트윗 카드 생성하기 위해
if file_extension in image_extensions:
print("이미지는 업로드하지 않고 텍스트만 트윗합니다.")
tweet_text = f"{tweet_subject}\n{tweet_content}"
동영상인 경우
elif file_extension in video_extensions:
file_name = f'temp_video{file_extension}'
with open(file_name, 'wb') as file:
file.write(response.content)
try:
media = api.media_upload(file_name, media_category='tweet_video')
media_id = media.media_id_string
print(f"동영상 업로드 성공, Media ID: {media_id}")
tweet_text = f"{tweet_subject}"
except Exception as e:
print(f"동영상 업로드 실패: {e}")
트윗 게시
if media_id:
try:
response = client.create_tweet(text=tweet_text, media_ids=[media_id])
tweet_id = response.data['id']
print(f"트윗 성공: {tweet_id}")
except Exception as e:
print(f"트윗 실패: {e}")
else:
try:
response = client.create_tweet(text=tweet_text)
tweet_id = response.data['id']
print(f"트윗 성공: {tweet_id}")
except Exception as e:
print(f"트윗 실패: {e}")
무료 api는 client.create_tweet를 사용해야 된다.