お帰りなさい｡
そろそろ何かしないと｡
Twitterのボットで生産性を向上させました｡
では､ ここで何ができるのか？
さて､ 私はボットを作りたいのです｡
このボットは､ よく､ あなたはあなたのフォロワーに本当に親切にしたいし､ 人をフォローバックしたいと思います｡
実際に見てみると､ 私はかなり､ かなりひどい状態です｡
フォローしている人は6人しかいないんです｡
でも､ もし私がすべてのフォロワーを調べて､ 一人一人フォローしていたら､ それこそ1万回以上クリックされることになりますね｡
かなり手間のかかる作業ですね｡
私たちのボットでそれができるのか？
まあ､ ええ､ できますよ｡
では､ 超余裕のあるbotをやってみましょう｡
だから､ この気前のいいボットは必ずフォローを返してくれるのです｡
どうやって作るんだ？
まあ､ 単純にループしてフォロワーに言うだけなんですけどね｡
で｡
そして､ ここ､ Tさん｡ P. は､ カーソルと呼ばれるものを与えてくれます｡
さて､ このカーソルは何でしょう？
ここのドキュメントで､ カーソルを入力すると｡
実際のカーソルのチュートリアルをよくしてもらう｡
ここを読むと､ Twitter APIの多くでページネーションを使っていることがわかります｡
そのため､ タイムライン､ ユーザーリスト､ メッセージのどれを見るにしても､ その内容は同じです｡
いろいろなページをクリックする必要がありますよね？
普通はフォロワーが多かったり､ タイムライン情報が多かったりしますよね｡
このカーソルを使えば､ タイムライン全体でもフォロワーリスト全体でも､ Twitter上のあらゆるものを簡単に見ることができますし､
使い方のチュートリアルもあります｡
例えば､ ここをもう少し大きくしてみましょう｡
API user timeline items を行うプリカーサを使用して､ タイムライン上のすべてのアイテムを取得できることがわかります｡
だから､ カーソルを使って､ 実際にアピドットを行うことができるのです｡
すべてのフォロワーをつかむためのフォロワー｡
そして､ 単純にドットアイテムを行うだけです｡
すべてのフォロワーをループできるように｡
さて､ このフォロワーと｡
じゃあ､ プリントアウトしてみようか｡
ここではループしているので､ followersまたはfollowerと表示し､ dot nameと表示するだけです｡
さて､ ここで問題なのは､ このようなことをする場合､ 例えば多くのものをループさせる場合､
何度も何度もAPIを叩くことになることです｡
そして､ Twitterはそれが気に入らないのでしょう｡
これは単純な例ですが､ TwitterのAPIを常に叩いていると､ Twitterのサーバーに負担がかかります｡
世界中の誰もがTwitterのAPIを何度も何度も高速に叩くと､ 例えばPythonならマシン上でとても高速に動作します｡
まあ､ サーバーに負荷がかかって大損害になるか､ サーバーがクラッシュするんだろうけど｡
つまり､ サーバーをクラッシュさせないように､ 数ミリ秒ごとにしかTwitter
APIをリクエストできないようにして､ このTwitterのレート制限に対応できるようにしているのです｡
だから､ ここにレートリミッターを入力すると｡
実はエラーがあるんです｡
レートリミットエラーが表示されているのがわかると思いますが､ これはTwitterのレートリミットに引っかかってAPIメソッドが失敗したときに発生するエラーです｡
こちらのTweet Bでは､ レートリミットエラーを使って､ 「このエラーになったら､ 何かしよう」ということができるようになっています｡
そこで､ ちょっとしたヘルパー関数を作ってみることにします｡
Define limit handleと言いたいところですが｡
このカーソルは､ APIフォロワーのデータ全体を情熱的に処理するためのものです｡
そして､ while this is trueというワイルドループを行います｡
ただただ､ ゆだね続ける｡
カーソルを合わせます｡
次はドットです｡
カーソルは発電機ですから｡
しかし､ ここでnextを呼び続けるたびに､ ちなみに内部的にはカーソルが何をしているかというと､
常にnextを呼び出してひたすら動き続けているのです｡
フォロワーを仕留めるまで続ける｡
しかし
そうでない場合は
まあ､ そういうことなら
除く｡
そして､ 実はこれをトライブロックに包むのです｡
そこで､ このエラーをキャッチできるように､ ここでtryと言うことにします｡
だから､ trueのままtry｡
そして､ その後に｡
除く｡
ティーポットレートリミットエラーが発生したら
まあ､ その場合は､ Twitter APIを叩かないように一時停止して､ 困らないようにして､ やっと少し時間が経った頃に戻ってきたいですね｡
Pythonに組み込まれているtimeというモジュールを使えば､ このようなことが可能になります｡
スリープ（sleep）と呼ばれるもので､ 要するに「おい､ これを一時停止してくれ､ 何が起こっているにせよ､ この行に数ミリ秒だけ留まってくれ」というものです｡
つまり､ 1000回やれば､ 1000ミリ秒､ 1/2になるわけです｡
これでリミットハンドル（リミットハンドラ）と呼べるものができました｡
そして､ カーソルを受け取るリミットハンドラをラップすれば､ この全体をラップすることができます｡
そうそう｡
これをもう少し大きくしてみよう｡
これでよしとする｡
悪用しないように､ レイドの上限に達したら､ エラーになるのではなく､ 少し間を置くようにすることができるようになりました｡
では､ その効果があったのかどうかを見てみましょう｡
保存する
そして､ 私たちのコードの一部を実行します｡
ここをクリアして､ これを実行しましょう｡
わかりました｡
D. C. 今､ 一時停止している様子｡
だから､ レート制限にかかるとすぐに一時停止してしまうんです｡
そして､ それはどんどん進んでいく｡
そして､ そこにあるのは
自分の持っているフォロワーを全部プリントアウトしている｡
カッコイイでしょ？
今､ 実はこれをやめようと思っているのは､ まあ､ まだ通ってるからなんですけどね｡
しかし､ 今できることは､ 実際に一人一人をフォローアップすることです｡
さて､ 私の場合､ Twitterはそんなにやっていないので､ ここで適当に誰かをフォローしてみましょう｡
ここで､ このユーザーを追ってみましょう｡
このユーザーの名前をこうやってコピーして､ ここで面白いことをやってみようと思います｡
もしというところです｡
フォロワー ドットネームは､ この方と同じです｡
じゃあ､ そういうことなら､ この人について行きたい｡
というわけで､ 言ってみることにします｡
彼女の点を追え｡
Followは､ ユーザーをフォローできるようにするものです｡
これを保存して自分のコードを実行すると､ 実行されています｡
走っている､ 走っている｡
先ほども言いましたが､ リストをすべて調べなければならないので､ 少し時間がかかります｡
しかし､ ビデオを一時停止して､ これが終わったら､ これがうまくいったかどうかを確認するつもりです｡