본문 바로가기
파이썬

[파이썬강좌] Python으로 Twitter에서 자동으로 블로그 게시물 트윗하기

by GDBS 2021. 11. 17.
반응형
728x170

이 튜토리얼에서는 블로그 사이트맵에서 데이터를 스크랩하고 Twitter에 블로그 게시물을 자동으로 트윗하는 스크립트를 만드는 방법을 보여 드리겠습니다. HootSuite와 같이 이 기능을 제공하는 유료 서비스도 많이 있습니다만, 같은 일을 무료로 할 수 있다면 어떨까요? 

 

웹 스크레이퍼는 게시물의 URL, 기사 제목 및 해당 블로그 게시물의 한 줄 설명과 같은 데이터를 스크랩합니다. 우리 웹사이트의 사이트맵에서 가져올 수 있는 대부분의 데이터입니다.

 

Sitemap이란 무엇이며 어떻게 찾을 수 있습니까?

설명하자면 사이트맵은 블로그 게시물의 모든 메타데이터를 저장하는 XML 페이지입니다. 게시된 기사의 URL, 마지막으로 수정한 시간, 이미지 수와 같은 데이터를 저장합니다.

사이트맵이 왜 필요한지 궁금하실 것입니다. 

 

사이트맵은 검색 엔진이 귀하의 블로그 게시물 또는 귀하의 웹사이트에 게시되는 모든 페이지를 가능한 한 빨리 나열할 수 있도록 해야 합니다. 다른 이유도 있습니다 . 

이제 웹사이트의 사이트맵을 찾아보겠습니다. 

대부분의 경우 www.YOUR-WEBSITE.com/sitemap.xml 또는 www.YOUR-WEBSITE.com/sitemap_index.xml 입니다. 

예를 들어 제 경우에는 https://geekyhumans.com/sitemap_index.xml 입니다.

해당 페이지를 열면 다음과 같은 표 형식으로 나열된 몇 개의 URL이 표시됩니다.

블로그 게시물의 URL이 필요하기 때문에 포스트 사이트맵을 사용하겠습니다. 따라서 post-sitemap.xml의 URL을 복사합니다. 

이제 블로그 게시물에 대한 사이트맵을 얻는 방법을 알게 되었습니다. 우리의 주요 주제에 집중합시다.

{전제 조건}

  • 파이썬 지식
  • API 키가 있는 Twitter 개발자 계정

[이전강좌] [파이썬실습강좌] Python에서 트위터(Twitter) API를 사용하는 방법 (feat.트위터 개발자 등록)

 

[파이썬실습강좌] Python에서 트위터(Twitter) API를 사용하는 방법 (feat.트위터 개발자 등록)

Twitter는 생각을 공유할 수 있는 가장 인기 있는 웹사이트 중 하나입니다. 많은 사람들이 마케팅, 지식 공유 등과 같은 다양한 목적으로 Twitter를 사용합니다. 개발자로서 Twitter API는 가장 중요한

gdbs.tistory.com

 

 

- 1단계 : 종속성 설치

이 단계에서는 종속성에 대해 논의하고 하나씩 설치합니다. 다음은 우리가 사용할 Python 모듈입니다.

  • Twython : Twitter API를 쉽게 사용할 수 있도록 도와주는 Python 라이브러리입니다. Twitter에서 가장 인기 있는 Python 라이브러리 중 하나입니다. Twitter에서 트윗하고, Twitter에서 검색하고, Twitter에서 메시지를 보내고, 프로필 이미지를 변경하고, Twitter API가 할 수 있는 거의 모든 작업을 수행할 수 있습니다. 우리는 이 Python 라이브러리를 사용하여 Twitter에서 트윗할 것입니다.
  • BeautifulSoup: HTML, XML 및 기타 마크업 언어에서 정보를 가져올 수 있는 가장 인기 있는 Python 라이브러리 중 하나입니다. 즉, 웹 페이지에서 데이터를 스크랩할 수 있다고 말할 수 있습니다. 이 패키지를 사용하여 사이트맵을 스크랩하고 블로그 게시물을 자동으로 트윗할 것입니다.
  • 요청: 이 Python 라이브러리는 HTTP/HTTPS 요청을 만드는 데 사용됩니다. 우리는 이 패키지를 사용하여 웹사이트에서 제목, 설명 등과 같은 데이터를 가져오기 위해 GET 요청을 할 것입니다.

