/** embedtweet.php
*
* Copyright (C) 2012 by Tamara Temple
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* \author Tamara Temple
* \since 2012-07-04
* \copyright 2012 by Tamara Temple
* \license GPLv3
* \version 0.1
*
* INSTALLATION
* ============
*
* To install this recipe, download it and copy it into your wiki's
* cookbook directory, then add the following lines to your local/config.php
* file:
*
* $EnableEmbedTweet=true;
* include_once("$FarmD/cookbook/embedtweet.php");
*
* USAGE
* =====
*
* To use, simply include the following in your wiki page text:
*
* [tweet id=]
*
* Alternately, you can use the URL of the particular status:
*
* [tweet url=https://twitter.com//status/]
*
* Both of these can be obtained for a tweet on the twitter web site
* by clicking on the "Expand" link in the tweet, then on "Embed this Tweet"
* and selecting Link tab. The status id is the last string of digits
* in the path. If you choose to url method, use the entire link
* shown.
*
* Additional parameters are described on the API document at
*
* but note that the omit_script is always set to true and the
* script is linked in the html footer automatically by the recipe.
*
* For future-proofing, there are two customizable variables that
* deal with the functionality provided by twitter.
*
* $ETweet_API_URL is the url of API call that returns the
* contents of the tweet desired.
*
* $ETweet_Widget_Script is the HTML that will include the
* widget script from twitter in the page footer.
*
* Neither of these should be set or changed unless the twitter API
* changes.
*
* TODO:
* * Provide a means of saving the tweet instead of fetching it each time.
* This will also prevent losing the tweet in the case it disappears
* from twitter, or twitter is inaccessible for some reason.
*
* NOTE:
* * Some twitter feeds are inaccessible by outside sources, unless
* the caller is an authenticated user, and is allowed to view
* the tweet. Currently, there is nothing in twitter's oembed API
* that can get around this.
*/
// Version of this recipe
$RecipeInfo['EmbedTweet']['Version'] = '2012-07-04';
// Add a custom page storage location and some bundled wikipages.
//@include("EmbedTweet/bundlepages.php");
SDV($EnableEmbedTweet,0); // set $EnableEmbedTweet=1; in local/config.php
SDV($ETweet_API_URL,'https://api.twitter.com/1/statuses/oembed.json');
SDV($ETweet_Widget_Script,'');
$HTMLFooterFmt[] = $ETweet_Widget_Script;
Markup('EmbedTweet','
* @param string $parms
**/
function ETw_HandleTweet ($parms='')
{
global $EnableEmbedTweet;
if (!IsEnabled($EnableEmbedTweet,false)) return;
if (empty($parms)) return;
$args = ParseArgs($parms);
$tweet = ETw_FetchTweet($args);
$embed = ETw_FormatTweet($tweet);
return(Keep($embed));
} // END function ETw_HandleTweet
/**
* Fetch the tweet
*
* @returns JSON encoded tweet contents
* @author Tamara Temple
* @param array $args
**/
function ETw_FetchTweet ($args)
{
global $ETweet_API_URL;
$ch = curl_init(ETw_BuildURL($args));
curl_setopt_array($ch,
array(CURLOPT_FOLLOWLOCATION=>true,
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_CONNECTTIMEOUT=>15,
CURLOPT_TIMEOUT=>30,
CURLOPT_USERAGENT=>"Mozilla/5.0",
CURLOPT_REFERER=>$ScriptUrl,
));
$response = curl_exec($ch);
if (false === $response) {
$response = array("errors"=>array(array("message"=>"curl error","code"=>curl_error($ch))));
return json_encode($response);
}
return $response;
} // END function ETw_FetchTweet
/**
* Format the JSON encoded tweet for embedding in page
*
* @returns string HTML to embed
* @author Tamara Temple
* @param string $tweet - JSON encoded tweet
**/
function ETw_FormatTweet ($tweet)
{
$decoded = json_decode($tweet,true);
if (isset($decoded['errors'])) {
// an error occured, return it
$embed = $decoded['errors'][0]['message'] .
"Error code: " .
$decoded['errors'][0]['code'];
} else {
$embed = $decoded['html'];
if (preg_match('!script src="//!',$embed)) {
// screwy return from twitter
$embed = preg_replace('!script src="//!','script src="http://',$embed);
}
}
return $embed;
} // END function ETw_FormatTweet
/**
* Build the URL needed to make the tweet request
*
* @returns string - url to send
* @author Tamara Temple
* @param array $args - arguments to twitter API
**/
function ETw_BuildURL ($args)
{
global $ETweet_API_URL;
if (isset($args['id'])) {
//prefer id over url
$query['id'] = $args['id'];
} elseif (isset($args['url'])) {
// use url
$query['url'] = $args['url'];
} else {
// neither id or url given
return false;
}
$api_parms=array('maxwidth','hide_media','hide_thread','omit_script','align','related','lang');
foreach ($args as $key => $value) {
if (in_array($key,$api_parms))
{
$query[$key] = $value;
}
}
$query['omit_script']='true';
$q_str = http_build_query($query);
$q_str = $ETweet_API_URL . '?' . $q_str;
return $q_str;
} // END function ETw_BuildURL