PythonでTwitterのbotを作ろう!(定期投稿タイプ)
定期投稿する簡単なbotを作ります
いくつも用意しておいた文章の中から、ランダムで10分に1回投稿します。かなり単純ですが、色んな応用例が考えられますね。
以下で作り方を説明します。今回は定期投稿するbotについてのみ解説します。(リプライに返事等はしません)
全ての作業はラズベリーパイ3で行なっています。OSはLinuxの一種のraspbianです。
まずはbot用アカウント作成
Twitterのサイトへ行き、作りたいbotの名前でアカウントを作成します。
この時メールアドレスが他のアカウントと重複していると作れないのですが、Gmailを使ってる場合はエイリアス機能というやつで解決できます。
例えば手持ちのGmailアドレスが"temochi@gmail.com"だとすると、"temochi+bot@gmail.com"などの様に、太字部分を付け足しても前者のメールアドレス("temochi@gmail.com")にメールが届くという仕組みです。
これで登録しておけば、別のメールアドレスだと認識されます。とっても便利。
また電話番号も重複していると登録できません。あらかじめ元々持っているTwitterアカウントに紐付けされている電話番号を削除しておけば問題ないので、先に消しておきましょう。
次の段階では電話番号の登録が必要になります。
必要なモジュールをインストール
sudo pip3 install requests_oauthlib
これをターミナルに打って、インストールしておきます。
キーやトークンを取得
上記のサイトにアクセスし、Create New Appをクリック、上からbotの名前・説明、URLを入力します。規約に同意するチェックを入れて、下のボタンを押すと登録できます。
この時、さっき作ったbot用アカウントに電話番号が登録されていないとエラーが出るので気をつけてください。
登録できたらKeys and Access Tokensというところを開くと、以下のファイルに対応するキー4つが見つかるはずです。トークンはCreate my access tokenボタンを押せば出ます。
取得したキーをsettings.pyという名前で作ったファイルに以下のように保存しておきます。XXXXXXの部分に取得したキー等をそれぞれ入力します。(実際はもう少し長い文字列)
実際のコード
では実際のコードを見てみましょう。これを"tweet.py"みたいな名前で保存しておきます。
まずこのコードを動かすためのモジュールがいくつかインポートされています。5行目でインポートされているのが、先ほど作った設定ファイルです。
11行目にツイートしたい内容を入力します。ダブルクォーテーション(")でくくり、コンマで区切って入力してください。
13行目で先ほど入力した内容の中から一つがrandomtweetという変数に入力されます。
14行目、15行目ではタイムスタンプを用意しています。これは、Twitterに一定時間内に全く同じ文言を何度もツイートしようとするとエラーが出るので、それを避けるためです。いらなかったら消してもOK。
17行目でrandomtweetとタイムスタンプを合わせてツイート内容を用意。
あとはインポートしたモジュールがうまいことしてくれます。詳しく知りたい人は下部にリンクした参考サイトを見てください。
実行してみてエラーが出ず、きちんとツイートされているようなら次へ進んでください。定期実行してみましょう。
cronの設定
cronとは決まった時間にプログラムを実行してくれるタイマーみたいなものです。さあここからがちょっとややこしいんですが、私はラズベリーパイでやってるのでそのやり方を説明します。
まずターミナルでcrontab -eと入力します。使うエディタを聞かれるので、2番のnanoを選びます。そして下の空いてるところに*/3 * * * * python3 /home/pi/tweet.py等と入力し(自分が保存したプログラムのパスを入れてください)、Ctrl+oを押してEnterで保存し、Ctrl+xを押して終了します。これで3分おきにプログラムが実行され、ツイートされます。
詳しくはこのサイトなどを見てください。
私が引っかかったポイントを説明しておきます。 アスタリスク(*)の間には一つずつスペースを入れ、アスタリスクと何分おきかを示すスラッシュ(/)の間にはスペースを入れません。
Herokuを使って定期実行できるようになりました(2017/06/04追記)
少しコードに変更(APIキーとタイムスタンプの部分)がありますので、注意してください。1番短い間隔で、10分おきにツイートできます。
もっと簡単にbotを作る
もっと簡単にbotを作れるwebサービスもあるようですが、短くて30分おきにしかツイートできないようなので、私は使いませんでした。それくらいの間隔で充分というなら便利に使えそうです。なので貼っておきます。
自分の普段使ってるアカウントで、何かのお知らせ定期ツイートだけしたいという人もこういうサービス使えば簡単そう。
注意事項
Twitterの規約はしっかり読んでおきましょう。うっかりするとbotだけでなく、通常利用のアカウントまで凍結される恐れがあります。
この中に気になる事項があって、複数アカウント取得するのはもしや禁止なのでは?と思ったのですが、以下のサイトによると、攻撃的なアカウントでなければ大丈夫なようです。人を傷つけることのないbotを作り、楽しいTwitterライフを!
Twitterルール改定──人種や性的指向へのヘイト行為や脅迫行為など、禁止事項が詳細に - ITmedia NEWS
参考サイト
かなり参考にさせてもらいました。わかりやすいです。
グラフにすればよくわかる!Twitterから自分のツイートをダウンロードして分析する方法。
(2017/03/30追記:もっとわかりやすく使いやすいプログラムを書けたので新しい記事を書きました。下のリンクから飛んでください。)
Twitterでよくある診断アプリは好きですか?自分がどんな人間かわかってるつもりでも、目に見える形にまとめられると新たな発見があって面白いですよね。
ただ、ああいうアプリではTwitterの仕様により、過去の全ツイートを読み込んで分析するということができません。ツイート頻度が高い人では特に、ごく最近のツイートからしか結果に反映されなくてつまらなかった…ということもあります。
それならPythonで簡単診断!
それならば!Python(Pythonとは、初心者にも使いやすいプログラミング言語です。)を使って自分で色々と自分のツイートを分析してみましょう。以下のグラフを見てください。これは私の全ツイート履歴から、非常に辛い気持ちを表す言葉が含まれるツイートの数を時系列で表したものです。私は双極性障害という病気持ちなので、かなりはっきりした波があることがわかります。
これだけでも何となく面白いですが、これに"お金"という言葉を含むツイートのグラフを重ねてみると…
こうなりました。お金について言及している時(私の場合ほぼお金がない時)には、やはり死にたい気持ちも強くなるのかもしれませんね。こうやって重ねてグラフにすると、とてもわかりやすいです。
今回はこのように自分の全ツイート履歴から、任意の言葉を含むツイートを時系列でグラフにするということを説明します。私は自分のメンタル分析・改善を目的としてるので暗いグラフを作ってますが、皆さんは好きな人・物などでグラフを作ってみると楽しいと思います。
Python環境構築
環境構築についてはOSによって違うので、以下のサイトを参考にしてください。すみません、あんまり詳しくないので丸投げ。ちなみに私はRaspberry pi3を使っていて、OSはRaspbianです。ラズパイは教育向けにできてるらしく、Pythonも元々入っています。みんなもラズパイ買っちゃいなよ。
いくつかライブラリをインストール
以下ラズパイのターミナルにコマンドを打ちます。環境によって違うかもしれませんが、ググればいっぱい情報出てくるはず。
sudo pip3 install pandas matplotlib numpy
もしこの辺でわからないことがあったら、コメントに書いてもらえればわかることなら答えます。
ツイートの履歴を取得
Twitterの設定の中に全ツイート履歴をリクエストするというボタンがあるので押してください。しばらくすると登録メールアドレス宛に送られてきます。解凍して適当な場所に保管してください。
さあ実践
まずは下のコードをメモ帳などのテキストエディタに貼り付け、"twigraph.py"という名前で保存します。拡張子(.py)があっていれば、名前は今適当に考えただけなので違ってもOKです。
まず8行目でダウンロードしたツイート履歴を読み込んでいます。自分が保存した場所のパスを入力してください。その次9行目から11行目に自分が抽出したいキーワードを入力します。3つまで同時に扱えるようにしました。それより多いと重なり過ぎてわけわからんことになると思います。11行目は今使っていないので、コメントアウトしています。(先頭に#をつけて無視されるようにしている)キーワードを3つ使うときは#を外します。
その後はデータをグラフに出力できる形式に整えています。20行目から24行目、これも今使っていないのでコメントアウトしています。この場合はこの場合は複数行なので行の前後をダブルクォーテーション3つ(""")で挟んでいます。これもキーワードを3つ使うときは外します。
34行目から36行目には、グラフの凡例を入れます。日本語入力するには設定が大変そうなので、ローマ字で入れてください。そしてまた保存しておきます。
いざ実行
自分の構築した環境で実行してみてください。どうでしょう?グラフがちゃんと出ましたか?
出てないかもしれませんね。私もグラフ出るようになるまでめっちゃ時間かかりました。backendの設定が云々とかあるかもしれません。しかしそろそろ疲れたので終わりにします。何かあれば聞いてください!私も初心者なので答えられないかもしれませんが、一緒に考えましょう。
ちゃんとグラフ出た人は色々キーワード変えて楽しんでみてください。それでは!
(2017/03/16追記:matplotlibバックエンドの設定、下のサイト見るとわかりやすいです。)
matplotlibのデフォルトのバックエンドをPyQt4にする - 計算物理屋の研究備忘録
(2017/3/19追記:同じキーワードで複数の呼び名が考えられる時(ex.猫,にゃんこ,ネコ)、まとめるにはstr.contains("猫|にゃんこ|ネコ")という風に指定します)
【初心者向け】Python標準入力の取扱い
先日紹介したpaizaですが、スキルチェック問題を解くのに初心者は絶対つまづくんじゃ?と思ったポイントがあったので、簡単に解説したいと思います。
一番簡単なの
まず一行・一回だけ読み込み。これは簡単。
3行目で標準入力から一行代入されます。ここで注意するポイントは、このままだとstr型(文字列)で受け取ることになるということです。文字列ならそれでいいのですが、例えば
このプログラムで入力が”10”だった場合、何が出力されるかわかりますか?正解は、10×2で20!・・・ではなく”1010”となります。何故こうなるかというと、str型で受け取っているため、数字ではなく文字列として認識されているからです。数字として扱い、計算するにはまずstr型からint型(整数)もしくはfloat型(小数点)に変換する必要があります。
なので、こう。aに代入する時に、一緒にint型に変換します。これで実行すると”1010”ではなく”20”と計算できました。
また、1行ではあるけれど、スペース区切りでいくつかの入力がある場合もあります。"2 10"など。
それぞれを別々の要素として、同じリストに受け取ってみましょう。split()というメソッドでそれが実現できます。
このかっこの中には区切り文字を指定できますが、詳しくは過去記事で紹介してるサイトを見たほうがわかりやすいと思います。スペースで区切る場合は何も入れなくて大丈夫です。
さて、上のコードで分割はできました。しかし先程と同じように、このままではstr型のままです。では”a = int(input().split())”とすれば良いのでしょうか?ここが私のどハマリしたポイントです。実はそう簡単にいかないのです。”a = int(input().split())”として実行したところ、こんなエラーが出ると思います。
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
int関数の引数はリストじゃあきまへんで~ってことですね。ではどうするか。以下のような方法があります。
これが本命
これで一行丸ごとint型で且つsplit ()関数によって分割されてリストに収納されました。
sysモジュールを使う
またsysモジュールを使う方法もあります。使うには三行目のように、あらかじめimportしておく必要があります。これだと複数行の入力をまとめてint型に変換できます。ただ、これだとsplit()を使えないので一行に一つの入力がある時しか使えません。
もしかしたらもっと他にスマートなやり方があるのかもしれませんが、この辺がわかっていれば標準入力だけでつまづくことは少ないと思います。あとはfor文で何とかします。append関数も覚えておくと便利。ループ処理等がわからない初心者さんはとりあえず過去記事で紹介したサイトでお勉強してくださいね。それでは!
2019年7月16日追記:paiza公式ブログで動画解説してくれてました。
Pythonの勉強にオススメのサービス3つ。全部無料!
Python完全に初心者の人向け。全部無料!
たくさんオススメしても悩むだけなので、3つだけです。まずは始めよう!
1. まずはこれ。元々は転職サービスみたいだけど、様々な言語の初心者向け動画講座が受けられます。もちろんPythonも。ブラウザ上で実際に手を動かしながら覚えられるのでわかりやすいです。動画を見終わったあとは、スキルチェック問題にチャレンジ。S~Dランクまで問題があり、解けるとランキングがわかるので(翌日)ゲーム感覚で楽しめます。問題を解くためにわからないところを調べると勉強になって良いです。あとは模範解答が見れたら最高なのになー。
2. 次はこれ。わかりやすく解説がまとまっています。paizaのスキルチェック問題を解いてる時にわからないことを検索すると出てきて何度もお世話になりました。そして気がついた。先にこのサイトを全部読めばいいんじゃね?と…。その後はpaizaのD問題がちゃんと解けるようになりましたとさ。めでたしめでたし。(C問題は問題によって解けたり解けなかったり)
3. 最後はこれ。iPhoneアプリ(Androidアプリがあるかは知りません)で、全部英語ですが時間制限もないのでゆっくり読むとわかるはず。プログラミング言語の勉強するとどうしても英語の文章を読む機会が増えるので、それに慣れる意味でもオススメ。これも解説の後に穴埋め問題があり、ちょっとしたスキマ時間に勉強できます。
このアプリにはCode PlaygroundというPython実行環境がついていて、iPhone上でちょっとしたコードの動作確認したりするのにも便利です。
以上です。まだ勉強途中ですが、他人のコードを見て何がどうなってるかわかる程度にはなりました。
paizaのスキルチェック問題を解く時、最初に標準入力の受け取り方がわからなくてめちゃくちゃハマりました。それについてもまた今度。
(3/10追記:標準入力についての記事を書きました。)
<2018/9/27追記:Progateのほうがオススメかも。楽しいよ。>