输入网址自动获取图标
先定义一个函数
<?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); ?>
作者:被水遗忘の鱼,终究还是活不成,自己喜欢的样子。