get.php
<?php
/**
* php获取网站favicon图标
* 版本:v1.1
* 编写:孟坤软件
* 时间:2016/12/3
*
* 参考资料
* [1]、Favicon.ico远程获取插件 php版 v1.0 http://www.jb51.net/codes/390215.html
* [2]、再谈获取网站图标Icon http://www.cnblogs.com/luguo3000/p/3789669.html
* [3]、Favicon.ico远程获取API接口 http://www.5z5d.com/api/favicon.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);
?>
fav_function.php
<?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;
}
?>
调用方法:get.php?url=http://www.baidu.com
如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!
txttool.com 说一段 esp56物联 查询128 IP查询