LoginSignup
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-19

注意

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3