Creating an RSS feed of tweets was very straightforward with version 1 of the API, but not so much anymore with version 1.1.
Create a file on your server with the following contents:
<?php
/*
Twitter JSON to Atom proxy for Twitter API 1.1
Original version by yimingliu ( https://gist.github.com/yimingliu/4735445 )
Display user_timeline instead of home_timeline
*/
date_default_timezone_set('America/Los_Angeles');
ini_set('display_errors', 0);
$user_screen_name = 'CHANGE ME';
$user_full_name = 'CHANGE ME TOO';
// Twitter App Settings (https://dev.twitter.com/apps):
// FILL THESE IN
$settings = array(
'consumer_key' => '',
'consumer_secret' => '',
'access_token' => '',
'access_token_secret' => ''
);
// API: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
$api_url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$api_params = array(
'count' => 80,
'contributor_details' => 'false',
);
// OAuth:
function oauth_encode($data){
if(is_array($data)){
return array_map('oauth_encode', $data);
} else if(is_scalar($data)) {
return str_ireplace(array('+', '%7E'), array(' ', '~'), rawurlencode($data));
} else {
return '';
}
}
// OAuth base settings
$oauth_params = array(
'oauth_consumer_key' => $settings['consumer_key'],
'oauth_nonce' => md5(microtime() . mt_rand()),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_token' => $settings['access_token'],
'oauth_version' => '1.0',
);
// Sign OAuth params
$sign_params = array_merge($oauth_params, $api_params);
uksort($sign_params, 'strcmp');
foreach ($sign_params as $k => $v) {
$sparam[] = oauth_encode($k) . '=' . oauth_encode($v);
}
$sparams = implode('&', $sparam);
$base_string = 'GET&' . oauth_encode($api_url) . '&' . oauth_encode($sparams);
$signing_key = oauth_encode($settings['consumer_secret']) . '&' . oauth_encode($settings['access_token_secret']);
$oauth_params['oauth_signature'] = oauth_encode(base64_encode(hash_hmac('sha1', $base_string, $signing_key, TRUE)));
// Set Authorization header:
uksort($oauth_params, 'strcmp');
foreach ($oauth_params as $k => $v) {
$hparam[] = $k . '="' . $v . '"';
}
$hparams = implode(', ', $hparam);
$headers = array();
$headers['Expect'] = '';
$headers['Authorization'] = 'OAuth ' . $hparams;
foreach ($headers as $k => $v) {
$curlheaders[] = trim($k . ': ' . $v);
}
// Format params:
foreach ($api_params as $k => $v) {
$rparam[] = $k . '=' . $v;
}
$rparams = implode('&', $rparam);
// echo "curl --get '" . $api_url . "' --data '" . $rparams . "' --header 'Authorization: OAuth " . $hparams . "' --verbose" . PHP_EOL;
// GET:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url . '?' . $rparams);
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlheaders);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10 );
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$info = curl_getinfo($ch);
$error = curl_error($ch);
$errno = curl_errno($ch);
curl_close($ch);
if($code != 200){
http_response_code($code);
echo 'Error' . PHP_EOL;
echo $code . PHP_EOL;
print_r($response);
print_r($info);
} else {
$all = json_decode($response, true);
$updated = date(DATE_ATOM, strtotime($all[0]['created_at']));
header('Content-type: application/atom+xml; charset=UTF-8', true);
echo '<?xml version="1.0" encoding="utf-8"?' . '>' . PHP_EOL;
?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
<title>Twitter / <?php echo $user_screen_name?></title>
<id>tag:twitter.com,2007:Status</id>
<link type="text/html" rel="alternate" href="http://twitter.com"/>
<link type="application/atom+xml" rel="self" href="http://<?php echo $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]?>"></link>
<updated><?php echo $updated?></updated>
<subtitle>Twitter updates from <?php echo $user_full_name?>.</subtitle>
<?php
foreach($all as $row){
$id = $row['id_str'];
$text = $row['text'];
$title = htmlspecialchars($row['user']['screen_name'] . ': ' . $text);
$entry = $title;
if(isset($row['entities']) and isset($row['entities']['urls']))
{
// expand t.co URLs
$urls = $row['entities']['urls'];
foreach($urls as $url)
{
$url_orig = $url['url'];
$url_expanded = $url['expanded_url'];
$url_expanded_tagged = "<a href='$url_expanded'>$url_expanded</a>";
$title = str_replace($url_orig, $url_expanded, $title);
$entry = str_replace($url_orig, $url_expanded_tagged, $entry);
}
}
$name = htmlspecialchars($row['user']['name']);
$screen_name = $row['user']['screen_name'];
$url = $row['user']['url'];
$profile_image_url = $row['user']['profile_image_url'];
$source = htmlspecialchars($row['source']);
$created = date(DATE_ATOM, strtotime($row['created_at']));
?>
<entry>
<title><?php echo $title?></title>
<content type="html"><?php echo $entry?></content>
<id>tag:twitter.com,2007:http://twitter.com/<?php echo $screen_name?>/status/<?php echo $id?></id>
<published><?php echo $created?></published>
<updated><?php echo $created?></updated>
<link type="text/html" rel="alternate" href="http://twitter.com/<?php echo $screen_name?>/status/<?php echo $id?>"/>
<link type="image/png" rel="image" href="<?php echo $profile_image_url?>"/>
<author>
<name><?php echo $name?></name>
<uri><?php echo $url?></uri>
</author>
</entry>
<?php
}
?>
</feed>
<?php
exit();
}
And there you have it. Change the settings at the top to reflect YOUR API credentials, then access the file and your RSS feed will be displayed.