Twitter BotをZeroから作ろう!
突然ですがおしらせ:本Noteを元にした記事が雑誌に掲載されました(∩´∀`)∩☆
ご興味があるかたは↑の雑誌もご覧いただければと思います☆
ーーーーというわけで本題w
異世界ものを書かれているファンタジー作家さんや、テーブルトークRPGのマスターさん、SF作家さん等につかっていただければ……と、以前『ファンタジー世界構築のための質問リスト』という本をだしました。
くわしい紹介は↑にあるとおりですけれど、まあやたらたくさん(なんと1500個以上)ものクエスチョンが入っているのです。
で、この本の中の質問文を時々つぶやくBOTをつくったらいいかも~?
なんてかるーく思い立ったのが数日前の吉日。無料サービスとかでぽちぽちっとやったらすぐにできるでっしょーー。と、甘い考えでやりはじめてみたら、なにやら意外に大変でございました。なので、ただやるだけじゃもったいないと、こんなふうにながーい記事にまとめてみましたわけですよ。
いちおう有料記事にしましたが、ほとんど無料で読めますのでどーぞー♪
Pythonやらなにやらの学習のおたすけにもなるかもしれないわねえと、細かく解説していたり、していなかったりしています。御用とお急ぎのない方ははじめから、そうでない方は目次から適当にすっ飛ばしてごらんくださいませ☆
無料Botサービスはどうなの?
きっと無料で使えるサービスたくさんあるよね。と、検索してみると……
こちらが一番有名で簡単にできるよと、ぐぐる先生もおっしゃっていたのです。が……。
やってみたのですが、どうもうまく動いてくれないのです。アカウントの登録は出来ても、つぶやきをセットできないかんじ。利用者の掲示板を見ても、みなさん困っておられる様子。
むむむ。困った。どうしよーうー。
他のTwitterBotサービスも調べてみたら、それぞれTwitterの仕様変更で更新をやめていたり、サービスを停止したりが多くて難儀している模様。
ほかにも、つぶやきの個数制限があったりなんだりで人様のサービスを使うのは面倒かもという気にだんだんなってきました。
しょうがない。こうなったら自分で作っちゃいましょう☆
※調べた限りのBOTサービスでは「つぶやき」の文面の著作権に関しての規約がありませんでした。ものすごーく穿った見かたをすると、登録したつぶやき文面を勝手に使われてしまう可能性もあります。今回つぶやきたい文言はアメリカSF作家協会のPatricia C. Wrede氏の作成された英文の質問を私が和訳したもので、私が使用する分に関しては許諾をうけていますが、BOTサービスへの登録などは権利的に問題があるかもしれないという点も、自作の方向に気持ちが傾いた理由であったりします。
自分で作っちゃおう!
れっつDIY!
用意するもの
じゃん!
こういうちびっさいコンピュータを使います。今回はRaspberry Pi Zeroというワンボードコンピュータをチョイス!
そうなんです。ハードから用意しますw
なんてね。じつは、前から家にあったものなのですケドw
※実はこのRaspberry Pi Zeroは、お部屋の照明のつけたり消したりを制御する赤外線リモコン機能の役割を持たせてあり、常に電源が入っています。(その作り方もまたいつかご紹介するかも)なので、今回の用途にも一緒につかってしまおうというわけです。
今回つくるBOTというのは、人間が操作しなくてもコンピュータが勝手に動いてくれる、まあロボット的なプログラムなわけです。
普通なら、インターネットにつながっているサーバーというものを用意して、その中でBOT(ロボットプログラム)を動かしておきます。サーバーって言うとアマゾンのクラウドだったり、Google先生のなんとかいうやつだったりでとても大げさな感じがしてしまいますが、実は、このちびっさいコンピュータでも十分サーバーになるのです。
物理的なハードウェアをサーバーと言ってみたり、中で動いているプログラムをサーバーと言ったりしていてたまに混乱します。
正直どっちもサーバーっていうんですよね。「もしもし?」と問い合わせたら、404と答えてくれたりw、なんかしら「サービスしてくれるヤツ」がサーバーだよと理解しています。ハードでもソフトでも、固いも柔らかいもどっちでもありなヤツのようです。今回は、すでにRaspberry Pi ハードウェアの中に、部屋の明かりコントロール・サーバー・プログラムが入っているので、ついでにそこに同居させるわけです。
もちろん、大きなパソコンでやっても同じことができます。でも、ずーっと電源入れっぱなしになるので、なるべく消費電力が少ない、こうしたちびっ子のほうが実はサーバーに向いているのかもしれませんね。
Raspberry Piの使い方
ちっちゃいけど立派なパソコンです。
流行りのLinuxとか動いてしまいます。速度はやっぱり遅かったりしますが、たんにTwitterにつぶやくぐらいなら十分でしょう。
今回は Pythonというこれまた流行りの言語をつかってBOTプログラムをつくりたいと考えています。Raspberry Pi に標準的なセットアップをすればPythonは最初からはいってくれているので超便利です♪
セットアップの仕方などはググるとたくさん出てくると思うので割愛します。でもさすがに不親切かもなのでいちおう公式サイトを張っておきますねー。英文ですがw
↑こちらの公式サイトからRaspbianというOSをダウンロードして、なんとかしてSDカードに入れて(ただコピーするだけじゃダメです。そこらへんの方法もぐぐってみましょー)、起動するとDebianというLinuxベースのOSが動作してくれるはずです。いろいろ機能もついてるので便利ですよー♪
本もたくさん出ていますが、やっぱりおすすめの入門書はこれ
いまは第3版が出ていて、Raspberry Pi3の事まで載っています。Raspberry Pi4に対応した第4版はまだかなー?
※Raspberry Piシリーズは今回使うZeroというちっさいタイプから、Raspberry Pi 4ってのまで、いくつか出ています。基本数字が大きくなるほど速いです。その分お値段もあがります。ご予算に合わせてどーぞー。
セットアップなど
は、上に書いたように省略ッ! 詳しくは自分でぐるるか本を読んでやってみて!
とりあえず、
・インターネットに接続できること
・Pythonが動くこと。Version2.7と3系が両方動くようになっているとGood!
を確認しましょう。それが出来てればとりあえず良し!
2020年10月追記:セットアップ方法も書きました。
と、
↑をご覧ください。最新の簡単セットアップ術です。(ほんとスゴイ簡単になっててびっくり!)
ご注意
上にもさらっと書いてありますが、Pythonのバージョンには気を付けておきましょう。Pythonはバージョンがいろいろあって、主に2.7系と、3以降系があります。今後は3以降が主流になってくるのは理の当然なのですが、困ったことに2.7用に作られたスクリプト(プログラム)は3以降ではそのままでは動かないのですねぇ。(こういうことをするから素人は困るのに……)
なので、両方のバージョンをインストールしておき、動くようにしてあると良いわけです。古い方(2.7)は消さないようにしましょう。今回参考にするサイトのプログラムリストを見ても、だいたいが2.7系で作られているようでしたので、そちらはそちらでそのまま利用するようにしたいわけです。
versionの調べ方
Pythonのバージョンは、Raspberry PiのOS(Rasbian)ログインした後、コンソールかターミナルから
$ python -V
で調べられます。(最初の$は打たないでね。あと、Vは大文字ですのでご注意)
こんなかんじですね。↑
python3(version3以降)も同様に
$ python3 -V
とすると、
こんな風にでてくれるわけです。
もし、python3が入っていないようなら、
このあたりを参考にしてインストールしちゃってください。
※3ではなく全部2.7系で動かすようにしても良いのですが、日本語まわりが面倒なんですよね~><
いよいよ(ようやく)Bot作り
まず、Tweepyのインストール&設定を行います。
参考サイト
このサイトを参考にさくっとやってみます。環境はUbuntuを想定と書かれていますが、Rasbianでもだいたいおんなじです。
Rasbianのコンソール(ターミナル)で、
$ sudo apt-get install python-setuptools
$ sudo easy_install tweepy
↑最初にこの呪文でツールをインストールします。
おや、python-setuptools は既にインストールされてるかんじでしたね。
tweepyは入っていなかったのでちゃんと入れておきます。
Twitterにアプリケーションの登録
Twitterに「これからこういうアプリケーションをつくるよ」と登録しないといけません。
こちらはRaspberry Piからではなくパソコンのブラウザからやりましょう。(Raspberry Piからもできないことはないけれど遅いからめんどくさい)
まず、BOTを作りたいアカウントでTwitterにログインしておき、そのブラウザから、Twitter Application Managementにアクセスします。
すると、こんなかんじの画面になります。まだ何もアプリケーションがないよってなってますので、右上の〔Create an app〕というところをクリックして、新しいアプリケーションを作成するわけですね。
あ、デベロッパーアカウントにしないといけません、Applyしましょう。
なにつくるのー? 的な質問があるので、 botをつくるよー等答えると、より詳しいことをおしえて等いろいろ質問されてきます。英文で答えないといけませんがGoogle翻訳等をつかって頑張ってこたえておきましょう。
上手く答えて、許可が得られると、
こんな画面になります。
ここの Keys and tokens というタブで、大事なアプリケーションKeyとトークンを調べられます。
↑このぼかしてあるところの文字列をコピペしてどこかに保存しておきましょう。
さて、ここまで出来たらまたRaspberry Piのターミナルでの作業。
スクリプトを作って実行してもよいですが、ターミナルから pythonを立ち上げて、そのまま対話モード(コマンドを打ち込んでその場で結果が返ってくるモード)でやってしまうのが楽です。(この段階ではまだ2.7を使います)
単に python とだけ打ち込んで実行すると、>>>というプロンプトがでてきます。そこにコマンドを打っていくと、その場で対話的にお返事が返ってきます。
↑この、>>>に続けて
import tweepy
consumer_key = "アプリのConsumer Key"
consumer_secret = "アプリのConsumer Secret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
print "Access:", auth.get_authorization_url()
と入力(アプリのConsumer Key というところと、アプリのConsumer Secret というところは先ほどコピペした内容に入れ替えておきます)してリターンキーを押して実行しましょう。(いちいち打たなくても、テキストとしてまとめてコピペすればOK)
すると、Access: HTTPS:hogehoge・・・
という内容がでてきます。このURLへアクセスして、Twitter認証を許可します。(パソコンのブラウザからでOK)すると、PINコード(数字)がでてきますので、それもコピペしておきます。
もう一度Pythonの対話画面で
verifier = raw_input('Verifier:')
ここにそのPINコードを入力(input文を使わずにそのまま代入してもよいけれどw)
verifier を入力した後で Python対話さんに
auth.get_access_token(verifier)
print "Access Token:", auth.access_token
print "Access Token Secret:", auth.access_token_secret
としてやると、Access Token と Access Token Secret を得られるというわけです。
こちらもコピペして保存しておきます。
取得した……という部分をそのコピペ内容に差し替えて
access_token = "取得したAccess Token"
access_secret = "取得したAccess Token Secret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
api.update_status('Hello, world!')
↑をPythonの対話モードから入力すれば、なにやらごちゃっと
返事が来てびっくり( ゚Д゚)しますが、Twitterさんからたくさんレスポンスがかえってきているということです。饒舌なだけでエラーではないようですね、ブラウザでTwitterのほうを確認してみましょう。
わあお☆、無事呟けていますね!(∩´∀`)∩☆
あとは、このHello, world! というところを自動的につぶやきたい言葉に変えるようプログラムするだけですね!
(そこがまた初心者にはむずかしいところなんですがw)
レッツゴープログラミング
まあ慣れちゃえば楽なんですけど、プログラムをしたことのない人にはここまででももうすでに敷居がとても高かったこととおもいます。
この先、さらに高くなりますよ(脅してどうするw)
もっとも、プロのグラマーさんたちに比べたら初歩も初歩、ぴよぴよひよこレベルです。そんなに構えないでいきましょー。
事細かに解説するとこれまた長くなるので、参考書を張っておきます。
タイトルがすてきでしょw
めんどくさいことはぜんぶPythonにやらせて人間は楽をしようという本。わたしのような面倒くさがりにぴったりw 技術書なのでちょいとお高いけれどとってもお勧めです。
さて、
ここから先はPython3でやります。
この先、Python2系は通るべからず。(通る人は自分の環境に読み替えましょう。でも日本語扱うからけっこうめんどいとおもいます~)
まずいろいろ実験したいので、つぶやくテキストデータのテスト用サンプルを作ります。
手元に1500行あるテキストデータはあるのですが、そのまま突っ込むと大変なので、まず最初の6つの質問テキストを抜き出して、一行1質問とし、UTF-8で保存します。
Linux上でテキスト編集のやりかたや文字コードについて分かっている人なら、直接Raspberry Piの中でファイルを作成してもOKです。
パソコンで作成した人は、
このあたりのソフトを使ってRaspberry Piへ転送しましょう。(ソフトの使い方やMacの場合は割愛ッ!)
Raspberry Piの中にこういう風に入っている事を確認しましょう。
※catは超簡単に言うとテキストファイルを表示するプログラムです。
日本語が通る最近のRasbianなら、UTF-8のテキストならば文字化けせずに表示できるはずです。
さて、このファイル(doc.txt)の入っているディレクトリでPython3を立ち上げて、このファイルでいろいろ確かめてみましょう。
まず、>>>が出たらこんな呪文を入れてみます。
with open("doc.txt") as f:
lines = f.read().splitlines()
print(lines)
何やっているかわからないっ!って人は
あたりを参考にどうぞー。
うまくいけば、
こんな風になるはずです。
ごちゃっと固まって表示されていますがそれは想定どおり。linesっていうリストにデータがまとまってはいっている(リスト化されている)わけです。今回は6行のデータですが、これが1500行になる予定。いまは6行でいろいろ実験してみましょうということですね。
実験いろいろ
まず、そのままPython3の対話モードで読み込んだ行数を調べましょう。
>>> print(len(lines))
6
>>>のあとのところを打ち込んでみてみます。6とでました。6行なのでもちろん正解。
最初の行を見たい場合は、print(lines[0]) とします。
>>> print(lines[0])
ワールド[A基本原則](1)自然と物理学の法則は、この世界では実際の地球と異なっていますか? それとも同じですか? どのように 魔法が世界に効いていますか? 魔法の獣(モンスター)はどのような存在ですか?
リストの0番目(1番最初)を表示しているわけですね。
なので最期の行は、
>>> print(lines[5])
ワールド[A基本原則](6)魔術師の個人的な意志力や生命力(魔法パワー)はどこからきますか? 神々や精霊? 魔法は枯渇性資源( ニーヴンの「ウォーロック」の「マナ」のように)ですか? 魔術師が彼自身の意志の力、生命力、あるいは正気で彼の呪文を養う必要があ りますか?(その場合の、長期的な影響は? 魔術師の健康は? 安定性は?)異なる人種/種は、彼らの魔法のために何かソースを持って いますか? または皆同じものを使用していますか?
こうなるわけですね。(6行あるので0からはじまって5が最後の行)
それ以上の行をprintしようとすると
>>> print(lines[6])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
こんなふうにエラー(IndexError: list index out of range)が出て、範囲外だよと教えてくれます。
この範囲内でランダムなデータを取り出して表示するようにプログラムを組むわけです。と、ランダムについて調べてみたら、Pythonにはリスト中のランダムなデータを取り出してくれるというまさにそのままの目的の便利な関数がありました。その名もrandomモジュールの関数choice()さんです。
使い方はかんたん
>>> import random
して、
>>> print(random.choice(lines))
とするだけで、linesリストの中からランダムな値を取り出してくれます。
なんどか実行してみましょう
>>> print(random.choice(lines))
ワールド[A基本原則](5)この国の人口は何人ですか? 全世界の人口と比べてどうですか? ここでは、土地の人口数で、村・町・都 市のように区分されていますか?
>>> print(random.choice(lines))
ワールド[A基本原則](4)どのくらい以前よりこの世界に人々がいましたか? 彼らは進化して現在の形になりましたか? それとも、 彼らは他のどこかから(いつ?)移住したのですか?
>>> print(random.choice(lines))
ワールド[A基本原則](1)自然と物理学の法則は、この世界では実際の地球と異なっていますか? それとも同じですか? どのように 魔法が世界に効いていますか? 魔法の獣(モンスター)はどのような存在ですか?
ほらばっちり☆
こりゃ便利。最大値とか考える必要もなくそのまま行けますね。
おっと、最大値と言えばTwitterはツイートできる文字数制限が140字まででしたね。それ以上の文字数の行はつぶやかないようにしないといけません。
文字数を調べるのもlenで行けます。
>>> print(len(lines[0]))
101
こんなかんじ、0行目は101文字あるよってことです。(数えてみて!)
今回のサンプルデータでは最期の行が140文字を超えるはずです。
>>> print(len(lines[5]))
213
ほら、213文字ありました。
こういうデータがrandom.choiceで出てきたときは、判定して排除しておくようにしないとですね。
では、ここまでは対話モードで行っていましたが、そろそろプログラムの形にしましょう。
こんなかんじのテストプログラムを作ってみました。
random.choiceで140文字以上の行がチョイスされたときは「over!」と表示してもう一度チョイスするようにし、そうでないときはチョイスされた行をそのままprintするプログラムです。
rnd.pyとして保存して実行してみます。
ぶじ、動作していることがわかりますね。最期なんて、2度も6行目がランダムで選ばれ、はじかれてから正しい140文字以内の行が再選択されていることがわかります。おけおけ。
無事動作していることがわかったので、over!の部分は要らないのでカットして、テキストをつぶやくように修正してみましょう。
Python3にもTweepyいれておきましょう
おっと、忘れ物。そういえばPython3にTweepy入れてませんでした。これ入れていないとつぶやけませんね。Python3への入れ方は、
$ sudo pip3 install tweepy
これでいけます。
こんなかんじ。
テスト(サンプル)の完成
さくっと作ったプログラム。
もやっとしているところは自分のキーコードをいれてね♡
いざ実行!
ここの表示は前のまま。
そしで、実際のTwitterを見てみると……
やったー! ばっちりできてますね!!
あとは読み込むデータを実際の大きなファイルにして、定期的に実行するように変更すればBOTの出来上がりです!
※このプログラムは毎回ファイルを読み込むようになっているので、実際に実行すると、大きなファイルではその分おそくなります。もっとエレガントにしても良いのですが、定期実行も一時間おき以上の時間を空けて行うつもりなので、この程度で今のところはよしとしておきます。
↑実際にBOTサーバーが動作しているRaspberry Pi Zero。ずーーーっと電源はいりっぱなしのおつかれさまな奴です。(重なっている上の基板は照明のコントロール用赤外線リモコン基板です)
―――
とりあえずここまでの情報があれば、自動的につぶやくBOTを作成することができるようになったことと思います。
これ以上突っ込んだ内容の解説を始めると、それぞれの方面で解説本が必要になってきます。やりたい事(今回はBOT作り)に向けてなるべく最短距離で走り抜けてみました。語り足りないことなど多々あるかとおもいますが、抜けている大きな穴は皆さんの調査能力に期待してあえて埋めないでおくことにします(ずるい言い訳w)
今回実際に作ったBOTさんは
↑こちらで動いています。よろしくね☆
我が家のRaspberry Piの電源が入っている限りぶつぶつつぶやき続けるはずです。
☆ ☆ ☆
この先はオマケです。読まなくても大丈夫ですが、お金を払ってでもすべてを知りたいッ!っていう方のためのスペシャル情報。自動的・定期的に実行する方法についての解説を追記しておきます。(最期にコピペ用サンプルコードも解説コメント付きでつけておきました)
ここから先は
¥ 200
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,