mirror of
				https://github.com/mashirozx/sakura.git
				synced 2025-05-29 01:49:21 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			267 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			267 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | ||
| 
 | ||
| /**
 | ||
|  * Classes
 | ||
|  */
 | ||
| include_once('classes/Aplayer.php');
 | ||
| include_once('classes/Bilibili.php');
 | ||
| include_once('classes/Cache.php');
 | ||
| include_once('classes/Images.php');
 | ||
| include_once('classes/QQ.php');
 | ||
| 
 | ||
| use Sakura\API\Images;
 | ||
| use Sakura\API\QQ;
 | ||
| use Sakura\API\Cache;
 | ||
| 
 | ||
| /**
 | ||
|  * 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/cover', array(
 | ||
|         'methods' => 'GET',
 | ||
|         'callback' => 'cover_gallery',
 | ||
|     ));
 | ||
|     register_rest_route('sakura/v1', '/image/feature', array(
 | ||
|         'methods' => 'GET',
 | ||
|         'callback' => 'feature_gallery',
 | ||
|     ));
 | ||
|     register_rest_route('sakura/v1', '/database/update', array(
 | ||
|         'methods' => 'GET',
 | ||
|         'callback' => 'update_database',
 | ||
|     ));
 | ||
|     register_rest_route('sakura/v1', '/qqinfo/json', array(
 | ||
|         'methods' => 'GET',
 | ||
|         'callback' => 'get_qq_info',
 | ||
|     ));
 | ||
|     register_rest_route('sakura/v1', '/qqinfo/avatar', array(
 | ||
|         'methods' => 'GET',
 | ||
|         'callback' => 'get_qq_avatar',
 | ||
|     ));
 | ||
|     register_rest_route('sakura/v1', '/bangumi/bilibili', array(
 | ||
|         'methods' => 'POST',
 | ||
|         'callback' => 'bgm_bilibili',
 | ||
|     ));
 | ||
|     register_rest_route('sakura/v1', '/meting/aplayer', array(
 | ||
|         'methods' => 'GET',
 | ||
|         'callback' => 'meting_aplayer',
 | ||
|     ));
 | ||
| });
 | ||
| 
 | ||
| /**
 | ||
|  * Image uploader response
 | ||
|  */
 | ||
| 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);
 | ||
|         $result->set_headers(array('Content-Type' => 'application/json'));
 | ||
|         return $result;
 | ||
|     }
 | ||
|     $images = new \Sakura\API\Images();
 | ||
|     switch (akina_option("img_upload_api")) {
 | ||
|         case 'imgur':
 | ||
|             $image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
 | ||
|             $API_Request = $images->Imgur_API($image);
 | ||
|             break;
 | ||
|         case 'smms':
 | ||
|             $image = $_FILES;
 | ||
|             $API_Request = $images->SMMS_API($image);
 | ||
|             break;
 | ||
|         case 'chevereto':
 | ||
|             $image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
 | ||
|             $API_Request = $images->Chevereto_API($image);
 | ||
|             break;
 | ||
|     }
 | ||
| 
 | ||
|     $result = new WP_REST_Response($API_Request, $API_Request['status']);
 | ||
|     $result->set_headers(array('Content-Type' => 'application/json'));
 | ||
|     return $result;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
|  * 随机封面图 rest api
 | ||
|  * @rest api接口路径:https://sakura.2heng.xin/wp-json/sakura/v1/image/cover
 | ||
|  */
 | ||
