PythonとTwitterAPIで作るブログ記事自動ツイートbot

#はじめに
自分の勉強用に運営している用語辞典的なブログがあるのですが、記事の数も増えてきて人様にみていただけるようになってきたので更なる発展のため、Twitterで宣伝してみることにしました。
ということで定期的に記事をツイートするBotをPython＋BeautifulSoup+TwitterAPIで作ってみます。

#大まかな流れ

1. TwitterAPIを使えるようにする
1. Pythonコードを実行してツイートできるようにする
3. ツイートしたいブログの全記事のURLを一覧化したページを作る
4. 作成した全記事一覧ページからURLを取得し、ツイートする
6. 適当なサーバーでcronを用いて定期実行されるようにする

それでは作っていきましょう！！！
#TwitterAPIを使えるようにする
###Twitterアカウントを作る
[Twitterアカウント](https://twitter.com/i/flow/signup)を作成します。
出てくる指示に従っていけば作れます。

###デベロッパー申請をする

作ったアカウントに関してTwitterAPIを利用するためにデベロッパー申請をしていきます。
Twitterにログインした状態で、[Developerサイト](https://twitter.com/i/flow/signup)へアクセスします。
「Create an app」ボタンをクリック。
![スクリーンショット 2020-10-27 23.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/4e9f104f-4ff8-1139-751f-2dd274c7044a.png)


Applyをクリック。
![スクリーンショット 2020-10-27 23.32.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/bc9d688b-52c8-1ea7-7204-ec9c26cefdd1.png)

デベロッパーツールの利用目的を選択。今回はBot作成なのでMaking a botを選択。Nextをクリック。
![スクリーンショット 2020-10-27 23.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/c848a356-b9db-7b38-c755-d9cf9f80bbe3.png)

ここで電話番号認証がまだの場合は以下のように求められますので登録しましょう。
![スクリーンショット 2020-10-27 23.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/295dfdac-b560-98e8-973e-397f3f844380.png)
またこのページでは以下のようなことを登録していきます。

1. デベロッパーアカウントのユーザーネーム
1. 個人のアカウントかチームアカウントか
1. 登録するメールアドレス
4. 住んでいる国
5. ニックネーム
6. APIのアップデート情報をメールで受け取りたいか？

ぽちぽち設定していきましょう。設定を終えたらNextをクリック。

![スクリーンショット 2020-10-27 23.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/80d5ea01-9ea1-a8c7-7c24-df041ec908c4.png)
英文でTwitter APIの利用目的を回答していきます。
![スクリーンショット 2020-10-27 23.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/7ab57f80-10e6-a277-f659-f1036ee565e2.png)
１つ目は「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.
```

![スクリーンショット 2020-10-27 23.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/2126e64b-0c5e-e53c-8642-f62a26438333.png)
2つ目は「Twitterのデータを分析する予定ある？」といった感じに書いてあるので以下のように回答しました。

```
自分のブログ記事を記載した自動ツイートで、ユーザーに人気のあるツイートを分析したい。

#英訳
I want to analyze tweets that are popular with users with automatic tweets that describe my blog article.
```
3つ目は「アプリはツイート、リツイート、お気に入り、フォロー、ダイレクトメッセージを利用する？」といった感じに書いてあるので以下のように回答しました。
![スクリーンショット 2020-10-27 23.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/f251b0bc-1178-b7ff-26b9-f242c1174c32.png)

```
私のアプリは自分で作ったブログに投稿した記事を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にしました。
![スクリーンショット 2020-10-28 0.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/7d79d337-37d8-fbb9-6ceb-95d854406d7a.png)
5つ目は「開発するアプリや分析結果を政府機関が利用するか？」といった感じに書いてあり、今回は使わないので、Noにしました。
![スクリーンショット 2020-10-28 0.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/f5d5ebff-26b5-8bea-7944-31d896b2e913.png)
ここまで入力したらNextをクリック。
![スクリーンショット 2020-10-28 0.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/a8b33c34-53cb-bb83-e6fd-721f3413ca06.png)
入力内容の確認画面になります。入力内容に間違いがなければLooks good!をクリック。
![スクリーンショット 2020-10-28 0.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/58734c6b-cca0-ec2f-55f2-17d5a18af913.png)
利用規約に同意して申請します。
![スクリーンショット 2020-10-28 0.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/ec2c5fec-045b-b2ab-1d14-8aecd76d2a52.png)
以下の画面が表示されれば申請完了です。あとは神に祈るだけ。
![スクリーンショット 2020-10-28 0.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/1162ee5c-dda2-dc0a-73d9-0297f32984dd.png)
Twitterから以下のような本登録メールが届いているので、メールに記載されているURLにアクセスすれば登録が完了です。
![スクリーンショット 2020-10-28 0.43.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/d6d1298e-468c-dd29-dd42-976a0d54b2af.png)

#Pythonコードを実行してツイートできるようにする
###TwitterAPIのAPIキー、トークンを取得
登録したデベロッパーアカウントを使ってAPIキー、トークンを取得します。
[Developerサイト](https://twitter.com/i/flow/signup)へアクセスすると下のような画面に入れます。
![スクリーンショット 2020-10-30 0.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/708954c9-bf96-e438-af5c-8c876d247bf2.png)
スクロールするとCreate Appがあるのでクリック。
![スクリーンショット 2020-10-30 0.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/c5fa9e02-4aea-e86c-4a69-24a58acda292.png)
アプリ名を入力。
![スクリーンショット 2020-10-30 0.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/c98bcb0a-8d9f-59d7-61a8-b67db66b28a7.png)
取得できました。人に見せちゃダメですぞ！！
![スクリーンショット 2020-10-30 0.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/2f2e607d-1d3a-45f3-3f63-ada8866370d1.png)
あと今回はツイートをしたいのでAPIの特権の変更が必要です。やっておきましょう。
登録したアプリ名をクリック。
![スクリーンショット 2020-10-30 0.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/5af06e4d-aee8-e054-d8d7-67de84a9213f.png)
Settingsをクリック。
![スクリーンショット 2020-10-30 1.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/77c3f8bc-2f9e-9d2a-d892-f356ce878291.png)
スクロールをして出てくるApp permissionsをRead OnlyからRead and Writeにします。
Editをクリック。
![スクリーンショット 2020-10-30 1.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/40a5798a-a492-1286-2b76-25a89552b840.png)
変更できるようになるので、Read and Writeをチェック、Save。
![スクリーンショット 2020-10-30 1.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/a3bdd95b-e70d-ee09-b47e-3febe5dcbb28.png)
ええんか？と聞かれるのでええんやでとYesをクリック。
![スクリーンショット 2020-10-30 1.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/0ebc9e7c-8c02-4612-58c7-b20fb639184c.png)
TwitterAPIでツイートできる権限を付与できました。
![スクリーンショット 2020-10-30 1.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/a2e4703b-02a0-6f39-d2bb-1bf6ee820fa3.png)
###TwitterAPIのAPIキー、トークンを使ってまずはツイートしてみる
TwitterAPIを使うにはリクエスト処理と認証が必要になります。

リクエスト処理はrequestsというライブラリでやるのが一般的です。
また認証はrequests_oauthlibというライブラリがよく使われているみたいですね。

ちなみにTwitterは認証方式としてOAuth認証 という認証方法を利用しているので、PythonからTwitterの情報にアクセスする場合はOAuth認証を利用し、TwitterAPIを通して情報のやり取りを行う必要があります。

- OAuth 認証に必要なもの
    - Consumer key
    - Consumer secret
    - Access token
    - Access token secret

これらのキーとトークンはさっき作ったやつです！
[Developerサイト](https://twitter.com/i/flow/signup)へアクセス。先ほど登録したアプリ名をクリック。
![スクリーンショット 2020-10-30 0.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/5af06e4d-aee8-e054-d8d7-67de84a9213f.png)
Keys and tokensをクリック。
![スクリーンショット 2020-10-30 1.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/927e24b8-4225-617b-cd34-e0277f54c58a.png)
ここから取得できます。
![スクリーンショット 2020-10-30 1.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/8a04b971-a64e-fa2f-682d-e898a84ea139.png)
ではではrequestsとrequests_oauthlibをインストールしましょう。
Windowsの方はAnaconda Powershell Promptで、Macの方はターミナルで以下を実行。
ライブラリをインストールしましょう。

```
pip install requests requests_oauthlib
```
あとはコードを実行するだけです。サンプルコードは以下です！取得したAPIキーとトークンを打ち込んで実行してみてください。ツイッターアカウントから「Pythonからのテストツイート」とツイートされているはずです。（感動の涙！！！）
####TwitterBot_autoTweet.py

```python
# 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でブログを作っているなら全記事一覧はプラグイン１つで簡単に作成できます。
使うプラグインは「PS Auto Sitemap」です。
Wordpressの管理画面からプラグインページに入り、新規追加で「PS Auto Sitemap」と検索してインストール、有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/ffdfaf00-1725-1c9b-f8f8-41e1fe2edcdb.png)
次にページを作成します。固定ページで「全記事一覧」という名前にでもして作成すれば良いと思います。(←なんでも大丈夫です)
記事の中にカスタムHTMLコードで以下のコードを書きます。

```
<!-- SITEMAP CONTENT REPLACE POINT -->
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/980c7ff7-f5a6-e420-0f40-40c03d638c71.png)
コードを書いたら記事を公開、その記事のIDを控えておいておきます。
PS Auto Sitemapの設定画面に入り「サイトマップを表示する記事」にIDを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/bf74e4c1-aeb5-5ac4-090e-394aa6c886a5.png)
これで全記事一覧が作成されるはずです。

#作成した全記事一覧ページからURLを取得し、ツイートする
作成した全記事一覧ページからURLをスクレイピングして取得します。
スクレイピングにはBeautifulSoupを用います。
ライブラリをインストールしましょう。

```
pip install beautifulsoup4
```
あとはAPIを使った時のようにコードを実行するだけです。サンプルコードは以下です。
これら2つのプログラムを同一フォルダに作成して、TwitterBot.pyに取得したAPIキーとトークンを、getBlogURL.pyに全記事一覧ページのURLを打ち込んで実行してみてください。

####TwitterBot.py

```python
# 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

```python
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にすればよいです。

```python
if "abc" not in url.get: 
```
いろいろとツイートする記事に条件を付けたい場合は以下のようにgetBlogURL.pyのfor文内を変更すれば良いです。

```python
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の完成です。

#参考にした、参考になるサイト
- [PythonでTwitterしてみた](https://qiita.com/konojunya/items/59a68d35e44db8b87186)
- [requests-oauthlib 1.3.0](https://pypi.org/project/requests-oauthlib/)
- [PythonからAPIを使ってツイートしてみる【かんたん】](https://prog-masaki.com/tweet-python/)
- [API reference index](https://developer.twitter.com/en/docs/api-reference-index)
- [プラグインで3分で出来る！全記事一覧ページを作成する手順【WordPress】](https://pinapopo.com/ps-auto-sitemap/)
- [Pythonとcronでささっと自動ツイートBotを自作する](https://note.com/rottenmarron/n/n48e4f6a07151)
- [【入門】cron（クロン）設定・書き方の基本](https://www.kagoya.jp/howto/rentalserver/cron/)
- [WordPressのブログ記事をpythonを用いて自動ツイートする方法](http://seintoon.com/usefulinfo/autotweet/)
- [10分で理解する Beautiful Soup](https://qiita.com/Chanmoro/items/db51658b073acddea4ac)
- [図解！Python BeautifulSoupの使い方を徹底解説！](https://ai-inter1.com/beautifulsoup_1/)