Twitter Component
After searching for a suitable php Twitter component for cakephp I found none. So here is my attemp at it. This component implenets all of the twitter api found on http://groups.google.com/group/twitter-development-talk/web/api-documentation
Here is the code with comments included.
And here is a usage example:
Hope this helps someone. The code is not well tested but it should work. I use it in my application.
Enjoy!
Component Class:
Download code
<?php
App::import('Core', array('HttpSocket', 'Xml'));
/**
* Twitter xml api implementation
* Documentation can be found on:
* http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
class TwitterComponent extends Object {
var $username = '';
var $password = '';
var $Http = null;
function __construct() {
$this->Http =& new HttpSocket();
}
/**
* Returns the 20 most recent statuses from non-protected users
* who have set a custom user icon. Does not require authentication.
*
* @param array params Optional. parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_public_timeline($params=array()) {
$url = 'http://twitter.com/statuses/public_timeline.xml';
return $this->__process($this->Http->get($url, $params));
}
/**
* Returns the 20 most recent statuses posted in the last 24 hours from the authenticating
* user and that user's friends. It's also possible to request another user's
* friends_timeline via the id parameter below.
*
* @param string id Optional. Specifies the ID or screen name of the user for whom to return the friends_timeline
* @param array params Optional. parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_friends_timeline($id=false, $params = array()) {
$url = 'http://twitter.com/statuses/friends_timeline';
if($id != false) {
$url .= "/{$id}.xml";
} else {
$url .= ".xml";
}
return $this->__process($this->Http->get($url, $params));
}
/**
* Returns the 20 most recent statuses posted in the last 24 hours from the authenticating user.
* It's also possible to request another user's timeline via the id parameter below.
*
* @param string id Optional. Specifies the ID or screen name of the user for whom to return the friends_timeline.
* @param array params Optional. parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_user_timeline($id=false, $params = array()) {
$url = 'http://twitter.com/statuses/user_timeline';
if($id != false) {
$url .= "/{$id}.xml";
} else {
$url .= ".xml";
}
return $this->__process($this->Http->get($url, $params));
}
/**
* Returns a single status, specified by the id parameter below.
* The status's author will be returned inline.
*
* @param string id Required. The numerical ID of the status you're trying to retrieve.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_show($id) {
$url = "http://twitter.com/statuses/show/{$id}.xml";
return $this->__process($this->Http->get($url));
}
/**
* Updates the authenticating user's status. Requires the status parameter specified below.
*
* @param string status Required. The text of your status update.
* Be sure to URL encode as necessary. Must not be more than 160 characters
* and should not be more than 140 characters to ensure optimal display.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_update($status) {
$url = "http://twitter.com/statuses/update.xml";
return $this->__process($this->Http->post($url, array('status' => $status), $this->__getAuthHeader()));
}
/**
* Returns the 20 most recent replies
* (status updates prefixed with @username posted by users who
* are friends with the user being replied to)
* to the authenticating user.
*
* @param array params Optional. Parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_replies($params = array()) {
$url = "http://twitter.com/statuses/replies.xml";
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Destroys the status specified by the required ID parameter.
*
* @param string id Required. The ID of the status to destroy.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function status_destroy($id) {
$url = "http://twitter.com/statuses/destroy/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Returns up to 100 of the authenticating user's friends who have most recently updated, each with current status inline.
* It's also possible to request another user's recent friends list via the id parameter below.
*
* @param string id Optional. The ID or screen name of the user for whom to request a list of friends.
* @param array params Optional. Parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function user_friends($id=false, $params = array()) {
$url = "http://twitter.com/statuses/friends";
if($id != false) {
$url .= "/{$id}.xml";
} else {
$url .= ".xml";
}
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Returns the authenticating user's followers, each with current status inline.
*
* @param array params Optional. Parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function user_followers($params = array()) {
$url = "http://twitter.com/statuses/followers.xml";
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Returns a list of the users currently featured on the site with their current statuses inline.
*
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function user_featured() {
$url = "http://twitter.com/statuses/featured.xml";
return $this->__process($this->Http->get($url));
}
/**
* Returns extended information of a given user, specified by ID or screen name as per the required id parameter below.
*
* @param string id Required. The ID or screen name of a user.
* @param array params Optional. Parameters passed to the query.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function user_show($id=false, $params = array()) {
$url = "http://twitter.com/users/show";
if($id != false) {
$url .= "/{$id}.xml";
} else {
$url .= ".xml";
}
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Returns a list of the 20 most recent direct messages sent to the authenticating user.
*
* @param array params Optional. Parameters passed to the query.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function direct_messages($params = array()) {
$url = "http://twitter.com/direct_messages.xml";
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Returns a list of the 20 most recent direct messages sent by the authenticating user.
*
* @param array params Optional. Parameters passed to the query.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function direct_messages_sent($params = array()) {
$url = "http://twitter.com/direct_messages/sent.xml";
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Sends a new direct message to the specified user from the authenticating user.
*
* @param string user Required. The ID or screen name of the recipient user.
* @param string text Required. The text of your direct message.
* Be sure to URL encode as necessary, and keep it under 140 characters.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function direct_messages_new($user, $text) {
$url = "http://twitter.com/direct_messages/new.xml";
$params = array('user' => $user, 'text' => $text);
return $this->__process($this->Http->post($url, $params, $this->__getAuthHeader()));
}
/**
* Destroys the direct message specified in the required ID parameter.
*
* @param string id Required. The ID of the direct message to destroy.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function direct_messages_destroy($id) {
$url = "http://twitter.com/direct_messages/destroy/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Befriends the user specified in the ID parameter as the authenticating user.
*
* @param string id Required. The ID or screen name of the user to befriend.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function friendship_create($id) {
$url = "http://twitter.com/friendships/create/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Discontinues friendship with the user specified in the ID parameter as the authenticating user.
*
* @param string id Required. The ID or screen name of the user with whom to discontinue friendship.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function friendship_destroy($id) {
$url = "http://twitter.com/friendships/destroy/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Returns an HTTP 200 OK response code and a format-specific response if authentication was successful.
*
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function account_verify_credentials() {
$url = "http://twitter.com/account/verify_credentials.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Ends the session of the authenticating user, returning a null cookie.
*
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function account_end_session() {
$url = "http://twitter.com/account/end_session";
$this->Http->get($url, null, $this->__getAuthHeader());
}
/**
* Returns 80 statuses per page for the authenticating user, ordered by descending date of posting.
*
* @param integer page Optional. Retrieves the 80 next most recent statuses.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function account_archive($page=1) {
$url = 'http://twitter.com/account/archive.xml';
return $this->__process($this->Http->get($url, array('page' => $page), $this->__getAuthHeader()));
}
/**
* Updates the location attribute of the authenticating user,
* as displayed on the side of their profile and returned in various API methods.
*
* @param string location The location of the user. Please note this is not normalized, geocoded, or translated to latitude/longitude at this time.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function account_update_location($location) {
$url = 'http://twitter.com/account/update_location.xml';
return $this->__process($this->Http->get($url, array('location' => $location), $this->__getAuthHeader()));
}
/**
* Sets which device Twitter delivers updates to for the authenticating user.
* Sending none as the device parameter will disable IM or SMS updates.
*
* @param string device Must be one of: sms, im, none.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function account_update_delivery_device($device) {
$url = 'http://twitter.com/account/update_delivery_device.xml';
return $this->__process($this->Http->get($url, array('device' => $device), $this->__getAuthHeader()));
}
/**
* Returns the 20 most recent favorite statuses for the authenticating user
* or user specified by the ID parameter in the requested format.
*
* @param string id Optional. The ID or screen name of the user for whom to request a list of favorite statuses.
* @param array params Optional. Parameters passed to the query
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function favorites($id = false, $params = array()) {
$url = "http://twitter.com/favorites";
if($id != false) {
$url .= "/{$id}.xml";
} else {
$url .= ".xml";
}
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));
}
/**
* Favorites the status specified in the ID parameter as the authenticating user.
*
* @param string id Required. The ID of the status to favorite.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function favorites_create($id) {
$url = "http://twitter.com/favorites/create/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Un-favorites the status specified in the ID parameter as the authenticating user.
*
* @param string id Required. The ID of the status to un-favorite.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function favorites_destroy($id) {
$url = "http://twitter.com/favorites/destroy/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Enables notifications for updates from the specified user to the authenticating user.
*
* @param string id Required. The ID or screen name of the user to follow.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function notifications_follow($id) {
$url = "http://twitter.com/notifications/follow/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Disables notifications for updates from the specified user to the authenticating user.
*
* @param string id Required. The ID or screen name of the user to leave.
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function notifications_leave($id) {
$url = "http://twitter.com/notifications/leave/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Blocks the user specified in the ID parameter as the authenticating user.
* Returns the blocked user in the requested format when successful.
*
* @param string id The ID or screen_name of the user to block
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function block_create($id) {
$url = "http://twitter.com/blocks/create/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Un-blocks the user specified in the ID parameter as the authenticating user.
* Returns the un-blocked user in the requested format when successful.
*
* @param string id The ID or screen_name of the user to block
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function block_destroy($id) {
$url = "http://twitter.com/blocks/destroy/{$id}.xml";
return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
}
/**
* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
*
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function help_test() {
$url = 'http://twitter.com/help/test.xml';
return $this->__process($this->Http->get($url));
}
/**
* Returns the same text displayed on http://twitter.com/home when
* a maintenance window is scheduled, in the requested format.
*
* @see http://groups.google.com/group/twitter-development-talk/web/api-documentation
*/
function help_downtime_schedule() {
$url = 'http://twitter.com/help/downtime_schedule.xml';
return $this->__process($this->Http->get($url));
}
// Private functions
function __process($response) {
$xml = new XML($response);
return $this->__xmlToArray($xml);
}
function __getAuthHeader() {
return array('auth' => array('method' => 'Basic',
'user' => $this->username,
'pass' => $this->password
)
);
}
function __xmlToArray($node) {
$array = array();
foreach ($node->children as $child) {
if (empty($child->children)) {
$value = $child->value;
} else {
$value = $this->__xmlToArray($child);
}
$key = $child->name;
if (!isset($array[$key])) {
$array[$key] = $value;
} else {
if (!is_array($array[$key]) || !isset($array[$key][0])) {
$array[$key] = array($array[$key]);
}
$array[$key][] = $value;
}
}
return $array;
}
}
?>
And here is a usage example:
Controller Class:
Download code
<?php
class TweetsController extends AppController
{
var $name = 'Tweets';
var $helpers = array('Time', 'Html');
var $components = array('Twitter');
var $uses = array();
function index()
{
$this->Twitter->username = Configure::read('Twitter.username');
$this->Twitter->password = Configure::read('Twitter.password');
$statuses = $this->Twitter->status_user_timeline(
Configure::read('Twitter.username') ,
array('count' => 10)
);
if(array_key_exists('statuses', $statuses))
$this->set('tweets', $statuses['statuses']['status']);
}
}
?>
Hope this helps someone. The code is not well tested but it should work. I use it in my application.
Enjoy!
Comments
Bug
1 Typo and Import bug
Fatal error: Class 'AppHelper' not found in cake/libs/view/helpers/xml.php on line 37
Comment
2 Typo and Import bug
Tnx for the typo warning. Can you provide some more information about the fatal error. When it is happening. Can you give some code example where the error occurs?
Comment
3 More info
Comment
4 Bug fix
You can download the new code from gitorious using git with
git clone http://git.gitorious.org/cakephp-twitter-cpomponent/mainline.git
Comment
5 Tip
I'm posting the solution here.
You replace App::import('Core', array('HttpSocket', 'Xml')) with uses('xml'); App:import('Core', array('HttpSocket')); on the top of the twitter.php file.
After that the component should work.
Comment
6 autentication
example:
return $this->__process($this->Http->get($url, $params, $this->__getAuthHeader()));Enjoy ;)