From 147dd16ab3f1d03a6bee8b3c8bf93170acab4ba9 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 18 Nov 2008 20:11:28 -0500 Subject: trac685 Twitter bridge - Shell script to sync all users' Twitter friends darcs-hash:20081119011128-7b5ce-74471277443b44d0075f66131028447cfda3b1e4.gz --- lib/common.php | 1 + lib/twitter.php | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 lib/twitter.php (limited to 'lib') diff --git a/lib/common.php b/lib/common.php index 2ab9c616c..aac54b547 100644 --- a/lib/common.php +++ b/lib/common.php @@ -146,6 +146,7 @@ require_once(INSTALLDIR.'/lib/theme.php'); require_once(INSTALLDIR.'/lib/mail.php'); require_once(INSTALLDIR.'/lib/subs.php'); require_once(INSTALLDIR.'/lib/Shorturl_api.php'); +require_once(INSTALLDIR.'/lib/twitter.php'); function __autoload($class) { if ($class == 'OAuthRequest') { diff --git a/lib/twitter.php b/lib/twitter.php new file mode 100644 index 000000000..6edbc3aa3 --- /dev/null +++ b/lib/twitter.php @@ -0,0 +1,199 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +function get_twitter_data($uri, $screen_name, $password) { + + $options = array( + CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true, + CURLOPT_HEADER => false, + CURLOPT_FOLLOWLOCATION => true, + // CURLOPT_USERAGENT => "identi.ca", + CURLOPT_CONNECTTIMEOUT => 120, + CURLOPT_TIMEOUT => 120 + ); + + + $ch = curl_init($uri); + curl_setopt_array($ch, $options); + $data = curl_exec($ch); + $errmsg = curl_error($ch); + + if ($errmsg) { + common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.", + __FILE__); + } + + curl_close($ch); + + return $data; +} + +function twitter_user_info($screen_name, $password) { + + $uri = "http://twitter.com/users/show/$screen_name.json"; + $data = get_twitter_data($uri, $screen_name, $password); + + if (!$data) { + return false; + } + + $twit_user = json_decode($data); + + if (!$twit_user) { + return false; + } + + return $twit_user; +} + +function update_twitter_user($fuser, $twitter_id, $screen_name) { + + $original = clone($fuser); + $fuser->nickname = $screen_name; + $fuser->uri = 'http://twitter.com/' . $screen_name; + $result = $fuser->updateKeys($original); + + if (!$result) { + common_log_db_error($fuser, 'UPDATE', __FILE__); + return false; + } + + return true; +} + +function add_twitter_user($twitter_id, $screen_name) { + + // Otherwise, create a new Twitter user + $fuser = DB_DataObject::factory('foreign_user'); + + $fuser->nickname = $screen_name; + $fuser->uri = 'http://twitter.com/' . $screen_name; + $fuser->id = $twitter_id; + $fuser->service = 1; // Twitter + $fuser->created = common_sql_now(); + $result = $fuser->insert(); + + if (!$result) { + common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name."); + common_log_db_error($fuser, 'INSERT', __FILE__); + return false; + } + + common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id)."); + + return true; +} + +// Creates or Updates a Twitter user +function save_twitter_user($twitter_id, $screen_name) { + + // Check to see whether the Twitter user is already in the system, + // and update its screen name and uri if so. + $fuser = Foreign_User::getForeignUser($twitter_id, 1); + + if ($fuser) { + + // Only update if Twitter screen name has changed + if ($fuser->nickname != $screen_name) { + + common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' . + "$fuser->id to $screen_name, was $fuser->nickname"); + + return update_twitter_user($fuser, $twitter_id, $screen_name); + } + + } else { + return add_twitter_user($twitter_id, $screen_name); + } + + return true; +} + +function retreive_twitter_friends($twitter_id, $screen_name, $password) { + + $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page="; + $twitter_user = twitter_user_info($screen_name, $password); + + // Calculate how many pages to get... + $pages = ceil($twitter_user->friends_count / 100); + + if ($pages == 0) { + common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame."); + } + + $friends = array(); + + for ($i = 1; $i <= $pages; $i++) { + + $data = get_twitter_data($uri . $i, $screen_name, $password); + + if (!$data) { + return NULL; + } + + $more_friends = json_decode($data); + + if (!$more_friends) { + return NULL; + } + + $friends = array_merge($friends, $more_friends); + } + + return $friends; +} + +function save_twitter_friends($user, $twitter_id, $screen_name, $password) { + + $friends = retreive_twitter_friends($twitter_id, $screen_name, $password); + + if (is_null($friends)) { + common_debug("Twitter bridge - Couldn't get friends data from Twitter."); + return false; + } + + foreach ($friends as $friend) { + + $friend_name = $friend->screen_name; + $friend_id = $friend->id; + + // Update or create the Foreign_user record + if (!save_twitter_user($friend_id, $friend_name)) { + return false; + } + + // Check to see if there's a related local user + $flink = Foreign_link::getByForeignID($friend_id, 1); + + if ($flink) { + + // Get associated user and subscribe her + $friend_user = User::staticGet('id', $flink->user_id); + subs_subscribe_to($user, $friend_user); + common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname."); + } + } + + return true; +} + -- cgit v1.2.3-54-g00ecf