Merge pull request #142 from spirit1431007/pr-branch
change curl to wp_remote_post
This commit is contained in:
		
						commit
						8ffa252dcd
					
				| 
						 | 
				
			
			@ -79,7 +79,6 @@ window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}
 | 
			
		|||
</head>
 | 
			
		||||
<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(!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>
 | 
			
		||||
	<section id="main-container">
 | 
			
		||||
		<?php 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										267
									
								
								inc/api.php
								
								
								
								
							
							
						
						
									
										267
									
								
								inc/api.php
								
								
								
								
							| 
						 | 
				
			
			@ -4,84 +4,77 @@
 | 
			
		|||
 * 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',
 | 
			
		||||
  ));
 | 
			
		||||
    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 $request)
 | 
			
		||||
{
 | 
			
		||||
  // see: https://developer.wordpress.org/rest-api/requests/
 | 
			
		||||
function upload_image(WP_REST_Request $request) {
 | 
			
		||||
    // 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 = $request->get_file_params();
 | 
			
		||||
  if ( !check_ajax_referer('wp_rest', '_wpnonce', false) ) {
 | 
			
		||||
    $output = array(
 | 
			
		||||
      'status' => 403,
 | 
			
		||||
      'success' => false,
 | 
			
		||||
      'message' => 'Unauthorized client.',
 | 
			
		||||
      '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",
 | 
			
		||||
    );
 | 
			
		||||
    $result = new WP_REST_Response($output, 403);
 | 
			
		||||
    // 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 = $request->get_file_params();
 | 
			
		||||
    if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
 | 
			
		||||
        $output = array(
 | 
			
		||||
            'status' => 403,
 | 
			
		||||
            'success' => false,
 | 
			
		||||
            'message' => 'Unauthorized client.',
 | 
			
		||||
            '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",
 | 
			
		||||
        );
 | 
			
		||||
        $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'));
 | 
			
		||||
    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
 | 
			
		||||
 */
 | 
			
		||||
function Chevereto_API($image)
 | 
			
		||||
{
 | 
			
		||||
    $fields = array(
 | 
			
		||||
      'source' => base64_encode($image),
 | 
			
		||||
      'key' => akina_option('chevereto_api_key')
 | 
			
		||||
function Chevereto_API($image) {
 | 
			
		||||
    $upload_url = akina_option('cheverto_url').'/api/1/upload';
 | 
			
		||||
    $args = array(
 | 
			
		||||
        'body' => array(
 | 
			
		||||
            'source' => base64_encode($image),
 | 
			
		||||
            'key' => akina_option('chevereto_api_key')
 | 
			
		||||
        )
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    $ch = curl_init();
 | 
			
		||||
    curl_setopt($ch, CURLOPT_URL, akina_option('cheverto_url').'/api/1/upload');
 | 
			
		||||
    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);
 | 
			
		||||
    $response = wp_remote_post($upload_url, $args);
 | 
			
		||||
    $reply = json_decode($response["body"]);
 | 
			
		||||
 | 
			
		||||
    if ($reply->status_txt == 'OK' && $reply->status_code == 200) {
 | 
			
		||||
        $status = 200;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,21 +102,20 @@ function Chevereto_API($image)
 | 
			
		|||
/**
 | 
			
		||||
 * Imgur upload interface
 | 
			
		||||
 */
 | 
			
		||||
function Imgur_API($image)
 | 
			
		||||
{
 | 
			
		||||
function Imgur_API($image) {
 | 
			
		||||
    $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();
 | 
			
		||||
    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);
 | 
			
		||||
    $response = wp_remote_post($upload_url, $args);
 | 
			
		||||
    $reply = json_decode($response["body"]);
 | 
			
		||||
 | 
			
		||||
    if ($reply->success && $reply->status == 200) {
 | 
			
		||||
        $status = 200;
 | 
			
		||||
| 
						 | 
				
			
			@ -151,66 +143,66 @@ function Imgur_API($image)
 | 
			
		|||
/**
 | 
			
		||||
 * smms upload interface
 | 
			
		||||
 */
 | 
			
		||||
function SMMS_API($image)
 | 
			
		||||
{
 | 
			
		||||
  $client_id = akina_option('smms_client_id');
 | 
			
		||||
function SMMS_API($image) {
 | 
			
		||||
    $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'];
 | 
			
		||||
  $filedata = $image['cmt_img_file']['tmp_name'];
 | 
			
		||||
  $filesize = $image['cmt_img_file']['size'];
 | 
			
		||||
    $headers = array();
 | 
			
		||||
    array_push($headers, "Content-Type: multipart/form-data; boundary=$Boundary");
 | 
			
		||||
    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";
 | 
			
		||||
  $headers = array();
 | 
			
		||||
  array_push($headers, "Content-Type: multipart/form-data");
 | 
			
		||||
  array_push($headers, "Authorization: Basic " . $client_id);
 | 
			
		||||
  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");
 | 
			
		||||
    $fields = array();
 | 
			
		||||
    array_push($fields, "--" . $Boundary);
 | 
			
		||||
    array_push($fields, "Content-Disposition: form-data; name=\"smfile\"; filename=\"$filename\"");
 | 
			
		||||
    array_push($fields, '');
 | 
			
		||||
    array_push($fields, $bits);
 | 
			
		||||
    array_push($fields, '');
 | 
			
		||||
    array_push($fields, "--" . $Boundary . "--");
 | 
			
		||||
    $fields = implode("\r\n", $fields);
 | 
			
		||||
 | 
			
		||||
  $finfo = new \finfo(FILEINFO_MIME_TYPE);
 | 
			
		||||
  $mimetype = $finfo->file($filedata);
 | 
			
		||||
    $args = array(
 | 
			
		||||
        '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();
 | 
			
		||||
  curl_setopt($ch, CURLOPT_URL, $url);
 | 
			
		||||
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 | 
			
		||||
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 | 
			
		||||
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
 | 
			
		||||
  curl_setopt($ch, CURLOPT_POST, true);
 | 
			
		||||
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 | 
			
		||||
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
 | 
			
		||||
 | 
			
		||||
  $reply = curl_exec($ch);
 | 
			
		||||
  curl_close($ch);
 | 
			
		||||
 | 
			
		||||
  $reply = json_decode($reply);
 | 
			
		||||
 | 
			
		||||
  if ($reply->success && $reply->code == 'success') {
 | 
			
		||||
    $status = 200;
 | 
			
		||||
    $success = true;
 | 
			
		||||
    $message = $reply->message;
 | 
			
		||||
    $link = $reply->data->url;
 | 
			
		||||
    $proxy = akina_option('cmt_image_proxy') . $link;
 | 
			
		||||
  } else if (preg_match("/Image upload repeated limit/i", $reply->message, $matches)) {
 | 
			
		||||
    $status = 200; // sm.ms 接口不规范,建议检测到重复的情况下返回标准化的 code,并单独把 url 放进一个字段
 | 
			
		||||
    $success = true;
 | 
			
		||||
    $message = $reply->message;
 | 
			
		||||
    $link = str_replace('Image upload repeated limit, this image exists at: ', '', $reply->message);
 | 
			
		||||
    $proxy = akina_option('cmt_image_proxy') . $link;
 | 
			
		||||
  } else {
 | 
			
		||||
    $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;
 | 
			
		||||
    if ($reply->success && $reply->code == 'success') {
 | 
			
		||||
        $status = 200;
 | 
			
		||||
        $success = true;
 | 
			
		||||
        $message = $reply->message;
 | 
			
		||||
        $link = $reply->data->url;
 | 
			
		||||
        $proxy = akina_option('cmt_image_proxy') . $link;
 | 
			
		||||
    } else if (preg_match("/Image upload repeated limit/i", $reply->message, $matches)) {
 | 
			
		||||
        $status = 200; // sm.ms 接口不规范,建议检测到重复的情况下返回标准化的 code,并单独把 url 放进一个字段
 | 
			
		||||
        $success = true;
 | 
			
		||||
        $message = $reply->message;
 | 
			
		||||
        $link = str_replace('Image upload repeated limit, this image exists at: ', '', $reply->message);
 | 
			
		||||
        $proxy = akina_option('cmt_image_proxy') . $link;
 | 
			
		||||
    } else {
 | 
			
		||||
        $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
 | 
			
		||||
 * @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间
 | 
			
		||||
 */
 | 
			
		||||
function cache_search_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
 | 
			
		||||
| 
						 | 
				
			
			@ -227,7 +218,7 @@ 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()))) . '},';
 | 
			
		||||
    $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();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -262,8 +253,12 @@ EOS;
 | 
			
		|||
 | 
			
		||||
    $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 缓存控制
 | 
			
		||||
    $result->set_headers(
 | 
			
		||||
        array(
 | 
			
		||||
            'Content-Type' => 'application/json',
 | 
			
		||||
            'Cache-Control' => 'max-age=3600'// json 缓存控制
 | 
			
		||||
        )
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return $result;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue