注意
Python3系のコードです。2系の場合はsuper()
あたりをちょっと変えれば動くと思います。
コード
import tweepy
consumer_key = "CONSUMER_KEY"
consumer_secret = "CONSUMER_SECRET"
access_token = "ACCESS_TOKEN"
access_secret = "ACCESS_TOKEN_SECRET"
class StreamListener(tweepy.StreamListener):
def __init__(self, api):
super().__init__(api)
self.me = self.api.me()
def on_event(self, event):
if event.event == 'follow':
if self.me.id != source_user["id"]:
source_user = event.source
event._api.create_friendship(source_user["id"])
print("followed by {} {}".format(source_user["name"], source_user["screen_name"]))
if __name__ == "__main__":
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
stream = tweepy.Stream(auth=api.auth, listener=StreamListener(api))
stream.userstream(_with="user")
説明
userstreamには、ツイート以外にイベントに関するものも流れてきます。
Tweepyのon_event
メソッドは、event
が流れてきた際に発火されるようです。
__init__内
self.me = self.api.me()
on_event内
if self.me.id != source_user["id"]:
とした理由ですが、仕様としてUser follows someone
とUser is followed
が同じfollow
として流れてくる上に、
説明 | Source | Target |
---|---|---|
自分が誰かにフォローされた | Following user | Current user |
自分が誰かをフォローした | Current user | Followed user |
この表のように、場合によって自分と相手の入る位置が変わってしまいます。
そのため、自分がフォローを返した際に、自分をフォローしようとしてしまいます。
その場合、エラーが発生してしまうため、それを避けるためにインスタンス作成時に自分の情報を取得しておき、follow
イベントが流れる度にsource_user
のid
を自分のid
と比較しています。
また、event
にはunfollow
というものがありますが、これは自分が他ユーザーのフォローを解除した際に流れてくるもので、他ユーザーからフォロー解除された旨を受け取ることはできません。
なので、自動フォロー解除については、適時REST APIを叩いてやる必要があります。