Ushahidi post tweets to API php example
The below code takes an rss search result from twitter, detects the authors location then posts the information to Ushahidi via the API.
Application I used it in: My School Closures for detecting people who tweet about school closures. Unfortunately I have to use pipes for the location builder which isn’t elegant as Yahoo Pipes sucks and I wish I never started playing with it. Feel free to play with the pipe I created to get geo location information from a location name, it is the pipe that has the json_decode.
You will need mysql and a table for the guids (this stops us from spamming twitter for authors we have already located). Make sure you change the configuration settings and create a table in mysql.
The method is simple, the code isn’t pretty and will require polishing but here it is:
[php] <pre> <?php //CONFIGURE THE SETTINGS BELOW //twitter settings $twitterusername = “mytwitteraccount”; $twitterpassword = “apasswordgoeshere”;
//database settings $host = “databasehostname”; $user = “databaseusername”; $pass = “databasepassword”; $dbname = ‘databasename’;
// You should create a table called tweetguids in your database $tablename = “tweetguids”;
// Change the below feed to a rss feed similar to below $rssurl = “http://pipes.yahoo.com/pipes/pipe.run?_id=a9663ebc09e69b9195fb2407fba9f2bc&_render=rss”;
// END OF CONFIG
$conn = mysql_connect($host, $user, $pass) or die (‘Error connecting to mysql’); mysql_select_db($dbname);
ini_set(‘display_errors’, 1); ini_set(‘log_errors’, 1); ini_set(‘error_log’, dirname(__FILE__) . ‘/error_log.txt’); error_reporting(E_ALL);
$rss = simplexml_load_file($rssurl) or die(“failure”); $count = 0; foreach ($rss->channel as $chan) { $time = $chan->pubDate; } foreach ($rss->channel as $chan){$time = $chan->pubDate;} foreach ($rss->channel->item as $item) { // only do first 10 records if ($count < 10) { $foundguid=0; $guidnew=$item->guid; // Check to see if guid exists in db already $sql=”SELECT * FROM $tablename where guid = \“$guidnew\””; $result=mysql_query($sql, $conn); while ($row=mysql_fetch_array($result)) { $foundguid=1; echo “Foundguid: $foundguid”; } if($foundguid==1) { echo “We found an alredy existing guid…”; } else { $count = $count + 1; $task=”report”; $incident_title=$item->title; $guidnew=$item->guid; $incident_title=str_replace(“ “,”+”,$incident_title); $incident_description=$item->description; $incident_description=str_replace(“ “,”+”,$incident_description); $incident_date=date(“m/d/Y”,$time); $incident_hour=date(“H”,$time); $incident_minute=date(“i”,$time); $incident_ampm=date(“a”,$time); $incident_category=”Possible Closure”; $location_name=”Unknown”; $author = $item->author; $author = str_replace(“ “,”+”,$author); $pos = strpos($author,”+”); //$author = substr($author,0,$pos); $author = str_ireplace(“http://twitter.com/”,””,$author); $url = “http://$twitterusername:$twitterpassword@api.twitter.com/1/users/lookup.xml?screen_name=$author”; //echo $url; $output = simplexml_load_file($url) or die(“badauth”); foreach ($output->user as $item) { // Get the values out of the XML $location=$item->location; // Clean up the location $location=str_ireplace(“-“,”,”,$location); $location=str_ireplace(“ “,”,”,$location); // $location=preg_replace(“/[^a-zA-Z0-9\s]/”, “”, $location); echo “
Location content: $location
”; // Pass the location to yahoo pipe $location = str_ireplace(“ “,””,$location); //echo “
Loc: $location”; $locationurl = “http://pipes.yahoo.com/pipes/pipe.run?_id=03539616e4cdd62eb15ed26b81e3041e&_render=json&q=$location”;
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $locationurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//make the request $json = curl_exec($ch); $arr = (json_decode($json,true)); $blah = $arr[‘value’][‘items’][0][‘name’][‘loc’]; //print_r($blah); $latitude = $blah[‘lat’]; $longitude = $blah[‘lon’]; $location_name = $blah[‘city’]; }
$incident_description=”Closure reported from twitter”; $url = “task=report&incident_title=$incident_title&incident_description=$incident_description&incident_date=$incident_date&incident_hour=$incident_hour&incident_minute=$incident_minu$ $posturl = “http://myschoolclosures.com/ushahidi/api”; $Curl_Session = curl_init($posturl); curl_setopt ($Curl_Session, CURLOPT_POST, 1); curl_setopt ($Curl_Session, CURLOPT_POSTFIELDS, $url); curl_setopt ($Curl_Session, CURLOPT_FOLLOWLOCATION, 1); curl_exec ($Curl_Session); curl_close ($Curl_Session); //Write to the database $sqlgo=”INSERT INTO $tablename VALUES (\“$guidnew\”)”; $result=mysql_query($sqlgo, $conn); } } //Write anything else to DB just in case anything trails behind $sql=”INSERT INTO $tablename VALUES (\“$guidnew\”)”; $result=mysql_query($sql, $conn); $row=mysql_fetch_array($result); //echo “
$sql
”; } ?> [/php]
![filter-full[1]](images/filter-full1.png)