2017-04-18 23 views
0

我正在製作一個攔截廣告的程序。我找到了一個來自this頁面的廣告服務器列表。我的問題:是否有可能從使用JavaScript的網站中的該頁面搜索這些廣告服務器?並且請注意,我想要擴展代碼在javascript中搜索包含廣告服務器列表的文本文件

+0

你可以對你要如何阻止這些廣告更精確?如果您打算通過刪除標籤手動禁用鏈接,圖像或iframe,我猜基本的搜索和替換頁面中的html會做.. – Kaddath

+0

@Kaddath是的我想禁用鏈接和圖像。如果你可以提供一個很好的答案 – Vagif

+0

在我的答案中爲你添加了一個工作示例。如果你想過濾掉更多的元素,你可以添加更多的循環。 – Waterscroll

回答

0

你可以使用這樣的事情:

var sites = ['site1', 'site2', '...'], 
    sites_len = sites.length; 
var els = document.getElementsByTagName('*'); 

for (var i = 0, len = els.length; i < len; i++) { 
    var attr = ""; 
    switch (els[i].tagName.toLowerCase()) { 
     case 'iframe': 
     case 'script': 
     case 'img': 
      attr = 'src'; 
      break; 
     case 'link': 
     case 'a': 
      attr = 'href'; 
      break 
     default: 
      continue; 
    } 
    var attr_val = els[i].getAttribute(attr); 
    for (var j = 0; j < sites_len; j++) 
     if (sites[j].indexOf(attr_val) > -1) 
      els[i].parentNode.reamoveChild(els[i]); 
} 
0

默認情況下,網頁無法訪問JavaScript中另一個網頁的內容。這就是所謂的cross-origin HTTP request。該網站可以允許不同的網站使用HTTP標頭Access-Control-Allow-Origin訪問其內容,但是您的網頁並沒有這樣做。

如果你繼續前進,嘗試你會得到錯誤XMLHttpRequest cannot load https://pgl.yoyo.org/as/serverlist.php?hostformat=nohtml&showintro=1&startdate%5Bday%5D=&startdate%5Bmonth%5D=&startdate%5Byear%5D=. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

要解決這個限制,你可以開發一個瀏覽器擴展,而不是或使用代理像crossorigin.me

這是一個工作示例:

function loadAdServers(callback) { 
 
    const url = 'https://crossorigin.me/https://pgl.yoyo.org/as/serverlist.php?hostformat=nohtml&showintro=1&startdate%5Bday%5D=&startdate%5Bmonth%5D=&startdate%5Byear%5D='; 
 

 
    const request = new XMLHttpRequest(); 
 
    request.open('GET', url); 
 
    request.addEventListener('load', function() { 
 
    callback(request.response.split('\n').filter(x => x)); 
 
    }); 
 
    request.send(); 
 
} 
 

 
function removeElement(element) { 
 
    if (element.parentElement) { 
 
    element.parentElement.removeChild(element); 
 
    } 
 
} 
 

 
function removeAdElements(adServers) { 
 
    for (const img of document.querySelectorAll('img')) { 
 
    for (const adServer of adServers) { 
 
     if (img.src.indexOf(adServer) >= 0) { 
 
     removeElement(img); 
 
     } 
 
    } 
 
    } 
 
    for (const a of document.querySelectorAll('a')) { 
 
    for (const adServer of adServers) { 
 
     if (a.href.indexOf(adServer) >= 0) { 
 
     removeElement(a); 
 
     } 
 
    } 
 
    } 
 
} 
 

 
loadAdServers(removeAdElements);
<img src="http://101order.com/company.logo"> 
 
    <a href="http://101order.com/">Link</a> 
 
    <a href="http://stackoverflow.com">stackoverflow</a>

這需要一些時間來加載列表和過濾元件。

+0

謝謝你的回答。但是我試圖把它放到一個擴展中,但它不起作用。你有任何想法如何在擴展中使用它? – Vagif

+0

我很抱歉,但我從未做過延期。我想你不需要使用'https:// crossorigin.me',但我不知道如何從擴展中訪問DOM。 – Waterscroll

相關問題