| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  | #!/usr/bin/env php
 | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @category  Plugin | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  |  * @package   GNUsocial | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  |  * @author    Brion Vibber <brion@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  | define('INSTALLDIR', dirname(__DIR__, 3)); | 
					
						
							|  |  |  | define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | $shortoptions = 'n:'; | 
					
						
							|  |  |  | $longoptions = array('nick=','import','all'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $helptext = <<<ENDOFHELP | 
					
						
							|  |  |  | USAGE: fakestream.php -n <username> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   -n --nick=<username> Local user whose Twitter timeline to watch | 
					
						
							|  |  |  |      --import          Experimental: run incoming messages through import | 
					
						
							|  |  |  |      --all             Experimental: run multiuser; requires nick be the app owner | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Attempts a User Stream connection to Twitter as the given user, dumping | 
					
						
							|  |  |  | data as it comes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENDOFHELP; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once INSTALLDIR.'/scripts/commandline.inc'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (have_option('n')) { | 
					
						
							|  |  |  |     $nickname = get_option_value('n'); | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  | } elseif (have_option('nick')) { | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  |     $nickname = get_option_value('nickname'); | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  | } elseif (have_option('all')) { | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     $nickname = null; | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | } else { | 
					
						
							|  |  |  |     show_help($helptext); | 
					
						
							|  |  |  |     exit(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  |  * @param User $user | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  |  * @return TwitterOAuthClient | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function twitterAuthForUser(User $user) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-07-18 11:39:34 +02:00
										 |  |  |     $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  |     $token = TwitterOAuthClient::unpackToken($flink->credentials); | 
					
						
							|  |  |  |     if (!$token) { | 
					
						
							|  |  |  |         throw new ServerException("No Twitter OAuth credentials for this user."); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return new TwitterOAuthClient($token->key, $token->secret); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Emulate the line-by-line output... | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param Foreign_link $flink | 
					
						
							|  |  |  |  * @param mixed $data | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function dumpMessage($flink, $data) | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     $msg = prepMessage($flink, $data); | 
					
						
							|  |  |  |     print json_encode($msg) . "\r\n"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function prepMessage($flink, $data) | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | { | 
					
						
							|  |  |  |     $msg->for_user = $flink->foreign_id; | 
					
						
							|  |  |  |     $msg->message = $data; | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     return $msg; | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (have_option('all')) { | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     $users = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $flink = new Foreign_link(); | 
					
						
							|  |  |  |     $flink->service = TWITTER_SERVICE; | 
					
						
							|  |  |  |     $flink->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ($flink->fetch()) { | 
					
						
							|  |  |  |         if (($flink->noticesync & FOREIGN_NOTICE_RECV) == | 
					
						
							|  |  |  |             FOREIGN_NOTICE_RECV) { | 
					
						
							|  |  |  |             $users[] = $flink->user_id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } else { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |     $user = User::getKV('nickname', $nickname); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     $users = array($user->id); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  | $output = array(); | 
					
						
							|  |  |  | foreach ($users as $id) { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |     $user = User::getKV('id', $id); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     if (!$user) { | 
					
						
							|  |  |  |         throw new Exception("No user for id $id"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $auth = twitterAuthForUser($user); | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  |     $flink = Foreign_link::getByUserID( | 
					
						
							|  |  |  |         $user->id, | 
					
						
							|  |  |  |         TWITTER_SERVICE | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     $friends->friends = $auth->friendsIds(); | 
					
						
							|  |  |  |     dumpMessage($flink, $friends); | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     $timeline = $auth->statusesHomeTimeline(); | 
					
						
							|  |  |  |     foreach ($timeline as $status) { | 
					
						
							|  |  |  |         $output[] = prepMessage($flink, $status); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-11-02 16:27:14 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  | usort($output, function ($a, $b) { | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |     if ($a->message->id < $b->message->id) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2019-09-18 17:15:00 +03:00
										 |  |  |     } elseif ($a->message->id == $b->message->id) { | 
					
						
							| 
									
										
										
										
											2010-11-02 16:43:01 -07:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreach ($output as $msg) { | 
					
						
							|  |  |  |     print json_encode($msg) . "\r\n"; | 
					
						
							|  |  |  | } |