

せめて早朝とか深夜の分を自動化できないか。
Python使えばできるんじゃないだろうか。
Twitterで定期的に発信を行うために、投稿を自動化したいと考えたことはないだろうか。
半分手動の予約ツイートはWEB上のサービスを利用すれば可能だが、自動化できるサービスは無い。
しかしPythonを使えば自動化可能だ。
本記事ではTwitterの投稿自動化ついて、Pythonのサンプルコードを交えて紹介する。
本記事の対象者
PythonからTwitterを扱うにはアプリ登録が必要

PythonからTwitterを扱うにはアプリ登録が必要だ。
以下のページから「Create an app」をクリックしてアプリ登録を行おう。
![]() |
|---|
登録したら、「Keys and Access Tokens」のタブを選択して、
API key, API secret, Access token, Access token secretを取得をする。
![]() |
|---|
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()
実行結果は以下の通り。
2番目のtweetです📒#テスト
— KRSW⭐IT+SEOで4桁ブロガー (@KRSW_Saitama) April 29, 2020
絵文字もハッシュタグも入っている。
埋め込みツイートでは改行が潰れているように見えるが、Twitter上では改行されている。
自動化

自動化するにはこのPythonコードを、定期実行の仕組みに組み込めば自動化できる。
定期実行の仕組みとしては以下のようなものがある。
- タスクスケジューラー(Windows)
- cron(Linux)
注意

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

今回はPythonを使ってTwitterへ投稿する方法を紹介した。
自動投稿までは以下の流れとなる。
Twitter自動投稿の流れ
Pythonのコードが出来上がったら次は定期的に実行させる環境に移してコードを実行すると思う。
ランニングコストをかけてネット上に実行環境を作るのもありだが、小型PCを購入してランニングコストを下げるのも1つの手かと思われる。
小型PCの魅力とオススメの機種について書いた記事があるので、もしよければ参考にして欲しい。
あわせて読みたい





