Python
Twitter
Python3
tweepy

Tweepyでstreaming apiを使用した自動フォロー返し

More than 1 year has passed since last update.


注意

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 someoneUser is followedが同じfollowとして流れてくる上に、

説明
Source
Target

自分が誰かにフォローされた
Following user
Current user

自分が誰かをフォローした
Current user
Followed user

この表のように、場合によって自分と相手の入る位置が変わってしまいます。

そのため、自分がフォローを返した際に、自分をフォローしようとしてしまいます。

その場合、エラーが発生してしまうため、それを避けるためにインスタンス作成時に自分の情報を取得しておき、followイベントが流れる度にsource_useridを自分のidと比較しています。

また、eventにはunfollowというものがありますが、これは自分が他ユーザーのフォローを解除した際に流れてくるもので、他ユーザーからフォロー解除された旨を受け取ることはできません。


なので、自動フォロー解除については、適時REST APIを叩いてやる必要があります。


参考

Streaming message types | Twitter Developers

tweepy/streaming.py at master · tweepy/tweepy