From 895780970f546c1972b1319922faed47f37ffe12 Mon Sep 17 00:00:00 2001 From: Aaron Parecki Date: Tue, 27 Sep 2022 00:33:07 +0000 Subject: [PATCH] add a page to convert a tweet to a micropub post --- controllers/controllers.php | 113 ++++++++++++++++++++++++++++++++++++ views/twitter.php | 83 ++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 views/twitter.php diff --git a/controllers/controllers.php b/controllers/controllers.php index c306aac..bcfe2d0 100644 --- a/controllers/controllers.php +++ b/controllers/controllers.php @@ -234,6 +234,24 @@ $app->get('/review', function() use($app) { } }); + +$app->get('/twitter', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $tweet_url = ''; + + if(array_key_exists('tweet_url', $params)) + $tweet_url = $params['tweet_url']; + + render('twitter', array( + 'title' => 'Import Tweet', + 'tweet_url' => $tweet_url, + 'authorizing' => false + )); + } +}); + $app->get('/repost', function() use($app) { if($user=require_login($app)) { $params = $app->request()->params(); @@ -422,6 +440,101 @@ $app->get('/settings/html-content', function() use($app) { } }); +$app->post('/twitter/preview', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + if($user->twitter_access_token) { + $xray_opts['twitter_api_key'] = Config::$twitterClientID; + $xray_opts['twitter_api_secret'] = Config::$twitterClientSecret; + $xray_opts['twitter_access_token'] = $user->twitter_access_token; + $xray_opts['twitter_access_token_secret'] = $user->twitter_token_secret; + } + + $tweet_url = $params['tweet_url']; + + // Pass to X-Ray to download all the twitter data in a useful format + $xray = new p3k\XRay(); + $xray->http = new p3k\HTTP('Quill ('.Config::$base_url.')'); + $data = $xray->parse($tweet_url, $xray_opts); + + $postdata = tweet_to_micropub_request($data['data']); + + $response = [ + 'json' => json_encode($postdata, JSON_PRETTY_PRINT+JSON_UNESCAPED_SLASHES) + ]; + + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode($response)); + } +}); + +$app->post('/twitter', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + if($user->twitter_access_token) { + $xray_opts['twitter_api_key'] = Config::$twitterClientID; + $xray_opts['twitter_api_secret'] = Config::$twitterClientSecret; + $xray_opts['twitter_access_token'] = $user->twitter_access_token; + $xray_opts['twitter_access_token_secret'] = $user->twitter_token_secret; + } + + $tweet_url = $params['tweet_url']; + + // Pass to X-Ray to download all the twitter data in a useful format + $xray = new p3k\XRay(); + $xray->http = new p3k\HTTP('Quill ('.Config::$base_url.')'); + $data = $xray->parse($tweet_url, $xray_opts); + + $location = null; + + if(isset($data['data']) && $data['data']['type'] == 'entry') { + $tweet = $data['data']; + + $postdata = tweet_to_micropub_request($tweet); + + $r = micropub_post_for_user($user, $postdata, null, true); + + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode([ + 'location' => (isset($r['location']) && $r['location'] ? Mf2\resolveUrl($user->micropub_endpoint, $r['location']) : null), + 'error' => $r['error'], + 'response' => $r['response'] + ])); + } else { + $app->response()['Content-type'] = 'application/json'; + + $app->response()->body(json_encode([ + 'location' => null, + 'error' => 'Error fetching tweet', + ])); + } + } +}); + +function tweet_to_micropub_request($tweet) { + // Convert to a micropub post + $postdata = [ + 'type' => ['h-entry'], + 'properties' => [ + 'content' => [$tweet['content']['text']], + 'published' => [$tweet['published']], + 'syndication' => [$tweet['url']], + ] + ]; + if(isset($tweet['in-reply-to'])) + $postdata['properties']['in-reply-to'] = [$tweet['in-reply-to']]; + if(isset($tweet['category'])) + $postdata['properties']['category'] = $tweet['category']; + if(isset($tweet['photo'])) + $postdata['properties']['photo'] = $tweet['photo']; + if(isset($tweet['video'])) + $postdata['properties']['video'] = $tweet['video']; + + return $postdata; +} + function create_favorite(&$user, $url) { $tweet_id = false; diff --git a/views/twitter.php b/views/twitter.php new file mode 100644 index 0000000..d9682e8 --- /dev/null +++ b/views/twitter.php @@ -0,0 +1,83 @@ +
+ + +
+ + +
+ +
+ +
+ + +
+ + +
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +