JavaScript是可以获取Response Header(响应头)的信息的:
如果是使用XMLHttpRequest, 这个对象本身有一个getResponseHeader(DOMString header)的方法来获取。
如果是使用jQuery.ajax, 在success属性对应的回调函数中,第三个参数会被jQuery设置一个jqXHR的对象,这个对象是对XMLHttpRequest对象的一个封装,也是有getResponseHeader方法的。
不过我这里要说的是GM_xmlhttpRequest,也就是俗称的“油猴脚本”里的功能。在firefox里的油猴扩展是Greasemonkey,在chrome中则是Tampermonkey。它们都内置了GM_xmlhttpRequest方法,用于处理ajax事件。
GM_xmlhttpRequest有个很好用的地方是它不会受跨域限制(当油猴脚本跨域时,会先提示你是否允许跨域,允许即可)。
要使用GM_xmlhttpRequest,需要先在脚本头部引入GM_xmlhttpRequest:
// @grant GM_xmlhttpRequest
然后用GM_xmlhttpRequest的head方法获取响应头:
GM_xmlhttpRequest({
url: "url",
method: "HEAD",
onload: function(response) {
console.log(response.responseHeaders);
}
});
我获取了p站一个图片的响应头,输出类似下面:
Date: Tue, 07 Mar 2017 05:31:54 GMT X-Content-Type-Options: nosniff Last-Modified: Tue, 08 Mar 2016 09:00:36 GMT Server: nginx Content-Type: image/jpeg Cache-Control: max-age=31536000 Accept-Ranges: bytes Content-Length: 528794 Expires: Fri, 02 Mar 2018 10:41:44 GMT
不过我现在还有个疑惑,就是油猴怎么从响应头中提取某个特性属性的值。它好像没有getResponseHeader方法。
参考文档
这玩意让我栽了个坑,因为GM_xmlhttpRequest的head方法是异步的……所以我们需要在GM_xmlhttpRequest外定义一个函数作为回调函数,然后在GM_xmlhttpRequest获取到结果之后在GM_xmlhttpRequest里执行这个回调函数。
示例如下:
// 判断url是否可用
function testURL(url) {
GM_xmlhttpRequest({
url: url,
method: "HEAD",
onload: function(response) {
// 获取请求头并在请求头内查找 Content-Type是否为image类型。如果图片网址是错的,那么Content-Type为提示错误的text/html类型。
if (response.responseHeaders.indexOf("image/") > -1) {
getResult(true);
} else {
getResult(false);
};
}
});
}
var getResult = function(result) {
if (result) {
console.log("结果为true");
//code......
}else{
console.log("结果为false");
//code......
}
}
testURL("http://i3.pixiv.net/img-original/img/2016/03/08/18/00/36/55694302_p0.jpg", getResult);
太蛋疼了……
后来我还发现有时候明明图片url是对的,但获取的状态码却是403的,判断失败,尚不不清楚原因。这导致我改进pixiv下载器的计划受阻了。
最后我还是用php做了这个功能,放弃油猴了……
header("Access-Control-Allow-Origin:http://www.pixiv.net");
function http_status($url) {
$refer = "http://www.pixiv.net/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_REFERER, $refer);
curl_exec($ch);
$status = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $status;
}
$url=$_GET['url'];
echo http_status($url);