読者です 読者をやめる 読者になる 読者になる

ひとメモ

Pythonを勉強して主にラズパイで何かするブログ

PythonでTwitterのbotを作ろう!(定期投稿タイプ)

この記事を見て作れるbotの例

アファメーションbot (@affirfbm) | Twitter

アファメーション(自己暗示みたいなもの)を5分に1回ひたすら呟くbotです。(現在停止中)

本来は自分で声に出して言うものですが、中々続かないんですよね。私はTwitter依存気味なので、TLに勝手にアファメーションが流れてきたらいいかもと思い作成しました。願望垂れ流しでちょっと恥ずかしいけど、なかなかいい感じです。

 

以下で作り方を説明します。今回は定期投稿する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


これをターミナルに打って、インストールしておきます。

 

キーやトークンを取得

Twitter Application Management

上記のサイトにアクセスし、Create New Appをクリック、上からbotの名前・説明、URLを入力します。規約に同意するチェックを入れて、下のボタンを押すと登録できます。

この時、さっき作ったbotアカウントに電話番号が登録されていないとエラーが出るので気をつけてください。

登録できたらKeys and Access Tokensというところを開くと、以下のファイルに対応するキー4つが見つかるはずです。トークンはCreate my access tokenボタンを押せば出ます。

取得したキーをsettings.pyという名前で作ったファイルに以下のように保存しておきます。XXXXXXの部分に取得したキー等をそれぞれ入力します。(実際はもう少し長い文字列)

gist.github.com

 

実際のコード

gist.github.com

 では実際のコードを見てみましょう。これを"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分おきにプログラムが実行され、ツイートされます。

 詳しくはこのサイトなどを見てください。

cronの設定方法 - Qiita

私が引っかかったポイントを説明しておきます。 アスタリスク(*)の間には一つずつスペースを入れ、アスタリスクと何分おきかを示すスラッシュ(/)の間にはスペースを入れません。

 

もっと簡単な方法もあるみたいです

この方法で定期ツイートするbotはできるようになりましたが、ラズパイは立ち上げっぱなしです。どこかのサーバーにプログラムを置いて、みたいなやり方もあるようですが、面倒臭そうなので私は今のところこのやり方でいってます。ラズパイは消費電力も少ないらしいし。(Herokuってやつが良さそうなので、試してみて良ければ記事更新します)

もっと簡単に作れるサイトもあるようですが、短くて30分おきにしかツイートできないようなので、私は使いませんでした。それくらいの間隔で充分というなら便利に使えそうです。なので貼っておきます。

 twittbot - enjoy

 

注意事項

Twitterの規約はしっかり読んでおきましょう。うっかりするとbotだけでなく、通常利用のアカウントまで凍結される恐れがあります。

The Twitter Rules | Twitter Help Center

この中に気になる事項があって、複数アカウント取得するのはもしや禁止なのでは?と思ったのですが、以下のサイトによると、攻撃的なアカウントでなければ大丈夫なようです。人を傷つけることのないbotを作り、楽しいTwitterライフを!

Twitterルール改定──人種や性的指向へのヘイト行為や脅迫行為など、禁止事項が詳細に - ITmedia NEWS

 

参考サイト

かなり参考にさせてもらいました。わかりやすいです。

 PythonでTwitterしてみた - Qiita

グラフにすればよくわかる!Twitterから自分のツイートをダウンロードして分析する方法。

(2017/03/30追記:もっとわかりやすく使いやすいプログラムを書けたので新しい記事を書きました。下のリンクから飛んでください。)

hwhw.hatenablog.com

 

Twitterでよくある診断アプリは好きですか?自分がどんな人間かわかってるつもりでも、目に見える形にまとめられると新たな発見があって面白いですよね。

ただ、ああいうアプリではTwitterの仕様により、過去の全ツイートを読み込んで分析するということができません。ツイート頻度が高い人では特に、ごく最近のツイートからしか結果に反映されなくてつまらなかった…ということもあります。

 

それならPythonで簡単診断!

それならば!PythonPythonとは、初心者にも使いやすいプログラミング言語です。)を使って自分で色々と自分のツイートを分析してみましょう。以下のグラフを見てください。これは私の全ツイート履歴から、"死にたい"という言葉が含まれるツイートの数を時系列で表したものです。私は双極性障害という病気持ちなので、かなりはっきりした波があることがわかります。

f:id:hwhw:20170312014058p:image

 これだけでも何となく面白いですが、これに"お金"という言葉を含むツイートのグラフを重ねてみると…

f:id:hwhw:20170312014149p:image

こうなりました。お金について言及している時(私の場合ほぼお金がない時)には、やはり死にたい気持ちも強くなるのかもしれませんね。こうやって重ねてグラフにすると、とてもわかりやすいです。

 今回はこのように自分の全ツイート履歴から、任意の言葉を含むツイートを時系列でグラフにするということを説明します。私は自分のメンタル分析・改善を目的としてるので暗いグラフを作ってますが、皆さんは好きな人・物などでグラフを作ってみると楽しいと思います。

 

Python環境構築

環境構築についてはOSによって違うので、以下のサイトを参考にしてください。すみません、あんまり詳しくないので丸投げ。ちなみに私はRaspberry pi3を使っていて、OSはRaspbianです。ラズパイは教育向けにできてるらしく、Pythonも元々入っています。みんなもラズパイ買っちゃいなよ。

 

 

