您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Export proxies from HideMyName into a JSON file. Premium membership NOT required.
// ==UserScript== // @name HideMyName Free Proxy exporter (JSON) // @namespace org.thorlancaster.hidemynameexporter // @version 1.0 // @description Export proxies from HideMyName into a JSON file. Premium membership NOT required. // @author Thor Lancaster // @match https://hidemy.name/en/proxy-list/* // @grant none // ==/UserScript== (function() { 'use strict'; var helpText = "<ol style='list-style: initial'><li>Use the site to generate a list of proxies you want</li>"+ "<li>Click \"Add this page\" button for each page of proxies</li>"+ "<li>When finished, click \"Export JSON\"</li><li>Remember to clear pages when done to prevent old, possibly expired proxies.</li></ol>"; // Utility Functions var DGE = function(name){ return document.getElementById(name); } var DCE = function(name){ return document.createElement(name); } // UI functions // Show a modal message box var showMessageBox = function(titleTxt, txt){ var root = DCE("div"); var rs = root.style; root.id = "fpe-alert"; rs.position = "fixed"; rs.zIndex = "9999999"; rs.width = "100%"; rs.height = "100%"; rs.top = "0px"; rs.left = "0px"; rs.background = "#0A2132"; rs.color = "#FFF"; rs.fontSize = "1.2em"; var title = DCE("div"); title.innerHTML = titleTxt; var ts = title.style; ts.fontSize = "1.5em"; ts.padding = "0.5em"; root.appendChild(title); var msg = DCE("div"); msg.innerHTML = txt; var mss = msg.style; mss.padding = "2%"; mss.border = "1px solid #777"; mss.width = "95%"; mss.maxHeight = "90%"; mss.maxHeight = "calc(100% - 6rem)"; mss.overflowY = "auto"; root.appendChild(msg); var exit = DCE("button"); var bts = exit.style; bts.position = "fixed"; bts.bottom = "0px"; bts.color = "#000"; bts.background = "#1CD798"; bts.padding = "0.5em"; bts.borderRadius = "0.2rem"; bts.border = "none"; bts.fontSize = "1.1rem"; exit.innerText = "Back to site"; exit.onclick = function(){ DGE("fpe-alert").parentElement.removeChild(DGE("fpe-alert")); } root.appendChild(exit); document.body.appendChild(root); } // Create and return the UI element var createUIPane = function(){ var root = DCE("div"); var rs = root.style; rs.position = "fixed"; rs.bottom = "0px"; rs.width = "10rem"; rs.borderRadius = "0.5rem"; rs.background = "#0A2132"; rs.color = "#FFF"; rs.textAlign = "center"; //////// var title = DCE("div"); title.innerHTML = "JSON Proxy<br/>Exporter<br/>"; var ts = title.style; ts.fontSize = "1.5em"; ts.padding = "0.3em"; ts.background = "#FF9204"; ts.borderTopLeftRadius = ts.borderTopRightRadius = "0.5rem"; root.appendChild(title); //////// var status = DCE("div"); status.id = "fpe-status"; var ss = status.style; ss.display = "none"; ss.position = "absolute"; ss.top = "2rem"; ss.left = "10rem"; ss.width = "10rem"; ss.minHeight = "3rem"; ss.borderRadius = "0.5em"; ss.background = "#0A2132"; root.appendChild(status); //////// for(var x = 0; x < 4; x++){ var txt = "Button " + x; if(x == 0) txt = "Add this page"; if(x == 1) txt = "Clear pages"; if(x == 2) txt = "Export JSON"; if(x == 3) txt = "How to use"; var btn = DCE("button"); var bts = btn.style; bts.color = "#000"; bts.padding = "0.5em"; bts.borderRadius = "0.2rem"; bts.border = "none"; bts.fontSize = "1.1rem"; if(x == 3){ bts.fontSize = "0.8rem"; } if(x == 2) { // Emphasized bts.background = "#1CD798"; btn.nNmBg = "#1CD798"; btn.nHvBg = "#15AE7A"; } else { // Normal bts.background = "#1C98D7"; btn.nNmBg = "#1C98D7"; btn.nHvBg = "#157AAE"; } btn.dataset.btnNum = x; btn.onmouseover = function(){this.style.background = this.nHvBg;} btn.onmouseout = function(){this.style.background = this.nNmBg;} btn.onclick = onButtonClick; var bdiv = DCE("div"); var bs = bdiv.style; bs.height = "3rem"; bs.display = "flex"; bs.alignItems = "center"; bs.justifyContent = "center"; btn.innerHTML = txt; bdiv.appendChild(btn); root.appendChild(bdiv); } return root; } var stTimer = null; var setStatusText = function(stTxt){ clearTimeout(stTimer); stTimer = setTimeout(function(){ DGE("fpe-status").style.display = "none"; }, 2200); var el = DGE("fpe-status"); el.style.display = "block"; el.innerHTML = stTxt; } var onButtonClick = function(){ var num = this.dataset.btnNum; if(num == 0){ addThisPage(); } else if(num == 1){ clearPages(); } else if(num == 2){ exportJSON(); } else if(num == 3){ showHelp(); } } // Data parsing functions var addThisPage = function(){ var fpeDatabase = fpeDatabase = JSON.parse(sessionStorage.getItem("fpe-database")); if(fpeDatabase == null){ fpeDatabase = {}; } //////////////// BEGIN DATA SCRAPING var table = document.getElementsByClassName("table_block")[0].getElementsByTagName("table")[0]; var rows = table.getElementsByTagName("tbody")[0].getElementsByTagName("tr"); for(var x = 0; x < rows.length; x++){ var row = rows[x]; var tds = row.getElementsByTagName("td"); var ip = tds[0].innerText; var value = {}; value.port = tds[1].innerText; value.location = tds[2].innerText; value.speed = tds[3].innerText; value.type = tds[4].innerText.toUpperCase(); value.anonymity = tds[5].innerText.toUpperCase(); Object.defineProperty(fpeDatabase, ip, { value: value, writable: true, enumerable: true }); } //////////////// END DATA SCRAPING sessionStorage.setItem("fpe-database", JSON.stringify(fpeDatabase)); } var clearPages = function(){ sessionStorage.removeItem("fpe-database"); } var exportJSON = function(){ var fpeDatabase = JSON.parse(sessionStorage.getItem("fpe-database")); if(fpeDatabase != null){ showMessageBox("JSON Output", "<pre>" + JSON.stringify(fpeDatabase, undefined, 2) + "</pre>"); } else { setStatusText("No data yet. Add some pages first."); } } var showHelp = function(){ showMessageBox("How to use", helpText); } // Main function var init = function(){ var ui = createUIPane(); document.body.appendChild(ui); } init(); })();