| 
...
 | 
...
 | 
@@ -8,6 +8,7 @@ | 
| 
 | 
 | 
 namespace App\Http\Controllers\Api;
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 use App\Http\Controllers\Controller;
 | 
| 
 | 
 | 
 use App\Models\SyncSubmitTask\SyncSubmitTask;
 | 
| 
 | 
 | 
 use Illuminate\Http\Exceptions\HttpResponseException;
 | 
| 
 | 
 | 
 use Illuminate\Http\JsonResponse;
 | 
| 
 | 
 | 
 use Illuminate\Http\Request;
 | 
| 
...
 | 
...
 | 
@@ -24,6 +25,12 @@ class NoticeController extends Controller | 
| 
 | 
 | 
     const SUCCESS = 200;
 | 
| 
 | 
 | 
     const ERROR = 400;
 | 
| 
 | 
 | 
     const SERVERERROR = 500;
 | 
| 
 | 
 | 
     const  TYPEVISIT = "visit";
 | 
| 
 | 
 | 
     const TYPEINQUIRY = "inquiry";
 | 
| 
 | 
 | 
     const TRAFFICZERO = 0;
 | 
| 
 | 
 | 
     const TRAFFICONE = 1;
 | 
| 
 | 
 | 
     const DEVICE_PORT_ONE = 1;
 | 
| 
 | 
 | 
     const DEVICE_PORT_TWO = 2;
 | 
| 
 | 
 | 
     protected $header = [];//设置请求头参数
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
...
 | 
...
 | 
@@ -110,7 +117,7 @@ public function curlGet($url){ | 
| 
 | 
 | 
         curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
 | 
| 
 | 
 | 
         curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, FALSE);
 | 
| 
 | 
 | 
         curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true);
 | 
| 
 | 
 | 
         curl_setopt($ch1, CURLOPT_CUSTOMREQUEST, 'GET');
 | 
| 
 | 
 | 
         curl_setopt($ch1, CURLOPT_CUSTOMREQUEST, "GET");
 | 
