正在显示
11 个修改的文件
包含
297 行增加
和
233 行删除
| @@ -2,13 +2,9 @@ | @@ -2,13 +2,9 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Console\Commands\RankData; | 3 | namespace App\Console\Commands\RankData; |
| 4 | 4 | ||
| 5 | -use App\Helper\Arr; | ||
| 6 | -use App\Helper\SemrushApi; | ||
| 7 | -use App\Models\Domain\DomainInfo; | ||
| 8 | -use App\Models\RankData\ExternalLinks as ExternalLinksModel; | 5 | +use App\Http\Logic\Bside\RankData\RankDataLogic; |
| 9 | use App\Models\Project\DeployOptimize; | 6 | use App\Models\Project\DeployOptimize; |
| 10 | -use App\Utils\HttpUtils; | ||
| 11 | -use App\Utils\LogUtils; | 7 | +use Illuminate\Support\Facades\Log; |
| 12 | 8 | ||
| 13 | /** | 9 | /** |
| 14 | * Class ExternalLinks | 10 | * Class ExternalLinks |
| @@ -38,89 +34,13 @@ class ExternalLinks extends BaseCommands | @@ -38,89 +34,13 @@ class ExternalLinks extends BaseCommands | ||
| 38 | */ | 34 | */ |
| 39 | public function do() | 35 | public function do() |
| 40 | { | 36 | { |
| 41 | - $error = 0; | ||
| 42 | - $semrushApi = new SemrushApi(); | ||
| 43 | //有排名api编号的项目 | 37 | //有排名api编号的项目 |
| 44 | $list = DeployOptimize::where('api_no', '>', 0)->select('domain', 'api_no', 'project_id')->get()->toArray(); | 38 | $list = DeployOptimize::where('api_no', '>', 0)->select('domain', 'api_no', 'project_id')->get()->toArray(); |
| 45 | - LogUtils::info('start rank_data_external_links:' . count($list)); | 39 | + Log::channel('rank_data')->info('开始-外链数据-'.count($list)); |
| 46 | foreach ($list as $item) { | 40 | foreach ($list as $item) { |
| 47 | - $project_id = $item['project_id']; | ||
| 48 | - $api_no = $item['api_no']; | ||
| 49 | - $domain = $item['domain']; | ||
| 50 | - if(!$domain){ | ||
| 51 | - continue; | ||
| 52 | - } | ||
| 53 | - $model = ExternalLinksModel::where('project_id', $project_id)->first(); | ||
| 54 | - if ($model && $model->updated_date >= getThisWeekStarDate()) { | ||
| 55 | - continue; | ||
| 56 | - } | ||
| 57 | - if (!$model) { | ||
| 58 | - $model = new ExternalLinksModel(); | ||
| 59 | - } | ||
| 60 | - | ||
| 61 | - | ||
| 62 | - //5.0 | ||
| 63 | - try { | ||
| 64 | - $data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []); | ||
| 65 | - $data = Arr::s2a($data); | ||
| 66 | - }catch (\Exception $e){ | ||
| 67 | - $data = []; | ||
| 68 | - } | ||
| 69 | - | ||
| 70 | - if(!$data){ | ||
| 71 | - //外链数据 | ||
| 72 | - $domain = (new DomainInfo())->getDomain($domain); | ||
| 73 | - $res = $semrushApi->backlinks_overview($domain); | ||
| 74 | - if (!$res) { | ||
| 75 | - $error++; | ||
| 76 | - continue; | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - $data = $this->_data($project_id, $res['total']); | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | - $model->project_id = $project_id; | ||
| 83 | - $model->total = $data['total']; | ||
| 84 | - $model->data = $data['data']; | ||
| 85 | - $model->updated_date = date('Y-m-d'); | ||
| 86 | - $model->save(); | 41 | + $rankDataLogic = new RankDataLogic(); |
| 42 | + $rankDataLogic->syncExternalLinks($item['api_no']); | ||
| 87 | } | 43 | } |
| 88 | - return !$error; | 44 | + return true; |
| 89 | } | 45 | } |
| 90 | - | ||
| 91 | - | ||
| 92 | - /** | ||
| 93 | - * 构造chat数据 | ||
| 94 | - * @param $project_id | ||
| 95 | - * @param $total | ||
| 96 | - * @return array|mixed | ||
| 97 | - * @author zbj | ||
| 98 | - * @date 2023/5/10 | ||
| 99 | - */ | ||
| 100 | - public function _data($project_id, $total) | ||
| 101 | - { | ||
| 102 | - // //外链数 | ||
| 103 | - $data['total'] = intval($total); | ||
| 104 | - $model = ExternalLinksModel::where('project_id', $project_id)->first(); | ||
| 105 | - if ($model) { | ||
| 106 | - //特殊处理的外链数 | ||
| 107 | -// $data['total'] = ($total > $model->total) ? intval($total) : $model->total; //特殊处理的 | ||
| 108 | - | ||
| 109 | - //chat数据 | ||
| 110 | - $chat_data = Arr::s2a($model['data']); | ||
| 111 | - if (empty($chat_data[date('Y-m-d')])) { | ||
| 112 | - array_shift($chat_data); | ||
| 113 | - } | ||
| 114 | - } else { | ||
| 115 | - //chat数据 | ||
| 116 | - for ($i = 1; $i < 12; $i++) { | ||
| 117 | - $date = date("Y-m-d", strtotime(-7 * $i . 'days')); | ||
| 118 | - $chat_data[$date] = 0; //伪造ceil($total - ($total * rand(5, 10) / 100)); | ||
| 119 | - } | ||
| 120 | - } | ||
| 121 | - $chat_data[date('Y-m-d')] = $data['total']; | ||
| 122 | - $data['data'] = $chat_data; | ||
| 123 | - return $data; | ||
| 124 | - } | ||
| 125 | - | ||
| 126 | } | 46 | } |
| @@ -2,10 +2,9 @@ | @@ -2,10 +2,9 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Console\Commands\RankData; | 3 | namespace App\Console\Commands\RankData; |
| 4 | 4 | ||
| 5 | -use App\Helper\QuanqiusouApi; | 5 | +use App\Http\Logic\Bside\RankData\RankDataLogic; |
| 6 | use App\Models\Project\DeployOptimize; | 6 | use App\Models\Project\DeployOptimize; |
| 7 | -use App\Models\RankData\IndexedPages as IndexedPagesModel; | ||
| 8 | -use App\Utils\LogUtils; | 7 | +use Illuminate\Support\Facades\Log; |
| 9 | 8 | ||
| 10 | /** | 9 | /** |
| 11 | * Class IndexedPages | 10 | * Class IndexedPages |
| @@ -35,34 +34,15 @@ class IndexedPages extends BaseCommands | @@ -35,34 +34,15 @@ class IndexedPages extends BaseCommands | ||
| 35 | * @date 2023/5/11 | 34 | * @date 2023/5/11 |
| 36 | */ | 35 | */ |
| 37 | public function do(){ | 36 | public function do(){ |
| 38 | - $error = 0; | ||
| 39 | - $api = new QuanqiusouApi(); | ||
| 40 | //有排名api编号的项目 | 37 | //有排名api编号的项目 |
| 41 | $list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray(); | 38 | $list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray(); |
| 42 | - LogUtils::info('start rank_data_indexed_pages:' . count($list)); | ||
| 43 | - foreach ($list as $project_id => $api_no) { | ||
| 44 | - $model = IndexedPagesModel::where('project_id', $project_id)->first(); | ||
| 45 | - if($model && $model->updated_date >= getThisWeekStarDate()){ | ||
| 46 | - continue; | ||
| 47 | - } | ||
| 48 | - | ||
| 49 | - if(!$model){ | ||
| 50 | - $model = new IndexedPagesModel(); | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - $res = $api->getSiteResPer($api_no); | ||
| 54 | - if(!$res){ | ||
| 55 | - $error++; | ||
| 56 | - continue; | ||
| 57 | - } | 39 | + Log::channel('rank_data')->info('开始-页面收录数据-'.count($list)); |
| 58 | 40 | ||
| 59 | - $model->project_id = $project_id; | ||
| 60 | - $model->data = $res['data']; | ||
| 61 | - $model->updated_date = date('Y-m-d'); | ||
| 62 | - $model->save(); | 41 | + foreach ($list as $project_id => $api_no) { |
| 42 | + $rankDataLogic = new RankDataLogic(); | ||
| 43 | + $rankDataLogic->syncIndexedPages($api_no); | ||
| 63 | } | 44 | } |
| 64 | 45 | ||
| 65 | - return !$error; | 46 | + return true; |
| 66 | } | 47 | } |
| 67 | - | ||
| 68 | } | 48 | } |
| @@ -5,11 +5,8 @@ namespace App\Console\Commands\RankData; | @@ -5,11 +5,8 @@ namespace App\Console\Commands\RankData; | ||
| 5 | use App\Helper\QuanqiusouApi; | 5 | use App\Helper\QuanqiusouApi; |
| 6 | use App\Http\Logic\Bside\RankData\RankDataLogic; | 6 | use App\Http\Logic\Bside\RankData\RankDataLogic; |
| 7 | use App\Models\Com\NoticeLog; | 7 | use App\Models\Com\NoticeLog; |
| 8 | -use App\Models\Project\DeployOptimize; | ||
| 9 | -use App\Models\Project\Project; | ||
| 10 | -use App\Models\RankData\RankData as GoogleRankModel; | ||
| 11 | -use App\Utils\LogUtils; | ||
| 12 | use Illuminate\Console\Command; | 8 | use Illuminate\Console\Command; |
| 9 | +use Illuminate\Support\Facades\Log; | ||
| 13 | 10 | ||
| 14 | /** | 11 | /** |
| 15 | * Class GoogleRank | 12 | * Class GoogleRank |
| @@ -56,17 +53,26 @@ class RankDataTask extends Command | @@ -56,17 +53,26 @@ class RankDataTask extends Command | ||
| 56 | foreach ($list as $item){ | 53 | foreach ($list as $item){ |
| 57 | echo 'start:' . $item['id'] . PHP_EOL; | 54 | echo 'start:' . $item['id'] . PHP_EOL; |
| 58 | try { | 55 | try { |
| 56 | + $rankDataLogic = new RankDataLogic(); | ||
| 57 | + //排名数据 | ||
| 59 | $api = new QuanqiusouApi(); | 58 | $api = new QuanqiusouApi(); |
| 60 | $site_res = $api->getSiteRes(); | 59 | $site_res = $api->getSiteRes(); |
| 61 | - | ||
| 62 | - (new RankDataLogic())->syncRankData($item['data']['api_no'], $site_res, true); | 60 | + $rankDataLogic->syncRankData($item['data']['api_no'], $site_res, true); |
| 61 | + //外链数据 | ||
| 62 | + $rankDataLogic->syncExternalLinks($item['data']['api_no'], true); | ||
| 63 | + //外链引荐域名 | ||
| 64 | + $rankDataLogic->syncRecommDomain($item['data']['api_no'], true); | ||
| 65 | + //测速 | ||
| 66 | + $rankDataLogic->syncSpeed($item['data']['api_no'], true); | ||
| 67 | + //每周排名数据 | ||
| 68 | + $rankDataLogic->syncRankWeek($item['data']['api_no'], true); | ||
| 63 | 69 | ||
| 64 | $item->status = NoticeLog::STATUS_SUCCESS; | 70 | $item->status = NoticeLog::STATUS_SUCCESS; |
| 65 | $item->save(); | 71 | $item->save(); |
| 66 | echo 'success:' . $item['id'] . PHP_EOL; | 72 | echo 'success:' . $item['id'] . PHP_EOL; |
| 67 | }catch (\Exception $e){ | 73 | }catch (\Exception $e){ |
| 68 | echo 'error:' . $item['id'] . $e->getMessage() . PHP_EOL; | 74 | echo 'error:' . $item['id'] . $e->getMessage() . PHP_EOL; |
| 69 | - errorLog('排名数据更新失败', $item, $e); | 75 | + Log::channel('rank_data')->error('排名数据更新失败' . $e->getMessage(), $item); |
| 70 | $this->retry($item, $e->getMessage()); | 76 | $this->retry($item, $e->getMessage()); |
| 71 | } | 77 | } |
| 72 | } | 78 | } |
| @@ -2,11 +2,8 @@ | @@ -2,11 +2,8 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Console\Commands\RankData; | 3 | namespace App\Console\Commands\RankData; |
| 4 | 4 | ||
| 5 | - | ||
| 6 | -use App\Helper\Arr; | ||
| 7 | -use App\Helper\QuanqiusouApi; | 5 | +use App\Http\Logic\Bside\RankData\RankDataLogic; |
| 8 | use App\Models\Project\DeployOptimize; | 6 | use App\Models\Project\DeployOptimize; |
| 9 | -use App\Models\RankData\RankWeek as RankWeekModel; | ||
| 10 | use App\Utils\LogUtils; | 7 | use App\Utils\LogUtils; |
| 11 | 8 | ||
| 12 | /** | 9 | /** |
| @@ -37,38 +34,14 @@ class RankWeek extends BaseCommands | @@ -37,38 +34,14 @@ class RankWeek extends BaseCommands | ||
| 37 | */ | 34 | */ |
| 38 | public function do() | 35 | public function do() |
| 39 | { | 36 | { |
| 40 | - $error = 0; | ||
| 41 | - | ||
| 42 | - //获取每周排名数据 | ||
| 43 | - $api = new QuanqiusouApi(); | ||
| 44 | - | ||
| 45 | - $res = $api->getGoogleRankWeek(); | ||
| 46 | - if (!$res) { | ||
| 47 | - return false; | ||
| 48 | - } | ||
| 49 | - | ||
| 50 | - $res = Arr::s2a($res); | ||
| 51 | //有排名api编号的项目 | 37 | //有排名api编号的项目 |
| 52 | $list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray(); | 38 | $list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray(); |
| 53 | LogUtils::info('start rank_data_week:' . count($list)); | 39 | LogUtils::info('start rank_data_week:' . count($list)); |
| 54 | foreach ($list as $project_id => $api_no) { | 40 | foreach ($list as $project_id => $api_no) { |
| 55 | - $rank_week = RankWeekModel::where('project_id', $project_id)->first(); | ||
| 56 | - if ($rank_week && $rank_week->updated_date >= getThisWeekStarDate()) { | ||
| 57 | - //本周数据已更新 | ||
| 58 | - continue; | ||
| 59 | - } | ||
| 60 | - | ||
| 61 | - if (!$rank_week) { | ||
| 62 | - $rank_week = new RankWeekModel(); | ||
| 63 | - } | ||
| 64 | - | ||
| 65 | - $rank_week->project_id = $project_id; | ||
| 66 | - $rank_week->data = $res['data'][$api_no]; | ||
| 67 | - $rank_week->date = $res['date']; | ||
| 68 | - $rank_week->updated_date = date('Y-m-d'); | ||
| 69 | - $rank_week->save(); | 41 | + $rankDataLogic = new RankDataLogic(); |
| 42 | + $rankDataLogic->syncRankWeek($api_no); | ||
| 70 | } | 43 | } |
| 71 | 44 | ||
| 72 | - return !$error; | 45 | + return true; |
| 73 | } | 46 | } |
| 74 | } | 47 | } |
| @@ -2,13 +2,9 @@ | @@ -2,13 +2,9 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Console\Commands\RankData; | 3 | namespace App\Console\Commands\RankData; |
| 4 | 4 | ||
| 5 | -use App\Helper\Arr; | ||
| 6 | -use App\Helper\SemrushApi; | ||
| 7 | -use App\Models\Domain\DomainInfo; | ||
| 8 | -use App\Models\RankData\RecommDomain as RecommDomainModel; | 5 | +use App\Http\Logic\Bside\RankData\RankDataLogic; |
| 9 | use App\Models\Project\DeployOptimize; | 6 | use App\Models\Project\DeployOptimize; |
| 10 | -use App\Utils\HttpUtils; | ||
| 11 | -use App\Utils\LogUtils; | 7 | +use Illuminate\Support\Facades\Log; |
| 12 | 8 | ||
| 13 | /** | 9 | /** |
| 14 | * Class RecommDomain | 10 | * Class RecommDomain |
| @@ -38,50 +34,14 @@ class RecommDomain extends BaseCommands | @@ -38,50 +34,14 @@ class RecommDomain extends BaseCommands | ||
| 38 | */ | 34 | */ |
| 39 | public function do() | 35 | public function do() |
| 40 | { | 36 | { |
| 41 | - $error = 0; | ||
| 42 | - $semrushApi = new SemrushApi(); | ||
| 43 | //有排名api编号的项目 | 37 | //有排名api编号的项目 |
| 44 | $list = DeployOptimize::where('api_no', '>', 0)->select('domain', 'api_no', 'project_id')->get()->toArray(); | 38 | $list = DeployOptimize::where('api_no', '>', 0)->select('domain', 'api_no', 'project_id')->get()->toArray(); |
| 45 | - LogUtils::info('start rank_data_recomm_domain:' . count($list)); | ||
| 46 | - foreach ($list as $item) { | ||
| 47 | - $project_id = $item['project_id']; | ||
| 48 | - $api_no = $item['api_no']; | ||
| 49 | - $domain = $item['domain']; | ||
| 50 | - if(!$domain){ | ||
| 51 | - continue; | ||
| 52 | - } | ||
| 53 | - $model = RecommDomainModel::where('project_id', $project_id)->first(); | ||
| 54 | - if ($model && $model->updated_date >= getThisWeekStarDate()) { | ||
| 55 | - continue; | ||
| 56 | - } | ||
| 57 | - if (!$model) { | ||
| 58 | - $model = new RecommDomainModel(); | ||
| 59 | - } | ||
| 60 | - | ||
| 61 | - //5.0 | ||
| 62 | - try { | ||
| 63 | - $data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []); | ||
| 64 | - $data = Arr::s2a($data)['list']; | ||
| 65 | - }catch (\Exception $e){ | ||
| 66 | - $data = []; | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - if(!$data){ | ||
| 70 | - //外链引荐域名 | ||
| 71 | - $domain = (new DomainInfo())->getDomain($domain); | ||
| 72 | - $data = $semrushApi->backlinks_refdomains($domain); | ||
| 73 | - } | 39 | + Log::channel('rank_data')->info('开始-外链引荐域名数据-'.count($list)); |
| 74 | 40 | ||
| 75 | - if (!$data) { | ||
| 76 | - $error++; | ||
| 77 | - continue; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - $model->project_id = $project_id; | ||
| 81 | - $model->data = $data; | ||
| 82 | - $model->updated_date = date('Y-m-d'); | ||
| 83 | - $model->save(); | 41 | + foreach ($list as $item) { |
| 42 | + $rankDataLogic = new RankDataLogic(); | ||
| 43 | + $rankDataLogic->syncExternalLinks($item['api_no']); | ||
| 84 | } | 44 | } |
| 85 | - return !$error; | 45 | + return true; |
| 86 | } | 46 | } |
| 87 | } | 47 | } |
| @@ -2,12 +2,9 @@ | @@ -2,12 +2,9 @@ | ||
| 2 | 2 | ||
| 3 | namespace App\Console\Commands\RankData; | 3 | namespace App\Console\Commands\RankData; |
| 4 | 4 | ||
| 5 | -use App\Helper\Arr; | ||
| 6 | -use App\Helper\GoogleSpeedApi; | ||
| 7 | -use App\Models\Domain\DomainInfo; | 5 | +use App\Http\Logic\Bside\RankData\RankDataLogic; |
| 8 | use App\Models\Project\DeployOptimize; | 6 | use App\Models\Project\DeployOptimize; |
| 9 | -use App\Models\RankData\Speed as GoogleSpeedModel; | ||
| 10 | -use App\Utils\LogUtils; | 7 | +use Illuminate\Support\Facades\Log; |
| 11 | 8 | ||
| 12 | /** | 9 | /** |
| 13 | * Class GoogleSpeed | 10 | * Class GoogleSpeed |
| @@ -38,34 +35,15 @@ class Speed extends BaseCommands | @@ -38,34 +35,15 @@ class Speed extends BaseCommands | ||
| 38 | */ | 35 | */ |
| 39 | public function do() | 36 | public function do() |
| 40 | { | 37 | { |
| 41 | - $error = 0; | ||
| 42 | - | ||
| 43 | - $googleSpeedApi = new GoogleSpeedApi(); | ||
| 44 | - | ||
| 45 | //有排名api编号的项目 | 38 | //有排名api编号的项目 |
| 46 | - $list = DeployOptimize::where('api_no', '>', 0)->pluck('domain', 'project_id')->toArray(); | ||
| 47 | - LogUtils::info('start rank_data_speed:' . count($list)); | ||
| 48 | - foreach ($list as $project_id => $domain) { | ||
| 49 | - $model = GoogleSpeedModel::where('project_id', $project_id)->first(); | ||
| 50 | - if ($model && $model->updated_date >= getThisWeekStarDate()) { | ||
| 51 | - //今周已更新 跳过 | ||
| 52 | - continue; | ||
| 53 | - } | ||
| 54 | - $domain = (new DomainInfo())->getDomain($domain); | ||
| 55 | - $res = $googleSpeedApi->run($domain); | ||
| 56 | - if (!$res) { | ||
| 57 | - $error++; | ||
| 58 | - continue; | ||
| 59 | - } | ||
| 60 | - if (!$model) { | ||
| 61 | - $model = new GoogleSpeedModel; | ||
| 62 | - } | ||
| 63 | - $model->project_id = $project_id; | ||
| 64 | - $model->data = $res; | ||
| 65 | - $model->updated_date = date('Y-m-d'); | ||
| 66 | - $model->save(); | 39 | + $list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray(); |
| 40 | + Log::channel('rank_data')->info('开始-测速数据-'.count($list)); | ||
| 41 | + | ||
| 42 | + foreach ($list as $project_id => $api_no) { | ||
| 43 | + $rankDataLogic = new RankDataLogic(); | ||
| 44 | + $rankDataLogic->syncSpeed($api_no); | ||
| 67 | } | 45 | } |
| 68 | 46 | ||
| 69 | - return !$error; | 47 | + return true; |
| 70 | } | 48 | } |
| 71 | } | 49 | } |
| @@ -5,6 +5,7 @@ namespace App\Helper; | @@ -5,6 +5,7 @@ namespace App\Helper; | ||
| 5 | 5 | ||
| 6 | use App\Utils\HttpUtils; | 6 | use App\Utils\HttpUtils; |
| 7 | use GuzzleHttp\Exception\GuzzleException; | 7 | use GuzzleHttp\Exception\GuzzleException; |
| 8 | +use Illuminate\Support\Facades\Log; | ||
| 8 | 9 | ||
| 9 | 10 | ||
| 10 | /** | 11 | /** |
| @@ -126,7 +127,7 @@ class GoogleSpeedApi | @@ -126,7 +127,7 @@ class GoogleSpeedApi | ||
| 126 | } | 127 | } |
| 127 | } | 128 | } |
| 128 | } catch (\Exception | GuzzleException $e) { | 129 | } catch (\Exception | GuzzleException $e) { |
| 129 | - errorLog('测速失败', $params, $e); | 130 | + Log::channel('rank_data')->error('测速失败' . $e->getMessage(), $params); |
| 130 | } | 131 | } |
| 131 | return [ | 132 | return [ |
| 132 | "url" => $url, | 133 | "url" => $url, |
| @@ -6,6 +6,7 @@ namespace App\Helper; | @@ -6,6 +6,7 @@ namespace App\Helper; | ||
| 6 | use App\Utils\HttpUtils; | 6 | use App\Utils\HttpUtils; |
| 7 | use GuzzleHttp\Exception\GuzzleException; | 7 | use GuzzleHttp\Exception\GuzzleException; |
| 8 | use Illuminate\Support\Facades\Cache; | 8 | use Illuminate\Support\Facades\Cache; |
| 9 | +use Illuminate\Support\Facades\Log; | ||
| 9 | 10 | ||
| 10 | 11 | ||
| 11 | /** | 12 | /** |
| @@ -130,7 +131,7 @@ class QuanqiusouApi | @@ -130,7 +131,7 @@ class QuanqiusouApi | ||
| 130 | Cache::put($key, $res, 2 * 3600); | 131 | Cache::put($key, $res, 2 * 3600); |
| 131 | } | 132 | } |
| 132 | } catch (\Exception | GuzzleException $e) { | 133 | } catch (\Exception | GuzzleException $e) { |
| 133 | - errorLog('获取每周谷歌排名数据失败', [], $e); | 134 | + Log::channel('rank_data')->error('获取每周谷歌排名数据失败' . $e->getMessage()); |
| 134 | return false; | 135 | return false; |
| 135 | } | 136 | } |
| 136 | } | 137 | } |
| @@ -5,6 +5,7 @@ namespace App\Helper; | @@ -5,6 +5,7 @@ namespace App\Helper; | ||
| 5 | 5 | ||
| 6 | use App\Utils\HttpUtils; | 6 | use App\Utils\HttpUtils; |
| 7 | use GuzzleHttp\Exception\GuzzleException; | 7 | use GuzzleHttp\Exception\GuzzleException; |
| 8 | +use Illuminate\Support\Facades\Log; | ||
| 8 | 9 | ||
| 9 | 10 | ||
| 10 | /** | 11 | /** |
| @@ -37,7 +38,7 @@ class SemrushApi | @@ -37,7 +38,7 @@ class SemrushApi | ||
| 37 | $res = HttpUtils::get($url, $params); | 38 | $res = HttpUtils::get($url, $params); |
| 38 | return $this->data($res)[0] ?? []; | 39 | return $this->data($res)[0] ?? []; |
| 39 | }catch (\Exception|GuzzleException $e){ | 40 | }catch (\Exception|GuzzleException $e){ |
| 40 | - errorLog('获取站点外链数据失败', $params, $e); | 41 | + Log::channel('rank_data')->error('外链数据获取失败' . $e->getMessage(), $params); |
| 41 | return false; | 42 | return false; |
| 42 | } | 43 | } |
| 43 | } | 44 | } |
| @@ -63,7 +64,7 @@ class SemrushApi | @@ -63,7 +64,7 @@ class SemrushApi | ||
| 63 | $res = HttpUtils::get($url, $params); | 64 | $res = HttpUtils::get($url, $params); |
| 64 | return $this->data($res); | 65 | return $this->data($res); |
| 65 | }catch (\Exception|GuzzleException $e){ | 66 | }catch (\Exception|GuzzleException $e){ |
| 66 | - errorLog('获取站点外链数据失败', $params, $e); | 67 | + Log::channel('rank_data')->error('获取站点外链数据失败' . $e->getMessage(), $params); |
| 67 | return false; | 68 | return false; |
| 68 | } | 69 | } |
| 69 | } | 70 | } |
| @@ -4,7 +4,9 @@ namespace App\Http\Logic\Bside\RankData; | @@ -4,7 +4,9 @@ namespace App\Http\Logic\Bside\RankData; | ||
| 4 | 4 | ||
| 5 | 5 | ||
| 6 | use App\Helper\Arr; | 6 | use App\Helper\Arr; |
| 7 | +use App\Helper\GoogleSpeedApi; | ||
| 7 | use App\Helper\QuanqiusouApi; | 8 | use App\Helper\QuanqiusouApi; |
| 9 | +use App\Helper\SemrushApi; | ||
| 8 | use App\Helper\Translate; | 10 | use App\Helper\Translate; |
| 9 | use App\Http\Logic\Aside\Project\DomainInfoLogic; | 11 | use App\Http\Logic\Aside\Project\DomainInfoLogic; |
| 10 | use App\Http\Logic\Aside\Project\ProjectLogic; | 12 | use App\Http\Logic\Aside\Project\ProjectLogic; |
| @@ -14,14 +16,20 @@ use App\Models\Project\DeployBuild; | @@ -14,14 +16,20 @@ use App\Models\Project\DeployBuild; | ||
| 14 | use App\Models\Project\DeployOptimize; | 16 | use App\Models\Project\DeployOptimize; |
| 15 | use App\Models\Project\Project; | 17 | use App\Models\Project\Project; |
| 16 | use App\Models\RankData\ExternalLinks; | 18 | use App\Models\RankData\ExternalLinks; |
| 19 | +use App\Models\RankData\ExternalLinks as ExternalLinksModel; | ||
| 17 | use App\Models\RankData\IndexedPages; | 20 | use App\Models\RankData\IndexedPages; |
| 21 | +use App\Models\RankData\IndexedPages as IndexedPagesModel; | ||
| 18 | use App\Models\RankData\RankData; | 22 | use App\Models\RankData\RankData; |
| 19 | use App\Models\RankData\RankWeek; | 23 | use App\Models\RankData\RankWeek; |
| 24 | +use App\Models\RankData\RankWeek as RankWeekModel; | ||
| 20 | use App\Models\RankData\RecommDomain; | 25 | use App\Models\RankData\RecommDomain; |
| 26 | +use App\Models\RankData\RecommDomain as RecommDomainModel; | ||
| 21 | use App\Models\RankData\Speed; | 27 | use App\Models\RankData\Speed; |
| 28 | +use App\Models\RankData\Speed as GoogleSpeedModel; | ||
| 22 | use App\Utils\HttpUtils; | 29 | use App\Utils\HttpUtils; |
| 23 | use GuzzleHttp\Exception\GuzzleException; | 30 | use GuzzleHttp\Exception\GuzzleException; |
| 24 | use Illuminate\Support\Facades\Cache; | 31 | use Illuminate\Support\Facades\Cache; |
| 32 | +use Illuminate\Support\Facades\Log; | ||
| 25 | use Illuminate\Support\Str; | 33 | use Illuminate\Support\Str; |
| 26 | 34 | ||
| 27 | class RankDataLogic extends BaseLogic | 35 | class RankDataLogic extends BaseLogic |
| @@ -399,6 +407,7 @@ class RankDataLogic extends BaseLogic | @@ -399,6 +407,7 @@ class RankDataLogic extends BaseLogic | ||
| 399 | } | 407 | } |
| 400 | } | 408 | } |
| 401 | 409 | ||
| 410 | + | ||
| 402 | /** | 411 | /** |
| 403 | * @param $project_id | 412 | * @param $project_id |
| 404 | * @param int $indexed_pages_num | 413 | * @param int $indexed_pages_num |
| @@ -484,4 +493,233 @@ class RankDataLogic extends BaseLogic | @@ -484,4 +493,233 @@ class RankDataLogic extends BaseLogic | ||
| 484 | $model->updated_date = date('Y-m-d'); | 493 | $model->updated_date = date('Y-m-d'); |
| 485 | $model->save(); | 494 | $model->save(); |
| 486 | } | 495 | } |
| 496 | + | ||
| 497 | + | ||
| 498 | + /** | ||
| 499 | + * 同步外链 | ||
| 500 | + * @throws \Exception|GuzzleException | ||
| 501 | + * @author zbj | ||
| 502 | + * @date 2023/9/20 | ||
| 503 | + */ | ||
| 504 | + public function syncExternalLinks($api_no, $force=false){ | ||
| 505 | + $project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id'); | ||
| 506 | + foreach ($project_ids as $project_id => $domain) { | ||
| 507 | + if (!$domain) { | ||
| 508 | + Log::channel('rank_data')->error('syncExternalLinks:未配置数据库', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 509 | + continue; | ||
| 510 | + } | ||
| 511 | + | ||
| 512 | + $model = ExternalLinksModel::where('project_id', $project_id)->first(); | ||
| 513 | + if ($model && $model->updated_date >= getThisWeekStarDate() && !$force) { | ||
| 514 | + continue; | ||
| 515 | + } | ||
| 516 | + if (!$model) { | ||
| 517 | + $model = new ExternalLinksModel(); | ||
| 518 | + } | ||
| 519 | + | ||
| 520 | + //5.0 | ||
| 521 | + try { | ||
| 522 | + $data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []); | ||
| 523 | + $data = Arr::s2a($data); | ||
| 524 | + }catch (\Exception $e){ | ||
| 525 | + $data = []; | ||
| 526 | + } | ||
| 527 | + if(!$data){ | ||
| 528 | + //外链数据 | ||
| 529 | + $domain = (new DomainInfo())->getDomain($domain); | ||
| 530 | + $semrushApi = new SemrushApi(); | ||
| 531 | + $res = $semrushApi->backlinks_overview($domain); | ||
| 532 | + if (!$res) { | ||
| 533 | + Log::channel('rank_data')->error('syncExternalLinks:外链数据为空', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 534 | + continue; | ||
| 535 | + } | ||
| 536 | + | ||
| 537 | + $data = $this->_data($project_id, $res['total']); | ||
| 538 | + } | ||
| 539 | + $model->project_id = $project_id; | ||
| 540 | + $model->total = $data['total']; | ||
| 541 | + $model->data = $data['data']; | ||
| 542 | + $model->updated_date = date('Y-m-d'); | ||
| 543 | + $model->save(); | ||
| 544 | + } | ||
| 545 | + } | ||
| 546 | + | ||
| 547 | + /** | ||
| 548 | + * 构造外链chat数据 | ||
| 549 | + * @param $project_id | ||
| 550 | + * @param $total | ||
| 551 | + * @return array|mixed | ||
| 552 | + * @author zbj | ||
| 553 | + * @date 2023/5/10 | ||
| 554 | + */ | ||
| 555 | + public function _data($project_id, $total) | ||
| 556 | + { | ||
| 557 | + // //外链数 | ||
| 558 | + $data['total'] = intval($total); | ||
| 559 | + $model = ExternalLinksModel::where('project_id', $project_id)->first(); | ||
| 560 | + if ($model) { | ||
| 561 | + //特殊处理的外链数 | ||
| 562 | +// $data['total'] = ($total > $model->total) ? intval($total) : $model->total; //特殊处理的 | ||
| 563 | + | ||
| 564 | + //chat数据 | ||
| 565 | + $chat_data = Arr::s2a($model['data']); | ||
| 566 | + if (empty($chat_data[date('Y-m-d')])) { | ||
| 567 | + array_shift($chat_data); | ||
| 568 | + } | ||
| 569 | + } else { | ||
| 570 | + //chat数据 | ||
| 571 | + for ($i = 1; $i < 12; $i++) { | ||
| 572 | + $date = date("Y-m-d", strtotime(-7 * $i . 'days')); | ||
| 573 | + $chat_data[$date] = 0; //伪造ceil($total - ($total * rand(5, 10) / 100)); | ||
| 574 | + } | ||
| 575 | + } | ||
| 576 | + $chat_data[date('Y-m-d')] = $data['total']; | ||
| 577 | + $data['data'] = $chat_data; | ||
| 578 | + return $data; | ||
| 579 | + } | ||
| 580 | + | ||
| 581 | + /** | ||
| 582 | + * 同步引荐域名数据 | ||
| 583 | + * @throws \Exception|GuzzleException | ||
| 584 | + * @author zbj | ||
| 585 | + * @date 2023/9/20 | ||
| 586 | + */ | ||
| 587 | + public function syncRecommDomain($api_no, $force=false){ | ||
| 588 | + $project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id'); | ||
| 589 | + foreach ($project_ids as $project_id => $domain) { | ||
| 590 | + if (!$domain) { | ||
| 591 | + Log::channel('rank_data')->error('syncRecommDomain:未配置数据库', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 592 | + continue; | ||
| 593 | + } | ||
| 594 | + $model = RecommDomainModel::where('project_id', $project_id)->first(); | ||
| 595 | + if ($model && $model->updated_date >= getThisWeekStarDate() && !$force) { | ||
| 596 | + continue; | ||
| 597 | + } | ||
| 598 | + if (!$model) { | ||
| 599 | + $model = new RecommDomainModel(); | ||
| 600 | + } | ||
| 601 | + | ||
| 602 | + //5.0 | ||
| 603 | + try { | ||
| 604 | + $data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []); | ||
| 605 | + $data = Arr::s2a($data)['list']; | ||
| 606 | + }catch (\Exception $e){ | ||
| 607 | + $data = []; | ||
| 608 | + } | ||
| 609 | + | ||
| 610 | + if(!$data){ | ||
| 611 | + //外链引荐域名 | ||
| 612 | + $domain = (new DomainInfo())->getDomain($domain); | ||
| 613 | + $semrushApi = new SemrushApi(); | ||
| 614 | + $domain = (new DomainInfo())->getDomain($domain); | ||
| 615 | + $data = $semrushApi->backlinks_refdomains($domain); | ||
| 616 | + } | ||
| 617 | + | ||
| 618 | + if (!$data) { | ||
| 619 | + Log::channel('rank_data')->error('syncRecommDomain:引荐域名数据为空', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 620 | + continue; | ||
| 621 | + } | ||
| 622 | + $model->project_id = $project_id; | ||
| 623 | + $model->data = $data; | ||
| 624 | + $model->updated_date = date('Y-m-d'); | ||
| 625 | + $model->save(); | ||
| 626 | + } | ||
| 627 | + } | ||
| 628 | + | ||
| 629 | + /** | ||
| 630 | + * 收录数 | ||
| 631 | + * @author zbj | ||
| 632 | + * @date 2024/1/9 | ||
| 633 | + */ | ||
| 634 | + public function syncIndexedPages($api_no, $force=false){ | ||
| 635 | + $project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id'); | ||
| 636 | + foreach ($project_ids as $project_id => $domain) { | ||
| 637 | + $model = IndexedPagesModel::where('project_id', $project_id)->first(); | ||
| 638 | + if($model && $model->updated_date >= getThisWeekStarDate() && !$force){ | ||
| 639 | + continue; | ||
| 640 | + } | ||
| 641 | + | ||
| 642 | + if(!$model){ | ||
| 643 | + $model = new IndexedPagesModel(); | ||
| 644 | + } | ||
| 645 | + $api = new QuanqiusouApi(); | ||
| 646 | + $res = $api->getSiteResPer($api_no); | ||
| 647 | + if(!$res){ | ||
| 648 | + Log::channel('rank_data')->error('syncIndexedPages:收录数数据为空', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 649 | + continue; | ||
| 650 | + } | ||
| 651 | + $model->project_id = $project_id; | ||
| 652 | + $model->data = $res['data']; | ||
| 653 | + $model->updated_date = date('Y-m-d'); | ||
| 654 | + $model->save(); | ||
| 655 | + } | ||
| 656 | + } | ||
| 657 | + | ||
| 658 | + /** | ||
| 659 | + * 测速 | ||
| 660 | + * @param $api_no | ||
| 661 | + * @param false $force | ||
| 662 | + * @author zbj | ||
| 663 | + * @date 2024/1/9 | ||
| 664 | + */ | ||
| 665 | + public function syncSpeed($api_no, $force=false){ | ||
| 666 | + $project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id'); | ||
| 667 | + foreach ($project_ids as $project_id => $domain) { | ||
| 668 | + $model = GoogleSpeedModel::where('project_id', $project_id)->first(); | ||
| 669 | + if ($model && $model->updated_date >= getThisWeekStarDate() && !$force) { | ||
| 670 | + continue; | ||
| 671 | + } | ||
| 672 | + $domain = (new DomainInfo())->getDomain($domain); | ||
| 673 | + $googleSpeedApi = new GoogleSpeedApi(); | ||
| 674 | + $res = $googleSpeedApi->run($domain); | ||
| 675 | + if (!$res) { | ||
| 676 | + Log::channel('rank_data')->error('syncSpeed:测速数据为空', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 677 | + continue; | ||
| 678 | + } | ||
| 679 | + if (!$model) { | ||
| 680 | + $model = new GoogleSpeedModel; | ||
| 681 | + } | ||
| 682 | + $model->project_id = $project_id; | ||
| 683 | + $model->data = $res; | ||
| 684 | + $model->updated_date = date('Y-m-d'); | ||
| 685 | + $model->save(); | ||
| 686 | + } | ||
| 687 | + | ||
| 688 | + } | ||
| 689 | + | ||
| 690 | + /** | ||
| 691 | + * 每周排名数据 | ||
| 692 | + * @param $api_no | ||
| 693 | + * @param false $force | ||
| 694 | + * @author zbj | ||
| 695 | + * @date 2024/1/9 | ||
| 696 | + */ | ||
| 697 | + public function syncRankWeek($api_no, $force=false){ | ||
| 698 | + $project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id'); | ||
| 699 | + foreach ($project_ids as $project_id => $domain) { | ||
| 700 | + $rank_week = RankWeekModel::where('project_id', $project_id)->first(); | ||
| 701 | + if ($rank_week && $rank_week->updated_date >= getThisWeekStarDate() && !$force) { | ||
| 702 | + //本周数据已更新 | ||
| 703 | + continue; | ||
| 704 | + } | ||
| 705 | + $api = new QuanqiusouApi(); | ||
| 706 | + $res = $api->getGoogleRankWeek(); | ||
| 707 | + if (!$res) { | ||
| 708 | + Log::channel('rank_data')->error('syncRankWeek:每周排名数据为空', ['project_id' => $project_id, 'api_no' => $api_no]); | ||
| 709 | + continue; | ||
| 710 | + } | ||
| 711 | + | ||
| 712 | + if (!$rank_week) { | ||
| 713 | + $rank_week = new RankWeekModel(); | ||
| 714 | + } | ||
| 715 | + | ||
| 716 | + $rank_week->project_id = $project_id; | ||
| 717 | + $rank_week->data = $res['data'][$api_no]; | ||
| 718 | + $rank_week->date = $res['date']; | ||
| 719 | + $rank_week->updated_date = date('Y-m-d'); | ||
| 720 | + $rank_week->save(); | ||
| 721 | + } | ||
| 722 | + | ||
| 723 | + } | ||
| 724 | + | ||
| 487 | } | 725 | } |
| @@ -66,6 +66,12 @@ return [ | @@ -66,6 +66,12 @@ return [ | ||
| 66 | 'via' => \App\Factory\LogFormatterFactory::class, | 66 | 'via' => \App\Factory\LogFormatterFactory::class, |
| 67 | 'prefix' => 'traffic', | 67 | 'prefix' => 'traffic', |
| 68 | ], | 68 | ], |
| 69 | + //自定义排名数据 | ||
| 70 | + 'rank_data' => [ | ||
| 71 | + 'driver' => 'custom', | ||
| 72 | + 'via' => \App\Factory\LogFormatterFactory::class, | ||
| 73 | + 'prefix' => 'rank_data', | ||
| 74 | + ], | ||
| 69 | 'wechatside' => [ | 75 | 'wechatside' => [ |
| 70 | 'driver' => 'custom', | 76 | 'driver' => 'custom', |
| 71 | 'via' => \App\Factory\LogFormatterFactory::class, | 77 | 'via' => \App\Factory\LogFormatterFactory::class, |
-
请 注册 或 登录 后发表评论