5

I'm using the Twitter API 1.1 Get statuses method to return the latest tweet from an account on the client's website. This is working fine but I can't find any clear documentation on how to render any links that may be included (Both included usernames and included links) as clickable links?

I can see in the JSON response that any included links are in the XML but it's not clear to me how to go about adding clickable links into the rendered output. The documentation around the new API seems to be lacking practical examples.

Can anyone advise?

The code I'm using the pull out the latest tweet is as follows:

$token = 'TOKEN HERE';
$token_secret = 'TOKEN SECRET HERE';
$consumer_key = 'CONSUMER KEY HERE';
$consumer_secret = 'CONSUMER SECRET HERE';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
'screen_name' => 'SCREEN NAME HERE',
'count' => '1'
);

$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_token' => $token,
'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
'oauth_timestamp' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_version' => '1.0'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);

// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);

// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));

// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);

$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));

// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);
Simon Wiffen
  • 161
  • 1
  • 9

2 Answers2

11

Thanks a lot for your response. I actually found a solution thanks to this blog post from the guys at Asheville - http://www.appliedtns.com/blog/tag/twitter/

It works fine for me.

// Parse any links found in our tweet
$formatted_text = preg_replace('/(\b(www\.|http\:\/\/)\S+\b)/', "<a target='_blank' href='$1'>$1</a>", $post->text);
$formatted_text = preg_replace('/\#(\w+)/', "<a target='_blank' href='http://search.twitter.com/search?q=$1'>#$1</a>", $formatted_text);
$formatted_text = preg_replace('/\@(\w+)/', "<a target='_blank' href='http://twitter.com/$1'>@$1</a>", $formatted_text);
Simon Wiffen
  • 161
  • 1
  • 9
  • Works great, is there a way to link the t.co links? – user1788364 Mar 23 '16 at 13:06
  • 1
    @user1788364 Apologies for the delay in getting back to you! The t.co links themselves aren't an issue, the issue is that the pervious code didn't look for https links and parse accordingly. Therefore if you add $formatted_text = preg_replace('/(\b(www\.|https\:\/\/)\S+\b)/', "$1", $post->text); into the list of parse commends that should resolve the t.co links as well as any other https links that are added. Hope that helps! – Simon Wiffen Jul 11 '16 at 13:49
  • 1
    A small update to this. Adding s? to the link regex will catch the t.co links and all other links $formatted_text = preg_replace('/(\b(www\.|https?\:\/\/)\S+\b)/', "$1", $post->text); And since API v1 has been deprecated, here is the correct link for a hashtag for the 2nd regex: $formatted_text = preg_replace('/\#(\w+)/', "#$1", $formatted_text); – mannr Jan 06 '17 at 16:04
0

Not sure if this exactly what you need but I am using the tmhOAuth library for my application, see https://github.com/themattharris/tmhOAuth-examples. Using code from Matt Harris' examples I loop through the response and build the output as in the code below. The links in the tweets are created by the library function entify_with_options($tweet).

// Decode response
$timeline = json_decode($this->tmhOAuth->response['response'], true);

if(!$timeline){
throw new Exception('Error: No response was found.');
}
else{
//  Start building the output
foreach ($timeline as $tweet) :

         ... start of response processing

         // Format and set tweet text 
     $tw_entified_tweet = tmhUtilities::entify_with_options($tweet);

         //  Format and set creation date for permalink
     $tw_created_at_formatted = is_twitterlist_format_date($tweet['created_at']);

         //  Format and set permalink
     $tw_permalink = str_replace(
    array(
        '%screen_name%',
        '%id%',
        '%created_at%'
    ),
    array(
        $tweet['user']['screen_name'],
        $tweet['id_str'],
        $tw_created_at_formatted,
        ),
        '<a href="https://twitter.com/%screen_name%/status/%id%" target="_blank">%created_at%</a>'
     );

         ... end response processing


    endforeach;
}

The date format function is:

function is_twitterlist_format_date($created_date)
{
    if ( is_null($created_date)) {
        return '';
    }
    else{
        // Format: March 4th, 9:19 am
        return date('F jS, g:i a', strtotime($created_date));
    }
}

Hope this is useful.

neilkb
  • 23
  • 3