우리는 몇 가지 더 많은 패키지를 사용할 것이지만 이것이 주요 패키지입니다.

이제 터미널을 열고 아래 명령을 사용하여 "twitter-bot"이라는 폴더를 만든 다음 엽니다.

 
mkdir twitter-bot
cd twitter-bot

폴더에 있으면 아래 명령을 사용하여 패키지를 설치합니다.

 
pip3 install twython
pip3 install beautifulsoup4
pip3 install requests

이제 마침내 모든 패키지를 설치했으므로 다음 단계로 넘어갑시다.

 

- 2단계 : 사이트맵 및 블로그 게시물에서 데이터 가져오기

이제 `twitter.py` 파일을 만들고 아래 코드를 붙여넣어 모든 패키지를 가져옵니다.

from twython import Twython
import requests, json
from bs4 import BeautifulSoup
import re, random 

일단 위의 작업이 완료되었습니다. 블로그 게시물의 URL을 가져오는 함수를 만들어 보겠습니다. 이렇게 하려면 아래 코드를 사용하십시오.

def fetchURL():
    xmlDict = []
    websites = [ 'https://geekyhumans.com/post-sitemap.xml']
    r = requests.get(websites[random.randint(0, len(websites)-1)])
    xml = r.text
    soup = BeautifulSoup(xml, features="lxml")
    sitemapTags = soup.find_all("url")
    
    for sitemap in sitemapTags:
        xmlDict.append(sitemap.findNext("loc").text) 
    return xmlDict[random.randint(0, len(xmlDict))]

{코드 설명}

사이트맵에 'GET' 요청을 하고 변수 'r'에 저장하는 함수 'fetchURL()'을 정의했습니다. `r`은 객체이기 때문에 `xml` 변수에 저장할 텍스트를 가져와야 합니다.

그런 다음 BeautifulSoup을 사용하여 모든 `<url>` 태그를 찾고 루프를 사용하여 사전에 저장합니다.

이제 위에서 스크랩한 URL의 제목도 가져와야 합니다. 이렇게 하려면 아래 기능을 사용하십시오.

def fetchTitle(url):
    r = requests.get(url)
    xml = r.text
    soup = BeautifulSoup(xml)
    title = soup.find_all("h1")
    return title[0].text

{코드 설명}

우리는 `url` 인수를 취하는 `fetchTitle()` 함수를 정의했습니다. 해당 `url` 문자열을 사용하여 웹 페이지에서 모든 데이터를 가져옵니다. 다시, 우리는 URL을 요청하고 BeautifulSoup을 사용하여 `<h1>` 태그의 텍스트를 반환합니다.

그것이 우리가 긁는 부분을 끝낸 것입니다. 이제 몇 가지 Twitter 기능을 정의해 보겠습니다.

 

- 3단계 : 인기 있는 해시태그 가져오기

아니요, 전 세계적으로 유행하는 태그를 가져오지 않습니다. 여기에서는 사전 정의된 태그를 사용하고 이러한 태그를 사용하여 사전 정의된 태그와 함께 사용된 트렌드 태그를 가져올 것입니다.

이제 태그를 가져올 함수를 하나 더 만들어야 합니다. 이렇게 하려면 아래 코드를 사용하십시오.

def fetchHashTags():
    tags = ['developer', 'API', 'tech', 'ios', 'vscode', 'atom', 'ide', 'javascript', 'php', 'mysql', 'bigdata', 'api']
    hashtags = []
    
    search = twitter.search(q='#'+tags[random.randint(0, len(tags)-1)], count=1000)
    tweets = search['statuses']
    
    for tweet in tweets :
        if tweet['text'].find('#') == 0 :
            hashtags += re.findall(r"#(\w+)", tweet['text'])
        hashtags = hashtags[:11]
    hashtags_string = ' #'.join(hashtags)
    return hashtags_string

{코드 설명}