いくつかライブラリをインストール

以下ラズパイのターミナルにコマンドを打ちます。環境によって違うかもしれませんが、ググればいっぱい情報出てくるはず。

 

sudo pip3 install pandas matplotlib numpy

 

もしこの辺でわからないことがあったら、コメントに書いてもらえればわかることなら答えます。

 

ツイートの履歴を取得

Twitterの設定の中に全ツイート履歴をリクエストするというボタンがあるので押してください。しばらくすると登録メールアドレス宛に送られてきます。解凍して適当な場所に保管してください。

 

さあ実践

まずは下のコードをメモ帳などのテキストエディタに貼り付け、"twigraph.py"という名前で保存します。拡張子(.py)があっていれば、名前は今適当に考えただけなので違ってもOKです。

gist.github.com

まず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ですが、スキルチェック問題を解くのに初心者は絶対つまづくんじゃ?と思ったポイントがあったので、簡単に解説したいと思います。ちなみに私はどハマりしました。(このハマるって言葉もプログラミング界隈ではやや普段使う意味と違う使われ方をしている気がします。楽しくてつい夢中になるのではなく、解決できずドツボにはまるという意味。多分…。)

 

一番簡単なの

まず一行・一回だけ読み込み。これは簡単。

gist.github.com

 

 3行目で標準入力から一行代入されます。ここで注意するポイントは、このままだとstr型(文字列)で受け取ることになるということです。文字列ならそれでいいのですが、例えば

gist.github.com

このプログラムで入力が”10”だった場合、何が出力されるかわかりますか?正解は、10×2で20!・・・ではなく”1010”となります。何故こうなるかというと、str型で受け取っているため、数字ではなく文字列として認識されているからです。数字として扱い、計算するにはまずstr型からint型(整数)もしくはfloat型(小数点)に変換する必要があります。

gist.github.com

なので、こう。aに代入する時に、一緒にint型に変換します。これで実行すると”1010”ではなく”20”と計算できました。

 

また、1行ではあるけれど、スペース区切りでいくつかの入力がある場合もあります。"2 10"など。

それぞれを別々の要素として、同じリストに受け取ってみましょう。split()というメソッドでそれが実現できます。

gist.github.com

このかっこの中には区切り文字を指定できますが、詳しくは過去記事で紹介してるサイトを見たほうがわかりやすいと思います。スペースで区切る場合は何も入れなくて大丈夫です。

さて、上のコードで分割はできました。しかし先程と同じように、このままでは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関数の引数はリストじゃあきまへんで~ってことですね。ではどうするか。以下のような方法があります。

 

これが本命

gist.github.com

これで一行丸ごとint型で且つsplit ()関数によって分割されてリストに収納されました。

 

sysモジュールを使う

またsysモジュールを使う方法もあります。使うには三行目のように、あらかじめimportしておく必要があります。これだと複数行の入力をまとめてint型に変換できます。ただ、これだとsplit()を使えないので一行に一つの入力がある時しか使えません。

gist.github.com

 

もしかしたらもっと他にスマートなやり方があるのかもしれませんが、この辺がわかっていれば標準入力だけでつまづくことは少ないと思います。あとはfor文で何とかします。append関数も覚えておくと便利。ループ処理等がわからない初心者さんはとりあえず過去記事で紹介したサイトでお勉強してくださいね。それでは!

 

 

hwhw.hatenablog.com

 

 

 

Pythonの勉強にオススメのサービス3つ。全部無料!

Python完全に初心者の人向け。全部無料!

 

  1. まずはこれ。元々は転職サービスみたいだけど、様々な言語の初心者向け動画講座が受けられます。もちろんPythonも。ブラウザ上で実際に手を動かしながら覚えられるのでわかりやすいです。動画を見終わったあとは、スキルチェック問題にチャレンジ。S~Dランクまで問題があり、解けるとランキングがわかるので(翌日)ゲーム感覚で楽しめます。問題を解くためにわからないところを調べると勉強になって良いです。あとは模範解答が見れたら最高なのになー。

    paiza.jp

  2. 次はこれ。わかりやすく解説がまとまっています。paizaのスキルチェック問題を解いてる時にわからないことを検索すると出てきて何度もお世話になりました。そして気がついた。先にこのサイトを全部読めばいいんじゃね?と…。その後はpaizaのD問題がちゃんと解けるようになりましたとさ。めでたしめでたし。(C問題は問題によって解けたり解けなかったり)

    www.python-izm.com

  3. 最後はこれ。iPhoneアプリで、全部英語ですが時間制限もないのでゆっくり読むとわかるはず。プログラミング言語の勉強するとどうしても英語の文章を読む機会が増えるので、それに慣れる意味でもオススメ。これも解説の後に穴埋め問題があり、ちょっとしたスキマ時間に勉強できます。

    appsto.re

 

以上です。まだ勉強途中ですが、他人のコードを見て何がどうなってるかわかる程度にはなりました。

paizaのスキルチェック問題を解く時、最初に標準入力の受け取り方がわからなくてめちゃくちゃハマりました。それについてもまた今度。

(3/10追記:標準入力についての記事を書きました。)

 

hwhw.hatenablog.com

 

 

 

 

【意外と知らないIT用語】ドメインって何? お名前.com