build-dns-china.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. const https = require('https');
  2. let ALEXA_TOP_LIMIT = 10000;
  3. let unzip, csv2, es;
  4. try {
  5. unzip = require('unzip-stream');
  6. csv2 = require('csv2');
  7. es = require('event-stream');
  8. } catch (e) {
  9. console.log('Dependencies not found');
  10. console.log('"npm i unzip-stream event-stream csv2" then try again!');
  11. console.error(e);
  12. process.exit(1);
  13. }
  14. (async () => {
  15. const alexaTopDomains = (await fetchAlexaTopDomains()).sort();
  16. const dnsmasqconfDomains = await fetchAndParseDnsmasqDomains(alexaTopDomains);
  17. console.log(dnsmasqconfDomains.length);
  18. })();
  19. function fetchAlexaTopDomains() {
  20. const data = [];
  21. return new Promise((resolve, reject) => {
  22. const req = https.request(
  23. {
  24. hostname: 's3.amazonaws.com',
  25. path: '/alexa-static/top-1m.csv.zip',
  26. method: 'GET',
  27. },
  28. (res) => {
  29. res
  30. .pipe(unzip.Parse())
  31. .on('entry', (entry) => {
  32. entry.pipe(csv2()).on('data', ([top, domain]) => {
  33. if (top < ALEXA_TOP_LIMIT) {
  34. data.push(domain);
  35. }
  36. });
  37. });
  38. res.on('end', () => {
  39. try {
  40. resolve(data);
  41. } catch (e) {
  42. reject(e);
  43. }
  44. });
  45. req.on('error', (err) => {
  46. reject(err);
  47. });
  48. }
  49. );
  50. req.end();
  51. })
  52. }
  53. function fetchAndParseDnsmasqDomains(alexaTopDomains) {
  54. const data = [];
  55. return new Promise((resolve, reject) => {
  56. const req = https.request(
  57. {
  58. hostname: 'raw.githubusercontent.com',
  59. path: '/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf',
  60. method: 'GET',
  61. },
  62. (res) => {
  63. const s = res
  64. .pipe(es.split())
  65. .pipe(es.mapSync(line => {
  66. s.pause();
  67. const domain = line
  68. .replaceAll('server=/', '')
  69. .replaceAll('/114.114.114.114', '');
  70. if (alexaTopDomains.includes(domain)) {
  71. console.log(domain);
  72. data.push(domain);
  73. }
  74. s.resume();
  75. }))
  76. .on('error', reject)
  77. .on('end', () => {
  78. resolve(data);
  79. });
  80. res.on('error', reject);
  81. }
  82. );
  83. req.end();
  84. })
  85. }