PHP检测域名是否被QQ/微信拦截

琐碎记事 · 2023-01-21

最近项目用到这功能了,整理下
首先拿到QQ的域名检测api

https://cgi.urlsec.qq.com/index.php?m=check&a=check&url=被检测域名&_=13位毫秒
以及微信的重定向域名

http://mp.weixinbridge.com/mp/wapredirect?url=被检测域名
原理:
有了上面两个网址就可以实现了,QQ的返回值是jsonp格式,需要单独处理下,详细方法看下面的类,域名被拉黑后json中data=>results=>whitetype该值将返回2,返回1或3都是正常!
微信的是一个重定向域名,正常域名返回3秒跳转的html或返回空,如果被拦截了就会返回 '已停止访问该网页'
我这边是tp框架,就直接发类出来了,原生的去掉namespace即可正常引用

Thinkphp类

namespace utils;

class Util
{
    public function getQqState($url){
        $res = self::curl_get("https://cgi.urlsec.qq.com/index.php?m=check&a=check&url=".$url."&_=".self::msectime());
        if (empty($res)){
            return false;
        }
        $res = substr($res, 1);
        $res = substr($res, 0, -1);
        $data = json_decode($res,true);
        if (empty($data)){
            return false;
        }
        $type = $data['data']['results']['whitetype'];
        if ($type==1 || $type ==3 ){
            return true;
        }else{
            return false;
        }
    }

    public function getWxState($url){
        $res = self::curl_get("http://mp.weixinbridge.com/mp/wapredirect?url=".$url);
        if (empty($res)){
            return true;
        }
        if (strpos($res,'已停止访问该网页') !== false){
            return false;
        }else{
            return true;
        }
    }

    private function msectime() {
        list($msec, $sec) = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
    }

    private function curl_get($url){
        $ch = curl_init(); // Curl 初始化
        $header = [
            'X-FORWARDED-FOR:218.91.92.84',
            'CLIENT-IP:218.91.92.84',
            'Cookie: pgv_pvi=9897416704; RK=WI7w5+CMZn; ptcz=e383433090496e1f60381fd68733196426868ba1876249a6736bcc4a3eb8ec72; pgv_pvid=455855220; cid=89410138-a33a-4ea9-98f2-4436da89d67d; _tfpdata=yBRknXvS8CfrED0zD85NZfxCPzT5SW8KEY03rIziZmu9ogk9y%2B5%2FU4QrJBbfqfuVqr%2F6vw8nSWfqHR3fu2Jc0TPvszwmrMwXEdN%2B8bKKfHwNCcL%2F2%2Fbhmiu%2B%2F4IgK1DX'
        ];
        curl_setopt($ch, CURLOPT_URL, $url); // 设置 Curl 目标
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Curl 请求有返回的值
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 设置抓取超时时间
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 跟踪重定向
        curl_setopt($ch, CURLOPT_ENCODING, ""); // 设置编码
        curl_setopt($ch, CURLOPT_REFERER, $url); // 伪造来源网址
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //伪造IP
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"); // 伪造ua
        curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); // 取消gzip压缩
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        $content = curl_exec($ch);
        curl_close($ch); // 结束 Curl
        return $content; // 函数返回内容
    }



}

我这边只需要返回true/false就好了,有其他需求自行更改
end!!!

作者:凉生先森
链接:https://www.jianshu.com/p/e1e0e5639f8a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Theme Jasmine by Kent Liao
辽ICP备2021009421号-2