Python

PythonからTwitterへ自動投稿したい(サンプルコードあり)

2020-04-29

Share this for your friends.

PythonからTwitterへ自動投稿したい(サンプルコードあり)

Twitterへの投稿、1日30ツイートとか難しい。
せめて早朝とか深夜の分を自動化できないか。
Python使えばできるんじゃないだろうか。

Twitterで定期的に発信を行うために、投稿を自動化したいと考えたことはないだろうか。
半分手動の予約ツイートはWEB上のサービスを利用すれば可能だが、自動化できるサービスは無い

しかしPythonを使えば自動化可能だ。

本記事ではTwitterの投稿自動化ついて、Pythonのサンプルコードを交えて紹介する。

本記事の対象者

  • Twitterの投稿を自動化したい人

  • PythonからTwitterを扱うにはアプリ登録が必要

    PythonからTwitterを扱うにはアプリ登録が必要だ。
    以下のページから「Create an app」をクリックしてアプリ登録を行おう。

    https://apps.twitter.com/

    Twitter 開発者登録


    登録したら、「Keys and Access Tokens」のタブを選択して、
    API key, API secret, Access token, Access token secretを取得をする。

    Twitter API取得

    Access tokenとAccess token secretはアプリ登録時に自動発行されないので、Generateボタンを押して作成する。


    Pythonを使ってTwitterに投稿する

    API key, API secret, Access token, Access token secretを取得できたら、次はPythonを使ってTwitterに投稿する。

    まずはpython向けのtwitterAPI連携ライブラリをインストールする。

    # pipを利用してライブラリをインストール
    pip install twitter
    


    そして取得したAPI key, API secret, Access token, Access token secretをそれぞれconsumer_key,consumer_secret,token,token_secretにセットして以下のコードを実行する。
    するとTwitter上にメッセージが投稿されているのが確認できる。

    #coding: UTF-8
    
    import twitter
    
    # 取得したキーとアクセストークンを設定する
    auth = twitter.OAuth(consumer_key="XXX",
                         consumer_secret="XXX",
                         token="XXX",
                         token_secret="XXX")
    
    t = twitter.Twitter(auth=auth)
    
    # twitterへメッセージを投稿する
    t.statuses.update(status="pythonからtwitterへの投稿テストです!")
    



    しかしこのままでは固定の内容しか投稿できないので、ここから変更を加えていく。


    投稿内容を外部から受け取れるように関数化

    先程のままでは固定の内容しか投稿できないので、投稿内容を外部から受け取れるように関数化する。

    以下ではクラス化してしまっているが、ただの関数化でもよい。

    twitter_util.py

    #coding: UTF-8
    
    import twitter
    
    class TwitterUtil:
    
        # 取得したキーとアクセストークンを設定する
        auth = twitter.OAuth(consumer_key="xxx",
                             consumer_secret="xxx",
                             token="xxx",
                             token_secret="xxx")
    
        def post(self, text):
            tw = twitter.Twitter(auth=self.auth)
            # twitterへメッセージを投稿する
            tw.statuses.update(status=text)
    


    複数の投稿候補から選んで投稿する

    Twitterへの投稿部分を関数化できたので、次は投稿が固定にならないように複数の投稿候補から選んで投稿する仕組みを作る。

    今回は曜日別にツイート内容が変わるようにしてみる。

    step
    1
    ツイート内容を用意する

    まず曜日別のツイート内容を用意する。
    [--split--] は曜日別の区切り文字列として定義した。

    tweet/week_tweets.txt

    0番目のtweetです📒
    
    #テスト
    
    [--split--]
    
    1番目のtweetです📒
    
    #テスト
    
    [--split--]
    
    2番目のtweetです📒
    
    #テスト
    
    [--split--]
    
    3番目のtweetです📒
    
    #テスト
    
    [--split--]
    
    4番目のtweetです📒
    
    #テスト
    
    [--split--]
    
    5番目のtweetです📒
    
    #テスト
    
    [--split--]
    
    6番目のtweetです📒
    
    #テスト
    


    step
    2
    ツイート内容のファイルを読み込む

    ツイート内容のテキストファイルが作成できたら、ファイルを読み込む。
    ファイルを読むには open を使いwith句の中でファイルをopenすることができる。

        TWEET_FILE_NAME = "tweet/week_tweets.txt"
    
        # tweet内容が含まれたtextファイル読み込み
        with open(TWEET_FILE_NAME, "r", encoding="utf_8") as f:
            file_content = f.read()
            print(file_content)
    
    

    step
    3
    ツイート内容のファイルを読み込む

    ファイルを読み込んだ段階では1つの文字列なので、これを曜日別の配列にする。
    配列にするには split を使って区切り文字列で分割することで配列化できる。

            SPLITTER = "[--split--]"
            # SPLITTERでファイルの中身を区切って配列にする
            contents = file_content.split(SPLITTER)
            print(contents)
    

    step
    4
    配列から曜日に対応する内容を取得する

    配列化ができたら、配列の中から曜日に対応する内容を取得する。
    曜日の番号は datetime.date.today().weekday() で取得できる。

            import datetime
    
            # 曜日番号を取得(0は月曜日)
            week_num = datetime.date.today().weekday()
            print(week_num)
    
            # tweetファイルの中身から曜日番号に対応する内容を取得
            tweet_text = contents[week_num].strip()
            print(tweet_text)
    

    step
    5
    取得した内容を投稿する

    最後に取得した内容を投稿する。
    先程クラス化した処理に投稿内容を渡すと投稿できる。

            import twitter_util
    
            # 投稿
            t = twitter_util.TwitterUtil()
            t.post(tweet_text)
    



    サンプルコードと実行結果

    これらの投稿処理を行うサンプルコードは以下のようになる。

    tweet_week.py

    #coding: UTF-8
    
    import datetime
    import twitter_util
    
    TWEET_FILE_NAME = "tweet/week_tweets.txt"
    SPLITTER = "[--split--]"
    
    def main():
    
        # tweet内容が含まれたtextファイル読み込み
        with open(TWEET_FILE_NAME, "r", encoding="utf_8") as f:
            file_content = f.read()
            #print(file_content)
    
            # SPLITTERでファイルの中身を区切って配列にする
            contents = file_content.split(SPLITTER)
            #print(contents)
    
            # 曜日番号を取得(0は月曜日)
            week_num = datetime.date.today().weekday()
            #print(week_num)
    
            # tweetファイルの中身から曜日番号に対応する内容を取得
            tweet_text = contents[week_num].strip()
            #print(tweet_text)
    
            # 投稿
            t = twitter_util.TwitterUtil()
            t.post(tweet_text)
    
    if __name__ == '__main__':
        main()
    
    


    実行結果は以下の通り。

    絵文字もハッシュタグも入っている。
    埋め込みツイートでは改行が潰れているように見えるが、Twitter上では改行されている。



    自動化

    自動化するにはこのPythonコードを、定期実行の仕組みに組み込めば自動化できる。

    定期実行の仕組みとしては以下のようなものがある。

    • タスクスケジューラー(Windows)
    • cron(Linux)


    注意

    自動化についてはTwitterの公式サイトにてルールが書かれている。
    違反にならないように開発しよう。



    PythonからTwitterへ自動投稿 まとめ


    今回はPythonを使ってTwitterへ投稿する方法を紹介した。
    自動投稿までは以下の流れとなる。

    Twitter自動投稿の流れ

  • アプリ登録してapi keyを取得する
  • api keyを使ってTwitterに投稿するプログラムを書く
  • タスクスケジューラーやcronなどで自動化する


  • Pythonのコードが出来上がったら次は定期的に実行させる環境に移してコードを実行すると思う。

    ランニングコストをかけてネット上に実行環境を作るのもありだが、小型PCを購入してランニングコストを下げるのも1つの手かと思われる。

    小型PCの魅力とオススメの機種について書いた記事があるので、もしよければ参考にして欲しい。



    Share this for your friends.

    ITipsと同じようなブログを作る方法

    ブログに興味がありますか?

    もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

    サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
    同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

    ランキング参加中

    にほんブログ村 IT技術ブログへ

    他にもブログやSNSで紹介してくれると励みになります。

    はてブのコメントで酷評されると泣きます(´;ω;`)

    -Python
    -

    © 2024 ITips