ブログのURLを変更しました。
旧URL http://statsbeginner.hatenablog.com/
↓
新URL http://www.statsbeginner.net/
旧URLのままでもアクセスできるようですが。
・・・そのことだけ書いて終わりというのもなんなので、最近の悩みを書いておきます。
Tweepyを使ってPythonからTwitterのAPIを触っているのですが、他の人のユーザ情報を取得しようとしたときに、ブロックされているかどうかの判断がうまくできません。
Tweepyが返すuserオブジェクト(Twitterが返すJsonでも同じですが)をみると、'protected'という項目があるので、これがTrueかFalseかで「鍵垢かどうか」はわかります。それは分かるのですが、ブロックされていることを示す情報が、見当たらないんですよね。
ブロックされている場合、たとえばuserオブジェクトからstatusという項目が抜け落ちます。そのユーザの最新ツイートを取得できないということなのです。これである種の判断はできるのですが、statusが外されるのは鍵垢の場合も同じなんです。
念のため、ブロックされている場合に返ってくるuserオブジェクトと、鍵垢である場合に返ってくるuserオブジェクトを比較したのですが、全て同じでした。
だから、「鍵垢であるがブロックはされていない」ケースと、「鍵垢でありブロックもされている」ケースの区別がつきません。'protected'=Falseである(鍵垢である)かつstatusがないというケースについては、「鍵垢ではないが、ブロックされているのだろう」と判断できるのですが。
Twitterのアプリとか使ってると、「◯◯さんにブロックされているので、◯◯さんのツイートを表示できません」って出るので、APIの中に対応する情報があるのでは?とは思っています。Tweepyはカバーしている機能が限定的なので、公式APIに対応する項目があるならurllib2とかやればいいのですが、調べても今のところよく分からない状況です。
【追記】
ブロックされているかを確認する方法は、分かりました。
Friendshipオブジェクトというのがあり、その属性でblocked_byという項目があるので、ここがTrueになっていたらブロックされているということですね。
なお、認証に使っているユーザ(つまり自分のアカウント)についてはブロックされているかが分かりますが、source_screen_nameのところに他のユーザを入れた場合は、blocked_by等の項目はNone(不明)という値になります。
>>> api.show_friendship(source_screen_name='statsbeginner', target_screen_name='InsideCHIKIRIN') ( Friendship( followed_by=False, blocking=False, following_received=False, id=257791390, live_following=False, muting=False, notifications_enabled=False, can_dm=False, following=False, following_requested=False, _api=<tweepy.api.API object at 0x11240bef0>, want_retweets=False, id_str='257791390', screen_name='statsbeginner', marked_spam=False, blocked_by=True, all_replies=False ), Friendship( followed_by=False, following_received=False, id=150598902, following=False, following_requested=False, _api=<tweepy.api.API object at 0x11240bef0>, id_str='150598902', screen_name='InsideCHIKIRIN' ) )
(↑見やすいように改行とインデントを入れています。)
相手が鍵垢であった場合も、値がNoneになったりはせず、ブロックされていればTrueと表示されます。
【/追記】
あともう1個悩みがあって、Tweepyで取得してデータを色々加工して記録してるのですが、稀にどこかの処理でTwitter ID(数字の並び)がfloat型になってしまっているようで、桁数が多いと指数表示で後ろのほうが省略されてしまい、一応また別の処理で自動的にint型に戻るのですがその時に数字がずれて別IDになってしまいます。floatにするようなことは明示的にはしていないので、どこかのエラーなのですがまだ把握できていません。
int型で扱ってるのは、APIから返ってくる整数の文字列が自動的にint型として認識されるからそれに合わせてるのですが、数字じゃなくてIDなのだから、あとで明示的に全部str型に直すようにします。
【追記】
IDがfloat型になってしまう現象も、Pandasで空のデータフレームを扱った際の挙動であることが判明し、これはエントリを起こしました。
www.statsbeginner.net
【/追記】