やっと困っていた問題が解決した。
その問題とはtwitterのbotにおけるステータスナンバーの比較だ。
以前話題になった問題の一つに『2,147,483,647問題』というのがあった。
これはプログラム言語での処理時にオーバーフローを起こし、自分が意図した処理とは別のことが起こってしまう問題だ。
その原因は変数の許容する数字の桁数だった。
変数の型について
プログラム言語の変数には型と言われる分類があり、
それにより色々な処理が楽にできるようになっている。
その型の一つに『interger』と言うのがある。
これは数字を扱う型の一つなんだけど、
その型というのは数学としての数字と文字列としての数字を区別するのに必ずいる。
数字を計算しようとしてるのに連結したりしたら困るからね。
で、PHP言語における解決方法としてはintergerじゃなくてfloatを使う。
これで多くの問題は解決する。
このfloat型の変数というのは14桁の数字まで扱える。
これは10兆の桁まで扱えるものなんだけど、現在のTwitterのステータスナンバーは1000兆の桁を超えているみたい。
そりゃエラーも出ますね。
僕の環境ではbotがステータスナンバーを比較して返答をする時にその不都合は効いてくる。
毎度取得するステータスナンバーが変数の桁数から溢れて、全然正しくないランダムな数字になる。
これにより特定の発言へ延々と返信したり、全く返信しなかったりしたのだ。
ステータスナンバーの比較
さっそく自分が書いたコードを貼り付ける。
//TwitterAPIを呼び出すのは省略 $xml = "TwitterのAPIを呼び出した結果がxmlで入っている" //比較されるステータスナンバーを配列に入れる $hikaku_number = "10000000000000000"; $array_hikaku_number = str_split($hikaku_number); //比較開始 foreach( $xml->status as $value ){ //発言のステータスナンバーを配列に入れる $status_number = strval($value->id); $array_status_number = str_split($status_number); //ステータスナンバーの比較のためのフラグ $reply_flag = false; $break_flag = false; //まずは桁数の比較。次に前から順に数字に変換して比較。 if( count($array_status_number) > count($array_number) ){ $reply_flag = true; } else { $i = 0; foreach( $array_status_number as $value ){ if( $value === $array_hikaku_number[$i] && $break_flag === false){ //何もせずに次の位へ }elseif( $value > $array_hikaku_number[$i] && $break_flag === false){ $reply_flag = true; $break_flag = true; }else{ $break_flag = true; } $i++; } } if ($reply_flag){ //投稿処理 } }
『$xml』の中には既に呼び出されたAPIがXMLの形で入っているとする。
そして比較方法はステータスナンバーを配列に一桁ずつ入れ、それを比較するという感じ。
最初はステータスナンバーを文字列として扱い、それを前から一つずつ配列に入れていく。
配列に入れたら数字をinterger型に変換して比較作業へと移る。
6行目と12行目が一桁ずつ配列に入れているところね。
15,16行目は配列を比較するための分岐フラグ。
19行目で桁数を比較し、異なる場合はステータスナンバーの方が大きいと判断。
同じ場合は23行目から33行目までの間で処理をする。
23行目は数字が同じだった時、26行目はステータスナンバーの方が大きかった時、29行目は小さかった時です。
そして大きかった時のみ35行目から37行目の間で投稿処理等をする。
まとめ
記事を書いていて思ったけど、もっとスマートな方法があるんだろうな。
ステータスナンバーの比較で詰まったとか最近は全く見あたらない気がするし。
でも、この配列を利用する方法なら桁数が大きくなっても結構いけると思う。
いつかは桁数が溢れる時が来るけど、それはまだ大分先だろう。
さて、次の問題は自動フォローアンフォローのスパムブロック機能付きを探すことかな?
これがあればbotもスパムに汚染されなくて良いし助かるんだけどな。
もし良い方法があればコメントとかで教えてくださいლ(╹◡╹ლ)
コメント