Merge pull request #142 from spirit1431007/pr-branch

change curl to wp_remote_post
This commit is contained in:
Mashiro 2019-11-26 18:57:50 +08:00 committed by GitHub
commit 8ffa252dcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 131 additions and 137 deletions

View File

@ -79,7 +79,6 @@ window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}
</head> </head>
<body <?php body_class(); ?>> <body <?php body_class(); ?>>
<?php if(get_template_directory_uri() != get_site_url().'/wp-content/themes/Sakura') echo '<div style="position:fixed;height:100%;width:100%;top:0;left:0;font-size:20px;z-index:999999;background-color: #fff;">Plz rename the theme folder name as <span style="color:red">Sakura</span>!<br>请将主题文件夹名改为 <span style="color:red">Sakura</span></div>'; ?> <?php if(get_template_directory_uri() != get_site_url().'/wp-content/themes/Sakura') echo '<div style="position:fixed;height:100%;width:100%;top:0;left:0;font-size:20px;z-index:999999;background-color: #fff;">Plz rename the theme folder name as <span style="color:red">Sakura</span>!<br>请将主题文件夹名改为 <span style="color:red">Sakura</span></div>'; ?>
<?php if(!function_exists('curl_exec')) echo '<div style="position:fixed;height:100%;width:100%;top:0;left:0;font-size:20px;z-index:999999;background-color: #fff;">主题需要 PHP 的 curl 支持!请在 `php.ini` 里开启或者联系你的主机商。<br>The theme requires PHP\'s curl support! Please turn on in `php.ini` or contact your hosting provider.</div>'; ?>
<div class="scrollbar" id="bar"></div> <div class="scrollbar" id="bar"></div>
<section id="main-container"> <section id="main-container">
<?php <?php

View File

