├── download_members_asCSV.js ├── download_members_asCSV.txt ├── memberScraper_withLocation_TSVfile.txt └── v2_memberScraper_withLocation_TSVfile.txt /download_members_asCSV.js: -------------------------------------------------------------------------------- 1 | var reg = (o, n) => o ? o[n] : ''; 2 | var cn = (o, s) => o ? o.getElementsByClassName(s) : console.log(o); 3 | var tn = (o, s) => o ? o.getElementsByTagName(s) : console.log(o); 4 | var gi = (o, s) => o ? o.getElementById(s) : console.log(o); 5 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 6 | var rando = (n) => Math.round(Math.random() * n); 7 | var fixCase = (fn)=> fn.replace(/\w\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase() ); 8 | var ele = (t) => document.createElement(t); 9 | var attr = (o, k, v) => o.setAttribute(k, v); 10 | 11 | var a = (l, r) => r.forEach(a => attr(l, a[0], a[1])); 12 | 13 | var fn = (s) => reg(/^\S+/.exec(s),0); 14 | var ln = (s) => reg(/(?<=\s+).+/.exec(s),0); 15 | 16 | 17 | var parseMember = (obj,meetup) => [ 18 | fn(fixCase(obj.name).replace(/,/g, '')), 19 | ln(fixCase(obj.name).replace(/,/g, '')), 20 | obj.role.replace(/,/g, ''), 21 | obj.status.replace(/,/g, ''), 22 | obj.intro.replace(/,/g, '').replace(/\n|\r/g, ''), 23 | obj.title.replace(/,/g,''), 24 | `https://www.meetup.com/${meetup}/members/${obj.id}/`, 25 | obj.joined, 26 | obj.last_visited, 27 | obj.photo ? obj.photo.highres_link : '']; 28 | 29 | 30 | function downloadr(arr2D, filename) { 31 | var data = ''; 32 | arr2D.forEach(row => { 33 | var arrRow = ''; 34 | row.forEach(col => { 35 | col ? arrRow = arrRow + col.toString().replace(/,/g, ' ') + ',' : arrRow = arrRow + ' ,'; 36 | }); 37 | data = data + arrRow + '\r'; 38 | }); 39 | 40 | var file = new Blob([data], { type: 'data:text/plain;charset=utf-8,' }); 41 | if (window.navigator.msSaveOrOpenBlob) { 42 | window.navigator.msSaveOrOpenBlob(file, filename); 43 | } else { 44 | var a = document.createElement('a'), 45 | url = URL.createObjectURL(file); 46 | a.href = url; 47 | a.download = filename; 48 | document.body.appendChild(a); 49 | a.click(); 50 | setTimeout(() => { 51 | document.body.removeChild(a); 52 | window.URL.revokeObjectURL(url); 53 | }, 10); 54 | } 55 | } 56 | 57 | async function getNumberOfMembers(meetup){ 58 | var res = await fetch('https://www.meetup.com/'+meetup+'/members'); 59 | var text = await res.text(); 60 | var doc = new DOMParser().parseFromString(text,'text/html'); 61 | var membersNum = reg(/(?<=All members\s*|membres\s*)[\d,\s]+/.exec(doc.body.innerText),0).replace(/\D+/g,''); 62 | console.log(membersNum) 63 | var memnum = tn(cn(doc,'groupHomeHeaderInfo-memberLink')[0],'span')[0] ? tn(cn(doc,'groupHomeHeaderInfo-memberLink')[0],'span')[0].innerText.replace(/\D+/g,'') : '5000'; 64 | var all_mem_num = memnum ? parseInt(memnum) : 1000; 65 | return all_mem_num; 66 | } 67 | 68 | async function getMembersByPage(meetup,p) { 69 | var res = await fetch(`https://www.meetup.com/mu_api/urlname/members?queries=%28endpoint%3Agroups%2F${meetup}%2Fmembers%2Clist%3A%28dynamicRef%3Alist_groupMembers_${meetup}_all%2Cmerge%3A%28isReverse%3A%21f%29%29%2Cmeta%3A%28method%3Aget%29%2Cparams%3A%28filter%3Aall%2Cpage%3A${p}%29%2Cref%3AgroupMembers_${meetup}_all%29`); 70 | var d = await res.json(); 71 | console.log(d); 72 | return d; 73 | } 74 | var containArr = [['First Name','Last Name','Role','Status','Intro','Title','Member Profile','Join Date','Last Visited','Photo Link']]; 75 | 76 | function createLoadingHTML(){ 77 | var contid = gi(document,'meetup_scraper_status'); 78 | if(contid) contid.outerHTML = ''; 79 | var cont = ele('div'); 80 | a(cont,[['id','meetup_scraper_status'],['style',`position: fixed; top: 100px; left: 40%; padding: 16px; background: #070f1c; color: #fff; border-radius: 0.4em;`]]); 81 | document.body.appendChild(cont); 82 | cont.innerText = 'initializing...'; 83 | } 84 | 85 | async function looper(){ 86 | createLoadingHTML(); 87 | var bgs = ['#228a3e','#1f7335','#185929','#12451f','#0d3317']; 88 | var langCheck = /en-AU|de-DE|es-ES|fr-FR|it-IT|nl-NL|pl-PL|pt-BR|tr-TR|ru-RU|th-TH|ja-JP|ko-KR/.test(window.location.href); 89 | var meetup = langCheck ? reg(/(?<=meetup.com\/[a-z]+-[A-Z]+\/).+?(?=\/)/.exec(window.location.href),0) : reg(/(?<=meetup.com\/).+?(?=\/)/.exec(window.location.href),0); 90 | var num_members = await getNumberOfMembers(meetup); 91 | var contid = gi(document,'meetup_scraper_status'); 92 | contid.innerText = `downloading ${num_members} members...`; 93 | var loopMax = Math.ceil(num_members/30); 94 | console.log(num_members) 95 | for(var i=1; i<=loopMax; i++){ 96 | var r = rando(1200); 97 | var per = Math.ceil(((i*30)/num_members)*100) < 100 ? Math.ceil(((i*30)/num_members)*100) : 100; 98 | contid.innerText = `${per}% complete`; 99 | contid.style.background = bgs[rando(bgs.length)]; 100 | contid.style.transition = `all ${r+1000}ms`; 101 | 102 | var res = await getMembersByPage(meetup,i); 103 | if(res && res.responses && res.responses.length && res.responses[0].value && res.responses[0].value.value.length) res.responses[0].value.value.forEach(el=> containArr.push(parseMember(el,meetup))); 104 | if(res.responses[0].value && res.responses[0].value.value.length == 0 ) {contid.style.opacity = '.1'; contid.style.transition = 'all 222ms'; break;} 105 | console.log(i); 106 | await delay(r+1000); 107 | } 108 | contid.innerText = `100% complete`; 109 | contid.style.opacity = '.01'; 110 | contid.style.transition = 'all 322ms'; 111 | downloadr(containArr, meetup+'_'+new Date().getTime()+'.csv'); 112 | await delay(333); 113 | contid.outerHTML = ''; 114 | } 115 | 116 | looper() 117 | 118 | 119 | /* 120 | //gets the missing location data, but has to be run over each member -- which will take forever. Maybe worth running in collaberation with a dive into LinkedIN data. 121 | async function getMemberPage(url){ 122 | var res = await fetch(url); 123 | var text = await res.text(); 124 | var doc = new DOMParser().parseFromString(text,'text/html'); 125 | var geoElm = cn(doc,'locality')[0] ? cn(doc,'locality')[0].parentElement : null; 126 | var geoName = geoElm ? geoElm.innerText.trim() : ''; 127 | var geoUrl = geoElm ? geoElm.href : ''; 128 | 129 | console.log(geoUrl) 130 | } 131 | 132 | getMemberPage(`https://www.meetup.com/ALE-Atlanta-Linux-Enthusiasts/members/23690981/`) 133 | */ 134 | -------------------------------------------------------------------------------- /download_members_asCSV.txt: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Bvar%20reg%20%3D%20(o%2C%20n)%20%3D%3E%20o%20%3F%20o%5Bn%5D%20%3A%20''%3Bvar%20cn%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementsByClassName(s)%20%3A%20console.log(o)%3Bvar%20tn%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementsByTagName(s)%20%3A%20console.log(o)%3Bvar%20gi%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementById(s)%20%3A%20console.log(o)%3Bvar%20delay%20%3D%20(ms)%20%3D%3E%20new%20Promise(res%20%3D%3E%20setTimeout(res%2C%20ms))%3Bvar%20rando%20%3D%20(n)%20%3D%3E%20Math.round(Math.random()%20*%20n)%3Bvar%20fixCase%20%3D%20(fn)%3D%3E%20fn.replace(%2F%5Cw%5CS*%2Fg%2C%20txt%20%3D%3E%20txt.charAt(0).toUpperCase()%20%2B%20txt.substr(1).toLowerCase()%20)%3Bvar%20ele%20%3D%20(t)%20%3D%3E%20document.createElement(t)%3Bvar%20attr%20%3D%20(o%2C%20k%2C%20v)%20%3D%3E%20o.setAttribute(k%2C%20v)%3Bvar%20a%20%3D%20(l%2C%20r)%20%3D%3E%20r.forEach(a%20%3D%3E%20attr(l%2C%20a%5B0%5D%2C%20a%5B1%5D))%3Bvar%20fn%20%3D%20(s)%20%3D%3E%20reg(%2F%5E%5CS%2B%2F.exec(s)%2C0)%3Bvar%20ln%20%3D%20(s)%20%3D%3E%20reg(%2F(%3F%3C%3D%5Cs%2B).%2B%2F.exec(s)%2C0)%3Bvar%20parseMember%20%3D%20(obj%2Cmeetup)%20%3D%3E%20%5Bfn(fixCase(obj.name).replace(%2F%2C%2Fg%2C%20''))%2Cln(fixCase(obj.name).replace(%2F%2C%2Fg%2C%20''))%2Cobj.role.replace(%2F%2C%2Fg%2C%20'')%2Cobj.status.replace(%2F%2C%2Fg%2C%20'')%2Cobj.intro.replace(%2F%2C%2Fg%2C%20'').replace(%2F%5Cn%7C%5Cr%2Fg%2C%20'')%2Cobj.title.replace(%2F%2C%2Fg%2C'')%2C%60https%3A%2F%2Fwww.meetup.com%2F%24%7Bmeetup%7D%2Fmembers%2F%24%7Bobj.id%7D%2F%60%2Cobj.joined%2Cobj.last_visited%2Cobj.photo%20%3F%20obj.photo.highres_link%20%3A%20''%5D%3Bfunction%20downloadr(arr2D%2C%20filename)%20%7Bvar%20data%20%3D%20''%3Barr2D.forEach(row%20%3D%3E%20%7Bvar%20arrRow%20%3D%20''%3Brow.forEach(col%20%3D%3E%20%7Bcol%20%3F%20arrRow%20%3D%20arrRow%20%2B%20col.toString().replace(%2F%2C%2Fg%2C%20'%20')%20%2B%20'%2C'%20%3A%20arrRow%20%3D%20arrRow%20%2B%20'%20%2C'%3B%7D)%3Bdata%20%3D%20data%20%2B%20arrRow%20%2B%20'%5Cr'%3B%7D)%3Bvar%20file%20%3D%20new%20Blob(%5Bdata%5D%2C%20%7B%20%20%20%20type%3A%20'data%3Atext%2Fplain%3Bcharset%3Dutf-8%2C'%20%20%7D)%3Bif%20(window.navigator.msSaveOrOpenBlob)%20%7Bwindow.navigator.msSaveOrOpenBlob(file%2C%20filename)%3B%7D%20else%20%7Bvar%20a%20%3D%20document.createElement('a')%2Curl%20%3D%20URL.createObjectURL(file)%3Ba.href%20%3D%20url%3Ba.download%20%3D%20filename%3Bdocument.body.appendChild(a)%3Ba.click()%3BsetTimeout(()%20%3D%3E%20%7Bdocument.body.removeChild(a)%3Bwindow.URL.revokeObjectURL(url)%3B%7D%2C%2010)%3B%7D%7Dasync%20function%20getNumberOfMembers(meetup)%7Bvar%20res%20%3D%20await%20fetch('https%3A%2F%2Fwww.meetup.com%2F'%2Bmeetup%2B'%2Fmembers')%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C'text%2Fhtml')%3Bvar%20membersNum%20%3D%20reg(%2F(%3F%3C%3DAll%20members%5Cs*%7Cmembres%5Cs*)%5B%5Cd%2C%5Cs%5D%2B%2F.exec(doc.body.innerText)%2C0).replace(%2F%5CD%2B%2Fg%2C'')%3Bvar%20memnum%20%3D%20tn(cn(doc%2C'groupHomeHeaderInfo-memberLink')%5B0%5D%2C'span')%5B0%5D%20%3F%20tn(cn(doc%2C'groupHomeHeaderInfo-memberLink')%5B0%5D%2C'span')%5B0%5D.innerText.replace(%2F%5CD%2B%2Fg%2C'')%20%3A%20'5000'%3Bvar%20all_mem_num%20%3D%20memnum%20%3F%20parseInt(memnum)%20%3A%201000%3Breturn%20all_mem_num%3B%7Dasync%20function%20getMembersByPage(meetup%2Cp)%20%7Bvar%20res%20%3D%20await%20fetch(%60https%3A%2F%2Fwww.meetup.com%2Fmu_api%2Furlname%2Fmembers%3Fqueries%3D%2528endpoint%253Agroups%252F%24%7Bmeetup%7D%252Fmembers%252Clist%253A%2528dynamicRef%253Alist_groupMembers_%24%7Bmeetup%7D_all%252Cmerge%253A%2528isReverse%253A%2521f%2529%2529%252Cmeta%253A%2528method%253Aget%2529%252Cparams%253A%2528filter%253Aall%252Cpage%253A%24%7Bp%7D%2529%252Cref%253AgroupMembers_%24%7Bmeetup%7D_all%2529%60)%3Bvar%20d%20%3D%20await%20res.json()%3Bconsole.log(d)%3Breturn%20d%3B%7Dvar%20containArr%20%3D%20%5B%5B'First%20Name'%2C'Last%20Name'%2C'Role'%2C'Status'%2C'Intro'%2C'Title'%2C'Member%20Profile'%2C'Join%20Date'%2C'Last%20Visited'%2C'Photo%20Link'%5D%5D%3Bfunction%20createLoadingHTML()%7Bvar%20contid%20%3D%20gi(document%2C'meetup_scraper_status')%3Bif(contid)%20contid.outerHTML%20%3D%20''%3Bvar%20cont%20%3D%20ele('div')%3Ba(cont%2C%5B%5B'id'%2C'meetup_scraper_status'%5D%2C%5B'style'%2C%60position%3A%20fixed%3B%20top%3A%20100px%3B%20left%3A%2040%25%3B%20padding%3A%2016px%3B%20background%3A%20%23070f1c%3B%20color%3A%20%23fff%3B%20border-radius%3A%200.4em%3B%60%5D%5D)%3Bdocument.body.appendChild(cont)%3Bcont.innerText%20%3D%20'initializing...'%3B%7Dasync%20function%20looper()%7BcreateLoadingHTML()%3Bvar%20bgs%20%3D%20%5B'%23228a3e'%2C'%231f7335'%2C'%23185929'%2C'%2312451f'%2C'%230d3317'%5D%3Bvar%20langCheck%20%3D%20%2Fen-AU%7Cde-DE%7Ces-ES%7Cfr-FR%7Cit-IT%7Cnl-NL%7Cpl-PL%7Cpt-BR%7Ctr-TR%7Cru-RU%7Cth-TH%7Cja-JP%7Cko-KR%2F.test(window.location.href)%3Bvar%20meetup%20%3D%20langCheck%20%3F%20reg(%2F(%3F%3C%3Dmeetup.com%5C%2F%5Ba-z%5D%2B-%5BA-Z%5D%2B%5C%2F).%2B%3F(%3F%3D%5C%2F)%2F.exec(window.location.href)%2C0)%20%3A%20reg(%2F(%3F%3C%3Dmeetup.com%5C%2F).%2B%3F(%3F%3D%5C%2F)%2F.exec(window.location.href)%2C0)%3Bvar%20num_members%20%3D%20await%20getNumberOfMembers(meetup)%3Bvar%20contid%20%3D%20gi(document%2C'meetup_scraper_status')%3Bcontid.innerText%20%3D%20%60downloading%20%24%7Bnum_members%7D%20members...%60%3Bvar%20loopMax%20%3D%20Math.ceil(num_members%2F30)%3Bfor(var%20i%3D1%3B%20i%3C%3DloopMax%3B%20i%2B%2B)%7Bvar%20r%20%3D%20rando(1200)%3Bvar%20per%20%3D%20Math.ceil(((i*30)%2Fnum_members)*100)%20%3C%20100%20%3F%20Math.ceil(((i*30)%2Fnum_members)*100)%20%3A%20100%3Bcontid.innerText%20%3D%20%60%24%7Bper%7D%25%20complete%60%3Bcontid.style.background%20%3D%20bgs%5Brando(bgs.length)%5D%3Bcontid.style.transition%20%3D%20%60all%20%24%7Br%2B1000%7Dms%60%3Bvar%20res%20%3D%20await%20getMembersByPage(meetup%2Ci)%3Bif(res%20%26%26%20res.responses%20%26%26%20res.responses.length%20%26%26%20res.responses%5B0%5D.value%20%26%26%20res.responses%5B0%5D.value.value.length)%20res.responses%5B0%5D.value.value.forEach(el%3D%3E%20containArr.push(parseMember(el%2Cmeetup)))%3Bif(res.responses%5B0%5D.value%20%26%26%20res.responses%5B0%5D.value.value.length%20%3D%3D%200%20)%20%7Bcontid.style.opacity%20%3D%20'.1'%3B%20contid.style.transition%20%3D%20'all%20222ms'%3B%20break%3B%7Dconsole.log(i)%3Bawait%20delay(r%2B1000)%3B%7Dcontid.innerText%20%3D%20%60100%25%20complete%60%3Bcontid.style.opacity%20%3D%20'.01'%3Bcontid.style.transition%20%3D%20'all%20322ms'%3Bdownloadr(containArr%2C%20meetup%2B'_'%2Bnew%20Date().getTime()%2B'.csv')%3Bawait%20delay(333)%3Bcontid.outerHTML%20%3D%20''%3B%7Dlooper()%7D)() 2 | -------------------------------------------------------------------------------- /memberScraper_withLocation_TSVfile.txt: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Bvar%20reg%20%3D%20(o%2C%20n)%20%3D%3E%20o%20%3F%20o%5Bn%5D%20%3A%20''%3Bvar%20cn%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementsByClassName(s)%20%3A%20console.log(o)%3Bvar%20tn%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementsByTagName(s)%20%3A%20console.log(o)%3Bvar%20gi%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementById(s)%20%3A%20console.log(o)%3Bvar%20delay%20%3D%20(ms)%20%3D%3E%20new%20Promise(res%20%3D%3E%20setTimeout(res%2C%20ms))%3Bvar%20rando%20%3D%20(n)%20%3D%3E%20Math.round(Math.random()%20*%20n)%3Bvar%20ele%20%3D%20(t)%20%3D%3E%20document.createElement(t)%3Bvar%20attr%20%3D%20(o%2C%20k%2C%20v)%20%3D%3E%20o.setAttribute(k%2C%20v)%3Bvar%20a%20%3D%20(l%2C%20r)%20%3D%3E%20r.forEach(a%20%3D%3E%20attr(l%2C%20a%5B0%5D%2C%20a%5B1%5D))%3Bvar%20tsvready%20%3D%20(s)%20%3D%3E%20s%20%3F%20s.replace(%2F%5Ct%7C%5Cu0009%2Fg%2C%20'%20').replace(%2F%5Cr%7C%5Cn%2Fg%2C%20'%E2%86%B5').replace(%2F%22%2Fg%2C%20%22'%22)%20%3A%20s%3Bvar%20fixNameCase%20%3D%20(s)%20%3D%3E%20s.split(%2F(%3F%3D%5B%5E%C3%A1%C3%A0%C3%A2%C3%A4%C3%A3%C3%A5%C3%81%C3%80%C3%82%C3%84%C3%83%C3%A6%C3%A9%C3%A8%C3%AA%C3%AB%C3%89%C3%88%C3%8A%C3%8B%C3%AD%C3%AC%C3%AE%C3%AF%C3%B1%C3%91%C3%B3%C3%B2%C3%B4%C3%B6%C3%B5%C3%B8%C5%93%C3%93%C3%92%C3%94%C3%96%C3%95%C3%98%C5%92%C3%9F%C3%9A%C3%99%C3%9B%C3%9C%C3%BA%C3%B9%C3%BB%C3%BCa-zA-Z%5D)%5Cb%2F).map(el%3D%3E%20el.replace(%2F%5Cw%5CS*%2Fg%2C%20txt%3D%3E%20txt.charAt(0).toUpperCase()%20%2B%20txt.substr(1).toLowerCase())).join('').replace(%2F(%3F%3C%3D%5CbMc)%5Cw%2Fig%2C%20t%3D%3E%20t.charAt(0).toUpperCase())%3Bvar%20reChar%20%3D%20(s)%20%3D%3E%20typeof%20s%20%3D%3D%20'string'%20%26%26%20s.match(%2F%26%23%5Cd%2B%3B%2Fg)%20%26%26%20s.match(%2F%26%23%5Cd%2B%3B%2Fg).length%20%3E%200%20%3F%20s.match(%2F%26%23%5Cd%2B%3B%2Fg).map(el%20%3D%3E%20%5Bel%2C%20String.fromCharCode(reg(%2F(%3F%3C%3D%26%23).%2B%3F(%3F%3D%3B)%2F.exec(el)%2C0))%5D).map(m%20%3D%3E%20s%20%3D%20s.replace(new%20RegExp(m%5B0%5D%2C%20'i')%2C%20m%5B1%5D)).pop()%20%3A%20s%3Bfunction%20splitFullName(s)%7Breturn%20%7Bfirst_name%3A%20reg(%2F%5E%5CS%2B%2F.exec(s)%2C0)%2Clast_name%3A%20%2F%5Cs%2B%2F.test(s)%20%3F%20reg(%2F(%3F%3C%3D%5CS%2B%5Cs%2B).%2B%2F.exec(s)%2C0)%20%3A%20''%2C%7D%7Dfunction%20parseMemberDetail(res%2Cmeetup)%7Bvar%20obj%20%3D%20res%20%26%26%20res.responses%20%26%26%20res.responses.length%20%26%26%20res.responses.filter(el%3D%3E%20%2FmemberProfile%2F.test(el.ref))%20%3F%20res.responses.filter(el%3D%3E%20%2FmemberProfile%2F.test(el.ref))%5B0%5D%20%3A%20null%3Bvar%20val%20%3D%20obj%20%26%26%20obj.value%20%3F%20obj.value%20%3A%20null%3Bvar%20full_name%20%3D%20val%20%26%26%20val.name%20%3F%20fixNameCase(reChar(tsvready(val.name)))%20%3A%20''%3Bvar%20full_name_ob%20%3D%20splitFullName(full_name)%3Bvar%20output%20%3D%20%7Bfirst_name%3A%20full_name_ob.first_name%2Clast_name%3A%20full_name_ob.last_name%2Cid%3A%20val%20%26%26%20val.id%20%3F%20val.id%20%3A%20''%2Cmember_profile%3A%20val%20%26%26%20val.id%20%3F%20%60https%3A%2F%2Fwww.meetup.com%2F%24%7Bmeetup%7D%2Fmembers%2F%24%7Bval.id%7D%2F%60%20%3A%20''%2Cfull_name%3A%20full_name%2Ccity%3A%20val%20%26%26%20val.city%20%3F%20reChar(tsvready(val.city))%20%3A%20''%2Cstate%3A%20val%20%26%26%20val.state%20%3F%20reChar(tsvready(val.state))%20%3A%20''%2Cgroup_role%3A%20val%20%26%26%20val.role%20%3F%20reChar(tsvready(val.role))%20%3A%20''%2Ctitle%3A%20val%20%26%26%20val.title%20%3F%20reChar(tsvready(val.title))%20%3A%20''%2Cjoined%3A%20val%20%26%26%20val.joined%20%3F%20val.joined%20%3A%20''%2Clast_visited%3A%20val%20%26%26%20val.last_visited%20%3F%20val.last_visited%20%3A%20''%2Cphoto%3A%20val%20%26%26%20val.photo%20%26%26%20val.photo.highres_link%20%3F%20val.photo.highres_link%20%3A%20''%2Cshared_groups%3A%20val%20%26%26%20val.self%20%26%26%20val.self.social%20%26%26%20val.self.social.commonChapters%20%26%26%20val.self.social.commonChapters.length%20%3F%20val.self.social.commonChapters.map(g%3D%3E%20%7Breturn%20%7Bgroup_id%3A%20g.id%2C%20group_name%3A%20g.name%2C%20url_path%3A%20g.urlname%7D%7D)%20%3A%20%5B%5D%2Cmember_questions%3A%20val%20%26%26%20val.profileQuestionsAnswers%20%26%26%20val.profileQuestionsAnswers.length%20%3F%20val.profileQuestionsAnswers.map(p%3D%3E%20%7Breturn%20%7Bquestion%3A%20reChar(tsvready(p.question))%2C%20answer%3A%20reChar(tsvready(p.answer))%7D%7D)%20%3A%20%5B%5D%2C%7D%3Breturn%20output%3B%7Dasync%20function%20getMemberDetail(obj)%7Bvar%20url%20%3D%20%60https%3A%2F%2Fwww.meetup.com%2Fmu_api%2Furlname%2Fmembers%2FmemberId%2Fprofile%3Fqueries%3D%2528endpoint%253Agroups%252F%24%7Bobj.group_name%7D%252Fprofile%252F%24%7Bobj.member_id%7D%252Cmeta%253A%2528method%253Aget%2529%252Cparams%253A%2528fields%253Aself%2529%252Cref%253AmemberProfile_%24%7Bobj.group_name%7D_%24%7Bobj.member_id%7D%2529%252C%2528endpoint%253A%24%7Bobj.group_name%7Ds%252Frsvps%252Fhistory%252F%24%7Bobj.member_id%7D%252Cmeta%253A%2528method%253Aget%2529%252Cref%253AprofileRSVP_%24%7Bobj.group_name%7D_%24%7Bobj.member_id%7D%2529%26metadata%3DclickTracking%253A%2521t%252Clogout%253A%2521f%252Creferrer%253A%252F%24%7Bobj.group_name%7D%252Fmembers%252F%252CretainRefs%253A%2521%2528self%252Cheaders%252Cgroup%2529%60%3Bvar%20res%20%3D%20await%20fetch(url)%3Bvar%20d%20%3D%20await%20res.json()%3Breturn%20%7Bdata%3Ad%2C%20time%3A%20new%20Date().getTime()%7D%3B%7Dasync%20function%20getNumberOfMembers(meetup)%7Bvar%20res%20%3D%20await%20fetch('https%3A%2F%2Fwww.meetup.com%2F'%2Bmeetup%2B'%2Fmembers')%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C'text%2Fhtml')%3Bvar%20membersNum%20%3D%20reg(%2F(%3F%3C%3DAll%20members%5Cs*%7Cmembres%5Cs*)%5B%5Cd%2C%5Cs%5D%2B%2F.exec(doc.body.innerText)%2C0).replace(%2F%5CD%2B%2Fg%2C'')%3Bvar%20memnum%20%3D%20tn(cn(doc%2C'groupHomeHeaderInfo-memberLink')%5B0%5D%2C'span')%5B0%5D%20%3F%20tn(cn(doc%2C'groupHomeHeaderInfo-memberLink')%5B0%5D%2C'span')%5B0%5D.innerText.replace(%2F%5CD%2B%2Fg%2C'')%20%3A%20'5000'%3Bvar%20all_mem_num%20%3D%20memnum%20%3F%20parseInt(memnum)%20%3A%201000%3Breturn%20all_mem_num%3B%7Dasync%20function%20getMembersByPage(meetup%2Cp)%20%7Bvar%20res%20%3D%20await%20fetch(%60https%3A%2F%2Fwww.meetup.com%2Fmu_api%2Furlname%2Fmembers%3Fqueries%3D%2528endpoint%253Agroups%252F%24%7Bmeetup%7D%252Fmembers%252Clist%253A%2528dynamicRef%253Alist_groupMembers_%24%7Bmeetup%7D_all%252Cmerge%253A%2528isReverse%253A%2521f%2529%2529%252Cmeta%253A%2528method%253Aget%2529%252Cparams%253A%2528filter%253Aall%252Cpage%253A%24%7Bp%7D%2529%252Cref%253AgroupMembers_%24%7Bmeetup%7D_all%2529%60)%3Bvar%20d%20%3D%20await%20res.json()%3Bconsole.log(d)%3Breturn%20d%3B%7Dfunction%20createDownloadHTML()%20%7Bif%20(gi(document%2C%20'downloading_notifier'))%20gi(document%2C%20'downloading_notifier').outerHTML%20%3D%20''%3Bvar%20cont%20%3D%20ele('div')%3Ba(cont%2C%20%5B%5B'id'%2C%20'downloading_notifier'%5D%2C%20%5B'style'%2C%20%60position%3A%20fixed%3B%20top%3A%20100px%3B%20left%3A%2010%25%3B%20width%3A%20550px%3B%20z-index%3A%20%24%7Bnew%20Date().getTime()%7D%3B%20background%3A%20%23121212%3B%20border%3A%201px%20solid%20%233de367%3B%20border-radius%3A%200.2em%3B%60%5D%5D)%3Bdocument.body.appendChild(cont)%3Bvar%20perc%20%3D%20ele('div')%3Ba(perc%2C%20%5B%5B'id'%2C%20'downloading_percentage_bar'%5D%2C%20%5B'style'%2C%20%60transition%3A%20all%201.5s%3B%20width%3A%200px%3B%20height%3A%2050px%3B%20background%3A%20%233de367%3B%20border%3A%201px%20solid%20%233de367%3B%20border-bottom-right-radius%3A%200.2em%3B%20border-top-right-radius%3A%200.2em%3B%60%5D%5D)%3Bcont.appendChild(perc)%3Bvar%20txt%20%3D%20ele('div')%3Ba(txt%2C%20%5B%5B'id'%2C%20'downloading_percentage_txt'%5D%2C%20%5B'style'%2C%20%60float%3A%20left%3B%20padding%3A%2014px%3B%20color%3A%20%23fff%3B%20width%3A%20550px%3B%60%5D%5D)%3Bperc.appendChild(txt)%3Btxt.innerText%20%3D%20'initiating%20download...'%3B%7Dfunction%20msToTime(s)%20%7Bvar%20ms%20%3D%20s%20%25%201000%3Bs%20%3D%20(s%20-%20ms)%20%2F%201000%3Bvar%20secs%20%3D%20s%20%25%2060%3Bs%20%3D%20(s%20-%20secs)%20%2F%2060%3Bvar%20secs_%20%3D%20%2F%5Cd%5Cd%2F.test(secs.toString())%20%3F%20secs.toString()%20%3A%20'0'%2Bsecs.toString()%3Bvar%20mins%20%3D%20s%20%25%2060%3Bvar%20mins_%20%3D%20%2F%5Cd%5Cd%2F.test(mins.toString())%20%3F%20mins.toString()%20%3A%20'0'%2Bmins.toString()%3Bvar%20hrs%20%3D%20(s%20-%20mins)%20%2F%2060%3Bvar%20hrs_%20%3D%20%2F%5Cd%5Cd%2F.test(hrs.toString())%20%3F%20hrs.toString()%20%3A%20'0'%2Bhrs.toString()%3Breturn%20hrs_%2B'%3A'%2Bmins_%2B'%3A'%2Bsecs_%3B%7Dvar%20time_estimate_containArr%20%3D%20%5B%5D%3Bvar%20full_member_conatinArr%20%3D%20%5B%5D%3Basync%20function%20getAllMembersFromGroup()%7BcreateDownloadHTML()%3Bvar%20langCheck%20%3D%20%2Fen-AU%7Cde-DE%7Ces-ES%7Cfr-FR%7Cit-IT%7Cnl-NL%7Cpl-PL%7Cpt-BR%7Ctr-TR%7Cru-RU%7Cth-TH%7Cja-JP%7Cko-KR%2F.test(window.location.href)%3Bvar%20meetup%20%3D%20langCheck%20%3F%20reg(%2F(%3F%3C%3Dmeetup.com%5C%2F%5Ba-z%5D%2B-%5BA-Z%5D%2B%5C%2F).%2B%3F(%3F%3D%5C%2F)%2F.exec(window.location.href)%2C0)%20%3A%20reg(%2F(%3F%3C%3Dmeetup.com%5C%2F).%2B%3F(%3F%3D%5C%2F)%2F.exec(window.location.href)%2C0)%3Bconsole.log(meetup)%3Bvar%20num_members%20%3D%20await%20getNumberOfMembers(meetup)%3Bvar%20status_elm_text%20%3D%20gi(document%2C'downloading_percentage_txt')%3Bstatus_elm_text.innerText%20%3D%20%60downloading%20%24%7Bnum_members%7D%20members...%60%3Bgi(document%2C'downloading_percentage_txt').style.fontFamily%20%3D%20%60%22Lucida%20Console%22%2C%20Monaco%2C%20monospace%60%3Bvar%20loopMax%20%3D%20Math.ceil(num_members%2F30)%3Bfor(var%20i%3D1%3B%20i%3C%3DloopMax%3B%20i%2B%2B)%7Bconsole.log(%5B'iterating%20member%20ids'%2Ci%5D)%3Bvar%20ri%20%3D%20rando(500)%3Bvar%20res%20%3D%20await%20getMembersByPage(meetup%2Ci)%3Bvar%20member_ids%20%3D%20%5B%5D%3Bif%20(res%20%26%26%20res.responses%20%26%26%20res.responses.length%20%26%26%20res.responses%5B0%5D.value%20%26%26%20res.responses%5B0%5D.value.value%20%26%26%20res.responses%5B0%5D.value.value.length)%20%7Bres.responses%5B0%5D.value.value.forEach(el%3D%3E%20%7Bif%20(member_ids.every(ii%3D%3E%20ii%20!%3D%20el.id))%20%7Bmember_ids.push(el.id)%3B%7D%7D)%3B%7Delse%7Bgi(document%2C%20'downloading_percentage_bar').style.width%20%3D%20%60550px%60%3Bgi(document%2C%20'downloading_percentage_bar').style.background%20%3D'%23d10f1c'%3Bgi(document%2C%20'downloading_percentage_txt').innerHTML%20%3D%20'This%20group%20cannot%20be%20scraped'%3Breturn%20false%3B%7Dfor(var%20m%3D0%3B%20m%3Cmember_ids.length%3B%20m%2B%2B)%7Bvar%20mi%20%3D%20rando(300)%3Bif(i%20%3D%3D%201)%7Bvar%20total_milsec_estimate%20%3D%20(num_members%20*%201000)%3Bvar%20milsec_remaining%20%3D%20(total_milsec_estimate%20-%20(full_member_conatinArr.length%20*%201000))%3B%7Delse%7Bvar%20total_milsec_estimate%20%3D%20(num_members%20*%20avg_request_duration)%3Bvar%20milsec_remaining%20%3D%20(total_milsec_estimate%20-%20(full_member_conatinArr.length%20*%20avg_request_duration))%3B%7Dvar%20c_time%20%3D%20new%20Date().getTime()%3Bvar%20memberRes%20%3D%20await%20getMemberDetail(%7Bgroup_name%3A%20meetup%2C%20member_id%3Amember_ids%5Bm%5D%7D)%3Bvar%20elapsed%20%3D%20(memberRes.time%2Bmi%2B200)%20-%20c_time%3Btime_estimate_containArr.push(elapsed)%3Bvar%20memberObj%20%3D%20parseMemberDetail(memberRes.data%2Cmeetup)%3Bfull_member_conatinArr.push(memberObj)%3Bvar%20percent_compeleted%20%3D%20Math.ceil((full_member_conatinArr.length%20%2F%20num_members)%20*%20100)%3Bgi(document%2C%20'downloading_percentage_bar').style.width%20%3D%20%60%24%7B(550%20*%20(full_member_conatinArr.length%20%2F%20num_members))%7Dpx%60%3Bgi(document%2C%20'downloading_percentage_bar').style.background%20%3D%20full_member_conatinArr.length%20%25%202%20%3D%3D%200%20%3F%20'%2307ba5b'%20%3A%20'%233de367'%3Bgi(document%2C%20'downloading_percentage_txt').innerHTML%20%3D%20%60%3Cdiv%3E%24%7Bpercent_compeleted%7D%25%20complete%20--%20time%20remaining%20%20%24%7BmsToTime(milsec_remaining)%7D%3C%2Fdiv%3E%60%3Bawait%20delay(mi%2B200)%3B%7Dvar%20avg_request_duration%20%3D%20time_estimate_containArr.reduce((a%2Cb)%3D%3E%20a%2Bb)%20%2F%20time_estimate_containArr.length%3Bvar%20total_milsec_estimate%20%3D%20(num_members%20*%20avg_request_duration)%3Bvar%20milsec_remaining%20%3D%20(total_milsec_estimate%20-%20(full_member_conatinArr.length%20*%20avg_request_duration))%3Bawait%20delay(ri%2B200)%3B%7Dvar%20dl_filename%20%3D%20%60%24%7Bmeetup%7D.tsv%60%3Bgi(document%2C%20'downloading_percentage_txt').innerHTML%20%3D%20%60Downloading%20as%20%24%7Bdl_filename%7D%60%3Bawait%20delay(2000)%3BconvertToTSV(full_member_conatinArr%2Cmeetup%2B'.tsv')%3Bgi(document%2C'downloading_notifier').outerHTML%20%3D%20''%3B%7Dfunction%20convertToTSV(fileArray%2Cnamed_file)%20%7Bvar%20unq%20%3D%20(arr)%20%3D%3E%20arr.filter((e%2C%20p%2C%20a)%20%3D%3E%20a.indexOf(e)%20%3D%3D%20p)%3Bvar%20firstLevel%20%3D%20fileArray.map(el%20%3D%3E%20Object.entries(el))%3Bvar%20lens%20%3D%20Math.max(...firstLevel.map(el%20%3D%3E%20el.length))%3Bvar%20header%20%3D%20unq(firstLevel.map(el%20%3D%3E%20el.map(itm%20%3D%3E%20itm%5B0%5D)).flat())%3Bvar%20table%20%3D%20%5Bheader%5D%3Bvar%20str%20%3D%20(o)%20%3D%3E%20typeof%20o%20%3D%3D%20'object'%20%3F%20JSON.stringify(o).replace(%2F%5Cn%7C%5Cr%2Fg%2C%20'%20')%20%3A%20o.toString().replace(%2F%5Cn%7C%5Cr%2Fg%2C%20'%20')%3Bfor%20(var%20i%20%3D%200%3B%20i%20%3C%20firstLevel.length%3B%20i%2B%2B)%20%7Bvar%20arr%20%3D%20%5B%5D%3Bvar%20row%20%3D%20%5B%5D%3Bfor%20(var%20s%20%3D%200%3B%20s%20%3C%20firstLevel%5Bi%5D.length%3B%20s%2B%2B)%20%7Bvar%20place%20%3D%20header.indexOf(firstLevel%5Bi%5D%5Bs%5D%5B0%5D)%3Barr%5Bplace%5D%20%3D%20firstLevel%5Bi%5D%5Bs%5D%5B1%5D%3B%7Dfor%20(var%20a%20%3D%200%3B%20a%20%3C%20arr.length%3B%20a%2B%2B)%20%7Bif%20(arr%5Ba%5D)%20%7Brow.push(arr%5Ba%5D)%3B%7D%20else%20%7Brow.push('')%3B%7D%7Dtable.push(row)%3B%7Dfunction%20downloadr(arr2D%2C%20filename)%20%7Bvar%20data%20%3D%20%2F%5C.json%24%7C.js%24%2F.test(filename)%20%3F%20JSON.stringify(arr2D)%20%3A%20arr2D.map(el%20%3D%3E%20el.reduce((a%2C%20b)%20%3D%3E%20a%20%2B%20'%5Ct'%20%2B%20b)).reduce((a%2C%20b)%20%3D%3E%20a%20%2B%20'%5Cr'%20%2B%20b)%3Bvar%20type%20%3D%20%2F%5C.json%24%7C.js%24%2F.test(filename)%20%3F%20'data%3Aapplication%2Fjson%3Bcharset%3Dutf-8%2C'%20%3A%20'data%3Atext%2Fplain%3Bcharset%3Dutf-8%2C'%3Bvar%20file%20%3D%20new%20Blob(%5Bdata%5D%2C%20%7Btype%3A%20type%7D)%3Bif%20(window.navigator.msSaveOrOpenBlob)%20%7Bwindow.navigator.msSaveOrOpenBlob(file%2C%20filename)%3B%7D%20else%20%7Bvar%20a%20%3D%20document.createElement('a')%2Curl%20%3D%20URL.createObjectURL(file)%3Ba.href%20%3D%20url%3Ba.download%20%3D%20filename%3Bdocument.body.appendChild(a)%3Ba.click()%3BsetTimeout(()%20%3D%3E%20%7Bdocument.body.removeChild(a)%3Bwindow.URL.revokeObjectURL(url)%3B%7D%2C%2010)%3B%7D%7Dvar%20output%20%3D%20table.map(el%20%3D%3E%20el.map(itm%20%3D%3E%20str(itm)))%3Bdownloadr(output%2C%20named_file)%3B%7DgetAllMembersFromGroup()%7D)() 2 | -------------------------------------------------------------------------------- /v2_memberScraper_withLocation_TSVfile.txt: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Bvar%20reg%20%3D%20(o%2C%20n)%20%3D%3E%20o%20%3F%20o%5Bn%5D%20%3A%20''%3Bvar%20cn%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementsByClassName(s)%20%3A%20console.log(o)%3Bvar%20tn%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementsByTagName(s)%20%3A%20console.log(o)%3Bvar%20gi%20%3D%20(o%2C%20s)%20%3D%3E%20o%20%3F%20o.getElementById(s)%20%3A%20console.log(o)%3Bvar%20delay%20%3D%20(ms)%20%3D%3E%20new%20Promise(res%20%3D%3E%20setTimeout(res%2C%20ms))%3Bvar%20rando%20%3D%20(n)%20%3D%3E%20Math.round(Math.random()%20*%20n)%3Bvar%20ele%20%3D%20(t)%20%3D%3E%20document.createElement(t)%3Bvar%20attr%20%3D%20(o%2C%20k%2C%20v)%20%3D%3E%20o.setAttribute(k%2C%20v)%3Bvar%20a%20%3D%20(l%2C%20r)%20%3D%3E%20r.forEach(a%20%3D%3E%20attr(l%2C%20a%5B0%5D%2C%20a%5B1%5D))%3Bvar%20tsvready%20%3D%20(s)%20%3D%3E%20s%20%3F%20s.replace(%2F%5Ct%7C%5Cu0009%2Fg%2C%20'%20').replace(%2F%5Cr%7C%5Cn%2Fg%2C%20'%E2%86%B5').replace(%2F%22%2Fg%2C%20%22'%22)%20%3A%20s%3Bvar%20fixNameCase%20%3D%20(s)%20%3D%3E%20s.split(%2F(%3F%3D%5B%5E%C3%A1%C3%A0%C3%A2%C3%A4%C3%A3%C3%A5%C3%81%C3%80%C3%82%C3%84%C3%83%C3%A6%C3%A9%C3%A8%C3%AA%C3%AB%C3%89%C3%88%C3%8A%C3%8B%C3%AD%C3%AC%C3%AE%C3%AF%C3%B1%C3%91%C3%B3%C3%B2%C3%B4%C3%B6%C3%B5%C3%B8%C5%93%C3%93%C3%92%C3%94%C3%96%C3%95%C3%98%C5%92%C3%9F%C3%9A%C3%99%C3%9B%C3%9C%C3%BA%C3%B9%C3%BB%C3%BCa-zA-Z%5D)%5Cb%2F).map(el%3D%3E%20el.replace(%2F%5Cw%5CS*%2Fg%2C%20txt%3D%3E%20txt.charAt(0).toUpperCase()%20%2B%20txt.substr(1).toLowerCase())).join('').replace(%2F(%3F%3C%3D%5CbMc)%5Cw%2Fig%2C%20t%3D%3E%20t.charAt(0).toUpperCase())%3Bvar%20reChar%20%3D%20(s)%20%3D%3E%20typeof%20s%20%3D%3D%20'string'%20%26%26%20s.match(%2F%26%23%5Cd%2B%3B%2Fg)%20%26%26%20s.match(%2F%26%23%5Cd%2B%3B%2Fg).length%20%3E%200%20%3F%20s.match(%2F%26%23%5Cd%2B%3B%2Fg).map(el%20%3D%3E%20%5Bel%2C%20String.fromCharCode(reg(%2F(%3F%3C%3D%26%23).%2B%3F(%3F%3D%3B)%2F.exec(el)%2C0))%5D).map(m%20%3D%3E%20s%20%3D%20s.replace(new%20RegExp(m%5B0%5D%2C%20'i')%2C%20m%5B1%5D)).pop()%20%3A%20s%3Bvar%20unqHsh%20%3D%20(a%2Co)%20%3D%3E%20a.filter(i%3D%3E%20o.hasOwnProperty(i)%20%3F%20false%20%3A%20(o%5Bi%5D%20%3D%20true))%3Bfunction%20splitFullName(s)%7Breturn%20%7Bfirst_name%3A%20reg(%2F%5E%5CS%2B%2F.exec(s)%2C0)%2Clast_name%3A%20%2F%5Cs%2B%2F.test(s)%20%3F%20reg(%2F(%3F%3C%3D%5CS%2B%5Cs%2B).%2B%2F.exec(s)%2C0)%20%3A%20''%2C%7D%7Dasync%20function%20fetchErr(url)%7Bvar%20res1%20%3D%20await%20fetch(url)%3Bif(res1.status%20%3D%3D%20200)%7Bvar%20d1%20%3D%20await%20res1.json()%3Breturn%20d1%3B%7Delse%7Bawait%20delay(1000)%3Bvar%20res2%20%3D%20await%20fetch(url)%3Bif(res2.status%20%3D%3D%20200)%7Bvar%20d2%20%3D%20await%20res2.json()%3Breturn%20d2%3B%7Delse%7Bawait%20delay(3000)%3Bvar%20res3%20%3D%20await%20fetch(url)%3Bif(res3.status%20%3D%3D%20200)%7Bvar%20d3%20%3D%20await%20res3.json()%3Breturn%20d3%3B%7Delse%7Breturn%20%7B%7D%3B%7D%7D%7D%7Dfunction%20parseMemberships(arr)%7Breturn%20arr.map(g%3D%3E%20%7Bdelete%20g.group.key_photo%3Bdelete%20g.group.group_photo%3Breturn%20g.group%3B%7D)%7Dfunction%20parseProfileDetail(res)%7Bvar%20x2%20%3D%20%2F%5Cb%5B%5Cw%5C.%5C-%5C%2B%5D%2B(%5Cs*(%5C%7B%7C%5C(%7C%5C%5B%7C)%5Cs*(AT%7Cat)%5Cs*(%7C%5C%7D%7C%5C)%7C%5C%5D)%5Cs*)%5B%5Cw%5C-%5D%2B(%5C.%7C%5Cs*(%5C%7B%7C%5C(%7C%5C%5B%7C)%5Cs*dot%5Cs*(%7C%5C%7D%7C%5C)%7C%5C%5D)%5Cs*)%5Ba-zA-Z%5D%7B2%2C13%7D(%5C.%5Ba-zA-Z%5D%7B2%2C13%7D%7C%5Cb)%7C%5Cb%5B%5Cw%5C.%5C-%5C%2B%5D%2B(%5Cs*(%7C%5C%7B%7C%5C(%7C%5C%5B)%5Cs*(AT%7Cat)%5Cs*(%5C%7D%7C%5C)%7C%5C%5D%7C)%5Cs*)(gmail%7Chotmail%7Cyahoo)%2Fi%3Bvar%20x1%20%3D%20%2F%5Cb%5B%5Cw%5C.%5C-%5C%2B%5D%2B%40%5B%5Cw%5C-%5D%2B%5C.%5Ba-zA-Z%5D%7B2%2C13%7D(%5C.%5Ba-zA-Z%5D%7B2%2C13%7D%7C%5Cb)%2Fi%3Bvar%20fixEmail%20%3D%20(s)%20%3D%3E%20%7Bvar%20atfix%20%3D%20s.replace(%2F%5Cb%5Cs*(%7C%5C%7B%7C%5C(%7C%5C%5B)%5Cs*(AT%7Cat)%5Cs*(%5C%7D%7C%5C)%7C%5C%5D%7C)%5Cs*%5Cb%2F%2C%20'%40').replace(%2F%5Cb%5Cs*(%5C%7B%7C%5C(%7C%5C%5B%7C)%5Cs*dot%5Cs*(%5C%7D%7C%5C)%7C%5C%5D%7C)%5Cs*%5Cb%2Fi%2C'.')%3Breturn%20x1.test(atfix)%20%3F%20atfix%20%3A%20atfix%2B'.com'%3B%7D%3Bvar%20obj%20%3D%20res%20%26%26%20res.responses%20%26%26%20res.responses.length%20%26%26%20res.responses%5B0%5D%20%3F%20res.responses%5B0%5D%20%3A%20null%3Bvar%20val%20%3D%20obj%20%26%26%20obj.value%20%3F%20obj.value%20%3A%20null%3Bvar%20full_name%20%3D%20val%20%26%26%20val.name%20%3F%20fixNameCase(reChar(tsvready(val.name)))%20%3A%20''%3Bvar%20full_name_ob%20%3D%20splitFullName(full_name)%3Bvar%20bio%20%3D%20val%20%26%26%20val.bio%20%3F%20val.bio%20%3A%20''%3Bvar%20groups_organizer%20%3D%20val%20%26%26%20val.memberships%20%26%26%20val.memberships.organizer%20%26%26%20val.memberships.organizer.length%20%3F%20parseMemberships(val.memberships.organizer)%20%3A%20%5B%5D%3Bvar%20groups_member%20%3D%20val%20%26%26%20val.memberships%20%26%26%20val.memberships.member%20%26%26%20val.memberships.member.length%20%3F%20parseMemberships(val.memberships.member)%20%3A%20%5B%5D%3Bvar%20emailbio%20%3D%20%20val%20%26%26%20val.bio%20%26%26%20x1.test(val.bio)%20%3F%20%5Breg(x1.exec(val.bio)%2C0).toLowerCase()%5D%20%3A%20%5B%5D%3Bvar%20emailbio2%20%3D%20val%20%26%26%20val.bio%20%26%26%20x2.test(val.bio)%20%3F%20%5BfixEmail(reg(x2.exec(val.bio)%2C0)).toLowerCase()%5D%20%3A%20%5B%5D%3Bvar%20emailsob%20%3D%20val%20%26%26%20val.email%20%3F%20%5Bval.email%5D%20%3A%20%5B%5D%3Bvar%20output%20%3D%20%7Bfirst_name%3A%20full_name_ob.first_name%2Clast_name%3A%20full_name_ob.last_name%2Cemails%3A%20emailsob.length%20%7C%7C%20emailbio.length%20%7C%7C%20emailbio2.length%20%3F%20unqHsh(%5B...emailsob%2C...emailbio%2C...emailbio2%5D%2C%7B%7D)%20%3A%20%5B%5D%2Clinkedin%3A%20val%20%26%26%20val.bio%20%26%26%20reg(%2Flinkedin.com%5C%2Fin%5C%2F%5CS%2B%2F.exec(val.bio)%2C0)%20%3F%20'https%3A%2F%2Fwww.'%20%2B%20reg(%2Flinkedin.com%5C%2Fin%5C%2F%5CS%2B%2F.exec(val.bio)%2C0)%20%3A%20''%2Cid%3A%20val%20%26%26%20val.id%20%3F%20val.id%20%3A%20''%2Cmember_profile%3A%20val%20%26%26%20val.id%20%3F%20%60https%3A%2F%2Fwww.meetup.com%2Fmembers%2F%24%7Bval.id%7D%2F%60%20%3A%20''%2Cfull_name%3A%20full_name%2Ccity%3A%20val%20%26%26%20val.city%20%3F%20reChar(tsvready(val.city))%20%3A%20''%2Cstate%3A%20val%20%26%26%20val.state%20%3F%20reChar(tsvready(val.state))%20%3A%20''%2Ccountry%3A%20val%20%26%26%20val.country%20%3F%20reChar(tsvready(val.country))%20%3A%20''%2Clocalized_country_name%3A%20val%20%26%26%20val.localized_country_name%20%3F%20reChar(tsvready(val.localized_country_name))%20%3A%20''%2Cjoined_site%3A%20val%20%26%26%20val.joined%20%3F%20val.joined%20%3A%20''%2Clat%3A%20val%20%26%26%20val.lat%20%3F%20val.lat%20%3A%20''%2Clng%3A%20val%20%26%26%20val.lon%20%3F%20val.lon%20%3A%20''%2Cphoto%3A%20val%20%26%26%20val.photo%20%26%26%20val.photo.photo_link%20%3F%20val.photo.photo_link%20%3A%20''%2Cbio%3A%20bio%2Cgroups_organizer%3A%20groups_organizer%2Cgroups_member%3A%20groups_organizer.length%20%26%26%20groups_member.length%20%3F%20groups_member.filter(g%3D%3E%20groups_organizer.every(r%3D%3E%20r.id%20!%3D%20g.id))%20%3A%20groups_member%2C%7D%3Breturn%20output%3B%7Dasync%20function%20getProfileDetail(id)%7Bvar%20url%20%3D%20%60https%3A%2F%2Fwww.meetup.com%2Fmu_api%2Furlname%2Fmembers%2FmemberId%2Fprofile%3Fqueries%3D%2528endpoint%253Amembers%252F%24%7Bid%7D%252Cmeta%253A%2528method%253Aget%2529%252Cparams%253A%2528fields%253A%2527memberships%252C%2Bprivacy%2527%2529%252Cref%253Aself%252Ctype%253Amember%2529%252C%2528endpoint%253Anoop%252Cflags%253A%2521%2528facebook_login_active%252Cfeature_microtargets_MUP-16377%252Cnwp_event_template_MUP-16782%252Cwework-announce%252Cfeature_google_tag_manager_MUP-19169%2529%252Cmeta%253A%2528metaRequestHeaders%253A%2521%2528unread-notifications%252Cunread-messages%252Cadmin-privileges%252Ctos-query%252Cfacebook-auth-url%252Cgoogle-auth-url%252Capple-auth-url%2529%252Cmethod%253Aget%2529%252Cparams%253A%2528%2529%252Cref%253Aheaders%252Ctype%253Aheaders%2529%26metadata%3DclickTracking%253A%2521t%252Clogout%253A%2521f%252Creferrer%253A%252FAtl-Clj%252Fmembers%252F%252CretainRefs%253A%2521%2528self%252Cheaders%2529%60%3Bvar%20d%20%3D%20await%20fetchErr(url)%3Breturn%20%7Bdata%3Ad%2C%20time%3A%20new%20Date().getTime()%7D%3B%7Dasync%20function%20getNumberOfMembers(meetup)%7Bvar%20res%20%3D%20await%20fetch('https%3A%2F%2Fwww.meetup.com%2F'%2Bmeetup%2B'%2Fmembers')%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C'text%2Fhtml')%3Bvar%20membersNum%20%3D%20reg(%2F(%3F%3C%3DAll%20members%5Cs*%7Cmembres%5Cs*)%5B%5Cd%2C%5Cs%5D%2B%2F.exec(doc.body.innerText)%2C0).replace(%2F%5CD%2B%2Fg%2C'')%3Bvar%20memnum%20%3D%20tn(cn(doc%2C'groupHomeHeaderInfo-memberLink')%5B0%5D%2C'span')%5B0%5D%20%3F%20tn(cn(doc%2C'groupHomeHeaderInfo-memberLink')%5B0%5D%2C'span')%5B0%5D.innerText.replace(%2F%5CD%2B%2Fg%2C'')%20%3A%20'5000'%3Bvar%20all_mem_num%20%3D%20memnum%20%3F%20parseInt(memnum)%20%3A%201000%3Breturn%20all_mem_num%3B%7Dasync%20function%20getMembersByPage(meetup%2Cp)%20%7Bvar%20url%20%3D%20%60https%3A%2F%2Fwww.meetup.com%2Fmu_api%2Furlname%2Fmembers%3Fqueries%3D%2528endpoint%253Agroups%252F%24%7Bmeetup%7D%252Fmembers%252Clist%253A%2528dynamicRef%253Alist_groupMembers_%24%7Bmeetup%7D_all%252Cmerge%253A%2528isReverse%253A%2521f%2529%2529%252Cmeta%253A%2528method%253Aget%2529%252Cparams%253A%2528filter%253Aall%252Cpage%253A%24%7Bp%7D%2529%252Cref%253AgroupMembers_%24%7Bmeetup%7D_all%2529%60%3Bvar%20d%20%3D%20await%20fetchErr(url)%3Bconsole.log(d)%3Breturn%20d%3B%7Dfunction%20createDownloadHTML()%20%7Bif%20(gi(document%2C%20'downloading_notifier'))%20gi(document%2C%20'downloading_notifier').outerHTML%20%3D%20''%3Bvar%20cont%20%3D%20ele('div')%3Ba(cont%2C%20%5B%5B'id'%2C%20'downloading_notifier'%5D%2C%20%5B'style'%2C%20%60position%3A%20fixed%3B%20top%3A%20100px%3B%20left%3A%2010%25%3B%20width%3A%20550px%3B%20z-index%3A%20%24%7Bnew%20Date().getTime()%7D%3B%20background%3A%20%23121212%3B%20border%3A%201px%20solid%20%233de367%3B%20border-radius%3A%200.2em%3B%60%5D%5D)%3Bdocument.body.appendChild(cont)%3Bvar%20perc%20%3D%20ele('div')%3Ba(perc%2C%20%5B%5B'id'%2C%20'downloading_percentage_bar'%5D%2C%20%5B'style'%2C%20%60transition%3A%20all%201.5s%3B%20width%3A%200px%3B%20height%3A%2050px%3B%20background%3A%20%233de367%3B%20border%3A%201px%20solid%20%233de367%3B%20border-bottom-right-radius%3A%200.2em%3B%20border-top-right-radius%3A%200.2em%3B%60%5D%5D)%3Bcont.appendChild(perc)%3Bvar%20txt%20%3D%20ele('div')%3Ba(txt%2C%20%5B%5B'id'%2C%20'downloading_percentage_txt'%5D%2C%20%5B'style'%2C%20%60float%3A%20left%3B%20padding%3A%2014px%3B%20color%3A%20%23fff%3B%20width%3A%20550px%3B%60%5D%5D)%3Bperc.appendChild(txt)%3Btxt.innerText%20%3D%20'initiating%20download...'%3B%7Dfunction%20msToTime(s)%20%7Bvar%20ms%20%3D%20s%20%25%201000%3Bs%20%3D%20(s%20-%20ms)%20%2F%201000%3Bvar%20secs%20%3D%20s%20%25%2060%3Bs%20%3D%20(s%20-%20secs)%20%2F%2060%3Bvar%20secs_%20%3D%20%2F%5Cd%5Cd%2F.test(secs.toString())%20%3F%20secs.toString()%20%3A%20'0'%2Bsecs.toString()%3Bvar%20mins%20%3D%20s%20%25%2060%3Bvar%20mins_%20%3D%20%2F%5Cd%5Cd%2F.test(mins.toString())%20%3F%20mins.toString()%20%3A%20'0'%2Bmins.toString()%3Bvar%20hrs%20%3D%20(s%20-%20mins)%20%2F%2060%3Bvar%20hrs_%20%3D%20%2F%5Cd%5Cd%2F.test(hrs.toString())%20%3F%20hrs.toString()%20%3A%20'0'%2Bhrs.toString()%3Breturn%20hrs_%2B'%3A'%2Bmins_%2B'%3A'%2Bsecs_%3B%7Dvar%20time_estimate_containArr%20%3D%20%5B%5D%3Bvar%20full_member_conatinArr%20%3D%20%5B%5D%3Basync%20function%20getAllMembersFromGroup()%7BcreateDownloadHTML()%3Bvar%20langCheck%20%3D%20%2Fen-AU%7Cde-DE%7Ces-ES%7Cfr-FR%7Cit-IT%7Cnl-NL%7Cpl-PL%7Cpt-BR%7Ctr-TR%7Cru-RU%7Cth-TH%7Cja-JP%7Cko-KR%2F.test(window.location.href)%3Bvar%20meetup%20%3D%20langCheck%20%3F%20reg(%2F(%3F%3C%3Dmeetup.com%5C%2F%5Ba-z%5D%2B-%5BA-Z%5D%2B%5C%2F).%2B%3F(%3F%3D%5C%2F)%2F.exec(window.location.href)%2C0)%20%3A%20reg(%2F(%3F%3C%3Dmeetup.com%5C%2F).%2B%3F(%3F%3D%5C%2F)%2F.exec(window.location.href)%2C0)%3Bconsole.log(meetup)%3Bvar%20num_members%20%3D%20await%20getNumberOfMembers(meetup)%3Bvar%20status_elm_text%20%3D%20gi(document%2C'downloading_percentage_txt')%3Bstatus_elm_text.innerText%20%3D%20%60downloading%20%24%7Bnum_members%7D%20members...%60%3Bgi(document%2C'downloading_percentage_txt').style.fontFamily%20%3D%20%60%22Lucida%20Console%22%2C%20Monaco%2C%20monospace%60%3Bvar%20loopMax%20%3D%20Math.ceil(num_members%2F30)%3Bfor(var%20i%3D1%3B%20i%3C%3DloopMax%3B%20i%2B%2B)%7Bconsole.log(%5B'iterating%20member%20ids'%2Ci%5D)%3Bvar%20ri%20%3D%20rando(500)%3Bvar%20res%20%3D%20await%20getMembersByPage(meetup%2Ci)%3Bvar%20member_ids%20%3D%20%5B%5D%3Bif%20(res%20%26%26%20res.responses%20%26%26%20res.responses.length%20%26%26%20res.responses%5B0%5D.value%20%26%26%20res.responses%5B0%5D.value.value%20%26%26%20res.responses%5B0%5D.value.value.length)%20%7Bres.responses%5B0%5D.value.value.forEach(el%3D%3E%20%7Bif%20(member_ids.every(ii%3D%3E%20ii%20!%3D%20el.id))%20%7Bmember_ids.push(el.id)%3B%7D%7D)%3B%7Dfor(var%20m%3D0%3B%20m%3Cmember_ids.length%3B%20m%2B%2B)%7Bvar%20mi%20%3D%20rando(300)%3Bif(i%20%3D%3D%201)%7Bvar%20total_milsec_estimate%20%3D%20(num_members%20*%201000)%3Bvar%20milsec_remaining%20%3D%20(total_milsec_estimate%20-%20(full_member_conatinArr.length%20*%201000))%3B%7Delse%7Bvar%20total_milsec_estimate%20%3D%20(num_members%20*%20avg_request_duration)%3Bvar%20milsec_remaining%20%3D%20(total_milsec_estimate%20-%20(full_member_conatinArr.length%20*%20avg_request_duration))%3B%7Dvar%20c_time%20%3D%20new%20Date().getTime()%3Bvar%20memberRes%20%3D%20await%20getProfileDetail(member_ids%5Bm%5D)%3Bvar%20elapsed%20%3D%20(memberRes.time%2Bmi%2B200)%20-%20c_time%3Btime_estimate_containArr.push(elapsed)%3Bif(memberRes.data)%7Bvar%20memberObj%20%3D%20parseProfileDetail(memberRes.data)%3Bfull_member_conatinArr.push(memberObj)%3B%7Dvar%20percent_compeleted%20%3D%20Math.ceil((full_member_conatinArr.length%20%2F%20num_members)%20*%20100)%3Bgi(document%2C%20'downloading_percentage_bar').style.width%20%3D%20%60%24%7B(550%20*%20(full_member_conatinArr.length%20%2F%20num_members))%7Dpx%60%3Bgi(document%2C%20'downloading_percentage_bar').style.background%20%3D%20full_member_conatinArr.length%20%25%202%20%3D%3D%200%20%3F%20'%2307ba5b'%20%3A%20'%233de367'%3Bgi(document%2C%20'downloading_percentage_txt').innerHTML%20%3D%20%60%3Cdiv%3E%24%7Bpercent_compeleted%7D%25%20complete%20--%20time%20remaining%20%20%24%7BmsToTime(milsec_remaining)%7D%3C%2Fdiv%3E%60%3Bawait%20delay(mi%2B200)%3B%7Dvar%20avg_request_duration%20%3D%20time_estimate_containArr.reduce((a%2Cb)%3D%3E%20a%2Bb)%20%2F%20time_estimate_containArr.length%3Bvar%20total_milsec_estimate%20%3D%20(num_members%20*%20avg_request_duration)%3Bvar%20milsec_remaining%20%3D%20(total_milsec_estimate%20-%20(full_member_conatinArr.length%20*%20avg_request_duration))%3Bawait%20delay(ri%2B200)%3B%7Dvar%20dl_filename%20%3D%20%60%24%7Bmeetup%7D.tsv%60%3Bgi(document%2C%20'downloading_percentage_txt').innerHTML%20%3D%20%60Downloading%20as%20%24%7Bdl_filename%7D%60%3Bawait%20delay(2000)%3BconvertToTSV(full_member_conatinArr%2Cmeetup%2B'.tsv')%3Bgi(document%2C'downloading_notifier').outerHTML%20%3D%20''%3B%7Dfunction%20convertToTSV(fileArray%2Cnamed_file)%20%7Bvar%20unq%20%3D%20(arr)%20%3D%3E%20arr.filter((e%2C%20p%2C%20a)%20%3D%3E%20a.indexOf(e)%20%3D%3D%20p)%3Bvar%20firstLevel%20%3D%20fileArray.map(el%20%3D%3E%20Object.entries(el))%3Bvar%20lens%20%3D%20Math.max(...firstLevel.map(el%20%3D%3E%20el.length))%3Bvar%20header%20%3D%20unq(firstLevel.map(el%20%3D%3E%20el.map(itm%20%3D%3E%20itm%5B0%5D)).flat())%3Bvar%20table%20%3D%20%5Bheader%5D%3Bvar%20str%20%3D%20(o)%20%3D%3E%20typeof%20o%20%3D%3D%20'object'%20%3F%20JSON.stringify(o).replace(%2F%5Cn%7C%5Cr%2Fg%2C%20'%20')%20%3A%20o.toString().replace(%2F%5Cn%7C%5Cr%2Fg%2C%20'%20')%3Bfor%20(var%20i%20%3D%200%3B%20i%20%3C%20firstLevel.length%3B%20i%2B%2B)%20%7Bvar%20arr%20%3D%20%5B%5D%3Bvar%20row%20%3D%20%5B%5D%3Bfor%20(var%20s%20%3D%200%3B%20s%20%3C%20firstLevel%5Bi%5D.length%3B%20s%2B%2B)%20%7Bvar%20place%20%3D%20header.indexOf(firstLevel%5Bi%5D%5Bs%5D%5B0%5D)%3Barr%5Bplace%5D%20%3D%20firstLevel%5Bi%5D%5Bs%5D%5B1%5D%3B%7Dfor%20(var%20a%20%3D%200%3B%20a%20%3C%20arr.length%3B%20a%2B%2B)%20%7Bif%20(arr%5Ba%5D)%20%7Brow.push(arr%5Ba%5D)%3B%7D%20else%20%7Brow.push('')%3B%7D%7Dtable.push(row)%3B%7Dfunction%20downloadr(arr2D%2C%20filename)%20%7Bvar%20data%20%3D%20%2F%5C.json%24%7C.js%24%2F.test(filename)%20%3F%20JSON.stringify(arr2D)%20%3A%20arr2D.map(el%20%3D%3E%20el.reduce((a%2C%20b)%20%3D%3E%20a%20%2B%20'%5Ct'%20%2B%20b)).reduce((a%2C%20b)%20%3D%3E%20a%20%2B%20'%5Cr'%20%2B%20b)%3Bvar%20type%20%3D%20%2F%5C.json%24%7C.js%24%2F.test(filename)%20%3F%20'data%3Aapplication%2Fjson%3Bcharset%3Dutf-8%2C'%20%3A%20'data%3Atext%2Fplain%3Bcharset%3Dutf-8%2C'%3Bvar%20file%20%3D%20new%20Blob(%5Bdata%5D%2C%20%7Btype%3A%20type%7D)%3Bif%20(window.navigator.msSaveOrOpenBlob)%20%7Bwindow.navigator.msSaveOrOpenBlob(file%2C%20filename)%3B%7D%20else%20%7Bvar%20a%20%3D%20document.createElement('a')%2Curl%20%3D%20URL.createObjectURL(file)%3Ba.href%20%3D%20url%3Ba.download%20%3D%20filename%3Bdocument.body.appendChild(a)%3Ba.click()%3BsetTimeout(()%20%3D%3E%20%7Bdocument.body.removeChild(a)%3Bwindow.URL.revokeObjectURL(url)%3B%7D%2C%2010)%3B%7D%7Dvar%20output%20%3D%20table.map(el%20%3D%3E%20el.map(itm%20%3D%3E%20str(itm)))%3Bdownloadr(output%2C%20named_file)%3B%7DgetAllMembersFromGroup()%7D)() 2 | --------------------------------------------------------------------------------