2013-08-11 13:30:41 +02:00
< ? php
2015-11-05 16:50:18 +01:00
//Based on https://github.com/mitsukarenai/twitterbridge-noapi
2013-08-11 13:30:41 +02:00
class TwitterBridge extends BridgeAbstract {
2015-11-05 16:50:18 +01:00
2013-08-15 13:58:58 +02:00
private $request ;
2013-08-11 13:30:41 +02:00
2015-11-05 16:50:18 +01:00
public function loadMetadatas () {
$this -> maintainer = " mitsukarenai " ;
$this -> name = " Twitter Bridge " ;
$this -> uri = " http://twitter.com/ " ;
$this -> description = " Returns user timelines or keyword/hashtag search results (without using their API). " ;
$this -> update = " 2014-05-25 " ;
$this -> parameters [ " By keyword or hashtag " ] =
' [
{
" name " : " Keyword or #hashtag " ,
" identifier " : " q "
}
] ' ;
$this -> parameters [ " By username " ] =
' [
{
" name " : " username " ,
" identifier " : " u "
}
] ' ;
}
2013-08-11 13:30:41 +02:00
public function collectData ( array $param ){
$html = '' ;
if ( isset ( $param [ 'q' ])) { /* keyword search mode */
2013-08-15 13:58:58 +02:00
$this -> request = $param [ 'q' ];
2015-06-26 11:55:11 +02: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 13:30:41 +02:00
}
elseif ( isset ( $param [ 'u' ])) { /* user timeline mode */
2013-08-15 13:58:58 +02: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 13:30:41 +02:00
}
else {
$this -> returnError ( 'You must specify a keyword (?q=...) or a Twitter username (?u=...).' , 400 );
}
2014-05-14 14:34:06 +02:00
foreach ( $html -> find ( 'div.js-stream-tweet' ) as $tweet ) {
2013-08-11 13:30:41 +02:00
$item = new \Item ();
2014-05-14 14:34:06 +02:00
$item -> username = $tweet -> getAttribute ( 'data-screen-name' ); // extract username and sanitize
2013-08-11 13:30:41 +02: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 14:34:06 +02: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 17:10:49 +02: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 14:34:06 +02: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 13:30:41 +02:00
$item -> title = $item -> fullname . ' (@' . $item -> username . ') | ' . $item -> content ;
$this -> items [] = $item ;
}
}
public function getName (){
2013-08-15 13:58:58 +02:00
return ( ! empty ( $this -> request ) ? $this -> request . ' - ' : '' ) . 'Twitter Bridge' ;
2013-08-11 13:30:41 +02:00
}
public function getURI (){
return 'http://twitter.com' ;
}
public function getCacheDuration (){
return 300 ; // 5 minutes
}
2013-08-15 16:19:43 +02:00
}