├── .gitignore ├── Dockerfile ├── README.md ├── index.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .python-version 3 | ha.pid 4 | haproxy.cfg 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:8.5.0 2 | 3 | WORKDIR /usr/src/app 4 | 5 | ENV HAPROXY_MAJOR 1.7 6 | ENV HAPROXY_VERSION 1.7.9 7 | ENV HAPROXY_MD5 a2bbbdd45ffe18d99cdcf26aa992f92d 8 | 9 | # copied from https://github.com/docker-library/haproxy/blob/394255fbe76c57a9f2e0775e3e69df714e801b46/1.7/Dockerfile 10 | RUN apt-get update \ 11 | && apt-get install -y --no-install-recommends \ 12 | libpcre3 \ 13 | libssl1.0.0 \ 14 | && rm -rf /var/lib/apt/lists/* 15 | 16 | RUN set -x \ 17 | \ 18 | && buildDeps=' \ 19 | gcc \ 20 | libc6-dev \ 21 | libpcre3-dev \ 22 | libssl-dev \ 23 | make \ 24 | wget \ 25 | ' \ 26 | && apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/* \ 27 | \ 28 | && wget -O haproxy.tar.gz "http://www.haproxy.org/download/${HAPROXY_MAJOR}/src/haproxy-${HAPROXY_VERSION}.tar.gz" \ 29 | && echo "$HAPROXY_MD5 *haproxy.tar.gz" | md5sum -c \ 30 | && mkdir -p /usr/src/haproxy \ 31 | && tar -xzf haproxy.tar.gz -C /usr/src/haproxy --strip-components=1 \ 32 | && rm haproxy.tar.gz \ 33 | \ 34 | && makeOpts=' \ 35 | TARGET=linux2628 \ 36 | USE_OPENSSL=1 \ 37 | USE_PCRE=1 PCREDIR= \ 38 | USE_ZLIB=1 \ 39 | ' \ 40 | && make -C /usr/src/haproxy -j "$(nproc)" all $makeOpts \ 41 | && make -C /usr/src/haproxy install-bin $makeOpts \ 42 | \ 43 | && mkdir -p /usr/local/etc/haproxy \ 44 | && cp -R /usr/src/haproxy/examples/errorfiles /usr/local/etc/haproxy/errors \ 45 | && rm -rf /usr/src/haproxy \ 46 | \ 47 | && apt-get purge -y --auto-remove $buildDeps 48 | 49 | 50 | COPY package.json . 51 | RUN npm install 52 | 53 | COPY index.js . 54 | 55 | EXPOSE 1339 56 | CMD [ "npm", "start" ] 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Free Proxy Rotator 2 | 3 | Tunnel requests through free proxies found online. Proxy quality is low, **use with caution**. 4 | 5 | + Proxies managed by haproxy, no need to cycle 6 | + Proxies are rotated every 60 seconds based on ping 7 | + Runs in docker 8 | + Proxies found with [proxy-list](https://github.com/chill117/proxy-lists) 9 | 10 | ### Running 11 | 12 | ```bash 13 | $ docker run -p 1339:1339 jaxgeller/free-proxy-rotator 14 | $ curl --proxy localhost:1339 http://httpbin.org/ip 15 | ``` 16 | 17 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const ProxyLists = require('proxy-lists'); 2 | const ip = require('ip'); 3 | const { promisify } = require('util'); 4 | const writeFile = promisify(require('fs').writeFile); 5 | const readFile = promisify(require('fs').readFile); 6 | const exec = promisify(require('child_process').exec); 7 | 8 | const PROXY_OPTIONS = { 9 | countries: ['us'], 10 | sourcesBlackList: ['kingproxies', 'bitproxies'] 11 | }; 12 | 13 | const CWD = process.cwd() 14 | const PORT = process.env.PORT || 1339 15 | const REFRESH_RATE = process.env.REFRESH_RATE || 60 16 | 17 | const PID_FILE = `${CWD}/ha.pid`; 18 | const CFG_FILE = `${CWD}/haproxy.cfg`; 19 | const HAPROXY_CMD = 'haproxy'; 20 | 21 | function renderProxies(proxies) { 22 | return proxies 23 | .filter(proxy => proxy !== undefined) 24 | .map((proxy, i) => ` server proxy${i} ${proxy.trim()}`) // intentional 2 spaces 25 | .join('\n'); 26 | } 27 | 28 | function getConfig(proxies) { 29 | return ` 30 | global 31 | maxconn 1024 32 | pidfile ha.pid 33 | daemon 34 | 35 | defaults 36 | mode http 37 | maxconn 1024 38 | option httplog 39 | option dontlognull 40 | retries 1 41 | timeout connect 5s 42 | timeout client 20s 43 | timeout server 20s 44 | 45 | frontend localnodes 46 | bind *:${PORT} 47 | mode http 48 | default_backend proxies 49 | 50 | backend proxies 51 | balance roundrobin 52 | option http_proxy 53 | ${renderProxies(proxies)} 54 | `; 55 | } 56 | 57 | function getProxyList() { 58 | let proxyList = {}; 59 | return new Promise((resolve, reject) => { 60 | ProxyLists.getProxies(PROXY_OPTIONS) 61 | .on('data', proxies => { 62 | proxies.forEach(proxy => { 63 | if (!ip.isV4Format(proxy.ipAddress)) return; 64 | if (proxy.port < 80) return; 65 | if (proxy.port === PORT) return; 66 | 67 | const el = `${proxy.ipAddress}:${proxy.port}`; 68 | 69 | proxyList[el] = 0; // if i figure out a good way to ping in node, ping server here 70 | }); 71 | }) 72 | .on('end', () => {resolve(proxyList)}) 73 | .on('error', err => { 74 | console.log(err) 75 | reject(err) 76 | }); 77 | }); 78 | } 79 | 80 | function sortProxiesByPing(proxies) { 81 | return Object.keys(proxies).sort((a, b) => proxies[a] - proxies[b]); 82 | } 83 | 84 | function getHaproxyPID() { 85 | return readFile(`${PID_FILE}`); 86 | } 87 | 88 | function startHaproxy() { 89 | console.log('launching haproxy'); 90 | return exec(`${HAPROXY_CMD} -f ${CFG_FILE}`); 91 | } 92 | 93 | function reloadHaproxy() { 94 | console.log('reloading haproxy'); 95 | return exec(`${HAPROXY_CMD} -sf $(cat ${PID_FILE}) -f ${CFG_FILE}`); 96 | } 97 | 98 | function killHaproxy() { 99 | console.log('killing existing haproxy'); 100 | return exec(`kill -9 $(cat ${PID_FILE}) 2>/dev/null`); 101 | } 102 | 103 | function saveHaproxyConfig(config) { 104 | return writeFile(`${CFG_FILE}`, config); 105 | } 106 | 107 | async function getAndSaveProxyList() { 108 | console.log('fetching proxies'); 109 | const proxyList = await getProxyList(); 110 | const keys = Object.keys(proxyList); 111 | const config = getConfig(keys.slice(0, 4095)); // haproxy max servers 112 | 113 | await saveHaproxyConfig(config); 114 | } 115 | 116 | function tick() { 117 | setTimeout(async () => { 118 | try { 119 | await getAndSaveProxyList(); 120 | await reloadHaproxy(); 121 | } catch (e) { 122 | console.warn(e); 123 | } 124 | 125 | return tick(); 126 | }, REFRESH_RATE * 1000); 127 | } 128 | 129 | async function main() { 130 | try { 131 | await getAndSaveProxyList(); 132 | await startHaproxy(); 133 | } catch (e) { 134 | console.warn(e); 135 | } 136 | 137 | tick(); 138 | } 139 | 140 | main(); 141 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "free-proxy-rotator", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "6.0.88", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.88.tgz", 10 | "integrity": "sha512-bYDPZTX0/s1aihdjLuAgogUAT5M+TpoWChEMea2p0yOcfn5bu3k6cJb9cp6nw268XeSNIGGr+4+/8V5K6BGzLQ==" 11 | }, 12 | "ajv": { 13 | "version": "4.11.8", 14 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 15 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 16 | "requires": { 17 | "co": "4.6.0", 18 | "json-stable-stringify": "1.0.1" 19 | } 20 | }, 21 | "amdefine": { 22 | "version": "1.0.1", 23 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 24 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 25 | }, 26 | "asn1": { 27 | "version": "0.2.3", 28 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 29 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 30 | }, 31 | "assert-plus": { 32 | "version": "0.2.0", 33 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 34 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 35 | }, 36 | "async": { 37 | "version": "2.5.0", 38 | "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", 39 | "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", 40 | "requires": { 41 | "lodash": "4.17.4" 42 | } 43 | }, 44 | "asynckit": { 45 | "version": "0.4.0", 46 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 47 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 48 | }, 49 | "atob": { 50 | "version": "1.1.3", 51 | "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", 52 | "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=" 53 | }, 54 | "aws-sign2": { 55 | "version": "0.6.0", 56 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 57 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 58 | }, 59 | "aws4": { 60 | "version": "1.6.0", 61 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 62 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 63 | }, 64 | "bcrypt-pbkdf": { 65 | "version": "1.0.1", 66 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 67 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 68 | "optional": true, 69 | "requires": { 70 | "tweetnacl": "0.14.5" 71 | } 72 | }, 73 | "boolbase": { 74 | "version": "1.0.0", 75 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 76 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 77 | }, 78 | "boom": { 79 | "version": "2.10.1", 80 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 81 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 82 | "requires": { 83 | "hoek": "2.16.3" 84 | } 85 | }, 86 | "buffer-crc32": { 87 | "version": "0.2.13", 88 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 89 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 90 | }, 91 | "caseless": { 92 | "version": "0.12.0", 93 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 94 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 95 | }, 96 | "cheerio": { 97 | "version": "1.0.0-rc.2", 98 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", 99 | "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", 100 | "requires": { 101 | "css-select": "1.2.0", 102 | "dom-serializer": "0.1.0", 103 | "entities": "1.1.1", 104 | "htmlparser2": "3.9.2", 105 | "lodash": "4.17.4", 106 | "parse5": "3.0.2" 107 | } 108 | }, 109 | "co": { 110 | "version": "4.6.0", 111 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 112 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 113 | }, 114 | "combined-stream": { 115 | "version": "1.0.5", 116 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 117 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 118 | "requires": { 119 | "delayed-stream": "1.0.0" 120 | } 121 | }, 122 | "commander": { 123 | "version": "2.11.0", 124 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 125 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" 126 | }, 127 | "core-util-is": { 128 | "version": "1.0.2", 129 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 130 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 131 | }, 132 | "cryptiles": { 133 | "version": "2.0.5", 134 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 135 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 136 | "requires": { 137 | "boom": "2.10.1" 138 | } 139 | }, 140 | "css": { 141 | "version": "2.2.1", 142 | "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", 143 | "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", 144 | "requires": { 145 | "inherits": "2.0.3", 146 | "source-map": "0.1.43", 147 | "source-map-resolve": "0.3.1", 148 | "urix": "0.1.0" 149 | } 150 | }, 151 | "css-select": { 152 | "version": "1.2.0", 153 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 154 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 155 | "requires": { 156 | "boolbase": "1.0.0", 157 | "css-what": "2.1.0", 158 | "domutils": "1.5.1", 159 | "nth-check": "1.0.1" 160 | } 161 | }, 162 | "css-what": { 163 | "version": "2.1.0", 164 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", 165 | "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" 166 | }, 167 | "dashdash": { 168 | "version": "1.14.1", 169 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 170 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 171 | "requires": { 172 | "assert-plus": "1.0.0" 173 | }, 174 | "dependencies": { 175 | "assert-plus": { 176 | "version": "1.0.0", 177 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 178 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 179 | } 180 | } 181 | }, 182 | "delayed-stream": { 183 | "version": "1.0.0", 184 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 185 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 186 | }, 187 | "dom-serializer": { 188 | "version": "0.1.0", 189 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 190 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 191 | "requires": { 192 | "domelementtype": "1.1.3", 193 | "entities": "1.1.1" 194 | }, 195 | "dependencies": { 196 | "domelementtype": { 197 | "version": "1.1.3", 198 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 199 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" 200 | } 201 | } 202 | }, 203 | "domelementtype": { 204 | "version": "1.3.0", 205 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 206 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" 207 | }, 208 | "domhandler": { 209 | "version": "2.4.1", 210 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", 211 | "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", 212 | "requires": { 213 | "domelementtype": "1.3.0" 214 | } 215 | }, 216 | "domutils": { 217 | "version": "1.5.1", 218 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 219 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 220 | "requires": { 221 | "dom-serializer": "0.1.0", 222 | "domelementtype": "1.3.0" 223 | } 224 | }, 225 | "ecc-jsbn": { 226 | "version": "0.1.1", 227 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 228 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 229 | "optional": true, 230 | "requires": { 231 | "jsbn": "0.1.0" 232 | } 233 | }, 234 | "ejs": { 235 | "version": "2.5.7", 236 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", 237 | "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" 238 | }, 239 | "entities": { 240 | "version": "1.1.1", 241 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 242 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" 243 | }, 244 | "extend": { 245 | "version": "3.0.1", 246 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 247 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 248 | }, 249 | "extsprintf": { 250 | "version": "1.3.0", 251 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 252 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 253 | }, 254 | "fd-slicer": { 255 | "version": "1.0.1", 256 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 257 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 258 | "requires": { 259 | "pend": "1.2.0" 260 | } 261 | }, 262 | "forever-agent": { 263 | "version": "0.6.1", 264 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 265 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 266 | }, 267 | "form-data": { 268 | "version": "2.1.4", 269 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 270 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 271 | "requires": { 272 | "asynckit": "0.4.0", 273 | "combined-stream": "1.0.5", 274 | "mime-types": "2.1.17" 275 | } 276 | }, 277 | "geoip-native-lite": { 278 | "version": "0.2.0", 279 | "resolved": "https://registry.npmjs.org/geoip-native-lite/-/geoip-native-lite-0.2.0.tgz", 280 | "integrity": "sha1-pt4hth+Bty5qMs0V/u0M7IZxosg=", 281 | "requires": { 282 | "async": "2.1.4", 283 | "commander": "2.9.0", 284 | "ip-address": "5.8.6", 285 | "lazy": "1.0.11", 286 | "mkdirp": "0.5.1", 287 | "underscore": "1.8.3", 288 | "yauzl": "2.7.0" 289 | }, 290 | "dependencies": { 291 | "async": { 292 | "version": "2.1.4", 293 | "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", 294 | "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", 295 | "requires": { 296 | "lodash": "4.17.4" 297 | } 298 | }, 299 | "commander": { 300 | "version": "2.9.0", 301 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 302 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 303 | "requires": { 304 | "graceful-readlink": "1.0.1" 305 | } 306 | } 307 | } 308 | }, 309 | "getpass": { 310 | "version": "0.1.7", 311 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 312 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 313 | "requires": { 314 | "assert-plus": "1.0.0" 315 | }, 316 | "dependencies": { 317 | "assert-plus": { 318 | "version": "1.0.0", 319 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 320 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 321 | } 322 | } 323 | }, 324 | "graceful-readlink": { 325 | "version": "1.0.1", 326 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 327 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 328 | }, 329 | "har-schema": { 330 | "version": "1.0.5", 331 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 332 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 333 | }, 334 | "har-validator": { 335 | "version": "4.2.1", 336 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 337 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", 338 | "requires": { 339 | "ajv": "4.11.8", 340 | "har-schema": "1.0.5" 341 | } 342 | }, 343 | "hawk": { 344 | "version": "3.1.3", 345 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 346 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 347 | "requires": { 348 | "boom": "2.10.1", 349 | "cryptiles": "2.0.5", 350 | "hoek": "2.16.3", 351 | "sntp": "1.0.9" 352 | } 353 | }, 354 | "hoek": { 355 | "version": "2.16.3", 356 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 357 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 358 | }, 359 | "htmlparser2": { 360 | "version": "3.9.2", 361 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", 362 | "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", 363 | "requires": { 364 | "domelementtype": "1.3.0", 365 | "domhandler": "2.4.1", 366 | "domutils": "1.5.1", 367 | "entities": "1.1.1", 368 | "inherits": "2.0.3", 369 | "readable-stream": "2.3.3" 370 | } 371 | }, 372 | "http-signature": { 373 | "version": "1.1.1", 374 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 375 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 376 | "requires": { 377 | "assert-plus": "0.2.0", 378 | "jsprim": "1.4.1", 379 | "sshpk": "1.13.1" 380 | } 381 | }, 382 | "inherits": { 383 | "version": "2.0.3", 384 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 385 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 386 | }, 387 | "ip": { 388 | "version": "1.1.5", 389 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 390 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 391 | }, 392 | "ip-address": { 393 | "version": "5.8.6", 394 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-5.8.6.tgz", 395 | "integrity": "sha1-ZmJ54ho4+cJ0+lA8rPwzn6buSD8=", 396 | "requires": { 397 | "jsbn": "0.1.0", 398 | "lodash.find": "4.6.0", 399 | "lodash.max": "4.0.1", 400 | "lodash.merge": "4.6.0", 401 | "lodash.padstart": "4.6.1", 402 | "lodash.repeat": "4.1.0", 403 | "sprintf-js": "1.1.1", 404 | "util-deprecate": "1.0.2" 405 | } 406 | }, 407 | "is-typedarray": { 408 | "version": "1.0.0", 409 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 410 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 411 | }, 412 | "isarray": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 415 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 416 | }, 417 | "isstream": { 418 | "version": "0.1.2", 419 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 420 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 421 | }, 422 | "jsbn": { 423 | "version": "0.1.0", 424 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", 425 | "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=" 426 | }, 427 | "json-schema": { 428 | "version": "0.2.3", 429 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 430 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 431 | }, 432 | "json-stable-stringify": { 433 | "version": "1.0.1", 434 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 435 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 436 | "requires": { 437 | "jsonify": "0.0.0" 438 | } 439 | }, 440 | "json-stringify-safe": { 441 | "version": "5.0.1", 442 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 443 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 444 | }, 445 | "jsonify": { 446 | "version": "0.0.0", 447 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 448 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 449 | }, 450 | "jsprim": { 451 | "version": "1.4.1", 452 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 453 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 454 | "requires": { 455 | "assert-plus": "1.0.0", 456 | "extsprintf": "1.3.0", 457 | "json-schema": "0.2.3", 458 | "verror": "1.10.0" 459 | }, 460 | "dependencies": { 461 | "assert-plus": { 462 | "version": "1.0.0", 463 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 464 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 465 | } 466 | } 467 | }, 468 | "lazy": { 469 | "version": "1.0.11", 470 | "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", 471 | "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" 472 | }, 473 | "lodash": { 474 | "version": "4.17.4", 475 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 476 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 477 | }, 478 | "lodash.find": { 479 | "version": "4.6.0", 480 | "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", 481 | "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=" 482 | }, 483 | "lodash.max": { 484 | "version": "4.0.1", 485 | "resolved": "https://registry.npmjs.org/lodash.max/-/lodash.max-4.0.1.tgz", 486 | "integrity": "sha1-hzVWbGGLNan3YFILSHrnllivE2o=" 487 | }, 488 | "lodash.merge": { 489 | "version": "4.6.0", 490 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", 491 | "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" 492 | }, 493 | "lodash.padstart": { 494 | "version": "4.6.1", 495 | "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", 496 | "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" 497 | }, 498 | "lodash.repeat": { 499 | "version": "4.1.0", 500 | "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-4.1.0.tgz", 501 | "integrity": "sha1-/H3oEx2MisB+S0n3T/6CnR8r7EQ=" 502 | }, 503 | "mime-db": { 504 | "version": "1.30.0", 505 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 506 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 507 | }, 508 | "mime-types": { 509 | "version": "2.1.17", 510 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 511 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 512 | "requires": { 513 | "mime-db": "1.30.0" 514 | } 515 | }, 516 | "minimist": { 517 | "version": "0.0.8", 518 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 519 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 520 | }, 521 | "mkdirp": { 522 | "version": "0.5.1", 523 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 524 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 525 | "requires": { 526 | "minimist": "0.0.8" 527 | } 528 | }, 529 | "nth-check": { 530 | "version": "1.0.1", 531 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", 532 | "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", 533 | "requires": { 534 | "boolbase": "1.0.0" 535 | } 536 | }, 537 | "oauth-sign": { 538 | "version": "0.8.2", 539 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 540 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 541 | }, 542 | "parse5": { 543 | "version": "3.0.2", 544 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", 545 | "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", 546 | "requires": { 547 | "@types/node": "6.0.88" 548 | } 549 | }, 550 | "pend": { 551 | "version": "1.2.0", 552 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 553 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 554 | }, 555 | "performance-now": { 556 | "version": "0.2.0", 557 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 558 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 559 | }, 560 | "process-nextick-args": { 561 | "version": "1.0.7", 562 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 563 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 564 | }, 565 | "proxy-lists": { 566 | "version": "1.14.1", 567 | "resolved": "https://registry.npmjs.org/proxy-lists/-/proxy-lists-1.14.1.tgz", 568 | "integrity": "sha1-/G4klL1zOD7phHJbEouNYAmZKpI=", 569 | "requires": { 570 | "async": "2.5.0", 571 | "cheerio": "1.0.0-rc.2", 572 | "commander": "2.11.0", 573 | "css": "2.2.1", 574 | "geoip-native-lite": "0.2.0", 575 | "request": "2.81.0", 576 | "underscore": "1.8.3", 577 | "xml2js": "0.4.17" 578 | } 579 | }, 580 | "punycode": { 581 | "version": "1.4.1", 582 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 583 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 584 | }, 585 | "qs": { 586 | "version": "6.4.0", 587 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 588 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 589 | }, 590 | "readable-stream": { 591 | "version": "2.3.3", 592 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 593 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 594 | "requires": { 595 | "core-util-is": "1.0.2", 596 | "inherits": "2.0.3", 597 | "isarray": "1.0.0", 598 | "process-nextick-args": "1.0.7", 599 | "safe-buffer": "5.1.1", 600 | "string_decoder": "1.0.3", 601 | "util-deprecate": "1.0.2" 602 | } 603 | }, 604 | "request": { 605 | "version": "2.81.0", 606 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 607 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", 608 | "requires": { 609 | "aws-sign2": "0.6.0", 610 | "aws4": "1.6.0", 611 | "caseless": "0.12.0", 612 | "combined-stream": "1.0.5", 613 | "extend": "3.0.1", 614 | "forever-agent": "0.6.1", 615 | "form-data": "2.1.4", 616 | "har-validator": "4.2.1", 617 | "hawk": "3.1.3", 618 | "http-signature": "1.1.1", 619 | "is-typedarray": "1.0.0", 620 | "isstream": "0.1.2", 621 | "json-stringify-safe": "5.0.1", 622 | "mime-types": "2.1.17", 623 | "oauth-sign": "0.8.2", 624 | "performance-now": "0.2.0", 625 | "qs": "6.4.0", 626 | "safe-buffer": "5.1.1", 627 | "stringstream": "0.0.5", 628 | "tough-cookie": "2.3.2", 629 | "tunnel-agent": "0.6.0", 630 | "uuid": "3.1.0" 631 | } 632 | }, 633 | "resolve-url": { 634 | "version": "0.2.1", 635 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 636 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 637 | }, 638 | "safe-buffer": { 639 | "version": "5.1.1", 640 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 641 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 642 | }, 643 | "sax": { 644 | "version": "1.2.4", 645 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 646 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 647 | }, 648 | "sntp": { 649 | "version": "1.0.9", 650 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 651 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 652 | "requires": { 653 | "hoek": "2.16.3" 654 | } 655 | }, 656 | "source-map": { 657 | "version": "0.1.43", 658 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 659 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 660 | "requires": { 661 | "amdefine": "1.0.1" 662 | } 663 | }, 664 | "source-map-resolve": { 665 | "version": "0.3.1", 666 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", 667 | "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", 668 | "requires": { 669 | "atob": "1.1.3", 670 | "resolve-url": "0.2.1", 671 | "source-map-url": "0.3.0", 672 | "urix": "0.1.0" 673 | } 674 | }, 675 | "source-map-url": { 676 | "version": "0.3.0", 677 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", 678 | "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=" 679 | }, 680 | "sprintf-js": { 681 | "version": "1.1.1", 682 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", 683 | "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" 684 | }, 685 | "sshpk": { 686 | "version": "1.13.1", 687 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 688 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 689 | "requires": { 690 | "asn1": "0.2.3", 691 | "assert-plus": "1.0.0", 692 | "bcrypt-pbkdf": "1.0.1", 693 | "dashdash": "1.14.1", 694 | "ecc-jsbn": "0.1.1", 695 | "getpass": "0.1.7", 696 | "jsbn": "0.1.0", 697 | "tweetnacl": "0.14.5" 698 | }, 699 | "dependencies": { 700 | "assert-plus": { 701 | "version": "1.0.0", 702 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 703 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 704 | } 705 | } 706 | }, 707 | "string_decoder": { 708 | "version": "1.0.3", 709 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 710 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 711 | "requires": { 712 | "safe-buffer": "5.1.1" 713 | } 714 | }, 715 | "stringstream": { 716 | "version": "0.0.5", 717 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 718 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 719 | }, 720 | "tough-cookie": { 721 | "version": "2.3.2", 722 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 723 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 724 | "requires": { 725 | "punycode": "1.4.1" 726 | } 727 | }, 728 | "tunnel-agent": { 729 | "version": "0.6.0", 730 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 731 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 732 | "requires": { 733 | "safe-buffer": "5.1.1" 734 | } 735 | }, 736 | "tweetnacl": { 737 | "version": "0.14.5", 738 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 739 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 740 | "optional": true 741 | }, 742 | "underscore": { 743 | "version": "1.8.3", 744 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", 745 | "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" 746 | }, 747 | "urix": { 748 | "version": "0.1.0", 749 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 750 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 751 | }, 752 | "util-deprecate": { 753 | "version": "1.0.2", 754 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 755 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 756 | }, 757 | "uuid": { 758 | "version": "3.1.0", 759 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 760 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 761 | }, 762 | "verror": { 763 | "version": "1.10.0", 764 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 765 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 766 | "requires": { 767 | "assert-plus": "1.0.0", 768 | "core-util-is": "1.0.2", 769 | "extsprintf": "1.3.0" 770 | }, 771 | "dependencies": { 772 | "assert-plus": { 773 | "version": "1.0.0", 774 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 775 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 776 | } 777 | } 778 | }, 779 | "xml2js": { 780 | "version": "0.4.17", 781 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", 782 | "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", 783 | "requires": { 784 | "sax": "1.2.4", 785 | "xmlbuilder": "4.2.1" 786 | } 787 | }, 788 | "xmlbuilder": { 789 | "version": "4.2.1", 790 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", 791 | "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", 792 | "requires": { 793 | "lodash": "4.17.4" 794 | } 795 | }, 796 | "yauzl": { 797 | "version": "2.7.0", 798 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.7.0.tgz", 799 | "integrity": "sha1-4h2EeGi0lvwp6uwj7of90z6bK84=", 800 | "requires": { 801 | "buffer-crc32": "0.2.13", 802 | "fd-slicer": "1.0.1" 803 | } 804 | } 805 | } 806 | } 807 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "free-proxy-rotator", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "author": "@jaxgeler", 10 | "license": "MIT", 11 | "dependencies": { 12 | "ejs": "^2.5.7", 13 | "ip": "^1.1.5", 14 | "proxy-lists": "^1.14.1" 15 | } 16 | } 17 | --------------------------------------------------------------------------------