不是我写的,留着备用,学习一下。

源码就一个文件,任意命名为:filename.php

可以放在网站根目录,也可以放二级目录,调用时加上目录就行。

调用方式:域名 + /?url=目标网址

示例1:

http://tool.bitefu.net/ico/?url=https://www.baidu.com

示例2(直接返回base64编码的图片信息):

http://tool.bitefu.net/ico/?url=https://www.baidu.com&type=1

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<?php
/**
* php获取网站favicon图标
*/
$url = getParam('url'); //获取传过来的链接参数
$type = getParam('type'); //获取传过来的链接参数
if (empty($url)) {
die('?url=https://www.baidu.com and &type=1 get base64');
}
if (substr($url, 0, 4) != 'http') {
$url = 'http://' . $url;
}
if (empty($type)) {
header('Content-type: image/x-icon');
} //输出的是图标格式
$content = geticon($url, $type);
if (empty($content)) {
$content = threeapi($url);
if ($content && !empty($type)) $content = base64EncodeImage($content);
}
if (empty($content)) {
echo default_ico($type);
return;
}
echo $content;
return;
function getcachedir() {
$dir = './cache';
if (!is_dir($dir)) mkdir($dir, 0777, true) or die('创建缓存目录失败!');
return $dir;
}
function geticon($url, $type = 0) {
if (empty($url)) return '';
if (isUrl($url) != '1') {
return default_ico($type);
}
$http = '';
if (substr($url, 0, 5) == 'https') {
$http = 'https://';
} //如果是https头,传到后面取图标时加上。防止出现302重定向
$arr = url_parse($url);
$domain = $arr['host']; //分解目标域名
$fav = $arr['fav']; //图标保存的路径和名称
//调用缓存文件
if (file_exists($fav)) { //有缓存就直接输出缓存
$file = file_get_contents($fav);
if ($file) return $type ? base64EncodeImage($file) : $file;
}
$check1 = getFav($http . $domain . "/favicon.ico");
if ($check1) {
cachefile($url, $check1);
return $type ? base64EncodeImage($check1) : $check1;
} //第一次尝试 根目录
$curl = get_url_content($url); //尝试读取内容并匹配ico文件
$file = $curl['exec'];
preg_match('|href\s*=\s*[\"\']([^<>]*?)\.ico[\"\'\?]|i', $file, $a); //正则匹配
if (!empty($a[1])) {
$file2 = $a[1].= '.ico';
if (!substr($file2, 0, 4) == 'http') { //相对路径
if (substr($file2, 0, 1) == '/') {
$file2 = substr($file2, 1);
}
if (substr($file2, 0, 3) == '../') {
$file2 = substr($a[1], 3);
}
if (substr($a[1], 0, 2) == './') {
$file2 = substr($file2, 2);
}
$file2 = $http . $domain . '/' . $file2; //手动加上链接再试一次

}
$check2 = getFav($file2);
if ($check2) {
cachefile($url, $check2);
return $type ? base64EncodeImage($check2) : $check2;
} //第二次尝试

}
return '';
}
function url_parse($url) {
$arr = parse_url($url);
$dir = getcachedir();
$arr['fav'] = $dir . "/" . $arr['host'] . ".ico";
return $arr;
}
function cachefile($url, $content) {
if (empty($url) || empty($content)) return false;
$arr = url_parse($url);
file_put_contents($arr['fav'], $content);
}
function threeapi($url, $type = 0) {
$urls = array(
'http://api.byi.pw/favicon/?url=' . $url,
'http://cdn.website.h.qhimg.com/index.php?domain=' . $url,
);
if (!empty($urls[$type])) {
$check1 = getFav($urls[$type]);
if ($check1) {
cachefile($url, $check1);
return $check1;
} else return threeapi($urls[($type + 1) ]);
}
return false;
}
/**
* 获取favion图标
*/
function getFav($url) {
$curl = get_url_content($url);
$file = $curl['exec']; //获取到的文件
$zt = $curl['getinfo']; //状态
if ($file && $zt['http_code'] == '200') {
return $file;
} //有文件,并且返回状态为200
return false;
}
function default_ico($type = 0) {
$file = "null.ico";
$data = file_get_contents($file);
return $type ? base64EncodeImage($data) : $data;
}
/**
* 获取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);
}
//将图片转化成base编码
function base64EncodeImage($image_data, $mime = 'image/png') {
$base64_image = 'data:' . $mime . ';base64,' . chunk_split(base64_encode($image_data));
return $base64_image;
}
/**
* 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展开?:\/\/' . '(([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;
}
?>

更多详情:https://my.oschina.net/xiaogg/blog/3053161

转载来源:小王先森(禁止套娃?)