StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

ブログのドメイン変更/TwitterのAPIについての悩み

 ブログの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とかやればいいのですが、調べても今のところよく分からない状況です。


f:id:midnightseminar:20170204112547j:plain


【追記】
 ブロックされているかを確認する方法は、分かりました。
 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型に直すようにします。


参考↓
www.statsbeginner.net


【追記】
 IDがfloat型になってしまう現象も、Pandasで空のデータフレームを扱った際の挙動であることが判明し、これはエントリを起こしました。
www.statsbeginner.net


【/追記】