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.