Для обеспечения индексации поисковыми системами большинство сайтов с платным
новостным контентом предоставляют обходной путь для беспрепятственного входа
поискового бота Google. Бот проверяется по содержимому заголовков Referer и
User-Agent, что позволяет любому желающему просмотреть закрытые области заменив
идентификатор браузера и указав в качестве адреса предыдущей страницы google.com.
Более того, некоторые платные ресурсы на основе значения Referer открывают
полный текст статьи для посетителей пришедших с поисковых систем, но при
попытке прямого обращения, требуют регистрации для просмотра платного контента.
Такое поведение выглядит как дискриминация различных категорий пользователей.
Для автоматизации беспрепятственного доступа к таким ресурсам как Wall Street
Journal предлагается небольшое дополнение к браузеру Chrome.
Создаём файл manifest.json, перечислив сайты для которых следует притвориться поисковым ботом:
{
"name": "Innocuous Chrome Extension",
"version": "0.1",
"description": "This is an innocuous chrome extension.",
"permissions": ["webRequest", "webRequestBlocking",
"http://www.ft.com/*",
"http://www.wsj.com/*",
"https://www.wsj.com/*",
"http://www.economist.com/*",
"http://www.nytimes.com/*",
"https://hbr.org/*",
"http://www.newyorker.com/*",
"http://www.forbes.com/*",
"http://online.barrons.com/*",
"http://www.barrons.com/*",
"http://www.investingdaily.com/*",
"http://realmoney.thestreet.com/*",
"http://www.washingtonpost.com/*"
],
"background": {
"scripts": ["background.js"]
},
"manifest_version": 2
}
Создаём скрипт background.js:
var ALLOW_COOKIES = ["nytimes", "ft.com"]
function changeRefer(details) {
foundReferer = false;
foundUA = false
var reqHeaders = details.requestHeaders.filter(function(header) {
// block cookies by default
if (header.name !== "Cookie") {
return header;
}
allowHeader = ALLOW_COOKIES.map(function(url) {
if (details.url.includes(url)) {
return true;
}
});
if (allowHeader.filter(Boolean)==true) return header;
}).map(function(header) {
if (header.name === "Referer") {
header.value = "https://www.google.com/";
foundReferer = true;
}
if (header.name === "User-Agent") {
header.value = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
foundUA = true;
}
return header;
})
// append referer
if (!foundReferer) {
reqHeaders.push({
"name": "Referer",
"value": "https://www.google.com/"
})
}
if (!foundUA) {
reqHeaders.push({
"name": "User-Agent",
"value": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
})
}
console.log(reqHeaders);
return {requestHeaders: reqHeaders};
}
function blockCookies(details) {
for (var i = 0; i < details.responseHeaders.length; ++i) {
if (details.responseHeaders[i].name === "Set-Cookie") {
details.responseHeaders.splice(i, 1);
}
}
return {responseHeaders: details.responseHeaders};
}
chrome.webRequest.onBeforeSendHeaders.addListener(changeRefer, {
urls: ["<all_urls>"],
types: ["main_frame"],
}, ["requestHeaders", "blocking"]);
chrome.webRequest.onHeadersReceived.addListener(blockCookies, {
urls: ["<all_urls>"],
types: ["main_frame"],
}, ["responseHeaders", "blocking"]);
Размещаем manifest.json и background.js в отдельной директории, открываем в
Chrome страницу chrome://extensions/, включаем режим разработчика (Developer
Mode), выбираем пункт "Click Load unpacked extension..." и указываем в
открывшемся диалоге путь к директории с файлами.
|