UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

PythonでTwitterのBOTを作成する

f:id:mochizuki_p:20161005192705p:plain

botとは?

twitterのbotをご存知ですか?そもそもbotとはなんなのか?よくわからないという方も多いと思います。botとは何かというと。

  • あらかじめ登録した文章を
  • 決まった時間に
  • 自動的につぶやいてくれるツールのことです!

実際はさらに高度な機能を持たせるようなことが可能なのですが、まずは単純な自動ツィート機能を実装してみましょう! 自動的に動いてくれる機械のことをロボット(robot)と言いますが、ボット(bot)はそれのさらに単純なものと考えてもいいかもしれませんね。

botの何が便利なのか?

botを作成するメリットはなんなのか?twitterで手動でツィートするのは結構面倒なものです。毎回twitterのホーム画面に移動してツィート窓を立ち上げて、ツィートボタンを押す。これを1日に何度も繰り返すと思うと面倒くさいですね。botはこんな手間をすべて省いてくれます。プログラムが時間を測って自動的にツィートをしてくれるので、とても簡単です!

また面白い、便利あるいは含蓄のあるツィートを繰り返してくれるbotを作成すればたくさんのフォロワーを獲得できるかもしれません!これは自分で商売をやっている方にはとても役に立つはずですし、単純に達成感を味わえるかもしれません。botを悪用してスパム垢を作るようなことも可能ですがこれは厳禁ですよ!

実際にbotを作成してみよう!

インターネット上ではbotを無料で運用してくれるサービスがありますがここではあくまでプログラミングの勉強のために独力でbotを作成してみることにしましょう。ここでは汎用性と、ツィート取得後にいろいろな処理ができることを考えてpythonを利用してみることにします。利用するOSはMacです。

ここではpythonの環境構築がすでに完了している前提で作業をします。

まずはpythonでtwitterを使用するために必要なライブ ラリ,python-twitterをダウンロードします。

pip3 install python-twitter

ダウンロードが成功したら、次はtwitterの認証コードを取得しなければいけません。実はここが少し面倒です。まずはtwitterのアカウントから、設定画面に移って、SMS認証を完了しましょう。うまくスマホがSMSメッセージを受信したらそのコードをツィッターの設定画面に登録して、うまくいけば完了です。

つぎに移動するのはtwitterのアプリ管理画面です。実はここからはすべて英語で、日本語は一切ありません。英語が苦手な方は気合いで乗り切りましょう! ツィッターのアプリ登録画面に移動しましょう。

f:id:mochizuki_p:20161005192232p:plain

ここでcreate new appsをクリックします。するとこのような画面に遷移するはずです。

f:id:mochizuki_p:20161005192239p:plain

必要な記述は * Name アプリの名前です。特に制限はないので、あなたの名前+botでいいでしょう。僕はmochizuki_botとしておきました。 * Description アプリの説明です。ここでは適当にmochizuki_bot, frequently tweet some useless stuff.とでもしておきます。 * Website ウェブサイト、ここでは特に必要ないのでgoogleのURLでも入れておきましょう。

下の方に同意を求めるチェックボタンがあるのでYes, I agreeをクリックしたら create Your Twitter applicationをクリックして次に進みます。

この画面が出てきたら成功です。

f:id:mochizuki_p:20161005192305p:plain

大事な情報はKeys and Access Tokensにあります。このタブをクリックしましょう。

f:id:mochizuki_p:20161005192210p:plain

ボットの運用に必要なのはApplication SettingにあるConsumer Key(API Key)とConsumer Secret(API Secret)、およびYour Access TokenにあるAccess TokenとAccess Token Secretです。この4つのコードをメモ帳などにコピー&ペーストしておきましょう。またこの4つのコードは外部に漏れないように注意してくださいね。

PythonでBOTのコードを書く

そうしたら実際にpythonのコードをかいてみましょう。

touch twitterBot.py 

でファイルを作成します。

最初に必要なのは以下の記述です、外部のプログラムからtwitterの機能を利用するには4つのトークンが必要です。まずはtwitter-pythonモジュールを読み込んで、4つのトークンを登録しましょう。

#!/usr/bin/env python
from twitter import *

ACCESS_TOKEN = "455253454-ah6dVay4YLnUIwMXM0AmPNJeai74oPvxgzCItQY"
ACCESS_TOKEN_SECRET = "MCuuPfOXrbpwBzyTeU7E4y35y3h54y57lEf2S7cO7bP2FM"
CONSUMER_KEY = "T4cxjhqoBQ4y3q5q4tRueCsQ3"
CONSUMER_SECRET = "nErCQqbq4tq35q45hq47MrhsmTKVXs5Lb3fz7eE1cEPiq"


t = Twitter(auth=OAuth(ACCESS_TOKEN,
                       ACCESS_TOKEN_SECRET,
                       CONSUMER_KEY,
                       CONSUMER_SECRET)
            )

さてまずは正常に動くかどうかテストをしてみましょう。上で書いたコードにこの記述を追加してみてください。

t.statuses.update(status="こんにちは世界")

このコードについての解説をします。 まず、twitterAPIでツィートをするエンドポイントは

statuses/update

です。そして最低限必要なパラメータはstatusです、ここにツィートした文章を指定してtwitterのアクセスポイントにデータを送信すると無事ツイートが完了するわけです。以上を入力したら保存して、以下のコマンドを入力してください。

