#はじめに
自分の勉強用に運営している用語辞典的なブログがあるのですが、記事の数も増えてきて人様にみていただけるようになってきたので更なる発展のため、Twitterで宣伝してみることにしました。
ということで定期的に記事をツイートするBotをPython+BeautifulSoup+TwitterAPIで作ってみます。
#大まかな流れ
- TwitterAPIを使えるようにする
- Pythonコードを実行してツイートできるようにする
- ツイートしたいブログの全記事のURLを一覧化したページを作る
- 作成した全記事一覧ページからURLを取得し、ツイートする
- 適当なサーバーでcronを用いて定期実行されるようにする
それでは作っていきましょう!!!
#TwitterAPIを使えるようにする
###Twitterアカウントを作る
Twitterアカウントを作成します。
出てくる指示に従っていけば作れます。
###デベロッパー申請をする
作ったアカウントに関してTwitterAPIを利用するためにデベロッパー申請をしていきます。
Twitterにログインした状態で、Developerサイトへアクセスします。
「Create an app」ボタンをクリック。
デベロッパーツールの利用目的を選択。今回はBot作成なのでMaking a botを選択。Nextをクリック。
ここで電話番号認証がまだの場合は以下のように求められますので登録しましょう。
またこのページでは以下のようなことを登録していきます。
- デベロッパーアカウントのユーザーネーム
- 個人のアカウントかチームアカウントか
- 登録するメールアドレス
- 住んでいる国
- ニックネーム
- APIのアップデート情報をメールで受け取りたいか?
ぽちぽち設定していきましょう。設定を終えたらNextをクリック。
英文でTwitter APIの利用目的を回答していきます。
1つ目は「TwitterAPIと取得できるデータの利用目的を英語で教えてね!詳しく書けば承認されやすくなるよ。」といった感じに書いてあるので以下のように回答しました。
・自分で作ったブログに投稿した記事をTwitterのAPIを利用して、定期的に自動でツイートしたい。
・Twitterのタイムラインに自動的に表示させるのは1日に8回程度です。
・TwitterAPIを利用して取得したデータをTwitter以外で利用することはありません。
#英訳
・I want to use Twitter's API to automatically display articles posted on my website on the Twitter timeline.
・It is automatically displayed on the Twitter timeline about 8 times a day.
・The data acquired using the Twitter API will not be used for anything other than Twitter.
2つ目は「Twitterのデータを分析する予定ある?」といった感じに書いてあるので以下のように回答しました。
自分のブログ記事を記載した自動ツイートで、ユーザーに人気のあるツイートを分析したい。
#英訳
I want to analyze tweets that are popular with users with automatic tweets that describe my blog article.
3つ目は「アプリはツイート、リツイート、お気に入り、フォロー、ダイレクトメッセージを利用する?」といった感じに書いてあるので以下のように回答しました。
私のアプリは自分で作ったブログに投稿した記事をTwitterのAPIを利用して、定期的に自動でツイートしたいのでツイート、リツイート、お気に入り、フォロー、ダイレクトメッセージを利用する。
#英訳
My app uses Twitter's API to automatically tweet articles posted on my blog, so I use tweets, retweets, favorites, followers, and direct messages.
4つ目は「Twitter以外でデータとかを利用する?」といった感じに書いてあり、今回は使わないので、Noにしました。
5つ目は「開発するアプリや分析結果を政府機関が利用するか?」といった感じに書いてあり、今回は使わないので、Noにしました。
ここまで入力したらNextをクリック。
入力内容の確認画面になります。入力内容に間違いがなければLooks good!をクリック。
利用規約に同意して申請します。
以下の画面が表示されれば申請完了です。あとは神に祈るだけ。
Twitterから以下のような本登録メールが届いているので、メールに記載されているURLにアクセスすれば登録が完了です。
#Pythonコードを実行してツイートできるようにする
###TwitterAPIのAPIキー、トークンを取得
登録したデベロッパーアカウントを使ってAPIキー、トークンを取得します。
Developerサイトへアクセスすると下のような画面に入れます。
スクロールするとCreate Appがあるのでクリック。
アプリ名を入力。
取得できました。人に見せちゃダメですぞ!!
あと今回はツイートをしたいのでAPIの特権の変更が必要です。やっておきましょう。
登録したアプリ名をクリック。
Settingsをクリック。
スクロールをして出てくるApp permissionsをRead OnlyからRead and Writeにします。
Editをクリック。
変更できるようになるので、Read and Writeをチェック、Save。
ええんか?と聞かれるのでええんやでとYesをクリック。
TwitterAPIでツイートできる権限を付与できました。
###TwitterAPIのAPIキー、トークンを使ってまずはツイートしてみる
TwitterAPIを使うにはリクエスト処理と認証が必要になります。
リクエスト処理はrequestsというライブラリでやるのが一般的です。
また認証はrequests_oauthlibというライブラリがよく使われているみたいですね。
ちなみにTwitterは認証方式としてOAuth認証 という認証方法を利用しているので、PythonからTwitterの情報にアクセスする場合はOAuth認証を利用し、TwitterAPIを通して情報のやり取りを行う必要があります。
- OAuth 認証に必要なもの
- Consumer key
- Consumer secret
- Access token
- Access token secret
これらのキーとトークンはさっき作ったやつです!
Developerサイトへアクセス。先ほど登録したアプリ名をクリック。
Keys and tokensをクリック。
ここから取得できます。
ではではrequestsとrequests_oauthlibをインストールしましょう。
Windowsの方はAnaconda Powershell Promptで、Macの方はターミナルで以下を実行。
ライブラリをインストールしましょう。
pip install requests requests_oauthlib
あとはコードを実行するだけです。サンプルコードは以下です!取得したAPIキーとトークンを打ち込んで実行してみてください。ツイッターアカウントから「Pythonからのテストツイート」とツイートされているはずです。(感動の涙!!!)
####TwitterBot_autoTweet.py
# coding: UTF-8
from requests_oauthlib import OAuth1Session
#ここにKeyとToken
CONSUMER_KEY = "XXXXXXXXXXXX"
CONSUMER_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN = "XXXXXXXXXXXX-XXXXXXXXXXXXXXXX"
ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
url = "https://api.twitter.com/1.1/statuses/update.json"
tweet = "Pythonからのテストツイート" #ツイート内容
params = {"status" : tweet}
req = twitter.post(url, params = params) #ここでツイート
if req.status_code == 200: #成功
print("Succeed!")
else: #エラー
print("ERROR : %d"% req.status_code)
#ツイートしたいブログの全記事のURLを一覧化したページを作る
無事にツイートできたので本命のブログ記事を自動ツイートするための下ごしらえです。
ブログの記事一つ一つをスクレイピングしてツイートするコードを書いてもいいのですが、記事が増えるたびに手直しが必要になるので、ツイートしたいブログの全記事を一覧化したページを作り、そこからURLをスクレイピングしてくるといった方法を取ります。
ブログはWordpressで作成している前提で話を進めます。
Wordpressでブログを作っているなら全記事一覧はプラグイン1つで簡単に作成できます。
使うプラグインは「PS Auto Sitemap」です。
Wordpressの管理画面からプラグインページに入り、新規追加で「PS Auto Sitemap」と検索してインストール、有効化します。
次にページを作成します。固定ページで「全記事一覧」という名前にでもして作成すれば良いと思います。(←なんでも大丈夫です)
記事の中にカスタムHTMLコードで以下のコードを書きます。
<!-- SITEMAP CONTENT REPLACE POINT -->
コードを書いたら記事を公開、その記事のIDを控えておいておきます。
PS Auto Sitemapの設定画面に入り「サイトマップを表示する記事」にIDを入力します。
これで全記事一覧が作成されるはずです。
#作成した全記事一覧ページからURLを取得し、ツイートする
作成した全記事一覧ページからURLをスクレイピングして取得します。
スクレイピングにはBeautifulSoupを用います。
ライブラリをインストールしましょう。
pip install beautifulsoup4
あとはAPIを使った時のようにコードを実行するだけです。サンプルコードは以下です。
これら2つのプログラムを同一フォルダに作成して、TwitterBot.pyに取得したAPIキーとトークンを、getBlogURL.pyに全記事一覧ページのURLを打ち込んで実行してみてください。
####TwitterBot.py
# coding: UTF-8
from requests_oauthlib import OAuth1Session
from getBlogURL import post_article
#ここにKeyとToken
CONSUMER_KEY = "XXXXXXXXXXXXXXXXXXXX"
CONSUMER_SECRET = "XXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
url = "https://api.twitter.com/1.1/statuses/update.json"
tweet = post_article #ツイート内容
params = {"status" : tweet}
req = twitter.post(url, params = params) #ここでツイート
if req.status_code == 200: #成功
print("Succeed!")
else: #エラー
print("ERROR : %d"% req.status_code)
####getBlogURL.py
import requests
from bs4 import BeautifulSoup
import random
# 全記事一覧のURLからツイートしたいURLを引っ張ってくる
res = requests.get("全記事一覧のURL")
soup = BeautifulSoup(res.text, "html.parser")
links = []
for url in soup.find_all('a'):
url.get = url.get('href')
#URLが取得できない場合はパス
if url.get is None:
continue
#URLに文字"abc"があったらURLをツイートしない
if "abc" not in url.get:
links.append(url.get)
post_article=random.choice(links)
ちなみにgetBlogURL.pyの以下の実装部分で"abc"を任意の文字に変更すると入力した文字がURLに含まれないときだけがツイートされるようになります。逆に含まれるものだけツイートしたい場合はnot inをinにすればよいです。
if "abc" not in url.get:
いろいろとツイートする記事に条件を付けたい場合は以下のようにgetBlogURL.pyのfor文内を変更すれば良いです。
for url in soup.find_all('a'):
url.get = url.get('href')
if url.get is None:
continue
#URLに文字"abc"があったらURLをツイートする
if "abc" not in url.get:
continue
#URLに文字"def"があったらURLをツイートしない
if "initial-search" in url.get:
continue
#URLが"https://abc.com/"だったらURLをツイートしない
if url.get == "https://abc.com/":
continue
#URLに文字"jkl"があったらURLをツイートする
if "jkl" in url.get:
links.append(url.get)
#適当なサーバーでcronを用いて定期実行されるようにする
最後です。作成したプログラムを家にある適当なUbuntuサーバー(Macでも可)で定期実行しましょう!
定期実行にはcronでスクリプトを定刻実行するのが楽だと思います。
###作成したいプログラムをサーバーにコピーする
FTPなりUSBなり何でもよいのでサーバーにコピーしてください。
###cronをroot権限で開く。
サーバーのコマンドラインで以下を実行。
crontab -u root -e
###コマンドを登録
以下のコマンドをcronに登録してください。(必要なツイートの頻度などに変更してね!)
サンプルは4時間おきに「/home/tweet/TwitterBot.py」を実行するといったコマンドになっています。
* * /4 * * * python3 /home/tweet/TwitterBot.py
これで4時間ごとに記事をツイートするBotの完成です。
#参考にした、参考になるサイト