프로그래밍/기술 웹사이트이기 때문에 프로그래밍 틈새 시장에 있는 태그 목록을 사용했습니다. 그 후, 우리는 트렌드 태그를 저장할 빈 목록 `hashtags`를 얻었습니다. 이제 `twython` 패키지를 사용하여 사전 정의된 태그를 사용하는 트윗을 검색하고 `tweets` 변수에 저장합니다.

`tweets`는 문자열이므로 `re` 패키지가 처리하는 문자열에서 해시태그를 필터링해야 합니다. 이제 'hashtags' 목록에 해시가 없는 모든 해시태그가 있습니다. 다음으로 `#` 접착제를 사용하여 문자열을 만들고 반환합니다.

 

- 4단계 : Twitter에 게시

위의 모든 단계가 완료되면 import 문 바로 뒤에 아래 코드를 붙여넣습니다.

APP_KEY = 'TWITTER_API_KEY'
APP_SECRET = 'TWITTER_API_SECRET'
OAUTH_TOKEN = 'OAUTH TOKEN FROM AUTHORIZATION'
OAUTH_TOKEN_SECRET = 'OAUTH TOKEN SECRET FROM AUTHORIZATION'
twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

완료되면 Twitter에 게시해 보겠습니다. 이를 위해 아래 코드를 사용하십시오.

def postOnTwitter():
    url = fetchURL()
    title = fetchTitle(url)
    hashtags = fetchHashTags()
    tweet_string = title + ': ' + url + '\n\n' + hashtags
    print(tweet_string)
    twitter.update_status(status=tweet_string)

postOnTwitter()

{코드 설명}

우리는 트윗에 필요한 모든 것을 가져온 다음 트윗 문자열을 생성합니다. 결국, 우리는 그 트윗 문자열을 Twython의 `update_status()` 함수에 전달합니다.

최종 `twitter.py`는 다음과 같아야 합니다.

from twython import Twython
import requests, json
from bs4 import BeautifulSoup
import re, random
APP_KEY = 'TWITTER_API_KEY'
APP_SECRET = 'TWITTER_API_SECRET'
OAUTH_TOKEN = 'OAUTH TOKEN FROM AUTHORIZATION'
OAUTH_TOKEN_SECRET = 'OAUTH TOKEN SECRET FROM AUTHORIZATION'

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)


def fetchURL():
    xmlDict = []
    websites = ['https://nordicapis.com/post-sitemap.xml', 'https://geekyhumans.com/post-sitemap.xml', 'https://www.appcoda.com/post-sitemap.xml']
    r = requests.get(websites[random.randint(0, len(websites)-1)])
    xml = r.text
    soup = BeautifulSoup(xml, features="lxml")
    sitemapTags = soup.find_all("url")
    
    for sitemap in sitemapTags:
        xmlDict.append(sitemap.findNext("loc").text) 
    return xmlDict[random.randint(0, len(xmlDict))]

def fetchTitle(url):
    r = requests.get(url)
    xml = r.text
    soup = BeautifulSoup(xml)
    title = soup.find_all("h1")
    return title[0].text

def fetchHashTags():
    tags = ['developer', 'API', 'tech', 'ios', 'vscode', 'atom', 'ide', 'javascript', 'php', 'mysql', 'bigdata', 'api']
    hashtags = []
    
    search = twitter.search(q='#'+tags[random.randint(0, len(tags)-1)], count=1000)
    tweets = search['statuses']
    
    for tweet in tweets :
        if tweet['text'].find('#') == 0 :
            hashtags += re.findall(r"#(\w+)", tweet['text'])
        hashtags = hashtags[:11]
    hashtags_string = ' #'.join(hashtags)
    return hashtags_string

def postOnTwitter():
    url = fetchURL()
    title = fetchTitle(url)
    hashtags = fetchHashTags()
    tweet_string = title + ': ' + url + '\n\n' + hashtags
    print(tweet_string)
    twitter.update_status(status=tweet_string)

postOnTwitter()

이제 다음 명령을 사용하여 이 코드를 실행하십시오.

python3 twitter.py

그게 끝!! 드디어 트윗을 자동화했습니다. ^^

모두 잘 되시나요?

 

 

 

[관련글]

728x90
반응형

댓글