@ -4,84 +4,77 @@
* Router * Router
*/ */
add_action('rest_api_init', function () { add_action('rest_api_init', function () {
register_rest_route('sakura/v1', '/image/upload', array( register_rest_route('sakura/v1', '/image/upload', array(
'methods' => 'POST', 'methods' => 'POST',
'callback' => 'upload_image', 'callback' => 'upload_image',
)); ));
register_rest_route('sakura/v1', '/cache_search/json', array( register_rest_route('sakura/v1', '/cache_search/json', array(
'methods' => 'GET', 'methods' => 'GET',
'callback' => 'cache_search_json', 'callback' => 'cache_search_json',
)); ));
}); });
/** /**
* Image uploader response * Image uploader response
*/ */
function upload_image(WP_REST_Request $request) function upload_image(WP_REST_Request $request) {
{ // see: https://developer.wordpress.org/rest-api/requests/
// see: https://developer.wordpress.org/rest-api/requests/
// handle file params $file === $_FILES // handle file params $file === $_FILES
/** /**
* curl \ * curl \
* -F "filecomment=This is an img file" \ * -F "filecomment=This is an img file" \
* -F "cmt_img_file=@screenshot.jpg" \ * -F "cmt_img_file=@screenshot.jpg" \
* https://dev.2heng.xin/wp-json/sakura/v1/image/upload * https://dev.2heng.xin/wp-json/sakura/v1/image/upload
*/ */
// $file = $request->get_file_params(); // $file = $request->get_file_params();
if ( !check_ajax_referer('wp_rest', '_wpnonce', false) ) { if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
$output = array( $output = array(
'status' => 403, 'status' => 403,
'success' => false, 'success' => false,
'message' => 'Unauthorized client.', 'message' => 'Unauthorized client.',
'link' => "https://view.moezx.cc/images/2019/11/14/step04.md.png", 'link' => "https://view.moezx.cc/images/2019/11/14/step04.md.png",
'proxy' => akina_option('cmt_image_proxy') . "https://view.moezx.cc/images/2019/11/14/step04.md.png", 'proxy' => akina_option('cmt_image_proxy') . "https://view.moezx.cc/images/2019/11/14/step04.md.png",
); );
$result = new WP_REST_Response($output, 403); $result = new WP_REST_Response($output, 403);
$result->set_headers(array('Content-Type' => 'application/json'));
return $result;
}
switch (akina_option("img_upload_api")) {
case 'imgur':
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
$API_Request = Imgur_API($image);
break;
case 'smms':
$image = $_FILES;
$API_Request = SMMS_API($image);
break;
case 'chevereto':
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
$API_Request = Chevereto_API($image);
break;
}
$result = new WP_REST_Response($API_Request, $API_Request->status);
$result->set_headers(array('Content-Type' => 'application/json')); $result->set_headers(array('Content-Type' => 'application/json'));
return $result; return $result;
}
switch (akina_option("img_upload_api")) {
case 'imgur':
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
$API_Request = Imgur_API($image);
break;
case 'smms':
$image = $_FILES;
$API_Request = SMMS_API($image);
break;
case 'chevereto':
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
$API_Request = Chevereto_API($image);
break;
}
$result = new WP_REST_Response($API_Request, $API_Request->status);
$result->set_headers(array('Content-Type' => 'application/json'));
return $result;
} }
/** /**
* Chevereto upload interface * Chevereto upload interface
*/ */
function Chevereto_API($image) function Chevereto_API($image) {
{ $upload_url = akina_option('cheverto_url').'/api/1/upload';
$fields = array( $args = array(
'source' => base64_encode($image), 'body' => array(
'key' => akina_option('chevereto_api_key') 'source' => base64_encode($image),
'key' => akina_option('chevereto_api_key')
)
); );
$ch = curl_init(); $response = wp_remote_post($upload_url, $args);
curl_setopt($ch, CURLOPT_URL, akina_option('cheverto_url').'/api/1/upload'); $reply = json_decode($response["body"]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$reply = curl_exec($ch);
curl_close($ch);
$reply = json_decode($reply);
if ($reply->status_txt == 'OK' && $reply->status_code == 200) { if ($reply->status_txt == 'OK' && $reply->status_code == 200) {
$status = 200; $status = 200;
@ -109,21 +102,20 @@ function Chevereto_API($image)
/** /**
* Imgur upload interface * Imgur upload interface
*/ */
function Imgur_API($image) function Imgur_API($image) {
{
$client_id = akina_option('imgur_client_id'); $client_id = akina_option('imgur_client_id');
$upload_url = akina_option('imgur_upload_image_proxy');
$args = array(
'headers' => array(
'Authorization' => 'Client-ID ' . $client_id
),
'body' => array(
'image' => base64_encode($image)
)
);
$ch = curl_init(); $response = wp_remote_post($upload_url, $args);
curl_setopt($ch, CURLOPT_URL, akina_option('imgur_upload_image_proxy')); $reply = json_decode($response["body"]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode($image)));
$reply = curl_exec($ch);
curl_close($ch);
$reply = json_decode($reply);
if ($reply->success && $reply->status == 200) { if ($reply->success && $reply->status == 200) {
$status = 200; $status = 200;
@ -151,66 +143,66 @@ function Imgur_API($image)
/** /**
* smms upload interface * smms upload interface
*/ */
function SMMS_API($image) function SMMS_API($image) {
{ $client_id = akina_option('smms_client_id');
$client_id = akina_option('smms_client_id'); $upload_url = "https://sm.ms/api/v2/upload";
$filename = $image['cmt_img_file']['name'];
$filedata = $image['cmt_img_file']['tmp_name'];
$Boundary = wp_generate_password();
$bits = file_get_contents($filedata);
$filename = $image['cmt_img_file']['name']; $headers = array();
$filedata = $image['cmt_img_file']['tmp_name']; array_push($headers, "Content-Type: multipart/form-data; boundary=$Boundary");
$filesize = $image['cmt_img_file']['size']; array_push($headers, '');
array_push($headers, "Authorization: Basic " . $client_id);
array_push($headers, '');
array_push($headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97");
$headers = implode("\r\n", $headers);
$url = "https://sm.ms/api/v2/upload"; $fields = array();
$headers = array(); array_push($fields, "--" . $Boundary);
array_push($headers, "Content-Type: multipart/form-data"); array_push($fields, "Content-Disposition: form-data; name=\"smfile\"; filename=\"$filename\"");
array_push($headers, "Authorization: Basic " . $client_id); array_push($fields, '');
array_push($headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97"); array_push($fields, $bits);
array_push($fields, '');
array_push($fields, "--" . $Boundary . "--");
$fields = implode("\r\n", $fields);
$finfo = new \finfo(FILEINFO_MIME_TYPE); $args = array(
$mimetype = $finfo->file($filedata); 'headers' => $headers,
'body' => $fields
);
$fields = array('smfile' => curl_file_create($filedata, $mimetype, $filename)); $response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
$ch = curl_init(); if ($reply->success && $reply->code == 'success') {
curl_setopt($ch, CURLOPT_URL, $url); $status = 200;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $success = true;
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $message = $reply->message;
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $link = $reply->data->url;
curl_setopt($ch, CURLOPT_POST, true); $proxy = akina_option('cmt_image_proxy') . $link;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } else if (preg_match("/Image upload repeated limit/i", $reply->message, $matches)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); $status = 200; // sm.ms 接口不规范,建议检测到重复的情况下返回标准化的 code并单独把 url 放进一个字段
$success = true;
$reply = curl_exec($ch); $message = $reply->message;
curl_close($ch); $link = str_replace('Image upload repeated limit, this image exists at: ', '', $reply->message);
$proxy = akina_option('cmt_image_proxy') . $link;
$reply = json_decode($reply); } else {
$status = 400;
if ($reply->success && $reply->code == 'success') { $success = false;
$status = 200; $message = $reply->message;
$success = true; $link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$message = $reply->message; $proxy = akina_option('cmt_image_proxy') . $link;
$link = $reply->data->url; }
$proxy = akina_option('cmt_image_proxy') . $link; $output = array(
} else if (preg_match("/Image upload repeated limit/i", $reply->message, $matches)) { 'status' => $status,
$status = 200; // sm.ms 接口不规范,建议检测到重复的情况下返回标准化的 code并单独把 url 放进一个字段 'success' => $success,
$success = true; 'message' => $message,
$message = $reply->message; 'link' => $link,
$link = str_replace('Image upload repeated limit, this image exists at: ', '', $reply->message); 'proxy' => $proxy,
$proxy = akina_option('cmt_image_proxy') . $link; );
} else { return $output;
$status = 400;
$success = false;
$message = $reply->message;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
} }
/* /*
@ -218,8 +210,7 @@ function SMMS_API($image)
* @rest api接口路径https://sakura.2heng.xin/wp-json/sakura/v1/cache_search/json * @rest api接口路径https://sakura.2heng.xin/wp-json/sakura/v1/cache_search/json
* @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间 * @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间
*/ */
function cache_search_json() function cache_search_json() {
{
$vowels = array("[", "{", "]", "}", "<", ">", "\r\n", "\r", "\n", "-", "'", '"', '`', " ", ":", ";", '\\', " ", "toc"); $vowels = array("[", "{", "]", "}", "<", ">", "\r\n", "\r", "\n", "-", "'", '"', '`', " ", ":", ";", '\\', " ", "toc");
$regex = <<<EOS $regex = <<<EOS
/<\/?[a-zA-Z]+("[^"]*"|'[^']*'|[^'">])*>|begin[\S\s]*\/begin|hermit[\S\s]*\/hermit|img[\S\s]*\/img|{{.*?}}|:.*?:/m /<\/?[a-zA-Z]+("[^"]*"|'[^']*'|[^'">])*>|begin[\S\s]*\/begin|hermit[\S\s]*\/hermit|img[\S\s]*\/img|{{.*?}}|:.*?:/m
@ -227,7 +218,7 @@ EOS;
$posts = new WP_Query('posts_per_page=-1&post_status=publish&post_type=post'); $posts = new WP_Query('posts_per_page=-1&post_status=publish&post_type=post');
while ($posts->have_posts()): $posts->the_post(); while ($posts->have_posts()): $posts->the_post();
$output .= '{"type":"post","link":"' . get_post_permalink() . '","title":' . json_encode(get_the_title()) . ',"comments":"' . get_comments_number('0', '1', '%') . '","text":' . json_encode(str_replace($vowels, " ", preg_replace($regex, ' ', get_the_content()))) . '},'; $output .= '{"type":"post","link":"' . get_post_permalink() . '","title":' . json_encode(get_the_title()) . ',"comments":"' . get_comments_number('0', '1', '%') . '","text":' . json_encode(str_replace($vowels, " ", preg_replace($regex, ' ', get_the_content()))) . '},';
endwhile; endwhile;
wp_reset_postdata(); wp_reset_postdata();
@ -262,8 +253,12 @@ EOS;
$data = '[' . $output . ']'; $data = '[' . $output . ']';
$result = new WP_REST_Response(json_decode($data), 200); $result = new WP_REST_Response(json_decode($data), 200);
$result->set_headers(array('Content-Type' => 'application/json', $result->set_headers(
'Cache-Control' => 'max-age=3600')); // json 缓存控制 array(
'Content-Type' => 'application/json',
'Cache-Control' => 'max-age=3600'// json 缓存控制
)
);
return $result; return $result;
} }