| 
 | 
 | 
         curl_setopt($ch1, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
 | 
| 
 | 
 | 
         $access_txt = curl_exec($ch1);
 | 
| 
 | 
 | 
         curl_close($ch1);
 | 
| 
...
 | 
...
 | 
@@ -118,6 +125,45 @@ public function curlGet($url){ | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 发送http post请求
 | 
| 
 | 
 | 
      * @param $url
 | 
| 
 | 
 | 
      * @param $data
 | 
| 
 | 
 | 
      * @param array $header
 | 
| 
 | 
 | 
      * @param bool $is_json
 | 
| 
 | 
 | 
      * @return mixed|string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     function httpPost($url, $data, $header = [],$is_json = true)
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         if (empty($header)) {
 | 
| 
 | 
 | 
             $header = array(
 | 
| 
 | 
 | 
                 "Accept: application/json",
 | 
| 
 | 
 | 
                 "Content-Type:application/json;charset=utf-8",
 | 
| 
 | 
 | 
             );
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         $ch = curl_init();
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_URL, $url);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 | 
| 
 | 
 | 
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 | 
| 
 | 
 | 
         $res = curl_exec($ch);
 | 
| 
 | 
 | 
         if (curl_errno($ch)) {
 | 
| 
 | 
 | 
             $error_message = curl_error($ch);
 | 
| 
 | 
 | 
             @file_put_contents(storage_path('logs/error.log'), var_export($error_message, true) . PHP_EOL, FILE_APPEND);
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         curl_close($ch);
 | 
| 
 | 
 | 
         if($is_json){
 | 
| 
 | 
 | 
             return json_decode($res, true);
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         return trim($res);
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * A端上传验证代码
 | 
| 
 | 
 | 
      * @param Request $request
 | 
| 
 | 
 | 
      * @return string
 | 
| 
...
 | 
...
 | 
@@ -145,7 +191,7 @@ public function uploadAmpVerifyFile(Request $request) | 
| 
 | 
 | 
         $domain = $request->getHost();
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         $domain_array = parse_url($domain);
 | 
| 
 | 
 | 
         $host = $domain_array['host'] ?? $domain_array['path'];
 | 
| 
 | 
 | 
         $host = $domain_array['host'] ? $domain_array['path'] : "";
 | 
| 
 | 
 | 
         $host_array = explode('.',$host);
 | 
| 
 | 
 | 
         if(count($host_array) <= 2){
 | 
| 
 | 
 | 
             array_unshift($host_array,'m');
 | 
| 
...
 | 
...
 | 
@@ -288,32 +334,159 @@ public function deleteDirectory($path) | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 提交
 | 
| 
 | 
 | 
      * @param $request
 | 
| 
 | 
 | 
      * @param string $type
 | 
| 
 | 
 | 
      * @param int $traffic
 | 
| 
 | 
 | 
      * @param array $files
 | 
| 
 | 
 | 
      * @return string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function transmit($request, $type = self::TYPEVISIT, $traffic = self::TRAFFICZERO,$files = []){
 | 
| 
 | 
 | 
         if($request->getClientIp() == "127.0.0.1"){
 | 
| 
 | 
 | 
             return $this->success();
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         //判断是否是爬虫
 | 
| 
 | 
 | 
         $isReptile = $this->isReptile($request);
 | 
| 
 | 
 | 
         if($isReptile){
 | 
| 
 | 
 | 
             return $this->success();
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         $data = $request->all();
 | 
| 
 | 
 | 
         if (empty($data)){
 | 
| 
 | 
 | 
             return $this->success();
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         $data["device_port"] = $this->userAgentHandle( $request->userAgent(),$data["device_port"] ?? self::DEVICE_PORT_ONE);
 | 
| 
 | 
 | 
         $req["data"] = $data;
 | 
| 
 | 
 | 
         $req["referer"] = $this->visitInfoHandle($data["referrer_url"] ?? $request->header('Referer'));
 | 
| 
 | 
 | 
         $req["domain"] = $request->getHost();
 | 
| 
 | 
 | 
         $req["ip"] = $request->getClientIp();
 | 
| 
 | 
 | 
         $req["user_agent"] = $request->userAgent();
 | 
| 
 | 
 | 
         $req["files"] = $files;
 | 
| 
 | 
 | 
         $req["type"] = $type;
 | 
| 
 | 
 | 
         $req["traffic"] = $traffic;
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //转发接口
 | 
| 
 | 
 | 
         $transmitUrl = env("TRANSMIT_URL");
 | 
| 
 | 
 | 
         return $this->httpPost($transmitUrl,json_encode($req));
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 处理user_agent
 | 
| 
 | 
 | 
      * @param $user_agent
 | 
| 
 | 
 | 
      * @param $device_port
 | 
| 
 | 
 | 
      * @return int
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function userAgentHandle($user_agent,$device_port){
 | 
| 
 | 
 | 
         if (!in_array($device_port,[self::DEVICE_PORT_ONE,self::DEVICE_PORT_TWO])){
 | 
| 
 | 
 | 
             $device_port = self::DEVICE_PORT_ONE;
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         // 头信息中带有这些信息, 代表是手机端, 重置设备类型
 | 
| 
 | 
 | 
         if (preg_match('/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|wap|windowsce|ucweb/', $user_agent)) {
 | 
| 
 | 
 | 
             $device_port = self::DEVICE_PORT_TWO;
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         return $device_port;
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 客户访问埋点接口
 | 
| 
 | 
 | 
      * @param Request $request
 | 
| 
 | 
 | 
      * @return JsonResponse
 | 
| 
 | 
 | 
      * @return string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function customerVisit(Request $request)
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         $data = $request->all();
 | 
| 
 | 
 | 
         $data["referrer_url"] = !empty($data["referrer_url"]) ? $data["referrer_url"] : "";
 | 
| 
 | 
 | 
         $data["url"] = !empty($data["url"]) ? $data["url"] : "";
 | 
| 
 | 
 | 
         $data["domain"] = !empty($data["domain"]) ? $data["domain"] : "";
 | 
| 
 | 
 | 
         $data["ip"] = $request->getClientIp();
 | 
| 
 | 
 | 
         $data["user_agent"] = $request->userAgent();
 | 
| 
 | 
 | 
         if (empty($data["referrer_url"]) || empty($data["url"]) || empty($data["domain"])){
 | 
| 
 | 
 | 
             return response()->json([
 | 
| 
 | 
 | 
                 'code' => self::SUCCESS,
 | 
| 
 | 
 | 
                 'msg' => 'success',
 | 
| 
 | 
 | 
             ]);
 | 
| 
 | 
 | 
         return $this->transmit($request);
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //转发data
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 埋点信息处理
 | 
| 
 | 
 | 
      * @param $referrerUrl
 | 
| 
 | 
 | 
      * @return string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function visitInfoHandle($referrerUrl)
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         if(preg_match('/google|facebook|bing|yahoo|youtobe|linkedin|messefrankfurt|yandex|tiktok|twitter|instagram|reddit|telegram|pinterest|tumblr/',$referrerUrl)){
 | 
| 
 | 
 | 
         }else if($referrerUrl == null){
 | 
| 
 | 
 | 
             //直访用户
 | 
| 
 | 
 | 
             $referrerUrl = "";
 | 
| 
 | 
 | 
         }else{
 | 
| 
 | 
 | 
             $referrerUrl = "https://www.google.com/";
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
         return $referrerUrl;
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //埋点成功
 | 
| 
 | 
 | 
         return response()->json([
 | 
| 
 | 
 | 
             'code' => self::SUCCESS,
 | 
| 
 | 
 | 
             'msg' => 'success',
 | 
| 
 | 
 | 
         ]);
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 是否是爬虫访问
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function isReptile($request): bool
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         $agent = $request->header('User-Agent');
 | 
| 
 | 
 | 
         if (!empty($agent)) {
 | 
| 
 | 
 | 
             $spiderSite= array(
 | 
| 
 | 
 | 
                 "TencentTraveler",
 | 
| 
 | 
 | 
                 "Baiduspider+",
 | 
| 
 | 
 | 
                 "BaiduGame",
 | 
| 
 | 
 | 
                 "Googlebot",
 | 
| 
 | 
 | 
                 "msnbot",
 | 
| 
 | 
 | 
                 "Sosospider+",
 | 
| 
 | 
 | 
                 "Sogou web spider",
 | 
| 
 | 
 | 
                 "ia_archiver",
 | 
| 
 | 
 | 
                 "Yahoo! Slurp",
 | 
| 
 | 
 | 
                 "YoudaoBot",
 | 
| 
 | 
 | 
                 "Yahoo Slurp",
 | 
| 
 | 
 | 
                 "MSNBot",
 | 
| 
 | 
 | 
                 "Java (Often spam bot)",
 | 
| 
 | 
 | 
                 "BaiDuSpider",
 | 
| 
 | 
 | 
                 "Voila",
 | 
| 
 | 
 | 
                 "Yandex bot",
 | 
| 
 | 
 | 
                 "BSpider",
 | 
| 
 | 
 | 
                 "twiceler",
 | 
| 
 | 
 | 
                 "Sogou Spider",
 | 
| 
 | 
 | 
                 "Speedy Spider",
 | 
| 
 | 
 | 
                 "Google AdSense",
 | 
| 
 | 
 | 
                 "Heritrix",
 | 
| 
 | 
 | 
                 "Python-urllib",
 | 
| 
 | 
 | 
                 "Alexa (IA Archiver)",
 | 
| 
 | 
 | 
                 "Ask",
 | 
| 
 | 
 | 
                 "Exabot",
 | 
| 
 | 
 | 
                 "Custo",
 | 
| 
 | 
 | 
                 "OutfoxBot/YodaoBot",
 | 
| 
 | 
 | 
                 "yacy",
 | 
| 
 | 
 | 
                 "SurveyBot",
 | 
| 
 | 
 | 
                 "legs",
 | 
| 
 | 
 | 
                 "lwp-trivial",
 | 
| 
 | 
 | 
                 "Nutch",
 | 
| 
 | 
 | 
                 "StackRambler",
 | 
| 
 | 
 | 
                 "The web archive (IA Archiver)",
 | 
| 
 | 
 | 
                 "Perl tool",
 | 
| 
 | 
 | 
                 "MJ12bot",
 | 
| 
 | 
 | 
                 "Netcraft",
 | 
| 
 | 
 | 
                 "MSIECrawler",
 | 
| 
 | 
 | 
                 "WGet tools",
 | 
| 
 | 
 | 
                 "larbin",
 | 
| 
 | 
 | 
                 "Fish search",
 | 
| 
 | 
 | 
                 "yandex.com/bots",
 | 
| 
 | 
 | 
                 "google.com/bot",
 | 
| 
 | 
 | 
                 "bingbot",
 | 
| 
 | 
 | 
                 "YandexMobileBot",
 | 
| 
 | 
 | 
                 "BingPreview",
 | 
| 
 | 
 | 
                 "AhrefsBot",
 | 
| 
 | 
 | 
                 "bot"
 | 
| 
 | 
 | 
             );
 | 
| 
 | 
 | 
             $flag = 0;
 | 
| 
 | 
 | 
             foreach($spiderSite as $val) {
 | 
| 
 | 
 | 
                 $str = strtolower($val);
 | 
| 
 | 
 | 
                 if (strpos($agent, $str) !== false) {
 | 
| 
 | 
 | 
                     $flag = 1;
 | 
| 
 | 
 | 
                 }
 | 
| 
 | 
 | 
             }
 | 
| 
 | 
 | 
             if($flag == 1){
 | 
| 
 | 
 | 
                 return true;
 | 
| 
 | 
 | 
             }else{
 | 
| 
 | 
 | 
                 return false;
 | 
| 
 | 
 | 
             }
 | 
| 
 | 
 | 
         } else {
 | 
| 
 | 
 | 
             return false;
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
...
 | 
...
 | 
@@ -323,40 +496,17 @@ public function customerVisit(Request $request) | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function trafficVisit(Request $request)
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         //获取参数
 | 
| 
 | 
 | 
         $data = $request->all();
 | 
| 
 | 
 | 
         $data["id"] = $request->input('ip');
 | 
| 
 | 
 | 
         $data["url"] = $request->input('url');
 | 
| 
 | 
 | 
         $data["device_port"] = intval($request->input('device_port'));
 | 
| 
 | 
 | 
         $data["referrer_url"] = $request->input('referrer_url');
 | 
| 
 | 
 | 
         $data["user_agent"] = $request->input('user_agent');
 | 
| 
 | 
 | 
         if (empty($data["id"]) || empty($data["url"]) || empty($data["referrer_url"]) || empty($data["user_agent"])){
 | 
| 
 | 
 | 
             return response()->json([
 | 
| 
 | 
 | 
                 'code' => self::SUCCESS,
 | 
| 
 | 
 | 
                 'msg' => 'success',
 | 
| 
 | 
 | 
             ]);
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //转发data
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //成功
 | 
| 
 | 
 | 
         return response()->json([
 | 
| 
 | 
 | 
             'code' => self::SUCCESS,
 | 
| 
 | 
 | 
             'msg' => 'success',
 | 
| 
 | 
 | 
         ]);
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         return $this->transmit($request,self::TYPEVISIT,self::TRAFFICONE);
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * C端表单提交 询盘信息
 | 
| 
 | 
 | 
      * @param Request $request
 | 
| 
 | 
 | 
      * @return mixed
 | 
| 
 | 
 | 
      * @return string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function inquiry(Request $request)
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         $data = $request->all();
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         $black_ips = ['203.86.233.27', '37.19.221.202'];
 | 
| 
 | 
 | 
         if(in_array(request()->getClientIp(), $black_ips)){
 | 
| 
 | 
 | 
             $this->success();
 | 
| 
...
 | 
...
 | 
@@ -381,40 +531,26 @@ public function inquiry(Request $request) | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         $data["files"] = $request->allFiles();
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //转发data
 | 
| 
 | 
 | 
         //返回数据
 | 
| 
 | 
 | 
         $res = "";
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         return $this->responseA($res);
 | 
| 
 | 
 | 
         return $this->transmit($request,self::TYPEINQUIRY,self::TRAFFICZERO,$data["files"]);
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 收集邮箱或者手机号等其他信息
 | 
| 
 | 
 | 
      * @param Request $request
 | 
| 
 | 
 | 
      * @return mixed
 | 
| 
 | 
 | 
      * @return string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function inquiryOtherInfo(Request $request)
 | 
| 
 | 
 | 
     {
 | 
| 
 | 
 | 
         return $this->inquiry($request);
 | 
| 
 | 
 | 
         return $this->transmit($request,self::TYPEINQUIRY);
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * 起点表单询盘
 | 
| 
 | 
 | 
      * @param Request $request
 | 
| 
 | 
 | 
      * @return void
 | 
| 
 | 
 | 
      * @return string
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     public function inquiryQd(Request $request){
 | 
| 
 | 
 | 
         $data = $request->post();
 | 
| 
 | 
 | 
         $data['submit_ip'] = $data['submit_ip'] ? $data['submit_ip'] : '';
 | 
| 
 | 
 | 
         $data['submit_time'] = $data['submit_time'] ? $data['submit_time'] : '';
 | 
| 
 | 
 | 
         $data['refer'] = $data['refer'] ? $data['refer'] : '';
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //转发data
 | 
| 
 | 
 | 
         //返回数据
 | 
| 
 | 
 | 
         $res = "";
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         return $this->responseA($res);
 | 
| 
 | 
 | 
         return $this->transmit($request,self::TYPEINQUIRY);
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
...
 | 
...
 | 
@@ -434,6 +570,7 @@ public function search(Request $request) | 
| 
 | 
 | 
             $data["search_content"] = $data['search'];
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //分页
 | 
| 
 | 
 | 
         $data["page"] = isset($data['page']) && (int)$data['page'] > 1 ? (int)$data['page'] : 1;
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         //转发data
 | 
...
 | 
...
 | 
 |