그누보드 페이지마다 sns 메타태그 생성 X(트위터) api를 통한 포스팅2편

 

그누보드 페이지마다 sns 메타태그 생성 X(트위터) api를 통한 포스팅1편

 

 

 

파이썬으로 넘어와서 필수 라이브러리는

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를 사용해야 된다.

 

 

 

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다