bot新年あけましておめでとうございます。本年もよろしくお願いいたします。昨年はこちらのブログには一度も投稿しませんでしたね。noteのほうではいくつか記事を書いたのですが。そちらもよければご覧ください。リンクはこの記事の下のほうに貼っておきます。タイトルにあるとおり、新年は明けましたが、僕は抱負を立てませんでした。APIを使ってbotを作ったので、なぜそうしたのか、またその実装について書いていきます。APIでbotを作ったのか新年が明けたら、一年の抱負を立てる。これは極めて一般的な行為でしょう。多くの人が抱負を立て、それを公開する人もたくさんいます。抱負を立てるというのは、素晴らしいことです。目標を持って、それに向かって進むわけですから、目標がなく、ただ闇雲に毎日を過ごすよりも、断然、理想の自分に近づける可能性は高まります。僕は新年の抱負を立てませんでした。新年の抱負を立てないかなぜ新年の抱負を立てなかったか。それは、これまで立てた抱負を思い出したことがないからです。年始に抱負を立てて、年末には翌年の抱負を考える。それただの抱負立てるマン!抱負を立てたなら、年末には、その抱負に対してどのくらい達成できたのか、できなかったのなら、来年はどうしていくべきなのか、検証しなければ意味がありません。PDCAサイクルを回さなければ、ダメなのです。抱負を忘れないようにすればいいじゃん、という声が聞こえました。それも、もうやったそれはすでに、僕にはワークしないことが判明しています。2019年の始めに、抱負を立てました。抱負を立てたことは覚えています。立てた抱負を忘れないようにしたことも覚えています。かの有名な大前研一氏の名言があります。人間が変わる方法は3つしかない。1番目は時間配分を変える。2番目は住む場所を変える。3番目はつきあう人を変える。この3つの要素でしか人間は変わらない。無意味なのは、『決意を新たにする』ことだ。「決意を新たにする」ことは無意味なのです。そこで、僕は自分の決意には頼らず、なにか仕組みを作ることにしました。理想の自分に近づくための仕組み。Twitterかどんな仕組みを作ろうかなぁと考えていたとき、僕はいつものようにTwitterのTLを眺めていました。そこでは、たくさんの人が新年の抱負を公開しており、なにか参考になりそうなものはないかなぁと考えていたのです。そこで、ふと思ったのです。Twitter見すぎじゃね?と。iPhoneには便利な機能があり、自分がどのアプリをどのくらい使っているか見ることができます。アプリを使っている時間。Timeそして、iPhoneを起動して最初に開くアプリ。PickupsTwitter、圧倒的です。TwitterのためにiPhoneを使っていると言っても過言ではない。いやむしろ、Twitterのために起きていると言っても言い過ぎではないくらい、Twitterを使っています。Twitterを使うことをやめようとは思いません。いや、やめようと思ったことは何回もあるのです。前述のとおり、決意は屁の突っ張りにもならないので、ここに仕組みを取り入れることにしました。これだけ多くの時間を費やしているTwitterの利用を仕組みでコントロールできれば、きっと理想の自分に近づけます。何をやりたいか実は、Twitterの利用に関して、日頃から課題に感じていることが2つありました。凝り固まったTLをほぐしたい先述のとおり、長い時間Twitterを使っていますから、そのTLには、多大な影響を与えられているはずです。同じ人たちをフォローしていると、その人たちの意見や考えに自分が染まっていってしまうのではないか、という怖さがあります。凝り固まったTLに影響されて、自分の思考回路まで凝り固まってしまわないようにしなければいけません。同じ人をフォローし続けてしまうかというと、いろいろな原因が考えられます。新たにフォローする人を探す時間がない新たにフォローする人を探す方法が分からないリアルな知り合いをアンフォローしづらいずっと前からTLでは見かけてたけど、フォローするタイミングを失ったずっとつぶやいてない人(アンフォローすべき人)にそもそも気づかないフォロワー数に対してフォロー数が増えるとダサいかもしれないツイートはあんまり好きじゃないのに、有名人だからフォローし続けてしまう根深い問題です。フォロワーと積極的にコミュニケーションをとりたい2つ目の課題は、フォロワーとのコミュニケーションです。僕は個人的に、あまりフォロワーとコミュニケーションを取らないほうなのですよね。それが良くないとは思いつつも。コミュニケーションといっても、リプを送り合う必要はなく、ただlikeしたり、RTしたりするだけでも、コミュニケーションが生まれると思っているのですが、なんとなくめんどくさかったり、likeのリストを後で見返したいツイート集として使っているというのもあり、あまりフォロワーのツイートに反応しないというのが現状です。Twitterを通して社会とつながること、それ自体に意味がありますし、そのためにフォロワーとのコミュニケーションは欠かせません。自分がブログを書いたときや求人系のツイートをしたときにはRTやlikeがほしいのですが、普段自分がフォロワーのツイートに反応しないくせにそれを期待するなんて、我ながら虫が良すぎるとも思うのです。これら2つの課題を解決するbotを作りました。どんなbotを作ったのか一言で言うと、自分のlike履歴に基づいて自動でフォロー/アンフォローするbotです。詳しく言うと、ある一定期間、自分からのlikeがなかった人のうち数人をランダムにアンフォローし、自分がフォローし続けている人がフォローしている人のうち数人をランダムにフォローしてくれます。このbotを導入することにより、botにアンフォローされたくない人のツイートを積極的にlikeするようになり、自分がlikeしていない人が自動でアンフォローされ、意識しなくても新たなフォローが増え、TLがほぐされていきます。完璧に先程の課題を解決する流れができあがりました。決意に頼らず、botに頼る。具体的な実装は以下のとおりです。全体像まずは全体像をご覧ください。かっこよく見せるために英語で作った図です。細かい部分は後述しますが、大きく4つのパートに分かれています。APIインスタンスを作成するスクリプト(get_api.py)、自分のlike履歴を自動収集するスクリプト(auto_fav_collect.py)、自動でアンフォローするスクリプト(auto_unfollow.py)、自動でフォローするスクリプト(auto_follow.py)、の4つです。これらをタスクスケジューラを使って定期実行させることでbot化させています。APIインスタンス作成(get_api.py)まずはAPIインスタンスの作成パートです。TwitterのAPIを触ったことがある方なら見慣れた内容かもしれませんが、keysにご自身のアカウント名やキー、トークンを設定してください。APIはけっこうデータ取得制限が厳しいので、エラーをしょっちゅう吐きます。そのあたりを処理してくれるようにパラメータをこんな感じで設定しておくと吉です。ちなみにanalyze_worldは僕のTwitterアカウントのscreen_nameです。フォローしてください。APIはこの記事を書いたときに使ったのですが、新たにアカウントを作り直しました。www.analyze-world.com久しぶりにアカウントを発行したので、このサイトを参考にさせていただきました。自分のlike自動収集(auto_fav_collect.py)さて、自分のlike履歴を自動収集するスクリプトです。これに関しては、APIの制限がとりわけ厳しいため、小分けにして収集が必要です。フォロー、アンフォローは1週間に1回で設定しますが、1週間分のlikeを取得しようとすると制限に引っかかるので、このスクリプトのみ毎日走らせることにしています。全履歴を毎回取得するのは無駄の極みなので、前回の履歴からの差分だけを取得するようにしましょう。あと、このスクリプトは制限がきつくてエラーになりやすいので、ログを貯めるようにしています。自動アンフォロー(auto_unfollow.py)パラメータは変更可能ですが、「直近90日間で自分からのlikeがなかった人のうち、ランダムに20人を毎週アンフォローする」仕様にしました。自動フォローも毎週20人にしているため、全体のフォロー数には影響がありません。20人としたのは、今のフォロー数が400強なので、5%くらいは入れ替わらないと意味がないかなと思ったためです。ここでは、先程の自動like収集の結果と、現時点での自分のフォローリストから、アンフォローの対象となる(直近90日間likeなし)人をリストアップし、その中から完全にランダムで20人を選び出します。自分でアンフォローするときは胸が痛む僕でも、botがやってくれるなら安心です。この仕組みを導入することで、likeは「この人のツイートは見続けたいときに押すもの」という確固たる定義が自分の中でできたのも収穫です。#一回で何人をアンフォローするか。自動フォロー(auto_follow.py)自動フォローのスクリプトです。どんな人を自動フォローの対象にするか、というのはいろいろ考えましたし、今回のやり方以外にも方法はあると思いますが、今回は、「自分がフォローしている人がフォローしている人」をランダムにピックアップすることにしました。自分がフォローしている人がどんな人をフォローしているのか、どんなTLを普段見ているのか、気になるところですし、きっとそこには自分の知らない素晴らしいツイッタラーがいるはずです。自分がフォローしている人全員を対象にして候補リストを作ってしまうと、リスト作りだけで時間がかかりすぎてしまいます。実際にフォローするのは20人だけなので、自分がフォローしている人の中からランダムに1人を選定し、その人がフォローしている人リストを取得、その中から20人を選びます。#何人のフォローしている人のフォローを探索するか。#何人のフォローを一度に増やすか。num_follow)ちなみに、このスクリプトで3人分、自動フォローしてみた結果。「おおお、見たことないけど、プロフィール的にはすごくよさそう」って感じの3アカウントでした。定期実行スクリプトができあがったら、これをタスクスケジューラで定期実行設定します。僕はWindows使いなので。この記事を参考にしました。www.atmarkit.co.jpちなみに、僕はpython関連のライブラリはcondaで入れているのですが、環境変数のpathを設定してなくてかなり詰まったので、ご注意ください。タスクスケジューラの「操作」タブ、プログラム/スクリプトに「C:\Users\ユーザー名\AppData\Local\Continuum\anaconda3\python.exe」を入れ、このpython.exeからライブラリが入ったフォルダまでのパスが通っておらず動かなかったのですが、以下を追加してなんとかなりました。まとめはい、ということで、今後、このbotを使っていきます!決意は一切不要!年明けからいい仕事ができました。noteも書いてるので、ぜひー。APIを用いてデータを取得しています。