2014-05-26 00:30:46 +02:00
< ? php
2016-08-10 11:00:40 +02:00
class TwitterBridge extends BridgeAbstract {
2014-05-26 00:30:46 +02:00
2015-11-05 16:50:18 +01:00
public function loadMetadatas () {
$this -> maintainer = " mitsukarenai " ;
2016-08-10 11:00:40 +02:00
$this -> name = " Twitter Bridge " ;
2015-11-05 16:50:18 +01:00
$this -> uri = " https://twitter.com/ " ;
2016-08-10 11:00:40 +02:00
$this -> description = " Returns tweets by keyword/hashtag or user name " ;
2016-08-17 14:45:08 +02:00
$this -> update = '2016-08-17' ;
2016-08-10 10:44:23 +02:00
2016-07-08 19:06:35 +02:00
$this -> parameters [ " global " ] =
2016-08-10 10:44:23 +02:00
' [
{
" name " : " Hide profile pictures " ,
2016-08-20 12:32:05 +02:00
" identifier " : " nopic " ,
2016-08-10 10:44:23 +02:00
" type " : " checkbox " ,
2016-08-15 01:19:16 +02:00
" required " : false ,
2016-08-10 10:44:23 +02:00
" exampleValue " : " checked " ,
" title " : " Activate to hide profile pictures in content "
}
] ' ;
2015-11-05 16:50:18 +01:00
$this -> parameters [ " By keyword or hashtag " ] =
' [
{
" name " : " Keyword or #hashtag " ,
2016-08-10 10:55:06 +02:00
" identifier " : " q " ,
" type " : " text " ,
2016-08-15 01:19:16 +02:00
" required " : true ,
2016-08-10 10:55:06 +02:00
" exampleValue " : " rss-bridge, #rss-bridge " ,
" title " : " Insert a keyword or hashtag "
2015-11-05 16:50:18 +01:00
}
] ' ;
$this -> parameters [ " By username " ] =
' [
{
" name " : " username " ,
2016-08-10 10:55:06 +02:00
" identifier " : " u " ,
" type " : " text " ,
2016-08-15 01:19:16 +02:00
" required " : true ,
2016-08-10 10:55:06 +02:00
" exampleValue " : " sebsauvage " ,
" title " : " Insert a user name "
2016-08-20 11:18:06 +02:00
},
{
" name " : " Without replies " ,
" identifier " : " norep " ,
" type " : " checkbox " ,
" required " : false ,
" exampleValue " : " checked " ,
" title " : " Only return initial tweets "
2015-11-05 16:50:18 +01:00
}
] ' ;
}
2014-05-26 00:30:46 +02:00
public function collectData ( array $param ){
2016-07-08 19:06:35 +02:00
$html = '' ;
2014-05-26 00:30:46 +02:00
if ( isset ( $param [ 'q' ])) { /* keyword search mode */
2016-07-08 19:06:35 +02:00
$html = $this -> getSimpleHTMLDOM ( 'https://twitter.com/search?q=' . urlencode ( $param [ 'q' ]) . '&f=tweets' ) or $this -> returnServerError ( 'No results for this query.' );
2014-05-26 00:30:46 +02:00
}
elseif ( isset ( $param [ 'u' ])) { /* user timeline mode */
2016-08-20 11:18:06 +02:00
$html = $this -> getSimpleHTMLDOM ( 'https://twitter.com/' . urlencode ( $param [ 'u' ]) . ( isset ( $param [ 'norep' ]) ? '' : '/with_replies' )) or $this -> returnServerError ( 'Requested username can\'t be found.' );
2014-05-26 00:30:46 +02:00
}
else {
2016-08-17 14:45:08 +02:00
$this -> returnClientError ( 'You must specify a keyword (?q=...) or a Twitter username (?u=...).' );
2014-05-26 00:30:46 +02:00
}
2016-08-10 10:44:23 +02:00
$hidePictures = false ;
2016-08-20 12:32:05 +02:00
if ( isset ( $param [ 'nopic' ]))
$hidePictures = $param [ 'nopic' ] === 'on' ;
2016-08-10 10:44:23 +02:00
2014-05-26 00:30:46 +02:00
foreach ( $html -> find ( 'div.js-stream-tweet' ) as $tweet ) {
$item = new \Item ();
// extract username and sanitize
$item -> username = $tweet -> getAttribute ( 'data-screen-name' );
// extract fullname (pseudonym)
2016-07-08 19:06:35 +02:00
$item -> fullname = $tweet -> getAttribute ( 'data-name' );
2016-08-10 10:26:29 +02:00
// get author
$item -> author = $item -> fullname . ' (@' . $item -> username . ')' ;
2014-05-26 00:30:46 +02:00
// get avatar link
2016-07-08 19:06:35 +02:00
$item -> avatar = $tweet -> find ( 'img' , 0 ) -> src ;
2014-05-26 00:30:46 +02:00
// get TweetID
$item -> id = $tweet -> getAttribute ( 'data-tweet-id' );
2016-07-08 19:06:35 +02:00
// get tweet link
$item -> uri = 'https://twitter.com' . $tweet -> find ( 'a.js-permalink' , 0 ) -> getAttribute ( 'href' );
2014-05-26 00:30:46 +02:00
// extract tweet timestamp
$item -> timestamp = $tweet -> find ( 'span.js-short-timestamp' , 0 ) -> getAttribute ( 'data-time' );
2016-08-10 10:26:29 +02:00
// generate the title
2016-08-19 17:20:49 +02:00
$item -> title = strip_tags ( html_entity_decode ( $tweet -> find ( 'p.js-tweet-text' , 0 ) -> innertext , ENT_QUOTES , 'UTF-8' ));
2016-07-08 19:06:35 +02:00
2014-05-26 00:30:46 +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' );
}
2016-08-09 21:59:55 +02:00
// process emojis (reduce size)
foreach ( $tweet -> find ( 'img.Emoji' ) as $img ){
$img -> style .= ' height: 1em;' ;
}
2016-08-09 21:47:29 +02:00
2016-08-09 21:59:55 +02:00
// get tweet text
2016-08-09 21:47:29 +02:00
$cleanedTweet = str_replace ( 'href="/' , 'href="https://twitter.com/' , $tweet -> find ( 'p.js-tweet-text' , 0 ) -> innertext );
2016-08-10 10:44:23 +02:00
// Add picture to content
$picture_html = '' ;
if ( ! $hidePictures ){
$picture_html = <<< EOD
< a href = " https://twitter.com/ { $item -> username } " >< img style = " align: top; width:75 px; border: 1px solid black; " alt = " { $item -> username } " src = " { $item -> avatar } " title = " { $item -> fullname } " /></ a >
EOD ;
}
// add content
2016-08-09 21:47:29 +02:00
$item -> content = <<< EOD
2016-08-09 22:05:42 +02:00
< div style = " display: inline-block; vertical-align: top; " >
2016-08-10 10:44:23 +02:00
{ $picture_html }
2016-08-09 22:05:42 +02:00
</ div >
< div style = " display: inline-block; vertical-align: top; " >
< blockquote > { $cleanedTweet } </ blockquote >
</ div >
2016-08-09 21:47:29 +02:00
EOD ;
2014-05-26 00:30:46 +02:00
// put out
$this -> items [] = $item ;
}
}
public function getCacheDuration (){
return 300 ; // 5 minutes
}
}