python3 twitterBot.py
{'text': 'MeteorJSとAngularJSは比較するものではない on @Qiita https://t.co/Zd36NOMr81', 'lang': 'ja', 'created_at': 'Fri May 27 00:25:24 +0000 2016', 'possibly_sensitive': False, 'contributors': None, 'truncated': False, 'is_quote_status': False, 'favorite_count': 0, 'geo': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'retweet_count': 0, 'coordinates': None, 'in_reply_to_user_id_str': None, 'source': '<a href="http://www.gardeners.me" rel="nofollow">Spamkiller3524643</a>', 'id_str': '735990251802365952', 'entities': {'symbols': [], 'urls': [{'display_url': 'qiita.com/acro5piano/ite…', 'expanded_url': 'http://qiita.com/acro5piano/items/9b9b86dd08cd637637b1', 'url': 'https://t.co/Zd36NOMr81', 'indices': [40, 63]}], 'hashtags': [], 'user_mentions': [{'screen_name': 'Qiita', 'name': 'キータ', 'indices': [33, 39], 'id_str': '341374118', 'id': 341374118}]}, 'user': {'friends_count': 169, 'protected': False, 'profile_use_background_image': True, 'lang': 'ja', 'created_at': 'Mon Dec 14 02:14:51 +0000 2015', 'notifications': False, 'screen_name': 'mochizuki_ichir', 'id': 4552442054, 'default_profile_image': False, 'is_translator': False, 'followers_count': 146, 'profile_background_color': 'C0DEED', 'location': '', 'time_zone': None, 'favourites_count': 56, 'id_str': '4552442054', 'follow_request_sent': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/693814151731240960/337BHEre_normal.jpg', 'profile_background_image_url': 'http://pbs.twimg.com/profile_background_images/676742400337829888/2kDtPXgH.jpg', 'profile_sidebar_fill_color': '000000', 'geo_enabled': False, 'profile_sidebar_border_color': '000000', 'name': '望月++', 'profile_background_tile': False, 'profile_link_color': '0084B4', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/693814151731240960/337BHEre_normal.jpg', 'is_translation_enabled': False, 'entities': {'description': {'urls': []}}, 'listed_count': 0, 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/4552442054/1459494491', 'has_extended_profile': False, 'default_profile': False, 'url': None, 'statuses_count': 251, 'contributors_enabled': False, 'profile_text_color': '000000', 'utc_offset': None, 'following': False, 'profile_background_image_url_https': 'https://pbs.twimg.com/profile_background_images/676742400337829888/2kDtPXgH.jpg', 'verified': False, 'description': 'ツィートはすべて人工無能が生成した無意味なものです。あまり本気にしないでください。\n\nHTML5/CSS/JavaScript(Node.js/React)/Python/C/C++/etc'}, 'in_reply_to_screen_name': None, 'retweeted': False, 'id': 735990251802365952, 'place': None, 'in_reply_to_status_id': None, 'favorited': False}

成功したらこんな感じのごちゃごちゃしたJSONデータが返ってきます。さて本題に帰ります。ここでの課題は定期的にあらかじめ登録した文章を自動でツィートすることです。

まずは自動ツィートしたい文章のリストを作成してリストに格納します。

そしてリストの件数を上限とした乱数を発生させて、リストからランダムに文章を抽出するプログラムを組みます。

twitterBot.pyの最初の部分にこの記述を追加してください。

import random

そして文章リストを作成します。

list = ["","","","","","","","",""]

乱数を発生させる部分です

i = random.randint(0,len(list))

list[i]

そしてプログラムを以下のように書き換えます

from twitter import *
import random

ACCESS_TOKEN = "455253454-ah6dVay4YLnUIwMXM0AmPNJeai74oPvxgzCItQY"
ACCESS_TOKEN_SECRET = "MCuuPfOXrbpwBzyTeU7E4y35y3h54y57lEf2S7cO7bP2FM"
CONSUMER_KEY = "T4cxjhqoBQ4y3q5q4tRueCsQ3"
CONSUMER_SECRET = "nErCQqbq4tq35q45hq47MrhsmTKVXs5Lb3fz7eE1cEPiq"


t = Twitter(auth=OAuth(ACCESS_TOKEN,
                       ACCESS_TOKEN_SECRET,
                       CONSUMER_KEY,
                       CONSUMER_SECRET)
            )

list = ["","","","","","","","",""]
i = random.randint(0,len(list))
str = t.statuses.update(status=list[i])
# これは確認用本番ではコメントアウト
print(str) 

これで実行してうまくいったら成功です! 最後に自動的にこのスクリプトを実行させる部分が残っていますね。やり方は主に2つあって

  1. OSのcronで定期的に実行させるやり方
  2. デーモン化して実行させる

ここでは1の方法で試してみたいと思います。

Cronを編集する

Ubuntuであればcrontabを編集します。

crontab -e

このファイルの中身は以下のようになっているはずです。

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

このファイルの最終行に以下のコードを付け加えて保存します。

0 8 * * * python3 twitterBot.py

このコードの構文は以下の通りです。最初の数字は何分に実行するかを表し、2つ目の数字は何時に実行するかを指定します。6番目は実行するコードを指定します。

ここではボットを実行するpython3 twitterBot.pyをrootユーザーで毎日8時ちょうどに実行することを指定します。

編集が終了したら上書きを行うと自動的にcronに登録されたコマンドが指定した時刻に実行されるようになります。