[Android開発ネタ] TwitterSDKを使用し、フォロワー/フォローを取得する

TwitterSDKにはフォロワー/フォローを取得するメソッドが用意されていないのでカスタムTwitterApiClientを作成すれば良いみたい。
通信部分はRetrofitを使っているらしい。
MyTwitterApiClient.kt

class MyTwitterApiClient(session: TwitterSession) : TwitterApiClient(session) {
    fun getTwitterFollowersService() = getService<TwitterFollowersService>(TwitterFollowersService::class.java)
    interface TwitterFollowersService {
        @GET("/1.1/followers/list.json")
        fun show(@Query("user_id") userId: Long?,
        @Query("screen_name") screenName: String,
        @Query("skip_status") skipStatus: Boolean?,
        @Query("include_user_entities") includeUserEntities: Boolean? = false,
        @Query("cursor") cursor: String? = null,
        @Query("count") count: Int? = 200): Call<Followers>
    }
}

Followers.kt

class Followers {
    @SerializedName("users")
    val users: List<User>? = null
    @SerializedName("next_cursor")
    val nextCursor: String? = null
    @SerializedName("previous_cursor")
    val previousCursor: String? = null
}

こんなメソッドを用意して使う

private fun getTwitterFollowers(users: MutableList<User>, cursor: String? = null, callBack: (MutableList<User>) -> Unit) {
    val session = TwitterCore.getInstance().sessionManager.activeSession
    val twitterClient = MyTwitterApiClient(session)
    twitterClient.getTwitterFollowersService().show(session.userId, session.userName, true, false, cursor)
    .enqueue(object : Callback<Followers>() {
    override fun success(result: Result<Followers>?) {
    Log.d("hoge", "getTwitterFollowers() success = ${result?.data?.toString()}")
    var nextCursor = "0"
    result?.data?.also { data ->
      nextCursor = data.nextCursor?.let { it } ?: "0"
      data.users?.also { resultUsers ->
      users += resultUsers
    }
    }
    if (nextCursor != "0") {
       getTwitterFollowers(users, nextCursor, callBack)
    } else {
       callBack.invoke(users)
    }
  }
    override fun failure(exception: TwitterException?) {
       Log.d("hoge", "getTwitterFollowers() failure = $exception")
       callBack.invoke(users)
    }
   })
  }

↑のメソッドの呼び出し。

val list = mutableListOf()
    getTwitterFollowers(list) { users ->
    if (users.size == 0) {
    // なにか処理
    return@getTwitterFollowers
    }
    // なにか処理
    }

いろいろ雑なのは気にしちゃいけない。
これで一応フォロワーの全量が取れるはず。
ただフォロワーを取得するAPIが15分に付き15回しか叩け無いという制限があるので、このロジックだとMAX3000人のフォロワーしか取得できない。
まぁ、3000人もいる人はめったにいないはず、、、はず、、、、。
(Twitterのことあまりわかってないw)
フォロー側を取得したい場合は@GET(“/1.1/followers/list.json”)@GET(“/1.1/friends/list.json”)に変更すれば取得できる。

コメント

タイトルとURLをコピーしました