Pythonで自動ツイートをするスクリプト作ってみた

# はじめに
最近、エンジニアを目指すインターン生たちのQiitaへのアウトプットをTwiiterを通して外部の人にもぜひ見てもらいたいと思いました。
ただ、手動でURLをツイートするのは非常に面倒だと思ったので、自動ツイートするスクリプトを組んでみました。
正直初めの、アカウント申請が一番面倒だった。笑

# 自動ツイートスクリプト作成手順
## developer accountを作成する
以下のサイトを参考にさせてもらいました。

 - [【第1回】Twitter APIを使うためにdeveloper accountの申請をしよう！](https://masatoshihanai.com/php-twitter-bot-01/)
 - [Twitter API：Developer accountの登録＆申請方法](https://clab.tokyo/archives/5016)
 - [Twitter開発者は300文字でアプリ説明文の宿題です](https://hal-cha-n.hatenablog.com/entry/2018/07/28/002824)

まず初めに、TwitterのAPIを利用するには開発者用のアカウントを申請しなければならないらしい。
基本的に、選択形式でどんどん質問に答えて進めていくが、最後に「作成するアプリケーションについて300語以上で説明する」必要がありました。
以下は今回の申請用に作った当たり障りのない文章です。どうぞご自由にお使いください！

>I will make a Twitter Bot. The purpose is for me to study the programming using Twitter's APIs. I don't intend to analyze Tweets, Twitter users, or their content. I only want to learn the web programming. My Twitter Bot will inform my followers regularly about my and my friends blogs and some programming techniques. I would like to exchange useful information on programming with many people through this account's tweets.

現在の仕様に変わった時（8月頃）は、申請には時間がかかる的な話を聞いていたが、12月時点では速攻（1、2分くらい）で申請が通りました。

## 新規のアプリを作成する
以下のサイトを参考にさせてもらいました。
[初心者向け！PythonでTwitterに自動ツイートするプログラムを作る方法](http://i-yusuke.com/entry/twitter-bot/)

申請が通れば、https://developer.twitter.com/en/apps/ から新規でアプリを作成します。
ホーム画面から、「Create New App」をクリックして、必要な情報を登録します。
登録できたら、「Keys and tokens」欄に行って、以下の情報をメモっておきましょう。

- API key
- API secret key
- Access token
- Access token secret

これで実装に必要な準備が整ったので、後はガリガリと実装を進めていくのみですね。

## 実装
いよいよ実装に取り掛かります。
今回に限った話ではないですが、ローカル環境を汚したくないので、仮想環境を用意して必要なライブラリをインストールします。

```.zsh
$ mkdir Bot
$ python3 -m venv venv
$ source venv/bin/activate
$ pip --version
$ pip install --upgrade pip
$ pip install twitter
$ pip install python-dotenv
```

ここから、いくつかファイルを作っていきます。
まずは、先程メモっておいた認証情報を.envに記述します。

```.env
TW_CONSUMER_KEY=''
TW_CONSUMER_SECRET=''
TW_TOKEN=''
TW_TOKEN_SECRET=''
```

続いて、config.pyを作成します。
`load_dotenv(find_dotenv())`で先程作成した.envファイルを読み込んでいるのが分かるでしょう。
.envに記述した内容を直接config.pyに記述しても良かったのですが、[GitHub](https://github.com/YuyaNishimaki/Twitter-Bot)にソースを公開したかったので、ファイルを分けました。

```config.py
import os
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())  # .envファイルを探して読み込む
TW_CONSUMER_KEY = os.environ.get('TW_CONSUMER_KEY')
TW_CONSUMER_SECRET = os.environ.get('TW_CONSUMER_SECRET')
TW_TOKEN = os.environ.get('TW_TOKEN')
TW_TOKEN_SECRET = os.environ.get('TW_TOKEN_SECRET')
```

続いて、main.pyを作成します。
`python main.py`と実行すれば、「自動ツイート」と自動でツイートされます。簡単ですね！
メッセージ部分を少しいじればBotも簡単に作れちゃいます。

```main.py
import config
from twitter import Twitter, OAuth

def main():
    t = Twitter(
        auth=OAuth(
            config.TW_TOKEN,
            config.TW_TOKEN_SECRET,
            config.TW_CONSUMER_KEY,
            config.TW_CONSUMER_SECRET,
        )
    )

    msg = "自動ツイート"
    t.statuses.update(status=msg)

if __name__ == "__main__":
    main()
```

## Qiitaの記事のURLを取得する
今回のスクリプトはQiitaの記事のURLをツイートすることが目的なので、そこも解説しておきましょう。
QiitaのAPIを利用するには、HTTPSプロトコルを使ってqiita.comに接続します。
そして、[Qiita API v2](https://qiita.com/api/v2/docs#%E6%A6%82%E8%A6%81)を見ながら欲しい情報をGETします。
レスポンスはjson文字列で返ってくるので、`json.loads()`を使って辞書型に変えて扱いやすくしておきます。
後は、辞書からurlを取得するだけで、好きな記事のURLが取得できます！

```main.py
import http.client
import json

def connect_qiita(uid, page, ppage):
    conn = http.client.HTTPSConnection("qiita.com", 443)
    conn.request(
        "GET",
        "/api/v2/users/"
        + uid
        + "/items?page="
        + page
        + "&per_page="
        + ppage,  # noqa E501
    )
    res = conn.getresponse()
    return res

def get_url(response):
    # print(res.status, res.reason)
    data = response.read().decode("utf-8")
    jsonstr = json.loads(data)
    url = jsonstr[0]["url"]
    return url

def main():
    USER_ID = "macky4"
    ITEM_NUM = 10
    PAGE = "1"
    PAR_PAGE = "10"
    connect_qiita(USER_ID, ITEM_NUM, PAGE, PAR_PAGE)
    url = get_url(response)
```

## ファイルから複数のユーザIDを読み込む
python3でのファイル読み込みは以下のようにして組み込みの`open`を用いて行う。

```python3
def load_user_ids():
    path = "user_ids.txt"
    with open(path, "r", encoding="utf-8") as f:
        user_ids = [s.strip() for s in f.readlines()]

    return user_ids
```

<!-- ## GoogleSpreadSheetから値を取得する
以下のサイトを参考にさせてもらいました。

- [【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ](https://tanuhack.com/python/operate-spreadsheet/) -->

## 作成したスクリプトをHerokuにデプロイ
以下のサイトを参考にさせてもらいました。
[Pythonで作ったTwitterのbotをHerokuで動かす](http://hwhw.hatenablog.com/entry/2017/06/04/234539)

今回作成しているスクリプトはいわゆるボットです。
ただ、現状ではコマンド一つで自動投稿はできますが、完全に自動化されていません。
そこで、無料で利用できるHerokuにスクリプトをデプロイして、何をせずともスクリプトが定期的に実行されるようにしてみました。
大分はっしょってます。すみません。。参考資料と合わせて読んで頂ければ幸いです。

### Herokuにデプロイする際の前提条件

- 無料のHerokuアカウントを持っていること
- Python3.7がローカルにインストールされていること
- Postgresqlがローカルにインストールされていること
- Gitがコマンドで使えること

### デプロイする

```.zsh
$ brew install heroku/brew/heroku  # HerokuのCLIをインストールする
$ heroku login  # herokuにログイン
$ heroku create
# $ git add .
# $ git commit -m "commit message"
$ git push heroku master
$ heroku config:set CONSUMER_KEY=*** CONSUMER_SECRET=*** ACCESS_TOKEN_KEY=*** ACCESS_TOKEN_SECRET=***  # 環境変数の設定
$ heroku run python main.py
$ heroku ps:scale web=1  # デプロイの確認
$ heroku open  # デプロイされたページにアクセス
```

### 定期的にスクリプトを動かす

```.zsh
$ heroku addons:create scheduler:standard
$ heroku addons:open scheduler
```

## herokuでのデータベース利用
以下のサイトを参考にさせてもらいました。
[heroku で python 動かすチュートリアルをやったメモ](https://qiita.com/cfiken/items/0715bb945389bc9ca682)