Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

前書き

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";

}
mpyw
PHP(Laravel) / JavaScript(React/Redux/ReactNative/Vue) / MySQL あたりが得意分野なWeb系エンジニア。最近マンネリ化がひどいので Go / Kotlin / Rust / Swift あたりから何か掘り下げたいと思っている。Go は 2.x 出てから書きます。古い記事はそのまま参考にしないようにご注意ください
http://gravatar.com/mpyw
synapse
Synapseは、オンラインサロンサービスにおけるパイオニアとして、かつて存在していたスタートアップです。
https://synapseam.github.io/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした