初心者がpythonでtwitter botを作りHerokuで自動化



#### まとめた理由
散々いろんなwebサイトで紹介されており、『初心者が１日で作れます！』と謳い文句がありますがそこまでサクサク作れるものではないです。自分は１週間ほどかかってしまいました。
初めてで作りたい方の参考や自分の振り返りとしてまとめます。

### 自作でtwitter botを作る利点、欠点
#####利点
・ランダム投稿など仕様を自由に作り変えられる
・半永久的に動かせる
#####欠点
・作るのに手間がかかる
・管理が必要

ネット上のアプリで設定すればその日のうちに投稿できますし、有料にすれば機能も多彩です↓。
https://www.google.com/search?q=localfolio+twotterbot&oq=localfolio+twotterbot&aqs=chrome..69i57.9485j0j7&sourceid=chrome&ie=UTF-8

またブラウザ版のtwitterなら予約投稿が可能です。↓
https://appllio.com/twitter-schedule-post-tweet
自分もBotbirdというアプリを使いました。ただ自作で作った方が後々の管理は楽ですので使っています。ランダム投稿や予約投稿自体の自動化を目的とした方には自作した方が良いです。


#### 事前準備
twitterのディベロッパーアカウント(新しく作ると2-3日かかります。)
python実行環境
Herokuのアカウント

#### 実行環境(Herokuにデプロイした時の環境)
入ってなくても動くパッケージもありますが、Herokuで自動実行するアプリ化する際にこのpython環境を構築しました。

python-3.9.4
python-jsonrpc-server==0.3.4
simplejson==3.17.2
ujson==1.35
json5==0.9.1
jsonschema==3.2.0
requests-oauthlib==1.3.0
oauthlib==3.1.0
nose==1.3.7
schedule==0.6.0
numpy==1.18.1

#### コード
twitterのアカウントを入手したら自分のpython環境上で以下のコードを作成して保存します。

```
    # !/usr/bin/env python
    # coding: utf-8

    import json
    from requests_oauthlib import OAuth1Session
    import os
    import time
    import numpy as np
    import random
    import sys

    # twitterディベロッパーアカウントの登録
    CK = '<自分で取得したConsumer Key>' # Consumer Key
    CS = '<自分で取得したConsumer Secret>' # Consumer Secret
    AT = '<自分で取得したAccess Token>' # Access Token
    AS = '<自分で取得したAccess Token Secret>' # Accesss Token Secret

    url_media = "https://upload.twitter.com/1.1/media/upload.json"
    url_text = "https://api.twitter.com/1.1/statuses/update.json"

    def job():    
        # 文章の作成
        context = '投稿成功！'
        A = random.randint(1,40)   #ランダムにする画像の選定
        B =  str(A) + '.jpg'
    
        # 投稿日の確認
        if (delta_days + 1) % 3 == 0:  #3日に1回投稿
            print('投稿日')
            # OAuth認証 セッションを開始
            twitter = OAuth1Session(CK, CS, AT, AS)

            # 画像投稿
            files = {"media" : open(B, 'rb')}
            req_media = twitter.post(url_media, files = files)

            # レスポンスを確認
            if req_media.status_code != 200:
                print ("画像アップデート失敗: %s", req_media.text)
                exit()

            # Media ID を取得
            media_id = json.loads(req_media.text)['media_id']
            print ("Media ID: %d" % media_id)

            # Media ID を付加してテキストを投稿
            params = {'status': context, "media_ids": [media_id]}
            req_media = twitter.post(url_text, params = params)

            # 再びレスポンスを確認
            if req_media.status_code != 200:
                print ("テキストアップデート失敗: %s", req_text.text)
                exit()
     job()
     print ("OK")
```
pythonファイルと同じディレクトリにある４０枚の画像からランダムに投稿します。
３日に一回投稿するようになっています。このコードをtwitterbot.pyとして名前をつけてコンソール上で実行すれば手動では投稿可能です。
mediaを変更すれば動画などの投稿も可能です。


####Herokuによる自動化
自動化するために当初mac PC上でpythonのschduleパッケージを使って動かしていましたが、PCを起動し続けなくてはいけないためHerokuにアップして自動化しました。
このサイトが非常にわかりやすいので参考にして実行しました↓
https://hashikake.com/heroku-scheculer#toc3

runtime.txtは実行環境記載のpythonのバージョン、
requirements.txtは実行環境記載のpythonパッケージを使用しました。

#### まとめ
自分でアプリなどを今後作っていきたいと考え作成してみましたが、やはりネットに書いている通りにやれば簡単に動くというほどではなかったのが感想です。
しかし、これを通じてプログラミングに慣れるのと自分で作ったものに愛着が湧きました。自動投稿自体は便利な機能なので今後も使っていきたいと思います。

誰かの役に立てば幸いです。