<?php require dirname(dirname(dirname(dirname(__DIR__)))). '/admin/extend/vendor/autoload.php'; require dirname(__DIR__) . '/services/BaseService.php'; require dirname(dirname(dirname(dirname(__DIR__))))."/wp-load.php"; use Qiniu\Auth; use Qiniu\Storage\UploadManager; use Qiniu\Storage\BucketManager; use Qiniu\Config; class QiNiuService extends BaseService { /** * 七牛云存储accessKey * @access private * @var string $accessKey */ private $accessKey = 'RK9e73yt96PIpTWPyE3Bb6J-8vikRt1t5kRGFssR'; /** * 七牛云存储secretKey * @access private * @var string $secretKey */ private $secretKey = '13nCzgXWS92SMO_B-QbV7_mNZLKYYdhRGdPRQZpM'; /** * 七牛云存储访问域名 * @access private * @var string $fileDomain */ private $fileDomain = 'download.goodao.net'; /** * 七牛云存储空间名称 * @access private * @var string $bucket */ private $bucket = 'goodao-translate'; /** * 数据初始化 */ public function __construct() { parent::__construct(); } public function listFiles($marker = null){ $auth = new Auth($this->accessKey, $this->secretKey); $bucketManager = new BucketManager($auth); $list = $bucketManager->listFiles($this->bucket,$this->siteDomain."_bak",$marker); $file_save_path = $this->jsonPath; foreach ($list[0]["items"] as $file){ $baseUrl = 'http://' . $this->fileDomain . '/' . $file["key"]; $filepath = explode("/", $file["key"]); // 下载保存文件名 $file_save_name = $file_save_path . '/' . $filepath[1]; // 对链接进行签名 $signedUrl = $auth->privateDownloadUrl($baseUrl); $result = $this->https_request($signedUrl); $language_array = json_decode($result, true); if (!array_key_exists('error', $language_array) && count($language_array) > 0) { // 判断当前路径是否存在 如果不存在创建文件夹 if (!file_exists($file_save_path)) { mkdir($file_save_path, 0777, true); } file_put_contents($file_save_name, $result); // echo $file_save_name."<br>"; } } if(isset($list[0]["marker"])){ $this->listFiles($list[0]["marker"]); } } public function deleteFile($file_path){ // 构建鉴权对象 $auth = new Auth($this->accessKey, $this->secretKey); // 要上传文件的本地路径 $filePath = $file_path; $path_array = explode('/', $file_path); // 获取需要上传的文件名 $file_name = end($path_array); $keybak = $this->siteDomain . '_bak/' . $file_name; $key = $this->siteDomain . '/' . $file_name; $auth = new Auth($this->accessKey, $this->secretKey); // $config = new Config(); $bucketManager = new BucketManager($auth); $res = $bucketManager->delete($this->bucket, $keybak); $res = $bucketManager->delete($this->bucket, $key); // 下载文件保存路径 $file_save_path = $this->jsonPath; // 下载保存文件名 $file_save_name = $file_save_path . '/' . $file_name; unlink($file_save_name); if ($res->error !== null) { // 上传失败 记录日志 $this->writeLog(2, date('H:i:s') . '--七牛云文件删除失败!' . $file_path); return false; } else { return true; } } /** * 从七牛云下载文件 * @access public * @param string $file_name * @return string */ public function downloadFile($file_name,$path = null) { return $this->transb($file_name,$path); // 下载文件保存路径 $file_save_path = $this->jsonPath; // 下载保存文件名 $file_save_name = $file_save_path . '/' . $file_name; // 判断当前文件本地是否存在 如果存在直接读取本地文件 // 本地不存在 从七牛云中获取 // 构建Auth对象 if (is_file($file_save_name)) { return $file_save_name; } else{ $auth = new Auth($this->accessKey, $this->secretKey); $baseUrl = 'http://' . $this->fileDomain . '/' . $this->siteDomain . '/' . $file_name; // 对链接进行签名 $signedUrl = $auth->privateDownloadUrl($baseUrl); $result = $this->https_request($signedUrl); $language_array = json_decode($result, true); if (!array_key_exists('error', $language_array) && count($language_array) > 0) { // 判断当前路径是否存在 如果不存在创建文件夹 if (!file_exists($file_save_path)) { mkdir($file_save_path, 0777, true); } foreach ($language_array["texts"] as $k=> $texts){ unset($language_array["texts"][$k]); $k = htmlspecialchars_decode(html_entity_decode(trim($k))); // echo $k."<br>"; $language_array["texts"][$k] = $texts; } $result= json_encode($language_array); file_put_contents($file_save_name, $result); return $file_save_name; }else { // 判断当前路径是否存在 如果不存在创建文件夹 if (!file_exists($file_save_path)) { mkdir($file_save_path, 0777, true); } $this->transb($file_name,$path); return $file_save_name; } } } public function transb($file_name = null,$path = 0,$language =0){ $param = $_POST; if(!$path){ $path = $param['path']; } $language = $param['language']; $html_file_path = $this->htmlPath . $path . 'index.html'; // echo $html_file_path; if(!is_file($html_file_path)){ $html = file_get_html("http://".$this->siteDomain.$path); }else{ $html = file_get_html($html_file_path); } // $html = file_get_html($html_file_path); $es = $html->find("text"); $description = $html->find("meta[name=description]",0); $keywords = $html->find("meta[name=keywords]",0); $imgses = $html->find("img"); $texts = []; $texts["tls"] = ["$language"]; $texts["sl"] = "en"; $texts["texts"][] = $description->content?$description->content:""; $texts["texts"][] = $keywords->content?$keywords->content:""; $sourcetext[] = $description->content?$description->content:""; $sourcetext[] = $keywords->content?$keywords->content:""; $imges = $html->find("img"); foreach ($imges as $ei){ $alt = $ei->alt; if($alt){ $sourcetext[] = $alt; $texts["texts"][] = $alt; } } foreach($es as $e){ $tag= $e->parent()->tag; $tags = ["script","style","root"]; if(!in_array($tag,$tags)){ $t = trim($e->text()); if($t ){ $lanclass = method_exists($e->parent()->parent(),"find")?$e->parent()->parent()->find("b",0)->class:""; if( $lanclass != "country-flag"){ $sourcetext[] = $e->text(); $texts["texts"][] = htmlspecialchars_decode(html_entity_decode($t)); } } } } // var_dump($texts); $json = json_encode($texts,JSON_UNESCAPED_UNICODE); // echo ($json); // exit; // echo $tag; foreach($imgses as $i=>$img){ $src = $img->src; $imgs[ $src] = $src; } $Http = new WP_Http_Curl(); $args = array( 'method' => 'POST', 'sslverify' => false, "headers"=>[ 'Accept' => 'application/json', 'Accept-Charset' => 'utf-8', 'Content-Type' => 'application/json; charset=utf-8', "Content-Length"=>strlen($json) ], 'body' => $json, ); $res = wp_remote_retrieve_body($Http->request("http://translate.waimaoq.com/globalso_trans", $args)); $res = json_decode($res,true); // print_r($res); if(isset($res[0]["code"]) && $res[0]["code"] == 200){ $text = []; $bakfile = $this->jsonPath."/en_{$language}_all.json"; if(is_file($bakfile)){ $baktxt = json_decode(file_get_contents($bakfile),true); }else{ $baktxt = []; } foreach($sourcetext as $k=>$v){ if(isset($baktxt[$v])){ $text[$v] = $baktxt[$v]; }else{ $text[$v] = $res[0]["texts"][$k]; } } $json_data["texts"] = $text; // $json_data["description"] = $res[0]["data"][0][0]; // $json_data["keywords"] = $res[0]["data"][1][0]; $json_data["imgs"] = $imgs; return $json_data; // return $json; // $data = $this->post(,$texts,true); if($file_name){ $file_name = $this->getJsonFileName($path, $language); $file_save_path = $this->jsonPath; // 下载保存文件名 $file_save_name = $file_save_path . '/' . $file_name; file_put_contents($file_save_name,json_encode($json_data)); }else{ return $json_data; } //return json_encode(['status' => 1, 'msg' => '获取成功!', 'data' => $json_data]); } } /** * 将文件上传至七牛云 * @access protected * @param string $file_path * @return bool * @throws \Exception */ public function uploadFile($file_path) { return true; // 构建鉴权对象 $auth = new Auth($this->accessKey, $this->secretKey); // 要上传文件的本地路径 $filePath = $file_path; $path_array = explode('/', $file_path); // 获取需要上传的文件名 $file_name = end($path_array); // 上传到七牛后保存的文件名 $key = $this->siteDomain . '/' . $file_name; $path = dirname(dirname(dirname(dirname(__FILE__)))); copy($filePath,$path."/json/$file_name"); // 上传到七牛后保存的文件名 $keybak = $this->siteDomain . '_bak/' . $file_name; // 初始化 UploadManager 对象并进行文件的上传。 $uploadMgr = new UploadManager(); // 生成上传 Token $token = $auth->uploadToken($this->bucket, $key); // 调用 UploadManager 的 putFile 方法进行文件的上传。 list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath); // 生成上传 Token $token = $auth->uploadToken($this->bucket, $keybak); // 调用 UploadManager 的 putFile 方法进行文件的上传。 list($ret, $err) = $uploadMgr->putFile($token, $keybak, $filePath); if ($err !== null) { // 上传失败 记录日志 $this->writeLog(2, date('H:i:s') . '--七牛云文件上传失败!' . $file_path); return false; } else { return true; } } /** * 远程请求数据 * @param string $url 远程请求地址 * @param array|null $data 请求提交的数据 * @param array|null $header 请求头 * @return string */ public function https_request($url, $data = null, $header = null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } if (!empty($header)) { curl_setopt($curl, CURLOPT_HTTPHEADER, $header); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 30); //设置curl默认访问为IPv4 if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) { curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); } $output = curl_exec($curl); curl_close($curl); return ($output); } /** * 批量拉取json文件 * @access protected * @param string $language * @return string */ public function curlBatchDownloadFile ($language) { $pages = $this->pages; $file_path = $this->jsonPath; $urls = []; $file_list = []; $auth = new Auth($this->accessKey, $this->secretKey); $baseUrl = 'http://' . $this->fileDomain . '/' . $this->siteDomain . '/'; foreach ($pages as $key => $value) { $file_name = $this->getJsonFileName($value['path'], $language); if (!file_exists($file_path . '/' . $file_name)) { $urls[] = $auth->privateDownloadUrl($baseUrl . $file_name); $file_list[] = $file_name; } } $count = count($urls); if ($count <= 0) { return true; } $chs = []; // 创建批处理cURL句柄 $mh = curl_multi_init(); // 创建cURL资源 for($i = 0; $i < $count; $i ++){ $chs[ $i ] = curl_init(); // 设置URL和相应的选项 curl_setopt($chs[ $i ], CURLOPT_RETURNTRANSFER, 1); curl_setopt($chs[ $i ], CURLOPT_URL, $urls[$i]); curl_setopt($chs[ $i ], CURLOPT_HEADER, 0); curl_multi_add_handle($mh, $chs[ $i ]); } // 执行批处理句柄 do { $mrc = curl_multi_exec($mh, $active); } while ($active > 0); while ($active and $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } for($i = 0; $i < $count; $i ++){ $content = curl_multi_getcontent($chs[$i]); $file_path = $this->jsonPath; // 判断当前路径是否存在 如果不存在创建文件夹 if (!file_exists($file_path)) { mkdir($file_path, 0777, true); } $content_array = json_decode($content, true); if (!empty($content) && !array_key_exists('error', $content_array)) { file_put_contents($file_path . '/' . $file_list[$i], $content); } } curl_multi_close($mh); } }