作者 赵彬吉

update

... ... @@ -2,13 +2,9 @@
namespace App\Console\Commands\RankData;
use App\Helper\Arr;
use App\Helper\SemrushApi;
use App\Models\Domain\DomainInfo;
use App\Models\RankData\ExternalLinks as ExternalLinksModel;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Project\DeployOptimize;
use App\Utils\HttpUtils;
use App\Utils\LogUtils;
use Illuminate\Support\Facades\Log;
/**
* Class ExternalLinks
... ... @@ -38,89 +34,13 @@ class ExternalLinks extends BaseCommands
*/
public function do()
{
$error = 0;
$semrushApi = new SemrushApi();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->select('domain', 'api_no', 'project_id')->get()->toArray();
LogUtils::info('start rank_data_external_links:' . count($list));
Log::channel('rank_data')->info('开始-外链数据-'.count($list));
foreach ($list as $item) {
$project_id = $item['project_id'];
$api_no = $item['api_no'];
$domain = $item['domain'];
if(!$domain){
continue;
$rankDataLogic = new RankDataLogic();
$rankDataLogic->syncExternalLinks($item['api_no']);
}
$model = ExternalLinksModel::where('project_id', $project_id)->first();
if ($model && $model->updated_date >= getThisWeekStarDate()) {
continue;
return true;
}
if (!$model) {
$model = new ExternalLinksModel();
}
//5.0
try {
$data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []);
$data = Arr::s2a($data);
}catch (\Exception $e){
$data = [];
}
if(!$data){
//外链数据
$domain = (new DomainInfo())->getDomain($domain);
$res = $semrushApi->backlinks_overview($domain);
if (!$res) {
$error++;
continue;
}
$data = $this->_data($project_id, $res['total']);
}
$model->project_id = $project_id;
$model->total = $data['total'];
$model->data = $data['data'];
$model->updated_date = date('Y-m-d');
$model->save();
}
return !$error;
}
/**
* 构造chat数据
* @param $project_id
* @param $total
* @return array|mixed
* @author zbj
* @date 2023/5/10
*/
public function _data($project_id, $total)
{
// //外链数
$data['total'] = intval($total);
$model = ExternalLinksModel::where('project_id', $project_id)->first();
if ($model) {
//特殊处理的外链数
// $data['total'] = ($total > $model->total) ? intval($total) : $model->total; //特殊处理的
//chat数据
$chat_data = Arr::s2a($model['data']);
if (empty($chat_data[date('Y-m-d')])) {
array_shift($chat_data);
}
} else {
//chat数据
for ($i = 1; $i < 12; $i++) {
$date = date("Y-m-d", strtotime(-7 * $i . 'days'));
$chat_data[$date] = 0; //伪造ceil($total - ($total * rand(5, 10) / 100));
}
}
$chat_data[date('Y-m-d')] = $data['total'];
$data['data'] = $chat_data;
return $data;
}
}
... ...
... ... @@ -2,10 +2,9 @@
namespace App\Console\Commands\RankData;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Project\DeployOptimize;
use App\Models\RankData\IndexedPages as IndexedPagesModel;
use App\Utils\LogUtils;
use Illuminate\Support\Facades\Log;
/**
* Class IndexedPages
... ... @@ -35,34 +34,15 @@ class IndexedPages extends BaseCommands
* @date 2023/5/11
*/
public function do(){
$error = 0;
$api = new QuanqiusouApi();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray();
LogUtils::info('start rank_data_indexed_pages:' . count($list));
foreach ($list as $project_id => $api_no) {
$model = IndexedPagesModel::where('project_id', $project_id)->first();
if($model && $model->updated_date >= getThisWeekStarDate()){
continue;
}
if(!$model){
$model = new IndexedPagesModel();
}
Log::channel('rank_data')->info('开始-页面收录数据-'.count($list));
$res = $api->getSiteResPer($api_no);
if(!$res){
$error++;
continue;
}
$model->project_id = $project_id;
$model->data = $res['data'];
$model->updated_date = date('Y-m-d');
$model->save();
foreach ($list as $project_id => $api_no) {
$rankDataLogic = new RankDataLogic();
$rankDataLogic->syncIndexedPages($api_no);
}
return !$error;
return true;
}
}
... ...
... ... @@ -5,11 +5,8 @@ namespace App\Console\Commands\RankData;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Com\NoticeLog;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\RankData\RankData as GoogleRankModel;
use App\Utils\LogUtils;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
/**
* Class GoogleRank
... ... @@ -56,17 +53,26 @@ class RankDataTask extends Command
foreach ($list as $item){
echo 'start:' . $item['id'] . PHP_EOL;
try {
$rankDataLogic = new RankDataLogic();
//排名数据
$api = new QuanqiusouApi();
$site_res = $api->getSiteRes();
(new RankDataLogic())->syncRankData($item['data']['api_no'], $site_res, true);
$rankDataLogic->syncRankData($item['data']['api_no'], $site_res, true);
//外链数据
$rankDataLogic->syncExternalLinks($item['data']['api_no'], true);
//外链引荐域名
$rankDataLogic->syncRecommDomain($item['data']['api_no'], true);
//测速
$rankDataLogic->syncSpeed($item['data']['api_no'], true);
//每周排名数据
$rankDataLogic->syncRankWeek($item['data']['api_no'], true);
$item->status = NoticeLog::STATUS_SUCCESS;
$item->save();
echo 'success:' . $item['id'] . PHP_EOL;
}catch (\Exception $e){
echo 'error:' . $item['id'] . $e->getMessage() . PHP_EOL;
errorLog('排名数据更新失败', $item, $e);
Log::channel('rank_data')->error('排名数据更新失败' . $e->getMessage(), $item);
$this->retry($item, $e->getMessage());
}
}
... ...
... ... @@ -2,11 +2,8 @@
namespace App\Console\Commands\RankData;
use App\Helper\Arr;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Project\DeployOptimize;
use App\Models\RankData\RankWeek as RankWeekModel;
use App\Utils\LogUtils;
/**
... ... @@ -37,38 +34,14 @@ class RankWeek extends BaseCommands
*/
public function do()
{
$error = 0;
//获取每周排名数据
$api = new QuanqiusouApi();
$res = $api->getGoogleRankWeek();
if (!$res) {
return false;
}
$res = Arr::s2a($res);
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray();
LogUtils::info('start rank_data_week:' . count($list));
foreach ($list as $project_id => $api_no) {
$rank_week = RankWeekModel::where('project_id', $project_id)->first();
if ($rank_week && $rank_week->updated_date >= getThisWeekStarDate()) {
//本周数据已更新
continue;
}
if (!$rank_week) {
$rank_week = new RankWeekModel();
}
$rank_week->project_id = $project_id;
$rank_week->data = $res['data'][$api_no];
$rank_week->date = $res['date'];
$rank_week->updated_date = date('Y-m-d');
$rank_week->save();
$rankDataLogic = new RankDataLogic();
$rankDataLogic->syncRankWeek($api_no);
}
return !$error;
return true;
}
}
... ...
... ... @@ -2,13 +2,9 @@
namespace App\Console\Commands\RankData;
use App\Helper\Arr;
use App\Helper\SemrushApi;
use App\Models\Domain\DomainInfo;
use App\Models\RankData\RecommDomain as RecommDomainModel;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Project\DeployOptimize;
use App\Utils\HttpUtils;
use App\Utils\LogUtils;
use Illuminate\Support\Facades\Log;
/**
* Class RecommDomain
... ... @@ -38,50 +34,14 @@ class RecommDomain extends BaseCommands
*/
public function do()
{
$error = 0;
$semrushApi = new SemrushApi();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->select('domain', 'api_no', 'project_id')->get()->toArray();
LogUtils::info('start rank_data_recomm_domain:' . count($list));
foreach ($list as $item) {
$project_id = $item['project_id'];
$api_no = $item['api_no'];
$domain = $item['domain'];
if(!$domain){
continue;
}
$model = RecommDomainModel::where('project_id', $project_id)->first();
if ($model && $model->updated_date >= getThisWeekStarDate()) {
continue;
}
if (!$model) {
$model = new RecommDomainModel();
}
//5.0
try {
$data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []);
$data = Arr::s2a($data)['list'];
}catch (\Exception $e){
$data = [];
}
Log::channel('rank_data')->info('开始-外链引荐域名数据-'.count($list));
if(!$data){
//外链引荐域名
$domain = (new DomainInfo())->getDomain($domain);
$data = $semrushApi->backlinks_refdomains($domain);
}
if (!$data) {
$error++;
continue;
}
$model->project_id = $project_id;
$model->data = $data;
$model->updated_date = date('Y-m-d');
$model->save();
foreach ($list as $item) {
$rankDataLogic = new RankDataLogic();
$rankDataLogic->syncExternalLinks($item['api_no']);
}
return !$error;
return true;
}
}
... ...
... ... @@ -2,12 +2,9 @@
namespace App\Console\Commands\RankData;
use App\Helper\Arr;
use App\Helper\GoogleSpeedApi;
use App\Models\Domain\DomainInfo;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Project\DeployOptimize;
use App\Models\RankData\Speed as GoogleSpeedModel;
use App\Utils\LogUtils;
use Illuminate\Support\Facades\Log;
/**
* Class GoogleSpeed
... ... @@ -38,34 +35,15 @@ class Speed extends BaseCommands
*/
public function do()
{
$error = 0;
$googleSpeedApi = new GoogleSpeedApi();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->pluck('domain', 'project_id')->toArray();
LogUtils::info('start rank_data_speed:' . count($list));
foreach ($list as $project_id => $domain) {
$model = GoogleSpeedModel::where('project_id', $project_id)->first();
if ($model && $model->updated_date >= getThisWeekStarDate()) {
//今周已更新 跳过
continue;
}
$domain = (new DomainInfo())->getDomain($domain);
$res = $googleSpeedApi->run($domain);
if (!$res) {
$error++;
continue;
}
if (!$model) {
$model = new GoogleSpeedModel;
}
$model->project_id = $project_id;
$model->data = $res;
$model->updated_date = date('Y-m-d');
$model->save();
$list = DeployOptimize::where('api_no', '>', 0)->pluck('api_no', 'project_id')->toArray();
Log::channel('rank_data')->info('开始-测速数据-'.count($list));
foreach ($list as $project_id => $api_no) {
$rankDataLogic = new RankDataLogic();
$rankDataLogic->syncSpeed($api_no);
}
return !$error;
return true;
}
}
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Helper;
use App\Utils\HttpUtils;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
/**
... ... @@ -126,7 +127,7 @@ class GoogleSpeedApi
}
}
} catch (\Exception | GuzzleException $e) {
errorLog('测速失败', $params, $e);
Log::channel('rank_data')->error('测速失败' . $e->getMessage(), $params);
}
return [
"url" => $url,
... ...
... ... @@ -6,6 +6,7 @@ namespace App\Helper;
use App\Utils\HttpUtils;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
/**
... ... @@ -130,7 +131,7 @@ class QuanqiusouApi
Cache::put($key, $res, 2 * 3600);
}
} catch (\Exception | GuzzleException $e) {
errorLog('获取每周谷歌排名数据失败', [], $e);
Log::channel('rank_data')->error('获取每周谷歌排名数据失败' . $e->getMessage());
return false;
}
}
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Helper;
use App\Utils\HttpUtils;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
/**
... ... @@ -37,7 +38,7 @@ class SemrushApi
$res = HttpUtils::get($url, $params);
return $this->data($res)[0] ?? [];
}catch (\Exception|GuzzleException $e){
errorLog('获取站点外链数据失败', $params, $e);
Log::channel('rank_data')->error('外链数据获取失败' . $e->getMessage(), $params);
return false;
}
}
... ... @@ -63,7 +64,7 @@ class SemrushApi
$res = HttpUtils::get($url, $params);
return $this->data($res);
}catch (\Exception|GuzzleException $e){
errorLog('获取站点外链数据失败', $params, $e);
Log::channel('rank_data')->error('获取站点外链数据失败' . $e->getMessage(), $params);
return false;
}
}
... ...
... ... @@ -4,7 +4,9 @@ namespace App\Http\Logic\Bside\RankData;
use App\Helper\Arr;
use App\Helper\GoogleSpeedApi;
use App\Helper\QuanqiusouApi;
use App\Helper\SemrushApi;
use App\Helper\Translate;
use App\Http\Logic\Aside\Project\DomainInfoLogic;
use App\Http\Logic\Aside\Project\ProjectLogic;
... ... @@ -14,14 +16,20 @@ use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\RankData\ExternalLinks;
use App\Models\RankData\ExternalLinks as ExternalLinksModel;
use App\Models\RankData\IndexedPages;
use App\Models\RankData\IndexedPages as IndexedPagesModel;
use App\Models\RankData\RankData;
use App\Models\RankData\RankWeek;
use App\Models\RankData\RankWeek as RankWeekModel;
use App\Models\RankData\RecommDomain;
use App\Models\RankData\RecommDomain as RecommDomainModel;
use App\Models\RankData\Speed;
use App\Models\RankData\Speed as GoogleSpeedModel;
use App\Utils\HttpUtils;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class RankDataLogic extends BaseLogic
... ... @@ -399,6 +407,7 @@ class RankDataLogic extends BaseLogic
}
}
/**
* @param $project_id
* @param int $indexed_pages_num
... ... @@ -484,4 +493,233 @@ class RankDataLogic extends BaseLogic
$model->updated_date = date('Y-m-d');
$model->save();
}
/**
* 同步外链
* @throws \Exception|GuzzleException
* @author zbj
* @date 2023/9/20
*/
public function syncExternalLinks($api_no, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id');
foreach ($project_ids as $project_id => $domain) {
if (!$domain) {
Log::channel('rank_data')->error('syncExternalLinks:未配置数据库', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
$model = ExternalLinksModel::where('project_id', $project_id)->first();
if ($model && $model->updated_date >= getThisWeekStarDate() && !$force) {
continue;
}
if (!$model) {
$model = new ExternalLinksModel();
}
//5.0
try {
$data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []);
$data = Arr::s2a($data);
}catch (\Exception $e){
$data = [];
}
if(!$data){
//外链数据
$domain = (new DomainInfo())->getDomain($domain);
$semrushApi = new SemrushApi();
$res = $semrushApi->backlinks_overview($domain);
if (!$res) {
Log::channel('rank_data')->error('syncExternalLinks:外链数据为空', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
$data = $this->_data($project_id, $res['total']);
}
$model->project_id = $project_id;
$model->total = $data['total'];
$model->data = $data['data'];
$model->updated_date = date('Y-m-d');
$model->save();
}
}
/**
* 构造外链chat数据
* @param $project_id
* @param $total
* @return array|mixed
* @author zbj
* @date 2023/5/10
*/
public function _data($project_id, $total)
{
// //外链数
$data['total'] = intval($total);
$model = ExternalLinksModel::where('project_id', $project_id)->first();
if ($model) {
//特殊处理的外链数
// $data['total'] = ($total > $model->total) ? intval($total) : $model->total; //特殊处理的
//chat数据
$chat_data = Arr::s2a($model['data']);
if (empty($chat_data[date('Y-m-d')])) {
array_shift($chat_data);
}
} else {
//chat数据
for ($i = 1; $i < 12; $i++) {
$date = date("Y-m-d", strtotime(-7 * $i . 'days'));
$chat_data[$date] = 0; //伪造ceil($total - ($total * rand(5, 10) / 100));
}
}
$chat_data[date('Y-m-d')] = $data['total'];
$data['data'] = $chat_data;
return $data;
}
/**
* 同步引荐域名数据
* @throws \Exception|GuzzleException
* @author zbj
* @date 2023/9/20
*/
public function syncRecommDomain($api_no, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id');
foreach ($project_ids as $project_id => $domain) {
if (!$domain) {
Log::channel('rank_data')->error('syncRecommDomain:未配置数据库', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
$model = RecommDomainModel::where('project_id', $project_id)->first();
if ($model && $model->updated_date >= getThisWeekStarDate() && !$force) {
continue;
}
if (!$model) {
$model = new RecommDomainModel();
}
//5.0
try {
$data = HttpUtils::get("https://www.quanqiusou.cn/semrush-api/data_json/{$api_no}.json", []);
$data = Arr::s2a($data)['list'];
}catch (\Exception $e){
$data = [];
}
if(!$data){
//外链引荐域名
$domain = (new DomainInfo())->getDomain($domain);
$semrushApi = new SemrushApi();
$domain = (new DomainInfo())->getDomain($domain);
$data = $semrushApi->backlinks_refdomains($domain);
}
if (!$data) {
Log::channel('rank_data')->error('syncRecommDomain:引荐域名数据为空', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
$model->project_id = $project_id;
$model->data = $data;
$model->updated_date = date('Y-m-d');
$model->save();
}
}
/**
* 收录数
* @author zbj
* @date 2024/1/9
*/
public function syncIndexedPages($api_no, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id');
foreach ($project_ids as $project_id => $domain) {
$model = IndexedPagesModel::where('project_id', $project_id)->first();
if($model && $model->updated_date >= getThisWeekStarDate() && !$force){
continue;
}
if(!$model){
$model = new IndexedPagesModel();
}
$api = new QuanqiusouApi();
$res = $api->getSiteResPer($api_no);
if(!$res){
Log::channel('rank_data')->error('syncIndexedPages:收录数数据为空', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
$model->project_id = $project_id;
$model->data = $res['data'];
$model->updated_date = date('Y-m-d');
$model->save();
}
}
/**
* 测速
* @param $api_no
* @param false $force
* @author zbj
* @date 2024/1/9
*/
public function syncSpeed($api_no, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id');
foreach ($project_ids as $project_id => $domain) {
$model = GoogleSpeedModel::where('project_id', $project_id)->first();
if ($model && $model->updated_date >= getThisWeekStarDate() && !$force) {
continue;
}
$domain = (new DomainInfo())->getDomain($domain);
$googleSpeedApi = new GoogleSpeedApi();
$res = $googleSpeedApi->run($domain);
if (!$res) {
Log::channel('rank_data')->error('syncSpeed:测速数据为空', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
if (!$model) {
$model = new GoogleSpeedModel;
}
$model->project_id = $project_id;
$model->data = $res;
$model->updated_date = date('Y-m-d');
$model->save();
}
}
/**
* 每周排名数据
* @param $api_no
* @param false $force
* @author zbj
* @date 2024/1/9
*/
public function syncRankWeek($api_no, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('domain', 'project_id');
foreach ($project_ids as $project_id => $domain) {
$rank_week = RankWeekModel::where('project_id', $project_id)->first();
if ($rank_week && $rank_week->updated_date >= getThisWeekStarDate() && !$force) {
//本周数据已更新
continue;
}
$api = new QuanqiusouApi();
$res = $api->getGoogleRankWeek();
if (!$res) {
Log::channel('rank_data')->error('syncRankWeek:每周排名数据为空', ['project_id' => $project_id, 'api_no' => $api_no]);
continue;
}
if (!$rank_week) {
$rank_week = new RankWeekModel();
}
$rank_week->project_id = $project_id;
$rank_week->data = $res['data'][$api_no];
$rank_week->date = $res['date'];
$rank_week->updated_date = date('Y-m-d');
$rank_week->save();
}
}
}
... ...
... ... @@ -66,6 +66,12 @@ return [
'via' => \App\Factory\LogFormatterFactory::class,
'prefix' => 'traffic',
],
//自定义排名数据
'rank_data' => [
'driver' => 'custom',
'via' => \App\Factory\LogFormatterFactory::class,
'prefix' => 'rank_data',
],
'wechatside' => [
'driver' => 'custom',
'via' => \App\Factory\LogFormatterFactory::class,
... ...