| function cover_gallery() {
 | ||
|     $imgurl = Images::cover_gallery();
 | ||
|     $data = array('cover image');
 | ||
|     $response = new WP_REST_Response($data);
 | ||
|     $response->set_status(302);
 | ||
|     $response->header('Location', $imgurl);
 | ||
|     return $response;
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 随机文章特色图 rest api
 | ||
|  * @rest api接口路径:https://sakura.2heng.xin/wp-json/sakura/v1/image/feature
 | ||
|  */
 | ||
| function feature_gallery() {
 | ||
|     $imgurl = Images::feature_gallery();
 | ||
|     $data = array('feature image');
 | ||
|     $response = new WP_REST_Response($data);
 | ||
|     $response->set_status(302);
 | ||
|     $response->header('Location', $imgurl);
 | ||
|     return $response;
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * update database rest api
 | ||
|  * @rest api接口路径:https://sakura.2heng.xin/wp-json/sakura/v1/database/update
 | ||
|  */
 | ||
| function update_database() {
 | ||
|     if (akina_option('cover_cdn_options') == "type_1") {
 | ||
|         $output = Cache::update_database();
 | ||
|         $result = new WP_REST_Response($output, 200);
 | ||
|         return $result;
 | ||
|     } else {
 | ||
|         return new WP_REST_Response("Invalid access", 200);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  * 定制实时搜索 rest api
 | ||
|  * @rest api接口路径:https://sakura.2heng.xin/wp-json/sakura/v1/cache_search/json
 | ||
|  * @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间
 | ||
|  */
 | ||
| function cache_search_json() {
 | ||
|     if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
 | ||
|         $output = array(
 | ||
|             'status' => 403,
 | ||
|             'success' => false,
 | ||
|             'message' => 'Unauthorized client.'
 | ||
|         );
 | ||
|         $result = new WP_REST_Response($output, 403);
 | ||
|     } else {
 | ||
|         $output = Cache::search_json();
 | ||
|         $result = new WP_REST_Response($output, 200);
 | ||
|     }
 | ||
|     $result->set_headers(
 | ||
|         array(
 | ||
|             'Content-Type' => 'application/json',
 | ||
|             'Cache-Control' => 'max-age=3600', // json 缓存控制
 | ||
|         )
 | ||
|     );
 | ||
|     return $result;
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * QQ info
 | ||
|  * https://sakura.2heng.xin/wp-json/sakura/v1/qqinfo/json
 | ||
|  */
 | ||
| function get_qq_info(WP_REST_Request $request) {
 | ||
|     if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
 | ||
|         $output = array(
 | ||
|             'status' => 403,
 | ||
|             'success' => false,
 | ||
|             'message' => 'Unauthorized client.'
 | ||
|         );
 | ||
|     } elseif ($_GET['qq']) {
 | ||
|         $qq = $_GET['qq'];
 | ||
|         $output = QQ::get_qq_info($qq);
 | ||
|     } else {
 | ||
|         $output = array(
 | ||
|             'status' => 400,
 | ||
|             'success' => false,
 | ||
|             'message' => 'Bad Request'
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     $result = new WP_REST_Response($output, $output['status']);
 | ||
|     $result->set_headers(array('Content-Type' => 'application/json'));
 | ||
|     return $result;
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * QQ头像链接解密
 | ||
|  * https://sakura.2heng.xin/wp-json/sakura/v1/qqinfo/avatar
 | ||
|  */
 | ||
| function get_qq_avatar() {
 | ||
|     $encrypted = $_GET["qq"];
 | ||
|     $imgurl = QQ::get_qq_avatar($encrypted);
 | ||
|     if (akina_option('qq_avatar_link') == 'type_2') {
 | ||
|         $imgdata = file_get_contents($imgurl);
 | ||
|         $response = new WP_REST_Response();
 | ||
|         $response->set_headers(array(
 | ||
|             'Content-Type' => 'image/jpeg',
 | ||
|             'Cache-Control' => 'max-age=86400'
 | ||
|         ));
 | ||
|         echo $imgdata;
 | ||
|     } else {
 | ||
|         $response = new WP_REST_Response();
 | ||
|         $response->set_status(301);
 | ||
|         $response->header('Location', $imgurl);
 | ||
|     }
 | ||
|     return $response;
 | ||
| }
 | ||
| 
 | ||
| function bgm_bilibili() {
 | ||
|     if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
 | ||
|         $output = array(
 | ||
|             'status' => 403,
 | ||
|             'success' => false,
 | ||
|             'message' => 'Unauthorized client.'
 | ||
|         );
 | ||
|         $response = new WP_REST_Response($output, 403);
 | ||
|     } else {
 | ||
|         $page = $_GET["page"] ?: 2;
 | ||
|         $bgm = new \Sakura\API\Bilibili();
 | ||
|         $html = preg_replace("/\s+|\n+|\r/", ' ', $bgm->get_bgm_items($page));
 | ||
|         $response = new WP_REST_Response($html, 200);
 | ||
|     }
 | ||
|     return $response;
 | ||
| }
 | ||
| 
 | ||
| function meting_aplayer() {
 | ||
|     $type = $_GET['type'];
 | ||
|     $id = $_GET['id'];
 | ||
|     $wpnonce = $_GET['_wpnonce'];
 | ||
|     $meting_pnonce = $_GET['meting_pnonce'];
 | ||
|     if ((isset($wpnonce) && !check_ajax_referer('wp_rest', $wpnonce, false)) || (isset($nonce) && !wp_verify_nonce($nonce, $type . '#:' . $id))) {
 | ||
|         $output = array(
 | ||
|             'status' => 403,
 | ||
|             'success' => false,
 | ||
|             'message' => 'Unauthorized client.'
 | ||
|         );
 | ||
|         $response = new WP_REST_Response($output, 403);
 | ||
|     } else {
 | ||
|         $Meting_API = new \Sakura\API\Aplayer();
 | ||
|         $data = $Meting_API->get_data($type, $id);
 | ||
|         if ($type === 'playlist') {
 | ||
|             $response = new WP_REST_Response($data, 200);
 | ||
|             $response->set_headers(array('cache-control' => 'max-age=3600'));
 | ||
|         } elseif ($type === 'lyric') {
 | ||
|             $response = new WP_REST_Response();
 | ||
|             $response->set_headers(array('cache-control' => 'max-age=3600'));
 | ||
|             echo $data;
 | ||
|         } else {
 | ||
|             $response = new WP_REST_Response();
 | ||
|             $response->set_status(301);
 | ||
|             $response->header('Location', $data);
 | ||
|         }
 | ||
|     }
 | ||
|     return $response;
 | ||
| } |