作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

... ... @@ -2,13 +2,9 @@
namespace App\Console\Commands\DayCount;
use App\Helper\Common;
use App\Helper\FormGlobalsoApi;
use App\Models\Domain\DomainInfo;
use App\Models\Inquiry\InquiryForm;
use App\Models\Inquiry\InquiryFormData;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Services\ProjectServer;
use Carbon\Carbon;
... ...
... ... @@ -12,7 +12,6 @@ namespace App\Console\Commands\DayCount;
use App\Helper\FormGlobalsoApi;
use App\Models\Inquiry\InquiryFormData;
use App\Models\Project\Project;
use App\Models\Visit\Visit;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
... ...
... ... @@ -2,16 +2,11 @@
namespace App\Console\Commands\DayCount;
use App\Helper\Common;
use App\Helper\FormGlobalsoApi;
use App\Models\Domain\DomainInfo;
use App\Models\Inquiry\InquiryForm;
use App\Models\Inquiry\InquiryFormData;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Services\ProjectServer;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
... ...
... ... @@ -14,7 +14,6 @@ use App\Models\Domain\DomainInfo;
use App\Models\Inquiry\InquiryFormData;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\Visit\Visit;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
... ...
... ... @@ -61,9 +61,8 @@ class TemplateLog extends Command
* @time :2024/7/10 14:48
*/
public function deleteTemplate(){
$startDate = date("Y-m-01 00:00:00");
$endDate = date("Y-m-t 23:59:59");
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$templateLogModel = new BTemplateLog();
return $templateLogModel->del(['created_at'=>['not between'=>[$startDate,$endDate]]]);
return $templateLogModel->del(['created_at'=>['<=',$date]]);
}
}
... ...
... ... @@ -13,6 +13,7 @@ use App\Models\Inquiry\ReInquiryDetailLog;
use App\Models\Inquiry\ReInquiryForm;
use App\Models\Inquiry\ReInquiryTask;
use App\Models\Inquiry\ReInquiryText;
use App\Models\Project\InquiryFilterConfig;
use App\Models\Project\Project;
use App\Models\WebSetting\WebLanguage;
use Illuminate\Console\Command;
... ... @@ -177,10 +178,10 @@ class RelayInquiry extends Command
$this->output('开始处理本轮询盘!');
foreach ($inquiry as $key=>$val) {
$this->output('询盘ID:' . $val->id);
//询盘时间超过90分钟 就不处理了
if(time() - strtotime($val->inquiry_date) > 90 * 60){
//询盘时间超过2小时 就不处理了
if(time() - strtotime($val->inquiry_date) > 7200){
$val->status = ReInquiryForm::STATUS_FORGO;
$val->remark = '超时90分钟未处理!';
$val->remark = '超时2小时未处理!';
$val->save();
continue;
}
... ... @@ -200,6 +201,14 @@ class RelayInquiry extends Command
$val->save();
continue;
}
//是否要过滤
$filter_res = $this->filter($val);
if($filter_res !== true){
$val->status = ReInquiryForm::STATUS_FORGO;
$val->remark = $filter_res;
$val->save();
continue;
}
try {
$this->relayDetail($ad_task, $val);
... ... @@ -213,6 +222,46 @@ class RelayInquiry extends Command
return true;
}
public function filter($data)
{
//通用过滤规则
$config = InquiryFilterConfig::getCacheInfoByProjectId(Project::DEMO_PROJECT_ID);
//过滤内容
if(!empty($data['message']) && !empty($config['filter_contents'])) {
foreach ($config['filter_contents'] as $filter_content) {
if (Str::contains(strtolower($data['message']), strtolower($filter_content))) {
return '过滤内容:' . $filter_content;
}
}
}
//过滤邮箱
if(!empty($data['email']) && !empty($config['filter_emails'])){
foreach ($config['filter_emails'] as $filter_email){
if(Str::contains(strtolower($data['email']), strtolower($filter_email))){
return '过滤邮箱:' . $filter_email;
}
}
}
//过滤电话
if(!empty($data['phone']) && !empty($config['filter_mobiles'])){
foreach ($config['filter_mobiles'] as $filter_mobile){
if(Str::contains(strtolower($data['phone']), strtolower($filter_mobile))){
return '过滤电话:' . $filter_mobile;
}
}
}
//过滤姓名
if(!empty($data['full_name'] && !empty($config['filter_names']))){
foreach ($config['filter_names'] as $filter_name){
if(Str::contains(strtolower($data['full_name']), strtolower($filter_name))){
return '过滤姓名:' . $filter_name;
}
}
}
return true;
}
/**
* 创建转发详情
* TODO 通过任务生成转发对象, 更具转发对象获取对应数据, 写入着陆记录
... ... @@ -326,6 +375,11 @@ class RelayInquiry extends Command
$pre = 0;
$start_time = time();
$seconds = rand(300, 3000); // 开始时间 从5-50分钟后开始
$exists = ReInquiryDetail::where('re_website', $domain)->where('email', $form->email)->first();
if($exists){
$this->output('转发站点邮件已存在');
continue;
}
// 写入推送详情
$re_detail = ReInquiryDetail::createInquiry($task['id'], $form->id, $domain, $country_name, $ip, $form->full_name, $form->email, $form->phone, $message, $message_id, $device_port,
$user_agent, $referrer, $urls, $is_v6, date('Y-m-d H:i:s', $start_time + $seconds));
... ...
... ... @@ -80,6 +80,7 @@ class postInquiry extends Command
}
public function visit(ReInquiryDetail $detail, ReInquiryDetailLog $log){
$website = 'https://' . $detail['re_website'] . '/';
if($detail['is_v6']) {
$data = [
'ip' => $detail['ip'],
... ... @@ -88,30 +89,27 @@ class postInquiry extends Command
'referrer_url' => $detail['referrer'],
'user_agent' => $detail['user_agent'],
];
$res = Http::withoutVerifying()->post($detail['re_website'] . 'api/traffic_visit/', $data)->json();
$res = Http::withoutVerifying()->post($website . 'api/traffic_visit/', $data)->json();
if (empty($res['status']) || $res['status'] != 200) {
$log->status = ReInquiryDetailLog::STATUS_FAIL;
$log->remark = $res['message'] ?? '';
$log->save();
Log::channel('inquiry_relay')->error('inquiry_relay visit error', [$res, $detail['re_website'] . 'api/traffic_visit/',$data]);
Log::channel('inquiry_relay')->error('inquiry_relay visit error', [$res, $website . 'api/traffic_visit/',$data]);
return false;
}
}else{
//v4 v5分离项目 往测试链接推
$website = $detail['re_website'];
$client = new \GuzzleHttp\Client();
$site_array = $client->request('GET', "https://www.quanqiusou.cn/extend_api/saas/split.php", [
'proxy' => env('CURL_PROXY'), // 代理服务器地址和端口号
])->getBody()->getContents();
$site_array = json_decode($site_array, true);
$mail_urls = array_column($site_array, 'main_url');
$key = array_search('https://' . $detail['re_website'] . '/', $mail_urls);
$key = array_search($website, $mail_urls);
if ($key !== false) {
// 分离项目 推送到测试链接
$website = $site_array[$key]['test_url'];
}else{
$website = 'https://' . $website . '/';
}
$data = [
... ... @@ -138,6 +136,7 @@ class postInquiry extends Command
}
public function inquiry(ReInquiryDetail $detail, ReInquiryDetailLog $log){
$website = 'https://' . $detail['re_website'] . '/';
// v6
if($detail['is_v6']) {
$data = [
... ... @@ -150,16 +149,16 @@ class postInquiry extends Command
if($detail->email){
$data['email'] = $detail->email;
}else{
$data['__amp_source_origin'] = trim($detail['re_website'], '/');
$data['__amp_source_origin'] = trim($website, '/');
}
$res = Http::withoutVerifying()->withHeaders(['User-Agent' => $detail['user_agent']])->post($detail['re_website'] . 'api/inquiryQd/', $data)->json();
$res = Http::withoutVerifying()->withHeaders(['User-Agent' => $detail['user_agent']])->post($website . 'api/inquiryQd/', $data)->json();
if(empty($res['code']) || $res['code'] != 200){
$log->status = ReInquiryDetailLog::STATUS_FAIL;
$log->remark = $res['message'] ?? '';
$log->save();
Log::channel('inquiry_relay')->error('inquiry_relay v6 inquiry error', [$res, $detail['website'] . 'api/inquiryQd/', $data]);
Log::channel('inquiry_relay')->error('inquiry_relay v6 inquiry error', [$res, $website . 'api/inquiryQd/', $data]);
return false;
}
}else{
... ...
... ... @@ -93,7 +93,10 @@ class ReplaceHtml extends Command
public function createReplacePageHtmlLog($info){
$saveData = [];
$customTemplateModel = new BCustomTemplate();
$list = $customTemplateModel->list(['status'=>BCustomTemplate::STATUS_ACTIVE]);
$list = $customTemplateModel->list(['status'=>BCustomTemplate::STATUS_ACTIVE,'html'=>['like','%'.trim($info['old_html']).'%']]);
if(empty($list)){
return 0;
}
foreach ($list as $v){
$saveData[] = [
'replace_id'=>$info['id'],
... ...
... ... @@ -9,6 +9,7 @@
namespace App\Console\Commands\ReplaceHtml;
use App\Models\Template\BCustomTemplate;
use App\Models\Template\BTemplate;
use App\Models\Template\TemplateReplaceHtml;
use App\Models\Template\TemplateReplaceHtmlLog;
... ... @@ -87,11 +88,19 @@ class ReplaceHtmlLog extends Command
if($info['template_id'] == 0){
$bTemplateModel->formatQuery($condition)->update(['html' => DB::raw("REPLACE(html, '$old_html', '$html')")]);
}else{
$bTemplateModel->where($condition)
->update([
'main_html' => DB::raw("REPLACE(main_html, '" . addslashes($old_html) . "', '" . addslashes($html) . "')"),
'updated_at' => now(),
]);
if($info['source'] == 9 && $info['is_custom'] == 0){
(new BCustomTemplate())->formatQuery(['id'=>$source_id])
->update([
'html' => DB::raw("REPLACE(html, '" . addslashes($old_html) . "', '" . addslashes($html) . "')"),
'updated_at' => now(),
]);
}else{
$bTemplateModel->where($condition)
->update([
'main_html' => DB::raw("REPLACE(main_html, '" . addslashes($old_html) . "', '" . addslashes($html) . "')"),
'updated_at' => now(),
]);
}
}
return true;
}
... ...
... ... @@ -37,6 +37,10 @@ class WorkchatMessageSend extends Command
foreach ($tasks as $task) {
$this->output('开始推送消息' . $task->id);
try {
//超过两小时 不推送了
if(time() - $task->send_time > 7200){
throw new \Exception('超时两小时未推送');
}
ProjectAssociationServices::getInstance()->sendMessage($task->friend_id, $task->content, $task->content_type);
$this->output('推送消息' . $task->id . '成功');
$task->status = MessagePush::STATUS_SUCCESS;
... ...
... ... @@ -20,14 +20,14 @@ class Kernel extends ConsoleKernel
$schedule->command('template_label')->dailyAt('01:00')->withoutOverlapping(1);//最新模块
$schedule->command('popular_template_label')->dailyAt('01:30')->withoutOverlapping(1);//热门模块
// $schedule->command('inspire')->hourly();
$schedule->command('remain_day')->dailyAt('09:30')->withoutOverlapping(1); // 项目剩余服务时长
// $schedule->command('remain_day')->dailyAt('09:30')->withoutOverlapping(1); // 项目剩余服务时长
$schedule->command('rank_data_task')->everyMinute()->withoutOverlapping(1); // 排名数据更新任务
$schedule->command('service_count')->dailyAt('01:00')->withoutOverlapping(1); //服务器使用情况,每天凌晨1点执行一次
$schedule->command('web_traffic_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
$schedule->command('web_traffic_russia_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
// $schedule->command('web_traffic_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
// $schedule->command('web_traffic_russia_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
$schedule->command('sync_channel')->dailyAt('06:00')->withoutOverlapping(1); // 渠道信息,每天执行一次
$schedule->command('forward_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计转发询盘记录
$schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次
// $schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次
$schedule->command('inquiry_count')->dailyAt('01:00')->withoutOverlapping(1); // 询盘统计数据,每天凌晨执行一次
// $schedule->command('domain_info')->dailyAt('01:20')->withoutOverlapping(1);// 更新域名|证书结束时间,每天凌晨1点执行一次
$schedule->command('share_user')->dailyAt('01:20')->withoutOverlapping(1);// 每天凌晨1点执行一次
... ... @@ -37,8 +37,6 @@ class Kernel extends ConsoleKernel
$schedule->command('update_keyword_route')->dailyAt('01:00')->withoutOverlapping(1); //升级项目--清除路由相同的关键字
$schedule->command('recommended_suppliers')->dailyAt('03:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商
$schedule->command('update_keyword_content')->hourly()->withoutOverlapping(1);
// 每月15号执行任务
$schedule->command('delete_template_log')->monthlyOn(15, '00:01')->withoutOverlapping();
// 每日推送已完成视频任务项目生成对应界面
//更新AI站点数据
$schedule->command('updateAiProjects')->everyFourHours()->withoutOverlapping(1);
... ...
... ... @@ -34,14 +34,23 @@ class AdsController extends BaseController
*/
public function fbAdsList(Request $request)
{
$ads_id = trim($request->input('ads_id'));
$title = trim($request->input('title'));
$industry = trim($request->input('industry'));
$result = ReInquiryTask::where(['status' => ReInquiryTask::STATUS_OPEN])
->when($ads_id, function ($query, $ads_id) {
$ad_id = trim($request->input('ad_id'));
$status = $request->input('status', '');
$result = ReInquiryTask::when($ad_id, function ($query, $ads_id) {
return $query->where('ad_id', 'like', '%' . $ads_id . '%');
})
->when($title, function ($query, $title) {
return $query->where('title', 'like', '%' . $title . '%');
})
->when($industry, function ($query, $industry) {
return $query->where('industry', $industry);
return $query->where('industry', 'like', '%' . $industry . '%');
})
->where(function ($query)use($status) {
if(is_numeric($status)){
return $query->where('status', $status);
}
})
->orderBy('id', 'desc')
->paginate();
... ...
... ... @@ -43,7 +43,6 @@ class RankDataLogic extends BaseLogic
public function index()
{
$project_id = $this->user['project_id'];
//查数据
$project = (new ProjectLogic())->getProjectInfo($project_id);
$domain_info = (new DomainInfoLogic)->getDomainInfo($project_id);
... ... @@ -87,6 +86,9 @@ class RankDataLogic extends BaseLogic
//小语种列表
$quanqiusou_api = new QuanqiusouApi();
$lang_data = $quanqiusou_api->getLangRankData($api_no);
if(empty($lang_data)){
$data['langs_status'] = 1;
}
$lang_data = Arr::setValueToKey($lang_data, 'language');
$data['langs'] = [];
$languageModel = new MinorLanguages();
... ... @@ -131,7 +133,14 @@ class RankDataLogic extends BaseLogic
'Robots.txt文件优化',
'Google站长工具优化设置'
];
if($project['type'] == 3){
$data['seo'] = [
'H1,H2,H3标签',
'TDK设置(Title, Description, Keywords)',
'Sitemap.xml Google站长地图',
'Robots.txt文件优化',
];
}
//外链引荐域名
$recomm_domain = $recomm_domain ? $recomm_domain->toArray() : [];
$recomm_domain['data'] = Collection::make($recomm_domain['data'] ?? [])->sortBy('backlinks_num')->all();
... ... @@ -381,6 +390,7 @@ class RankDataLogic extends BaseLogic
public function syncRankData($api_no, $site_res, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('project_id');
foreach ($project_ids as $project_id) {
Log::channel('rank_data')->info('开始查项目:' . $project_id);
$project = Project::find($project_id);
if (!$project) {
throw new \Exception($api_no . '关联的项目不存在');
... ... @@ -388,12 +398,14 @@ class RankDataLogic extends BaseLogic
$api = new QuanqiusouApi();
$model = RankData::where('project_id', $project_id)->where('lang', '')->first();
if (!$model || $model->updated_date != date('Y-m-d') || $force) {
Log::channel('rank_data')->info('开始接口数据:' . $project_id);
$res = $api->getGoogleRank($project_id, $api_no, '', 7, $force);
if (!$res) {
throw new \Exception("接口数据获取失败,api_no:{$api_no}");
}
//收录数
$indexed_pages_num = $site_res[$api_no] ?? 0;
Log::channel('rank_data')->info('开始保存:' . $project_id);
$this->save_rank($project_id, $res, $indexed_pages_num);
}
//有小语种的
... ...
... ... @@ -51,7 +51,7 @@ class InquiryFormData extends Base
//5分钟内是否有重复数据
$is_exist = self::where('sign', $sign)->where('created_at', '>', date('Y-m-d H:i:s', strtotime('-5 minute')))->first();
if($is_exist){
return true;
return 0;
}
$model = new self();
... ...
... ... @@ -63,10 +63,10 @@ class MessagePush extends Base
$model->type = self::TYPE_INQUIRY;
$model->ref_ids = $id;
$model->content = '[' . date('H:i', strtotime($submit_at)) . '] 您的全球搜网站收到来自【' . $country . $name . '】的询盘信息,请登录后台或APP进行查看!';
$model->send_time = $submit_at;
}else{
//定时发送时间
$send_time = $hour >= 9 ? date('Y-m-d 09:00:00', strtotime('+1 day')) : date('Y-m-d 09:00:00');
$send_time = $hour >= 9 ? date('Y-m-d 09:00:00', strtotime($submit_at . '+1 day')) : date('Y-m-d 09:00:00', strtotime($submit_at));
$model = self::where('project_id', $project_id)->where('type', self::TYPE_INQUIRY)->where('send_time', $send_time)->first();
if(!$model){
$model = new self();
... ...
... ... @@ -159,14 +159,15 @@ class SyncSubmitTaskService
Visit::isInquiry($data['ip']);
//推送企微消息
try {
$name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name'];
MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']);
}catch (\Exception $e){
LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage());
if($id){
try {
$name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name'];
MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']);
}catch (\Exception $e){
LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage());
}
}
return true;
}
... ... @@ -189,6 +190,7 @@ class SyncSubmitTaskService
$referrer_url = $url_arr['scheme'] . '://' . $url_arr['host'] . '/';
}
}
$visit_data['referrer_url'] = $this->handle_referer($referrer_url);
$visit_data['device_port'] = $data['data']['device_port']??'';
$visit_data['url'] = $data['data']['url']??'';
... ... @@ -201,7 +203,7 @@ class SyncSubmitTaskService
if(!empty($data['is_cf'])){
$visit_data['is_inquiry'] = 1;
}
Visit::saveData($visit_data, $date);
Visit::saveData($visit_data, $visit_data['updated_date']);
return true;
}
... ...