输入网址自动获取图标

先定义一个函数

<?php

/**
 * 获取favion图标
 * @param $url 目标url
 * @param $path 保存路径
 */
function getFav($url, $path)
{
    $curl = get_url_content($url);
    $file = $curl['exec'];  //获取到的文件
    $zt = $curl['getinfo']; //状态
    
    if($file && $zt['http_code'] == '200')    //有文件,并且返回状态为200
    {
        if(md5($file) == '4d8504e8ead22878dc1278750d874663')    //获取到的是来自360api的星星……
        {
            echoFav($path);
        }
        
        if($zt['content_type']=='image/x-icon') //是一个合法的图片文件
        {
            echoFav($path, $file);  //直接输出
        }
        else if($zt['content_type']=='image/vnd.microsoft.icon') //维基百科是这个类型
        {
            echoFav($path, $file);  //直接输出
        }
    }
}

/**
 * 输出最终的favion图标
 * @param $path 图标保存路径
 * @param $file 图标文件
 */
function echoFav($path = '', $file = '')
{
    if($file == '')  //没有
    {
        $file = "null.png"; //默认的图标
        if (file_exists($file))  $file = file_get_contents($file);
    }
    if($path != '') file_put_contents($path, $file);   //保存文件
    die($file);
}

/**
 * 获取GET或POST过来的参数
 * @param $key 键值
 * @param $default 默认值
 * @return 获取到的内容(没有则为默认值)
 */
function getParam($key,$default='')
{
    return trim($key && is_string($key) ? (isset($_POST[$key]) ? $_POST[$key] : (isset($_GET[$key]) ? $_GET[$key] : $default)) : $default);
}

/**
 * curl获取数据
 * @param $bbb 目标url地址
 * @return ['exec'] 获取的内容
 * @return ['getinfo'] 返回的状态码
 */
function get_url_content($bbb) { 
   $ch = curl_init(); 
   $timeout = 5000;  //超时时间
   curl_setopt ($ch, CURLOPT_URL, $bbb); 
   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  
   curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT_MS, $timeout); 
   curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
   curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   curl_setopt ($ch, CURLOPT_ENCODING, 'gzip'); //取消gzip压缩(代表:网易邮箱)
   $file_info['exec']= curl_exec($ch); 
   $file_info['getinfo'] = curl_getinfo($ch); //判断状态 有的情况下无法正确判断ico是否存在
   curl_close($ch); 
   return $file_info; 
}

/**
 * 判断字符串是否为域名
 * @param $s 目标url地址
 * @return 
 */
function isUrl($s)  
{  
    return preg_match('/^http[s]?:\/\/'.  
        '(([0-9]{1,3}\.){3}[0-9]{1,3}'. // IP形式的URL- 199.194.52.184  
        '|'. // 允许IP和DOMAIN(域名)  
        '([0-9a-z_!~*\'()-]+\.)*'. // 三级域验证- www.  
        '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.'. // 二级域验证  
        '[a-z]{2,6})'.  // 顶级域验证.com or .museum  
        '(:[0-9]{1,4})?'.  // 端口- :80  
        '((\/\?)|'.  // 如果含有文件对文件部分进行校验  
        '(\/[0-9a-zA-Z_!~\*\'\(\)\.;\?:@&=\+\$,%#-\/]*)?)$/',  
        $s) == 1;  
}

/**
 * 判断网址302重定向后的地址
 * @param $url 目标url地址
 * @param $vars post数据
 * @return 重定向的网址或 false
 */
function curl_post_302($url, $vars = '') {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL,  $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
    if($vars != '')
        curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);   //post数据
    $data = curl_exec($ch);
    $Headers =  curl_getinfo($ch);
    curl_close($ch);
    if ($data != $Headers)
        return  $Headers["url"];
    else
        return false;
}
?>

然后将图标输出并保存

<?php 

header('Content-type: image/x-icon');   //输出的是图标格式
include_once("fav_function.php");

$dir = 'cache'; //图标缓存目录

//如果缓存目录不存在则创建
if (!is_dir($dir)) mkdir($dir,0777,true) or die('创建缓存目录失败!');

$url = getParam('url'); //获取传过来的链接参数

//没有url参数,输出默认图像
if(!$url) echoFav();

$http = '';

//如果网页不是http://开头的,就给他加上 
if(substr($url, 0, 4) != 'http')
{
    $url = 'http://'.$url;
}
else if(substr($url, 0, 5) == 'https')
{
    $http = 'https://'; //如果是https头,传到后面取图标时加上。防止出现302重定向
}


//非法域名时调用默认文件
if(isUrl($url) != '1') echoFav();

$arr = parse_url($url); //分解目标域名
$domain = $arr['host']; //没有头和尾的裸域名

$fav = $dir."/".$domain.".ico"; //图标保存的路径和名称

//调用缓存文件
if (file_exists($fav)) //有缓存就直接输出缓存
{
    $file = file_get_contents($fav);
    if($file) die($file);
}

//直接尝试站点根目录下的favion.ico文件  (通用方法)
getFav($http.$domain."/favicon.ico", $fav); 

//直接请求目标网址并匹配<meta>标签中的favion.ico
$curl = get_url_content($url);
$file = $curl['exec'];
preg_match('|href\s*=\s*[\"\']([^<>]*?)\.ico[\"\'\?]|i',$file,$a);    //正则匹配

//没有匹配结果
if(!(isset($a[1]) && $a[1]))
{
    getFav('http://cdn.website.h.qhimg.com/index.php?domain='.$domain, $fav);  //来自360的api
    echoFav($fav);
}

$a[1] .='.ico'; //加上后缀名
getFav($a[1], $fav);    //如果favicon自身带有完整链接

if(substr($a[1], 0, 1) == '/')  //相对路径的处理
{
    $a[1] = substr($a[1], 1);
}
if(substr($a[1], 0, 3) == '../')  //相对路径的处理
{
    $a[1] = substr($a[1], 3);
}
if(substr($a[1], 0, 2) == './')  //相对路径的处理
{
    $a[1] = substr($a[1], 2);
}

$u = $http.$domain.'/'.$a[1];   //手动加上链接再试一次
getFav($u, $fav);

//上面的方法都没法获取
getFav('http://cdn.website.h.qhimg.com/index.php?domain='.$domain, $fav);  //来自360的api
echoFav($fav);
?> 

 

posted @ 2022-03-19 16:01  被水遗忘の鱼  阅读(116)  评论(0编辑  收藏  举报