Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
21
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@mpyw

TwitterAPIで自動フォロー返しする

前書き

Twitterでリクエストがあったのでサンプルを掲載します。

  • ストリーミングで継続的に監視する方法を紹介しますが、cronで定期実行する場合でもストリーミング関連の部分を削除するだけで対応可能です。
  • ライブラリにはTwistOAuthを使用しますが、他のライブラリでも方法は類似しているはずです。
  • ToS的には怪しいですが、運用上自動リムーブ返しがないとフォロー数規制で困るケースがあるので、参考程度にこれも込みのソースにさせていただきます。不要な場合この部分は消してください。
  • 並列リクエスト可能ですが、Twitterにアクセス拒否される要因になるので、あえて逐次リクエストにしています。

ソースコード

ストリーミング利用時・cron利用時ともに必要なコード

<?php

// ライブラリをロード
require 'TwistOAuth.phar';

// テキストとして結果を表示
header('Content-Type: text/plain; charset=utf-8');

// 実行時間を無制限にする
set_time_limit(0);

// APIキー設定
$ck = '***コンシューマーキー***';
$cs = '***コンシューマーシークレット***';
$at = '***アクセストークン***';
$as = '***アクセストークンシークレット***';

// インスタンス生成
$to = new TwistOAuth($ck, $cs, $at, $as);

// カーソルを追跡して全てのIDを配列として取得するクロージャ
// 但し高速化のためキーに格納する
$get_all_ids = function ($endpoint) use ($to) {
    $ids = [];
    $params = [
        'stringify_ids' => '1',
        'cursor'        => '-1',
    ];
    $params['cursor'] = '-1';
    do {
        $result = $to->get($endpoint, $params);
        $ids += array_flip($result->ids);
    } while ($params['cursor'] = $result->next_cursor_str);
    return $ids;
};

// リムーブ実行用クロージャ
$unfollow = function ($user_id) use ($to) {
    try {
        $user = $to->post('friendships/destroy', compact('user_id'));
        echo "Unfollowed @{$user->screen_name}\n";
    } catch (TwistException $e) {
        echo "ID{$user_id}: {$e->getMessage()}\n";
    }
};

// フォロー実行用クロージャ
$follow = function ($user_id) use ($to) {
    try {
        $user = $to->post('friendships/create', compact('user_id'));
        if ($user->protected) {
            echo "Send follow request to @{$user->screen_name}\n";
        } else {
            echo "Followed @{$user->screen_name}\n";
        }
    } catch (TwistException $e) {
        echo "ID{$user_id}: {$e->getMessage()}\n";
    }
};

/* ユーザリストによる処理開始 */
try {

    // フレンドとフォロワーそれぞれを取得
    $friends   = $get_all_ids('friends/ids');
    $followers = $get_all_ids('followers/ids');

    // 差分を取得
    $friends_only   = array_diff_key($friends, $followers);
    $followers_only = array_diff_key($followers, $friends);

    // 1件ずつそれぞれ試行
    foreach ($friends_only as $user_id => $_) $unfollow($user_id);
    foreach ($followers_only as $user_id => $_) $follow($user_id);

} catch (TwistException $e) {

    echo "Fatal Error: {$e->getMessage()}\n";

}


ストリーミング利用時のみ必要な追加のコード

/* ストリーミングによる処理開始 */
try {

    // 自分のユーザIDを取得
    $my_id = $to->get('account/verify_credentials')->id_str;

    // ストリーミングに接続
    $to->streaming(
       'user',
        function ($status) use ($unfollow, $follow, $my_id) {
            // 自分に対するフォローイベントとリムーブイベントだけを検知
            if (isset($status->event) && $status->target->id_str === $my_id) {
                if ($status->event === 'unfollow') {
                    $unfollow($status->source->id_str);
                } elseif ($status->event === 'follow') {
                    $follow($status->source->id_str);
                }
            }
        }
    );

} catch (TwistException $e) {

    echo "Fatal Error: {$e->getMessage()}\n";

}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
21
Help us understand the problem. What are the problem?