• Ushahidi post tweets to API php example

    Date: 2010.07.15 | Category: ICT, my school closures, school, school closures, ushahidi

    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 inMy 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:

    <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 "<br/><b>Location content: $location<br/>";
                                    // Pass the location to yahoo pipe
                                    $location = str_ireplace(" ","",$location);
                                    //echo "<br/>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 "<br/>$sql<br/>";
    }
    ?>
    

    Report This Post

    No related posts.