diff options
author | Aaron Parecki <aaron@parecki.com> | 2022-09-27 00:33:07 +0000 |
---|---|---|
committer | Aaron Parecki <aaron@parecki.com> | 2022-09-27 00:33:07 +0000 |
commit | 895780970f546c1972b1319922faed47f37ffe12 (patch) | |
tree | 1c6b767ce70ef57975c6192498a108e447a38874 | |
parent | 86fb4a5ce73aeafe718dd7d2ad77eaa6ae7da99d (diff) |
add a page to convert a tweet to a micropub post
-rw-r--r-- | controllers/controllers.php | 113 | ||||
-rw-r--r-- | views/twitter.php | 83 |
2 files changed, 196 insertions, 0 deletions
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 @@ + <div class="narrow"> + <?= partial('partials/header') ?> + + <div style="clear: both;" class="notice-pad"> + <div class="alert alert-success hidden" id="test_success"><strong>Success! </strong><a href="" id="post_href">View your post</a></div> + <div class="alert alert-danger hidden" id="test_error"><strong>Something went wrong!</strong><br>Your Micropub endpoint indicated that something went wrong creating the post.</div> + </div> + + <form role="form" style="margin-top: 20px;" id="note_form"> + + <div class="form-group"> + <label for="tweet_url">Tweet to Import</label> + <input type="text" id="tweet_url" value="<?= $this->tweet_url ?>" class="form-control"> + </div> + + + <div style="float: right; margin-top: 6px;"> + <button class="btn btn-success" id="btn_post">Import</button> + </div> + + <div style="float: right; margin-top: 6px; margin-right: 6px;"> + <button class="btn btn-default" id="btn_preview">Preview</button> + </div> + + </form> + + <div style="clear: both;"></div> + + <div id="preview_data" class="hidden"> + <pre></pre> + </div> + + </div> + +<script> +$(function(){ + + $("#btn_preview").click(function(e){ + + $("#btn_preview").addClass("loading disabled"); + + $.post("/twitter/preview", { + tweet_url: $("#tweet_url").val(), + }, function(response){ + $("#preview_data pre").text(response.json); + $("#preview_data").removeClass("hidden"); + $("#btn_preview").removeClass("loading disabled"); + }); + + return false; + }); + + $("#btn_post").click(function(){ + $("#btn_post").addClass("loading disabled"); + + $.post("/twitter", { + tweet_url: $("#tweet_url").val(), + }, function(response){ + + if(response.location != false) { + + $("#test_success").removeClass('hidden'); + $("#test_error").addClass('hidden'); + $("#post_href").attr("href", response.location); + $("#note_form").addClass('hidden'); + + window.location = response.location; + } else { + $("#test_success").addClass('hidden'); + $("#test_error").removeClass('hidden'); + if(response.error_details) { + $("#test_error").text(response.error_details); + } + $("#btn_post").removeClass("loading disabled"); + } + + }); + return false; + }); + +}); + +</script> |