I revised the code posted in How to Auto Follow on Twitter by Twitter API v1.1 & PHP. The new version handles possible errors occurred in auto follow back.
New Code
<?php require __DIR__ . '/lib/twitteroauth/twitteroauth.php'; define('CONSUMER_KEY', 'your_consumer_key'); define('CONSUMER_SECRET', 'your_consumer_secret'); define('ACCESS_TOKEN', 'your_access_token'); define('ACCESS_TOKEN_SECRET', 'your_access_token_secret'); $toa = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET); $followers = $toa->get('followers/ids', array('cursor' => -1)); $friends = $toa->get('friends/ids', array('cursor' => -1)); if (!is_array($followers->ids) or !is_array($friends->ids)) exit; $errorIds = file_exists('error.log') ? file_get_contents('error.log') : null; $errCnt = 0; foreach ($followers->ids as $i => $id) { if (empty($friends->ids) or !in_array($id, $friends->ids)) { if (!is_null($errorIds) and false !== strpos($errorIds, (string)$id)) continue; $ret = $toa->post('friendships/create', array('user_id' => $id)); if (isset($ret->errors)) { /* Error code: 34 : Sorry, that page does not exist 108: Cannot find specified user 130: Over capacity 131: Internal error 159: Sorry, this account has been suspended 160: You've already requested to follow USER_NAME 161: You are unable to follow more people at this time */ if ($ret->errors[0]->code != 161 and $ret->errors[0]->code != 131 and $ret->errors[0]->code != 130) { $fh = fopen('error.log', 'a'); fwrite($fh, "$id\n"); fclose($fh); } $errCnt++; if ($errCnt >= 5) break; } } }
Changes
if (!is_array($followers->ids) or !is_array($friends->ids)) exit;
I added the code at line 14 that checks if $followers
and $friends
lists were successfully returned, otherwise exits the code. Because a get request can fail when a Twitter API limit reached or an internal server error occurred.
A rare situation can happens, that a get request for $followers
(users following you) was successful but not for $friends
(users you are following). In this case, the original code were trying to request unnecessary follow backs for users listed in $followers
because your $friends
list was null, even though you were already following them.
In order to avoid this situation, I added the code at line 14.
Next, the codes from line 25:
$ret = $toa->post('friendships/create', array('user_id' => $id)); if (isset($ret->errors)) { /* Error code: 34 : Sorry, that page does not exist 108: Cannot find specified user 130: Over capacity 131: Internal error 159: Sorry, this account has been suspended 160: You've already requested to follow USER_NAME 161: You are unable to follow more people at this time */ if ($ret->errors[0]->code != 161 and $ret->errors[0]->code != 131 and $ret->errors[0]->code != 130) { $fh = fopen('error.log', 'a'); fwrite($fh, "$id\n"); fclose($fh); } $errCnt++; if ($errCnt >= 5) break; }
The code above was added to handle possible errors in follow back request.
$ret = $toa->post('friendships/create', array('user_id' => $id));
The following errors can occur at line 25:
- error code 34 : Sorry, that page does not exist
- error code 108: Cannot find specified user
- error code 130: Over capacity
- error code 131: Internal error
- error code 159: Sorry, this account has been suspended
- error code 160: You’ve already requested to follow USER_NAME
(occurs where a user account is private and a friend (follow) request is not accepted) - error code 161: You are unable to follow more people at this time
When the errors occurred, except for error code 130, 131 and 161, a user ID is saved in “error.log” in order to avoid sending a request again for the user.
This is needed because, for example, $toa->get('followers/ids', array('cursor' => -1));
can return a list including a user ID which causes “error code 108: Cannot find specified user”. I don’t know why Twitter API returns a user ID not existing, but actually it can happen, so I needed to add the error handling code.
Finally, the code at 46-47 breaks the loop for follow backs when errors occurred more than 5 times for just in case.