作者 赵彬吉

update

@@ -48,7 +48,7 @@ class RankData extends BaseCommands @@ -48,7 +48,7 @@ class RankData extends BaseCommands
48 48
49 foreach ($list as $item){ 49 foreach ($list as $item){
50 $model = GoogleRankModel::where('project_id', $item['project_id'])->where('lang', '')->first(); 50 $model = GoogleRankModel::where('project_id', $item['project_id'])->where('lang', '')->first();
51 - if (!$model || $model->updated_date == date('Y-m-d')) { 51 + if (!$model || $model->updated_date != date('Y-m-d')) {
52 $res = $api->getGoogleRank($item['api_no']); 52 $res = $api->getGoogleRank($item['api_no']);
53 if(!$res){ 53 if(!$res){
54 $error++; 54 $error++;
@@ -63,7 +63,7 @@ class RankData extends BaseCommands @@ -63,7 +63,7 @@ class RankData extends BaseCommands
63 //有小语种的 63 //有小语种的
64 if($item['minor_languages']){ 64 if($item['minor_languages']){
65 $model = GoogleRankModel::where('project_id', $item['project_id'])->where('lang', '<>', '')->first(); 65 $model = GoogleRankModel::where('project_id', $item['project_id'])->where('lang', '<>', '')->first();
66 - if (!$model || $model->updated_date == date('Y-m-d')) { 66 + if (!$model || $model->updated_date != date('Y-m-d')) {
67 $res = $api->getGoogleRank($item['api_no'], 1); 67 $res = $api->getGoogleRank($item['api_no'], 1);
68 if(!$res){ 68 if(!$res){
69 $error++; 69 $error++;
@@ -98,6 +98,7 @@ class RankData extends BaseCommands @@ -98,6 +98,7 @@ class RankData extends BaseCommands
98 98
99 if(!$lang){ 99 if(!$lang){
100 foreach ($data as &$ranks){ 100 foreach ($data as &$ranks){
  101 + ksort($ranks);
101 foreach ($ranks as &$rank){ 102 foreach ($ranks as &$rank){
102 //处理排名 103 //处理排名
103 if(!in_array($project_id, $without_project_ids)){ 104 if(!in_array($project_id, $without_project_ids)){
  1 +<?php
  2 +
  3 +namespace App\Http\Logic\Aside\Project;
  4 +
  5 +
  6 +use App\Http\Logic\Aside\BaseLogic;
  7 +use App\Models\Project\DomainInfo;
  8 +use App\Models\Project\Payment;
  9 +use MongoDB\Client;
  10 +
  11 +class DomainInfoLogic extends BaseLogic
  12 +{
  13 + public function __construct()
  14 + {
  15 + parent::__construct();
  16 +
  17 + $this->model = new DomainInfo();
  18 + }
  19 +
  20 + public function getDomainInfo($project_id)
  21 + {
  22 + $project = app(ProjectLogic::class)->getInfo($project_id);
  23 + $domain = $project['deploy_optimize']['domain'];
  24 + $info = $this->model->where('project_id', $project_id)->first();
  25 + //不存在或时间过期了 重新获取信息
  26 + $expiration_date = $info['domain_info']['expiration_date'] ?? '';
  27 + $end_time = $info['ssl']['end_time'] ?? '';
  28 + if(!$info || $expiration_date < date("Y-m-d") || $end_time < date('Y-m-d')){
  29 + try {
  30 + $mongo = new Client("mongodb://root:globalso8837840@23.228.125.2:27017");
  31 + $db = $mongo->globalso_monitor;
  32 + $collection = $db->project_v1;
  33 + $project_zk = $collection->findOne(['main_url' => $domain]);
  34 + $info['domain'] = $domain;
  35 + $info['domain_info'] = (array) $project_zk['domain_info'] ?? [];
  36 + $info['ssl'] = (array) $project_zk['ssl'] ?? [];
  37 + parent::save($info);
  38 + }catch (\Exception $e){
  39 + return [];
  40 + }
  41 + }
  42 + return $info;
  43 + }
  44 +}
@@ -5,6 +5,7 @@ namespace App\Http\Logic\Bside; @@ -5,6 +5,7 @@ namespace App\Http\Logic\Bside;
5 5
6 use App\Helper\Arr; 6 use App\Helper\Arr;
7 use App\Helper\Translate; 7 use App\Helper\Translate;
  8 +use App\Http\Logic\Aside\Project\DomainInfoLogic;
8 use App\Http\Logic\Aside\Project\ProjectLogic; 9 use App\Http\Logic\Aside\Project\ProjectLogic;
9 use App\Models\RankData\ExternalLinks; 10 use App\Models\RankData\ExternalLinks;
10 use App\Models\RankData\IndexedPages; 11 use App\Models\RankData\IndexedPages;
@@ -12,6 +13,9 @@ use App\Models\RankData\RankData; @@ -12,6 +13,9 @@ use App\Models\RankData\RankData;
12 use App\Models\RankData\RankWeek; 13 use App\Models\RankData\RankWeek;
13 use App\Models\RankData\RecommDomain; 14 use App\Models\RankData\RecommDomain;
14 use App\Models\RankData\Speed; 15 use App\Models\RankData\Speed;
  16 +use App\Utils\HttpUtils;
  17 +use GuzzleHttp\Exception\GuzzleException;
  18 +use Illuminate\Support\Facades\Cache;
15 use Illuminate\Support\Str; 19 use Illuminate\Support\Str;
16 20
17 class RankDataLogic extends BaseLogic 21 class RankDataLogic extends BaseLogic
@@ -28,6 +32,7 @@ class RankDataLogic extends BaseLogic @@ -28,6 +32,7 @@ class RankDataLogic extends BaseLogic
28 32
29 //查数据 33 //查数据
30 $project = app(ProjectLogic::class)->getInfo($project_id); 34 $project = app(ProjectLogic::class)->getInfo($project_id);
  35 + $domain_info = app(DomainInfoLogic::class)->getDomainInfo($project_id);
31 $rank = RankData::where('project_id', $project_id)->first(); 36 $rank = RankData::where('project_id', $project_id)->first();
32 $rank_week = RankWeek::where('project_id', $project_id)->first(); 37 $rank_week = RankWeek::where('project_id', $project_id)->first();
33 $recomm_domain = RecommDomain::where('project_id', $project_id)->first(); 38 $recomm_domain = RecommDomain::where('project_id', $project_id)->first();
@@ -48,7 +53,7 @@ class RankDataLogic extends BaseLogic @@ -48,7 +53,7 @@ class RankDataLogic extends BaseLogic
48 53
49 //小语种列表 54 //小语种列表
50 $langs = Arr::pluck($project['deploy_optimize']['minor_languages'], 'tl'); 55 $langs = Arr::pluck($project['deploy_optimize']['minor_languages'], 'tl');
51 - foreach ($langs as $lang){ 56 + foreach ($langs as $lang) {
52 $data['langs'][$lang] = Translate::getTls($lang); 57 $data['langs'][$lang] = Translate::getTls($lang);
53 } 58 }
54 59
@@ -56,8 +61,8 @@ class RankDataLogic extends BaseLogic @@ -56,8 +61,8 @@ class RankDataLogic extends BaseLogic
56 $data['project'] = [ 61 $data['project'] = [
57 'company' => $project['company'], 62 'company' => $project['company'],
58 'domain' => $project['deploy_optimize']['domain'], 63 'domain' => $project['deploy_optimize']['domain'],
59 - 'domain_info' => '',  
60 - 'cert_info' => '', 64 + 'domain_info' => ($domain_info['domain_info']['creation_date'] ?? '') . ' - ' . ($domain_info['domain_info']['expiration_date'] ?? ''),
  65 + 'cert_info' => ($domain_info['ssl']['start_time'] ?? '') . ' - ' . ($domain_info['ssl']['end_time'] ?? ''),
61 'plan' => str_replace('营销大师-', '全球搜-', $project['deploy_build']['plan'][0]), 66 'plan' => str_replace('营销大师-', '全球搜-', $project['deploy_build']['plan'][0]),
62 'keyword_num' => $project['deploy_build']['keyword_num'], 67 'keyword_num' => $project['deploy_build']['keyword_num'],
63 'compliance_day' => $rank['compliance_day'] ?? 0, 68 'compliance_day' => $rank['compliance_day'] ?? 0,
@@ -96,7 +101,7 @@ class RankDataLogic extends BaseLogic @@ -96,7 +101,7 @@ class RankDataLogic extends BaseLogic
96 'data' => array_values($indexed_pages['data'] ?? []), 101 'data' => array_values($indexed_pages['data'] ?? []),
97 ]; 102 ];
98 //收录数加上当日数据 103 //收录数加上当日数据
99 - if((Arr::last($data['indexed_pages_chat']['labels'])) != date('Y-m-d')){ 104 + if ((Arr::last($data['indexed_pages_chat']['labels'])) != date('Y-m-d')) {
100 $data['indexed_pages_chat']['labels'][] = date('Y-m-d'); 105 $data['indexed_pages_chat']['labels'][] = date('Y-m-d');
101 $data['indexed_pages_chat']['data'][] = $data['indexed_pages_num']; 106 $data['indexed_pages_chat']['data'][] = $data['indexed_pages_num'];
102 } 107 }
@@ -114,7 +119,205 @@ class RankDataLogic extends BaseLogic @@ -114,7 +119,205 @@ class RankDataLogic extends BaseLogic
114 * @author zbj 119 * @author zbj
115 * @date 2023/5/12 120 * @date 2023/5/12
116 */ 121 */
117 - public function keywords_rank_list(){  
118 - $lang = $this->request['lang']; 122 + public function keywords_rank_list()
  123 + {
  124 + $page = intval($this->request['page'] ?: 1);
  125 + $lang = $this->request['lang'] ?: '';
  126 + $project_id = $this->user['project_id'];
  127 + $project = app(ProjectLogic::class)->getInfo($project_id);
  128 + $api_no = $project['deploy_optimize']['api_no'] ?? '';
  129 + $domain = $project['deploy_optimize']['domain'] ?? '';
  130 + $domain_arr = parse_url($domain);
  131 + $domain = $domain_arr['host'] ?? $domain_arr['path'];
  132 +
  133 + //复制站点域名
  134 + $ext_projects = $this->getExtendProjects();
  135 + $flg_ext = $this->getExtFlag($ext_projects, $domain, $api_no);
  136 + $ext_domain = str_replace('www.', '', $this->getExtendProjects($api_no)['ext'] ?? '');
  137 + //AI站点域名
  138 + $ai_projects = $this->getAiProjects()['data'] ?? [];
  139 + $flg_ai = $this->getAiFlag($ai_projects, $domain);
  140 + $ai_domain = str_replace('www.', '', $this->getAiProjects($domain)['domain'] ?? '');
  141 +
  142 +
  143 + $list = RankData::where('project_id', $project_id)->where('lang', $lang)->value('data');
  144 + $list30 = []; //排名前三十的
  145 + $list30_0 = []; //排名前三十且近三天没有排名的
  146 + $list100 = []; //排名前100的
  147 + $list0 = [];//排名为0的
  148 + foreach ($list as $key => $v) {
  149 + $last = Arr::last($v);
  150 + $data = [];
  151 +
  152 + //处理日期
  153 + foreach ($v as $date => $position) {
  154 + $data[date('m-d', strtotime($date . '+ 1 day'))] = $position['position'];
  155 + }
  156 +
  157 + //域名类型
  158 + $domain_text = '主域名:' . str_replace('www.', '', $domain);
  159 + if (!empty($last['r'])) {
  160 + $domain_text = 'AI域名:' . $last['r'];
  161 + if (in_array($flg_ext, [1, 2]) || $flg_ai == 1) {
  162 + if ($last['r'] == $ai_domain) {
  163 + $domain_text = '星链域名: ' . $ai_domain;
  164 + } else if ($last['r'] == $ext_domain) {
  165 + $domain_text = '主域名2: ' . $ext_domain;
  166 + } else {
  167 + $domain_text = 'AI域名: ' . $last['r'];
  168 + }
  169 + }
  170 + }
  171 + $v = [
  172 + 'keyword' => $key,
  173 + 'domain' => $domain_text,
  174 + 'g' => $last['g'], //1核心关键词
  175 + 'position' => $data
  176 + ];
  177 + if ($last['position'] == 0) {
  178 + $list0[] = $v;
  179 + } elseif ($last['position'] <= 30) {
  180 + if (($v['position'][date('m-d', strtotime('-1day'))] ?? '') == 0 ||
  181 + ($v['position'][date('m-d', strtotime('-2day'))] ?? '') == 0) {
  182 + $list30_0[] = $v;
  183 + } else {
  184 + $list30[] = $v;
  185 + }
  186 + } else {
  187 + $list100[] = $v;
  188 + }
  189 + }
  190 + //排序 排名前30的 按关键词长短排序 最近三天无排名的排后; 后30名的按排名排序
  191 + $list30 = collect($list30)->sortBy(function ($item) {
  192 + return strlen($item['keyword']);
  193 + })->values()->all();
  194 + $list30_0 = collect($list30_0)->sortBy(function ($item) {
  195 + return strlen($item['keyword']);
  196 + })->values()->all();
  197 + $list100 = collect($list100)->sortBy(function ($item) {
  198 + return Arr::last($item['position']);
  199 + })->values()->all();
  200 + $list = collect($list30)->merge($list30_0)->merge($list100)->merge($list0)->filter(function ($item) {
  201 + //搜索
  202 + if ($this->request['search']) {
  203 + return strpos($item['keyword'], $this->request['search']) !== false;
  204 + }
  205 + //前几名
  206 + if ($this->request['first']) {
  207 + $position = Arr::last($item['position']);
  208 + return $position > 0 && $position <= $this->request['first'];
  209 + }
  210 + //核心词
  211 + if ($this->request['g']) {
  212 + return $item['g'] == $this->request['g'];
  213 + }
  214 + return true;
  215 + })->values();
  216 + $data = [
  217 + "list" => $list->forPage($page, 100)->toArray(),
  218 + "total" => $list->count(),
  219 + "page" => $page,
  220 + "total_page" => ceil($list->count() / 100),
  221 + "size" => 100
  222 + ];
  223 + return $this->success($data);
  224 + }
  225 +
  226 +
  227 + /**
  228 + * 获取复制站点项目
  229 + * @author zbj
  230 + * @date 2023/5/12
  231 + */
  232 + public function getExtendProjects($api_no = null)
  233 + {
  234 + $key = 'extend_projects_list';
  235 + $data = Cache::get($key);
  236 + if (!$data) {
  237 + $api_url = 'http://api.quanqiusou.cn/google-rank/api/extend_projects.php';
  238 + try {
  239 + $data = HttpUtils::get($api_url, []);
  240 + if ($data) {
  241 + $data = Arr::s2a($data);
  242 + Cache::put($key, $data, 4 * 3600);
  243 + }
  244 + } catch (\Exception | GuzzleException $e) {
  245 + errorLog('复制站点项目获取失败', [], $e);
  246 + return false;
  247 + }
  248 + }
  249 + if ($api_no !== null) {
  250 + $data = collect($data)->where('apino', $api_no)->first();
  251 + return $data ?: [];
  252 + }
  253 + return $data;
  254 + }
  255 +
  256 + /**
  257 + * 获取AI站点项目
  258 + * @author zbj
  259 + * @date 2023/5/12
  260 + */
  261 + public function getAiProjects($domain = null)
  262 + {
  263 + $key = 'ai_projects_list';
  264 + $data = Cache::get($key);
  265 + if (!$data) {
  266 + $api_url = 'https://demosite5.globalso.com/api/domain';
  267 + try {
  268 + $data = HttpUtils::get($api_url, []);
  269 + if ($data) {
  270 + $data = Arr::s2a($data);
  271 + Cache::put($key, $data, 4 * 3600);
  272 + }
  273 + } catch (\Exception | GuzzleException $e) {
  274 + errorLog('AI站点项目获取失败', [], $e);
  275 + return false;
  276 + }
  277 + }
  278 + if ($domain !== null) {
  279 + $domain = parse_url($domain);
  280 + $data = collect($data['data'])->where('bind_domain', $domain['host'] ?? $domain['path'])->first();
  281 + return $data ?: [];
  282 + }
  283 + return $data;
  284 + }
  285 +
  286 + /**
  287 + * 获取复制项目标识
  288 + * @author zbj
  289 + * @date 2023/5/15
  290 + */
  291 + protected function getExtFlag($ext_projects, $domain, $api_no)
  292 + {
  293 + //复制站点标识
  294 + $flg_ext = 0;
  295 + if ($ext_projects) {
  296 + $ext_urls = array_column($ext_projects, 'ext');
  297 + $api_nos = array_column($ext_projects, 'apino');
  298 + if (in_array($api_no, $api_nos)) {
  299 + $flg_ext = 1;
  300 + }
  301 + if (in_array($domain, $ext_urls)) {
  302 + $flg_ext = 2;
  303 + }
  304 + }
  305 + return $flg_ext;
  306 + }
  307 +
  308 + /**
  309 + * 获取AI项目标识
  310 + * @author zbj
  311 + * @date 2023/5/15
  312 + */
  313 + protected function getAiFlag($ai_projects, $domain)
  314 + {
  315 + $flg_ai = 0;
  316 + foreach ($ai_projects as $ai_project) {
  317 + if ($ai_project['bind_domain'] == $domain) {
  318 + $flg_ai = 1;
  319 + }
  320 + }
  321 + return $flg_ai;
119 } 322 }
120 } 323 }
  1 +<?php
  2 +
  3 +namespace App\Models\Project;
  4 +
  5 +use App\Helper\Arr;
  6 +use App\Models\Base;
  7 +use App\Models\Devops\ServerConfig;
  8 +use Illuminate\Support\Facades\Cache;
  9 +
  10 +class DomainInfo extends Base
  11 +{
  12 + //设置关联表名
  13 + protected $table = 'gl_project_domain_info';
  14 +
  15 +
  16 + public function setDomainInfoAttribute($value){
  17 + $this->attributes['domain_info'] = Arr::a2s($value);
  18 + }
  19 +
  20 + public function getDomainInfoAttribute($value){
  21 + return Arr::s2a($value);
  22 + }
  23 +
  24 + public function setSslAttribute($value){
  25 + $this->attributes['ssl'] = Arr::a2s($value);
  26 + }
  27 +
  28 + public function getSslAttribute($value){
  29 + return Arr::s2a($value);
  30 + }
  31 +}
@@ -14,6 +14,7 @@ @@ -14,6 +14,7 @@
14 "laravel/framework": "^8.75", 14 "laravel/framework": "^8.75",
15 "laravel/sanctum": "^2.11", 15 "laravel/sanctum": "^2.11",
16 "laravel/tinker": "^2.5", 16 "laravel/tinker": "^2.5",
  17 + "mongodb/mongodb": "^1.6",
17 "phpoffice/phpspreadsheet": "^1.28" 18 "phpoffice/phpspreadsheet": "^1.28"
18 }, 19 },
19 "require-dev": { 20 "require-dev": {