SyncInquiryRelay.php 5.6 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhl
 * Date: 2025/2/13
 * Time: 16:45
 */

namespace App\Console\Commands\Inquiry;

use App\Helper\Translate;
use App\Models\Inquiry\InquiryInfo;
use App\Services\InquiryRelayService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class SyncInquiryRelay extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sync_inquiry_relay';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '同步询盘信息:站群询盘,';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }


    public function handle()
    {
        $this->getInquiryForm();
        $this->getInquirySzcm();
    }

    /**
     * 获取表单系统中询盘信息
     * message_sign唯一值:md5(name+email+phone+ip+time)
     */
    public function getInquiryForm()
    {
        $service = new InquiryRelayService();
        $result = $service->getInquiryRelay();
        if (isset($result['status']) && $result['status'] == 200) {
            $data = $result['data'] ?? [];
            foreach ($data as $item) {
                if (substr($item['phone'], 0, 3) == '+86') {
                    //+86区号过滤
                    continue;
                }
                $this->saveDate($item, $item['source_type']);
            }
        }
    }

    /**
     * 获取秋哥asp采集询盘信息
     * type固定4
     * message_sign唯一值:md5(name+email+phone+ip+time)
     * 先查数据库最大origin_key,再获取数据
     */
    public function getInquirySzcm()
    {
        $max_origin_key = InquiryInfo::where('type', InquiryInfo::TYPE_SPIDER)->orderBy('origin_key', 'desc')->value('origin_key');
        if ($max_origin_key) {
            $start_id = $max_origin_key + 1;
        } else {
            $start_id = 65029;
        }

        // TODO 由于该渠道数据不规则, 可能某个ID获取不到数据, 无法判断是因为已经没有数据了, 还是因为解析问题导致, 所以当未获取到数据时, 多向后取几次数据, 连续几次没有数据, 就认为已经获取到最大数据。
        $service = new InquiryRelayService();
        $pre = 0;
        while ($start_id > 0) {
            $result = $service->getInquirySzcm($start_id);
            if (empty($result) && $pre <= 3) {
                $start_id++;
                $pre++;
                continue;
            }

            if ($result) {
                $this->saveDate($result, InquiryInfo::TYPE_SPIDER);
                $start_id++;
                $pre = 0;
            }

            if ($pre > 3)
                break;
        }
        return true;
    }

    /**
     * 询盘数据入库
     * @param $data
     * @param $type
     * @return bool
     */
    public function saveDate($data, $type)
    {
        $model = new InquiryInfo();
        $message_sign = md5($data['name'] . $data['email'] . $data['phone'] . $data['ip'] . $data['time']);
        $inquiry_info = $model->where('message_sign', $message_sign)->first();
        if ($inquiry_info)
            return true;

        //没有IP,根据submit_country获取
        if (empty($data['ip']) && isset($data['submit_country']) && $data['submit_country']) {
            $chinese_name = DB::table('gl_world_country_city')->where('pid', 0)->where('iso2', $data['submit_country'])->value('chinese_name');
            $data['ip'] = $this->getIpData($chinese_name);
        }

        //获取country
        $country = '';
        if ($data['ip']) {
            $country = file_get_contents("http://ip.globalso.com?ip=" . $data['ip']);
        }

        //翻译message
        $message_cn = '';
        $re_message_trans = Translate::translate($data['message'], 'zh');
        if (isset($re_message_trans[0]['code']) && $re_message_trans[0]['code'] == 200) {
            $message_cn = $re_message_trans[0]['texts'];
        }

        //获取页面上title和keywords
        $html = curl_c($data['refer'], false);

        if (empty($data['title'])) {
            preg_match_all('/<title>([\w\W]*?)<\/title>/', $html, $matches);
            if (!empty($matches[1])) {
                $data['title'] = substr($matches[1][0], 0, 255);
            }
        }

        $keywords = '';
        preg_match_all('/<meta\s+[^>]*?name=[\'|\"]keywords[\'|\"]\s+[^>]*?content=[\'|\"]([\w\W]*?)[\'|\"]/', $html, $matches);
        if (!empty($matches[1])) {
            $keywords = substr($matches[1][0], 0, 255);
        }

        if (empty($data['origin_key'])) {
            $data['origin_key'] = 0;
        }

        if (empty($data['image'])) {
            $data['image'] = '';
        }

        $model->createInquiry($data['name'], $data['phone'], $data['email'], $data['ip'], $country, $data['message'], $message_cn, $type, $data['time'], $data['refer'], $data['title'], $keywords, $message_sign, $data['origin_key'], $data['image']);
        return true;
    }

    /**
     * 获取国家随机ip
     * @param $country_name
     * @return mixed|string
     * @author Akun
     * @date 2025/02/14 14:19
     */
    public function getIpData($country_name)
    {
        // 有国家 通过国家查询, 如果没有获取到就随机获取
        $where = [];
        $country_name && $where['ip_area'] = $country_name;
        $ip = DB::table('gl_xunpan_ipdata')->where($where)->inRandomOrder()->value('ip');
        if (empty($ip_data)) {
            $ip = DB::table('gl_xunpan_ipdata')->inRandomOrder()->value('ip');
        }
        return $ip;
    }
}