Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
158 lines (140 sloc) 4.06 KB
<?php
error_reporting(-1);
ini_set('display_errors',1);
$request_body = file_get_contents('php://input');
$xml = simplexml_load_string($request_body);
switch($xml->methodName)
{
//wordpress blog verification
case 'mt.supportedMethods':
success('metaWeblog.getRecentPosts');
break;
//first authentication request from ifttt
case 'metaWeblog.getRecentPosts':
//send a blank blog response
//this also makes sure that the channel is never triggered
success('<array><data></data></array>');
break;
case 'metaWeblog.newPost':
//@see http://codex.wordpress.org/XML-RPC_WordPress_API/Posts#wp.newPost
$obj = new stdClass;
//get the parameters from xml
$obj->user = (string)$xml->params->param[1]->value->string;
$obj->pass = (string)$xml->params->param[2]->value->string;
//@see content in the wordpress docs
$content = $xml->params->param[3]->value->struct->member;
foreach($content as $data)
{
switch((string)$data->name)
{
//neglect these sections of the request
case 'post_status' ://publish status
case 'mt_keywords': //tags
break;
//the passed categories are parsed into an array
case 'categories':
$categories=array();
foreach($data->xpath('value/array/data/value/string') as $cat)
array_push($categories,(string)$cat);
$obj->categories = $categories;
break;
case 'description':
$url = (string)$data->value->string;
break;
//this is used for title
default:
$obj->{$data->name} = (string)$data->value->string;
}
}
//Make the webrequest
//Only if we have a valid url
if(valid_url($url,true))
{
// Load Requests Library
include('requests/Requests.php');
Requests::register_autoloader();
$headers = array('Content-Type' => 'application/json');
$response = Requests::post($url, $headers, json_encode($obj));
if($response->success)
success('<string>'.$response->status_code.'</string>');
else
failure($response->status_code);
}
else
{
//since the url was invalid, we return 400 (Bad Request)
failure(400);
}
}
/** Copied from wordpress */
function success($innerXML)
{
$xml = <<<EOD
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
$innerXML
</value>
</param>
</params>
</methodResponse>
EOD;
output($xml);
}
function output($xml){
$length = strlen($xml);
header('Connection: close');
header('Content-Length: '.$length);
header('Content-Type: text/xml');
header('Date: '.date('r'));
echo $xml;
exit;
}
function failure($status){
$xml= <<<EOD
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>$status</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Request was not successful.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
EOD;
output($xml);
}
/** Used from drupal */
function valid_url($url, $absolute = FALSE) {
if ($absolute) {
return (bool) preg_match("
/^ # Start at the beginning of the text
(?:https?):\/\/ # Look for ftp, http, https or feed schemes
(?: # Userinfo (optional) which is typically
(?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)* # a username or a username and password
(?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@ # combination
)?
(?:
(?:[a-z0-9\-\.]|%[0-9a-f]{2})+ # A domain name or a IPv4 address
|(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\]) # or a well formed IPv6 address
)
(?::[0-9]+)? # Server port number (optional)
(?:[\/|\?]
(?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2}) # The path and query (optional)
*)?
$/xi", $url);
}
else {
return (bool) preg_match("/^(?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})+$/i", $url);
}
}