<?php
/**
 * TweetPull4RSS
 *
 * @author sahearn
 * @version 0.2
 *
 * 27 August 2013
 */

$options getopt("u:"); 
if (empty(
$options) ) { 
    print 
"User id is required. [-u userID]\n\n"
    exit(
1); 
}
// clean up input (twitter allows max 15-char username)
$passedID substr(strip_tags(stripslashes($options['u'])), 015);

// import library to auth with twitter
require 'tmhOAuth/tmhOAuth.php';

class 
tmhOAuthExample extends tmhOAuth {
    const 
VERSION '0.2';

    public 
$twitter_userid;
    public 
$twitter_name;
    public 
$twitter_desc;
    public 
$twitter_icon;
    public 
$file;
    
    public function 
__construct($config = array()) {
        
$this->config array_merge(
            array(
                
// change the values below to ones for your application
                
'consumer_key'    => '[your consumer key]',
                
'consumer_secret' => '[your consumer secret]',
                
'token'           => '[your access token]',
                
'secret'          => '[your access secret]',
                
//'bearer'          => 'YOUR_OAUTH2_TOKEN',
                
'user_agent'      => 'TweetPull4RSS ' self::VERSION ' with tmhOAuth ' parent::VERSION ' - //github.com/themattharris/tmhOAuth',
            ),
            
$config
        
);

        
parent::__construct($this->config);
    }

    
// open output file for writing; config with your full path
    
public function openOutputFile() {
        
$this->file '/full/path/to/result/rss/file/' $this->twitter_userid '.xml';
    }

    
// RSS header; no need to modify this
    
public function writeHeader() {
        
$output '<?xml version="1.0" encoding="UTF-8"?>' "\n";
        
$output .= '<rss version="2.0"' "\n";
        
$output .= ' xmlns:content="http://purl.org/rss/1.0/modules/content/"' "\n";
        
$output .= ' xmlns:dc="http://purl.org/dc/elements/1.1/"' "\n";
        
$output .= ' >' "\n";

        
$output .= "\t" '<channel>' "\n";
        
$output .= "\t\t" '<title>' $this->twitter_name ' (' $this->twitter_userid ') on Twitter</title>' "\n";
        
$output .= "\t\t" '<link>https://twitter.com/' $this->twitter_userid '</link>' "\n";
        
$output .= "\t\t" '<description>' $this->twitter_desc '</description>' "\n";

        
$output .= "\t\t" '<language>en-US</language>' "\n";

        
$output .= "\t\t" '<image>' "\n";
        
$output .= "\t\t" ' <title>' $this->twitter_name ' (' $this->twitter_userid ') on Twitter</title>' "\n";
        
$output .= "\t\t" ' <url>' $this->twitter_icon '</url>' "\n";
        
$output .= "\t\t" ' <link>https://twitter.com/' $this->twitter_userid '</link>' "\n";
        
$output .= "\t\t" '</image>' "\n";

        
file_put_contents($this->file$output);
    }
  
    
// RSS footer; no need to modify this
    
public function writeFooter() {
        
$output "\t" '</channel>' "\n";
        
$output .= "</rss>";

        
$current file_get_contents($this->file);
        
$current .= $output;
        
file_put_contents($this->file$current);
    }
  
    
// function to truncate string at a word boundary, and pad with ellipses
    // use for the tweet title if you'd like
    
public function truncate($string$length$stopanywhere=false) {
        
//truncates a string to a certain char length, stopping on a word if not specified otherwise.
        
if (strlen($string) > $length) {
            
//limit hit!
            
$string substr($string,0,($length -3));
            if (
$stopanywhere) {
                
//stop anywhere
                
$string .= '...';
            } else{
                
//stop on a word.
                
$string substr($string,0,strrpos($string,' ')).'...';
            }
        }
        return 
$string;
    }

    
// create hyperlinks out of any @mentions, #hashtags, or links embedded in a tweet
    
public function links($r) {
        
$final '';
        
$respText $r["text"];

        
// grab all the urls from the response and put them in an array for later
        
$urls $r["entities"]["urls"];
        foreach (
$urls as $url) {
            
$uUrl $url["url"];
            list(
$uStart$uEnd) = $url["indices"];
            
$entities[] = array( $uStart$uEnd'url'$uUrl );
        }
        
        
// grab all the @mentions from the response and put them in an array for later
        
$mentions $r["entities"]["user_mentions"];
        foreach (
$mentions as $mention) {
            
$mName $mention["screen_name"];
            list(
$mStart$mEnd) = $mention["indices"];
            
$entities[] = array( $mStart$mEnd'mention''@' $mName );
        }
        
        
// grab all the hashtags from the response and put them in an array for later
        
$hashtags $r["entities"]["hashtags"];
        foreach (
$hashtags as $hashtag) {
            
$hName $hashtag["text"];
            list(
$hStart$hEnd) = $hashtag["indices"];
            
$entities[] = array( $hStart$hEnd'hashtag''#' $hName );
        }

        if (isset(
$entities)) {
            
// reverse sort, because I need to work backwards through the indices
            
rsort($entities);
            
            foreach (
$entities as $entity) {
                if (
strcasecmp(substr($respText$entity[0], $entity[1]-$entity[0]),$entity[3]) == 0) {
                    if (
strcmp($entity[2],"url") == 0) {
                        
$final substr_replace($respText'<a href="' $entity[3] . '">' $entity[3] . '</a>'$entity[0], $entity[1]-$entity[0]);
                    } elseif (
strcmp($entity[2],"mention") == 0) {
                        
$final substr_replace($respText'<a href="https://twitter.com/' trim($entity[3],'@') . '">' $entity[3] . '</a>'$entity[0], $entity[1]-$entity[0]);
                    } elseif (
strcmp($entity[2],"hashtag") == 0) {
                        
$final substr_replace($respText'<a href="https://twitter.com/search?q=%23' trim($entity[3],'#') . '&amp;src=hash">' $entity[3] . '</a>'$entity[0], $entity[1]-$entity[0]);
                    }
                    
$respText $final;
                }
            }
        }

        return 
$respText;
    }
}

