177 lines
6.4 KiB
PHP
177 lines
6.4 KiB
PHP
|
<?php
|
|||
|
|
|||
|
/**
|
|||
|
* Router
|
|||
|
*/
|
|||
|
add_action('rest_api_init', function () {
|
|||
|
register_rest_route('sakura/v1', '/image/upload', array(
|
|||
|
'methods' => 'POST',
|
|||
|
'callback' => 'upload_image',
|
|||
|
));
|
|||
|
register_rest_route('sakura/v1', '/cache_search/json', array(
|
|||
|
'methods' => 'GET',
|
|||
|
'callback' => 'cache_search_json',
|
|||
|
));
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* Image uploader response
|
|||
|
*/
|
|||
|
function upload_image(WP_REST_Request $req)
|
|||
|
{
|
|||
|
// see: https://developer.wordpress.org/rest-api/requests/
|
|||
|
|
|||
|
// handle file params $file === $_FILES
|
|||
|
/**
|
|||
|
* curl \
|
|||
|
* -F "filecomment=This is an img file" \
|
|||
|
* -F "cmt_img_file=@screenshot.jpg" \
|
|||
|
* https://dev.2heng.xin/wp-json/sakura/v1/image/upload
|
|||
|
*/
|
|||
|
$file = $req->get_file_params();
|
|||
|
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
|
|||
|
|
|||
|
switch (akina_option("img_upload_api")) {
|
|||
|
case 'imgur':
|
|||
|
$API_Request = Imgur_API($image);
|
|||
|
break;
|
|||
|
case 'smms':
|
|||
|
$API_Request = SMMS_API($image);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
$result = new WP_REST_Response($API_Request, 200);
|
|||
|
$result->set_headers(array('Content-Type' => 'application/json',
|
|||
|
'Cache-Control' => 'max-age=3600')); // json 缓存控制
|
|||
|
return $result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Imgur upload interface
|
|||
|
*/
|
|||
|
function Imgur_API($image)
|
|||
|
{
|
|||
|
$client_id = akina_option('imgur_client_id');
|
|||
|
|
|||
|
$ch = curl_init();
|
|||
|
curl_setopt($ch, CURLOPT_URL, akina_option('imgur_upload_image_proxy'));
|
|||
|
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) {
|
|||
|
$status = 200;
|
|||
|
$message = "success";
|
|||
|
$link = $reply->data->link;
|
|||
|
$proxy = akina_option('cmt_image_proxy') . $link;
|
|||
|
} else {
|
|||
|
$status = $reply->status;
|
|||
|
$message = $reply->data->error;
|
|||
|
$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,
|
|||
|
'message' => $message,
|
|||
|
'link' => $link,
|
|||
|
'proxy' => $proxy,
|
|||
|
);
|
|||
|
return $output;
|
|||
|
}
|
|||
|
|
|||
|
function SMMS_API($image)
|
|||
|
{
|
|||
|
$client_id = akina_option('smms_client_id');
|
|||
|
|
|||
|
$ch = curl_init();
|
|||
|
curl_setopt($ch, CURLOPT_URL, 'https://sm.ms/api/v2/upload');
|
|||
|
curl_setopt($ch, CURLOPT_POST, true);
|
|||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . $client_id));
|
|||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type ' . 'multipart/form-data'));
|
|||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, array('smfile' => $image));
|
|||
|
|
|||
|
$reply = curl_exec($ch);
|
|||
|
curl_close($ch);
|
|||
|
|
|||
|
$reply = json_decode($reply);
|
|||
|
|
|||
|
if ($reply->success && $reply->code == 'success') {
|
|||
|
$status = 200;
|
|||
|
$message = $reply->message;
|
|||
|
$link = $reply->data->url;
|
|||
|
$proxy = akina_option('cmt_image_proxy') . $link;
|
|||
|
} else {
|
|||
|
$status = 0; // sm.ms 接口不规范,谁给提个意见?我要状态码!
|
|||
|
$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,
|
|||
|
'message' => $message,
|
|||
|
'link' => $link,
|
|||
|
'proxy' => $proxy,
|
|||
|
);
|
|||
|
return $output;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* 定制实时搜索 rest api
|
|||
|
* @rest api接口路径:https://sakura.2heng.xin/wp-json/cache_search/v1/json/
|
|||
|
* @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间
|
|||
|
*/
|
|||
|
function cache_search_json()
|
|||
|
{
|
|||
|
$vowels = array("[", "{", "]", "}", "<", ">", "\r\n", "\r", "\n", "-", "'", '"', '`', " ", ":", ";", '\\', " ", "toc");
|
|||
|
$regex = <<<EOS
|
|||
|
/<\/?[a-zA-Z]+("[^"]*"|'[^']*'|[^'">])*>|begin[\S\s]*\/begin|hermit[\S\s]*\/hermit|img[\S\s]*\/img|{{.*?}}|:.*?:/m
|
|||
|
EOS;
|
|||
|
|
|||
|
$posts = new WP_Query('posts_per_page=-1&post_status=publish&post_type=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()))) . '},';
|
|||
|
endwhile;
|
|||
|
wp_reset_postdata();
|
|||
|
|
|||
|
$pages = get_pages();
|
|||
|
foreach ($pages as $page) {
|
|||
|
$output .= '{"type":"page","link":"' . get_page_link($page) . '","title":' . json_encode($page->post_title) . ',"comments":"' . $page->comment_count . '","text":' . json_encode(str_replace($vowels, " ", preg_replace($regex, ' ', $page->post_content))) . '},';
|
|||
|
}
|
|||
|
|
|||
|
$tags = get_tags();
|
|||
|
foreach ($tags as $tag) {
|
|||
|
$output .= '{"type":"tag","link":"' . get_term_link($tag) . '","title":' . json_encode($tag->name) . ',"comments":"","text":""},';
|
|||
|
}
|
|||
|
|
|||
|
$categories = get_categories();
|
|||
|
foreach ($categories as $category) {
|
|||
|
$output .= '{"type":"category","link":"' . get_term_link($category) . '","title":' . json_encode($category->name) . ',"comments":"","text":""},';
|
|||
|
}
|
|||
|
if (akina_option('live_search_comment')) {
|
|||
|
$comments = get_comments();
|
|||
|
foreach ($comments as $comment) {
|
|||
|
$is_private = get_comment_meta($comment->comment_ID, '_private', true);
|
|||
|
if ($is_private) {
|
|||
|
$output .= '{"type":"comment","link":"' . get_comment_link($comment) . '","title":' . json_encode(get_the_title($comment->comment_post_ID)) . ',"comments":"","text":' . json_encode($comment->comment_author . ":" . __("The comment is private", "sakura") /*该评论为私密评论*/) . '},';
|
|||
|
continue;
|
|||
|
} else {
|
|||
|
$output .= '{"type":"comment","link":"' . get_comment_link($comment) . '","title":' . json_encode(get_the_title($comment->comment_post_ID)) . ',"comments":"","text":' . json_encode(str_replace($vowels, " ", preg_replace($regex, " ", $comment->comment_author . ":" . $comment->comment_content))) . '},';
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$output = substr($output, 0, strlen($output) - 1);
|
|||
|
|
|||
|
$data = '[' . $output . ']';
|
|||
|
$result = new WP_REST_Response(json_decode($data), 200);
|
|||
|
$result->set_headers(array('Content-Type' => 'application/json',
|
|||
|
'Cache-Control' => 'max-age=3600')); // json 缓存控制
|
|||
|
|
|||
|
return $result;
|
|||
|
}
|