2013-08-11 15:30:41 +04:00
< ? php
/**
* RssBridgeTwitter
* Based on https :// github . com / mitsukarenai / twitterbridge - noapi
2014-05-26 01:27:14 +04:00
* 2014 - 05 - 25
2013-08-11 15:30:41 +04:00
*
* @ name Twitter Bridge
2014-05-26 01:27:14 +04:00
* @ homepage http :// twitter . com /
2013-08-13 00:54:09 +04:00
* @ description Returns user timelines or keyword / hashtag search results ( without using their API ) .
2014-05-21 21:15:52 +04:00
* @ maintainer mitsukarenai
2013-08-15 18:19:43 +04:00
* @ use1 ( q = " keyword or #hashtag " )
2013-08-12 00:34:14 +04:00
* @ use2 ( u = " username " )
2013-08-11 15:30:41 +04:00
*/
class TwitterBridge extends BridgeAbstract {
2013-08-15 15:58:58 +04:00
private $request ;
2013-08-11 15:30:41 +04:00
public function collectData ( array $param ){
$html = '' ;
if ( isset ( $param [ 'q' ])) { /* keyword search mode */
2013-08-15 15:58:58 +04:00
$this -> request = $param [ 'q' ];
2015-06-26 12:55:11 +03:00
$html = file_get_html ( 'https://twitter.com/search?q=' . urlencode ( $this -> request ) . '&f=tweets' ) or $this -> returnError ( 'No results for this query.' , 404 );
2013-08-11 15:30:41 +04:00
}
elseif ( isset ( $param [ 'u' ])) { /* user timeline mode */
2013-08-15 15:58:58 +04:00
$this -> request = $param [ 'u' ];
$html = file_get_html ( 'http://twitter.com/' . urlencode ( $this -> request )) or $this -> returnError ( 'Requested username can\'t be found.' , 404 );
2013-08-11 15:30:41 +04:00
}
else {
$this -> returnError ( 'You must specify a keyword (?q=...) or a Twitter username (?u=...).' , 400 );
}
2014-05-14 16:34:06 +04:00
foreach ( $html -> find ( 'div.js-stream-tweet' ) as $tweet ) {
2013-08-11 15:30:41 +04:00
$item = new \Item ();
2014-05-14 16:34:06 +04:00
$item -> username = $tweet -> getAttribute ( 'data-screen-name' ); // extract username and sanitize
2013-08-11 15:30:41 +04:00
$item -> fullname = $tweet -> getAttribute ( 'data-name' ); // extract fullname (pseudonym)
$item -> avatar = $tweet -> find ( 'img' , 0 ) -> src ; // get avatar link
$item -> id = $tweet -> getAttribute ( 'data-tweet-id' ); // get TweetID
2014-05-14 16:34:06 +04:00
$item -> uri = 'https://twitter.com' . $tweet -> find ( 'a.js-permalink' , 0 ) -> getAttribute ( 'href' ); // get tweet link
$item -> timestamp = $tweet -> find ( 'span.js-short-timestamp' , 0 ) -> getAttribute ( 'data-time' ); // extract tweet timestamp
2014-05-28 19:10:49 +04:00
// processing content links
foreach ( $tweet -> find ( 'a' ) as $link ) {
if ( $link -> hasAttribute ( 'data-expanded-url' ) ) {
$link -> href = $link -> getAttribute ( 'data-expanded-url' );
}
$link -> removeAttribute ( 'data-expanded-url' );
$link -> removeAttribute ( 'data-query-source' );
$link -> removeAttribute ( 'rel' );
$link -> removeAttribute ( 'class' );
$link -> removeAttribute ( 'target' );
$link -> removeAttribute ( 'title' );
}
2014-05-14 16:34:06 +04:00
$item -> content = str_replace ( 'href="/' , 'href="https://twitter.com/' , strip_tags ( $tweet -> find ( 'p.js-tweet-text' , 0 ) -> innertext , '<a>' )); // extract tweet text
2013-08-11 15:30:41 +04:00
$item -> title = $item -> fullname . ' (@' . $item -> username . ') | ' . $item -> content ;
$this -> items [] = $item ;
}
}
public function getName (){
2013-08-15 15:58:58 +04:00
return ( ! empty ( $this -> request ) ? $this -> request . ' - ' : '' ) . 'Twitter Bridge' ;
2013-08-11 15:30:41 +04:00
}
public function getURI (){
return 'http://twitter.com' ;
}
public function getCacheDuration (){
return 300 ; // 5 minutes
}
2013-08-15 18:19:43 +04:00
}