// instantiate ctor
$tmhOAuth = new tmhOAuthExample();

// make request
$code $tmhOAuth->request('GET'$tmhOAuth->url('1.1/statuses/user_timeline'), array('screen_name' => $passedID));

// clean up JSON response data
$decoded json_decode($tmhOAuth->response['response'], true);

if (isset(
$decoded[0]["created_at"])) {

    
// extract twitter user data from first tweet
    
$tmhOAuth->twitter_userid $decoded[0]["user"]["screen_name"];
    
$tmhOAuth->twitter_name $decoded[0]["user"]["name"];
    
$tmhOAuth->twitter_desc $decoded[0]["user"]["description"];
    
$tmhOAuth->twitter_icon $decoded[0]["user"]["profile_image_url"];

    
// start output, write header
    
$tmhOAuth->openOutputFile();
    
$tmhOAuth->writeHeader();

    
// write each tweet
    
foreach ($decoded as $i) {
        
$p explode(" "$i["created_at"]);
        
$dateFinal $p[0] . ', ' $p[2] . ' ' $p[1] . ' ' $p[5] . ' ' $p[3] . ' ' $p[4];

        
$content "\t\t" '<item>' "\n";
//        $content .= "\t\t" . ' <title>' . $tmhOAuth->truncate($i["text"], 50) . '</title>' . "\n";
        
$content .= "\t\t" ' <title>' $i["text"] . '</title>' "\n";
        
$content .= "\t\t" ' <link>https://twitter.com/' $tmhOAuth->twitter_userid '/status/' $i["id_str"] . '</link>' "\n";
        
$content .= "\t\t" ' <guid isPermaLink="false">https://twitter.com/' $tmhOAuth->twitter_userid '/status/' $i["id_str"] . '</guid>' "\n";
        
$content .= "\t\t" ' <description><![CDATA[' $tmhOAuth->links($i) . ']]></description>' "\n";
        
$content .= "\t\t" ' <dc:creator>' $tmhOAuth->twitter_userid '</dc:creator>' "\n";
        
$content .= "\t\t" ' <pubDate>' $dateFinal '</pubDate>' "\n";
        
$content .= "\t\t" '</item>' "\n";

        
$current file_get_contents($tmhOAuth->file);
        
$current .= $content;
        
file_put_contents($tmhOAuth->file$current);
    }

    
$tmhOAuth->writeFooter();

} elseif (isset(
$decoded[0]["errors"])) {
    
// report errors if any
    
echo "Error: " $decoded[0]["errors"][0]["message"] . "\n\n";
}

?>