├── SearchResultsEnhancer.js ├── bookmarklet_stargazersByLocation.txt ├── bookmarklet_usersearch.txt ├── downloadFollowers.js ├── download_csv_of_senior_contributors.js ├── getForkersByLocation.js ├── getForkersByLocation_bookmarklet.txt ├── getProfileAsObject.js ├── githubEmail.txt ├── github_custom_Search ├── code_search_scraper.js ├── fromSearch │ └── getProfilesFromAdvancedUserSearch.js ├── getPathsFromCurrentSearch.js ├── getProfileDetails.js ├── getUserPathsBy_LangGeo.js ├── langs.json └── testSearch.js ├── starGazerSearchByLocation.js └── usersearch.js /SearchResultsEnhancer.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 rando = (n) => Math.round(Math.random() * n); 6 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 7 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 8 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 9 | var ele = (t) => document.createElement(t); 10 | var attr = (o, k, v) => o.setAttribute(k, v); 11 | 12 | var dateString = (s) => new Date(s).toString().replace(/^\S+/, '').replace(/\d\d:\d\d.+/, '').trim().replace(/(?<=[a-zA-Z]{3})\s\d+/, ''); 13 | var parseYearMonths = (n) => { 14 | var m = n / 2629800000; 15 | var years = Math.trunc(m / 12); 16 | var months = Math.round(12 * ((m / 12) - years)); 17 | var str = months && years ? `${years} yr${years>1?'s':''} ${months} mo${months>1?'s':''}` : years && months == 0 ? `${years} year${years>1?'s':''}` : `${months} month${months>1?'s':''}`; 18 | return str; 19 | }; 20 | 21 | var svgs = { 22 | li: `` 23 | }; 24 | 25 | function mapLangPerc(arr) { 26 | var containArr = []; 27 | var obj = {}; 28 | var langs = unq(arr.map(el => el.lang).filter(el => el != '')).forEach(el => obj[el] = []); 29 | for (var i = 0; i < arr.length; i++) { 30 | var obs = Object.entries(obj); 31 | for (var o = 0; o < obs.length; o++) { 32 | if (arr[i].lang == obs[o][0]) { 33 | obs[o][1].push(arr[i].time) 34 | } 35 | } 36 | } 37 | var obe = Object.entries(obj); 38 | var total = obe.map(el => el[1].length).reduce((a, b) => a + b); 39 | for (var i = 0; i < obe.length; i++) { 40 | var earliest = Math.min(...obe[i][1]); 41 | var latest = Math.max(...obe[i][1]); 42 | var duration = parseYearMonths(latest - earliest); 43 | var perc = Math.round((obe[i][1].length / total) * 10000) / 100; 44 | var out = { 45 | lang: obe[i][0], 46 | percent: perc, 47 | start: dateString(earliest), 48 | end: dateString(latest), 49 | duration: duration 50 | }; 51 | containArr.push(out) 52 | } 53 | console.log(containArr) 54 | return containArr.sort((a, b) => a.percent - b.percent).reverse(); 55 | } 56 | 57 | var cleanObject = (ob) => 58 | Object.entries(ob).reduce((r, [k, v]) => { 59 | if (v) { 60 | r[k] = v; 61 | return r; 62 | } else { 63 | return r; 64 | } 65 | }, {}); 66 | 67 | async function getPatches(link) { 68 | var res = await fetch(link); 69 | var html = await res.text(); 70 | var email = reg(/\b[\w\.\-\+]+@[\w\-]+\.[a-zA-Z]{2,13}(\.[a-zA-Z]{2,13}|\b)/.exec(html.replace(/\w+@users.noreply.github.com|\+.+?(?=@)/g, '')), 0); 71 | var check = /users.noreply.github.com|@users.noreply.github/i.test(email) ? '' : email; 72 | return check; 73 | } 74 | 75 | async function getProfileRepoData(url) { 76 | var res = await fetch(url); 77 | var text = await res.text(); 78 | var doc = new DOMParser().parseFromString(text, 'text/html'); 79 | return doc; 80 | } 81 | 82 | function parseRepo(doc, type) { 83 | return Array.from(cn(doc, `col-12 d-flex width-full py-4 border-bottom public ${type}`)).map(el => { 84 | var stars = cn(el, 'octicon-star')[0] ? cn(el, 'octicon-star')[0].parentElement.innerText.trim() : 0; 85 | return { 86 | repo: reg(/(?<=github.com\/.+?\/).+?$/.exec(tn(el, 'a')[0].href), 0), 87 | lang: cn(el, 'ml-0 mr-3')[0] ? cn(el, 'ml-0 mr-3')[0].innerText.trim() : '', 88 | time: tn(el, 'relative-time')[0] ? new Date(tn(el, 'relative-time')[0].getAttribute('datetime')).getTime() : 0, 89 | stars: stars == 'Unstar' ? 0 : parseInt(stars.replace(/\D+/g, '')), 90 | forks: cn(el, 'octicon octicon-repo-forked')[0] ? parseInt(cn(el, 'octicon octicon-repo-forked')[0].parentElement.innerText.trim().replace(/\D+/g, '')) : 0 91 | }; 92 | }); 93 | } 94 | 95 | function getFollowCounts(elm, type) { 96 | var follower_a = Array.from(tn(elm, 'a')).filter(el => type.test(el.innerText))[0]; 97 | var follower_s = follower_a ? cn(follower_a, 'Counter') : null; 98 | var followerCount = follower_s && follower_s[0] ? parseInt(follower_s[0].innerText.trim()) : 0; 99 | return followerCount; 100 | } 101 | 102 | async function loopThroughRepos(path) { 103 | var prop = (arr, str) => arr.filter(el => el.getAttribute('itemprop') == str).map(el => el ? el.innerText.trim() : ''); 104 | var res = await getProfileRepoData(`https://github.com/${path}?tab=repositories`); 105 | var mainDoc = res; //await getProfileRepoData(`https://github.com/${path}`); 106 | var owns = parseRepo(res, 'source'); 107 | var forks = parseRepo(res, 'fork'); 108 | var vcard = cn(res, 'vcard-details ')[0] ? Array.from(tn(cn(res, 'vcard-details ')[0], 'li')) : null; 109 | var email = vcard ? prop(vcard, 'email') : null; 110 | var website = vcard ? prop(vcard, 'url') : null; 111 | var worksFor = vcard ? prop(vcard, 'worksFor') : null; 112 | var followers = getFollowCounts(res, /followers/i); 113 | var following = getFollowCounts(res, /following/i); 114 | var bio = cn(res, 'p-note user-profile-bio js-user-profile-bio')[0] ? cn(res, 'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : ''; 115 | var contributions = cn(mainDoc, 'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc, 'graph-before-activity-overview')[0], 'day')).map(el => { 116 | return { 117 | date: new Date(el.getAttribute('data-date')).getTime(), 118 | commits: parseInt(el.getAttribute('data-count')) 119 | } 120 | }).filter(el => el.commits) : null; 121 | var pagenate = cn(res, 'paginate-container')[0] ? Array.from(tn(cn(res, 'paginate-container')[0], 'a')).filter(el => el.innerText == 'Next').map(el => el.href) : []; 122 | var pages = cn(res, 'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0] ? Math.ceil(parseInt(cn(res, 'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0].innerText.replace(/\D+/g, '')) / 30) : 0; 123 | for (var i = 2; i <= pages; i++) { 124 | var res2 = await getProfileRepoData(pagenate[0]); 125 | parseRepo(res2, 'fork').forEach(el => forks.push(el)); 126 | parseRepo(res2, 'source').forEach(el => owns.push(el)); 127 | } 128 | if ((email == null || email.length == 0) && owns[0]) { 129 | for (var r = (owns.length - 1); r > ((owns.length - 5) || -1); r--) { //starts from oldest repo since this is most likely to have an email 130 | var link = `https://github.com/${path}/${owns[r].repo}/commit/master.patch`; 131 | var patchEmail = await getPatches(link); 132 | console.log(`${r} of ${owns.length-1}`); 133 | if (patchEmail) { 134 | email.push(patchEmail); 135 | console.log(`finished on ${r} of ${owns.length-1}`); 136 | r = -1; 137 | break; 138 | }; 139 | } 140 | } 141 | var langs = unq(owns.map(el => el.lang).filter(el => el != '')); 142 | var interest = unq(forks.map(el => el.lang).filter(el => el != '')); 143 | var recognized = owns.filter(el => (el.forks > 0 || el.stars > 0) && el.lang).sort((a, b) => b.time - a.time); 144 | var lastActive = owns && owns.length > 0 ? new Date(Math.max(...owns.map(el => el.time))) : 'never'; 145 | var profile = { 146 | email: email && email.length > 0 ? unq(email).toString() : null, 147 | langs: langs && langs.length > 0 ? langs : null, 148 | website: website && website.length > 0 ? website.toString() : null, 149 | worksFor: worksFor && worksFor.length > 0 ? worksFor.toString() : null, 150 | interests: interest && interest.length > 0 ? interest : null, 151 | followers: followers, 152 | following: following, 153 | repos: owns.length > 0 ? owns : null, 154 | forks: forks.length > 0 ? forks : null, 155 | recognized: recognized && recognized.length > 0 ? recognized : null, 156 | contributions: contributions && contributions.length > 0 ? contributions : null, 157 | totalCommits: contributions && contributions.length > 0 ? contributions.map(el => el.commits).reduce((a, b) => a + b) : null, 158 | lastActive: lastActive 159 | }; 160 | return cleanObject(profile); 161 | } 162 | 163 | 164 | function changePager() { 165 | var pagenation = cn(document, 'paginate-container codesearch-pagination-container')[0]; 166 | if(pagenation){ 167 | var pageor = ele('div'); 168 | attr(pageor, 'style', `position: fixed; top: 0px; left: 35%;`); 169 | attr(pageor, 'class', 'self_pageor'); 170 | pageor.innerHTML = pagenation.innerHTML.replace(/class="d-flex d-md-inline-block pagination"/g, 'class="self_paging" ').replace(/href/g, 'data_url'); 171 | document.body.appendChild(pageor); 172 | 173 | var pages = Array.from(tn(cn(document, 'self_paging')[0], 'a')); 174 | for (var i = 0; i < pages.length; i++) { 175 | pages[i].style.padding = '5px'; 176 | pages[i].style.cursor = 'pointer'; 177 | pages[i].style.border = '1px solid #004471'; 178 | pages[i].style.background = '#fff'; 179 | pages[i].style.borderBottomRightRadius = '0.3em'; 180 | pages[i].style.borderBottomLeftRadius = '0.3em'; 181 | pages[i].onclick = opener; 182 | } 183 | 184 | function opener() { 185 | console.log(this.getAttribute('data_url')); 186 | window.open(this.getAttribute('data_url'), '_self'); 187 | } 188 | pagenation.outerHTML = ''; 189 | 190 | } 191 | } 192 | 193 | async function getProfileData() { 194 | changePager(); 195 | var cardElms = cn(document, 'user-list-item'); 196 | var paths = cardElms ? Array.from(cardElms).map(el => reg(/(?<=github.com\/).+?(?=\/|$)/.exec(tn(el, 'a')[0].href), 0)) : []; 197 | if (cn(cardElms[0], 'additional_info_table' [0] == undefined)) { 198 | for (var i = 0; i < paths.length; i++) { 199 | var cont = cn(cardElms[i], 'user-list-info ml-2 min-width-0')[0]; 200 | var res = await loopThroughRepos(paths[i]); 201 | if (res) { 202 | createCard(cont, res); 203 | } 204 | } 205 | } 206 | } 207 | 208 | function openByEmail() { 209 | console.log(this.getAttribute('data_action')); 210 | window.open('https://www.linkedin.com/sales/gmail/profile/proxy/' + this.getAttribute('data_action')); //, 'PRINT', 'height=500, width=300,top=1,left=1 211 | } 212 | 213 | function createCard(elm, res) { 214 | var cont = ele('div'); 215 | attr(cont, 'class', 'additional_info_table'); 216 | attr(cont, 'style', `border: 1px solid #004471; border-radius: .3em; width: ${screen.width*0.4}px;; font-size: 0.75em;`); 217 | elm.appendChild(cont); 218 | 219 | var itms = Object.entries(res).filter(el => el); 220 | for (var i = 0; i < itms.length; i++) { 221 | var islen = (itms[i][0] == 'recognized' || itms[i][0] == 'forks' || itms[i][0] == 'contributions' || itms[i][0] == 'repos'); 222 | var txt = islen ? itms[i][1].length : itms[i][1].toString().replace(/,\s*/g, ', '); 223 | var txt2 = itms[i][0]; 224 | var border1 = i != (itms.length - 1) ? ' border-bottom: 1px solid #004471;' : ''; 225 | var border2 = i != (itms.length - 1) ? ' border-bottom: 1px solid #fff;' : ''; 226 | 227 | if (txt2 == 'langs') { 228 | var info = mapLangPerc(res.repos); 229 | info.forEach(el => { 230 | var grid = ele('div'); 231 | attr(grid, 'style', `display: grid; grid-template-columns: 25% 75%;`); 232 | cont.appendChild(grid); 233 | 234 | var label = ele('div'); 235 | attr(label, 'style', `grid-area: 1 / 1; background: hsl(${Math.ceil(200+(el.percent)*1.3)}, 82%, 56%); color: #fff;${border2} padding: 6px; text-align: center;`); 236 | label.innerHTML = `${el.lang} ${el.percent}%`; 237 | grid.appendChild(label); 238 | 239 | var val = ele('div'); 240 | attr(val, 'style', `grid-area: 1 / 2; border-bottom: 1px solid hsl(${Math.ceil(200+(el.percent)*1.3)}, 82%, 56%); padding: 6px;`); 241 | val.innerHTML = `${el.start} to ${el.end} ${el.duration}`; 242 | grid.appendChild(val); 243 | }); 244 | } else { 245 | var grid = ele('div'); 246 | var label = ele('div'); 247 | var val = ele('div'); 248 | cont.appendChild(grid); 249 | grid.appendChild(label); 250 | grid.appendChild(val); 251 | attr(grid, 'style', `max-height: 33px; display: grid; grid-template-columns: 25% 67% 8%;`); 252 | attr(label, 'style', `max-height: 33px; grid-area: 1 / 1; background: #004471; color: #fff;${border2} padding: 6px; text-align: center;`); 253 | attr(val, 'style', `max-height: 33px; grid-area: 1 / 2;${border1} padding: 6px;`); 254 | val.innerText = txt; 255 | label.innerText = txt2; 256 | 257 | if (itms[i][0] == 'email') { 258 | var li = ele('div'); 259 | attr(li, 'style', `max-height: 33px; grid-area: 1 / 3; float: right; cursor: pointer; ${border1}`); 260 | attr(li, 'data_action', itms[i][1]); 261 | grid.appendChild(li); 262 | li.innerHTML = svgs.li; 263 | li.onclick = openByEmail; 264 | } else { 265 | attr(grid, 'style', `display: grid; grid-template-columns: 25% 75%;`); 266 | } 267 | 268 | } 269 | } 270 | } 271 | getProfileData(); 272 | -------------------------------------------------------------------------------- /bookmarklet_stargazersByLocation.txt: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Bvar%20reg%20%3D%20(elm%2C%20n)%20%3D%3E%20elm%20!%3D%20null%20%3F%20elm%5Bn%5D%20%3A%20''%3Bvar%20cn%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementsByClassName(nm)%3Bvar%20tn%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementsByTagName(nm)%3Bvar%20gi%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementById(nm)%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%2B%20n)%3Bvar%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%20currentPage%20%3D%20window.location.href%3Bvar%20startPage%20%3D%20currentPage.replace(%2F(%3F%3C%3Dstargazers).%2B%2F%2C%20'')%3Bvar%20csvTable%20%3D%20(arr)%20%3D%3E%20arr.map(itm%20%3D%3E%20itm.toString().replace(%2F%24%2F%2C%20'%5Cr')).toString().replace(%2F%5Cr%2C%2Fg%2C%20'%5Cr')%3Bvar%20popTarget%20%3D%20%22gitStarPop%22%3Bvar%20reg%20%3D%20(elm%2C%20n)%20%3D%3E%20elm%20!%3D%20null%20%3F%20elm%5Bn%5D%20%3A%20''%3Bvar%20cn%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementsByClassName(nm)%3Bvar%20tn%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementsByTagName(nm)%3Bvar%20gi%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementById(nm)%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%2B%20n)%3Bvar%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%20csvTable%20%3D%20(arr)%20%3D%3E%20arr.map(itm%20%3D%3E%20itm.toString().replace(%2F%24%2F%2C%20'%5Cr')).toString().replace(%2F%5Cr%2C%2Fg%2C%20'%5Cr')%3Bfunction%20dragElement()%20%7Bvar%20elmnt%20%3D%20this.parentElement%3Bvar%20pos1%20%3D%200%2Cpos2%20%3D%200%2Cpos3%20%3D%200%2Cpos4%20%3D%200%3Bif%20(document.getElementById(this.id))%20%7Bdocument.getElementById(this.id).onmousedown%20%3D%20dragMouseDown%3B%7D%20else%20%7Bthis.onmousedown%20%3D%20dragMouseDown%3B%7Dfunction%20dragMouseDown(e)%20%7Bpos3%20%3D%20e.clientX%3Bpos4%20%3D%20e.clientY%3Bdocument.onmouseup%20%3D%20closeDragElement%3Bdocument.onmousemove%20%3D%20elementDrag%3B%7Dfunction%20elementDrag(e)%20%7Bpos1%20%3D%20pos3%20-%20e.clientX%3Bpos2%20%3D%20pos4%20-%20e.clientY%3Bpos3%20%3D%20e.clientX%3Bpos4%20%3D%20e.clientY%3Belmnt.style.top%20%3D%20(elmnt.offsetTop%20-%20pos2)%20%2B%20%22px%22%3Belmnt.style.left%20%3D%20(elmnt.offsetLeft%20-%20pos1)%20%2B%20%22px%22%3Belmnt.style.opacity%20%3D%20%220.85%22%3Belmnt.style.transition%20%3D%20%22opacity%201000ms%22%3B%7Dfunction%20closeDragElement()%20%7Bdocument.onmouseup%20%3D%20null%3Bdocument.onmousemove%20%3D%20null%3Belmnt.style.opacity%20%3D%20%221%22%3B%7D%7Dfunction%20createPopTextArea(id)%20%7Bif%20(document.getElementById(id))%20document.getElementById(id).outerHTML%20%3D%20%22%22%3Bvar%20cd%20%3D%20document.createElement(%22div%22)%3Bcd.setAttribute(%22id%22%2C%20id)%3Bcd.style.display%20%3D%20%22inline-block%22%3Bcd.style.position%20%3D%20%22fixed%22%3Bcd.style.top%20%3D%20%2210%25%22%3Bcd.style.left%20%3D%20%2250%25%22%3Bcd.style.width%20%3D%20%2222%25%22%3Bcd.style.height%20%3D%20%2216%25%22%3Bcd.style.background%20%3D%20%22transparent%22%3Bcd.style.borderRadius%20%3D%20%22.15em%22%3Bcd.style.padding%20%3D%20%222px%22%3Bcd.style.zIndex%20%3D%20%2210000%22%3Bdocument.body.appendChild(cd)%3Bvar%20cb%20%3D%20document.createElement(%22button%22)%3Bcb.setAttribute(%22id%22%2C%20id%20%2B%20%22_close%22)%3Bcb.style.float%20%3D%20%22left%22%3Bcb.style.background%20%3D%20%22%23000%22%3Bcb.style.height%20%3D%20%2220px%22%3Bcb.style.width%20%3D%20%2220px%22%3Bcb.style.borderRadius%20%3D%20%2250%25%22%3Bcb.style.boxShadow%20%3D%20%220px%22%3Bcb.style.border%20%3D%20%223px%20solid%20Crimson%22%3Bcb.style.textAlign%20%3D%20%22center%22%3Bcb.style.cursor%20%3D%20%22pointer%22%3Bcb.style.userSelect%20%3D%20%22none%22%3Bcb.style.fontSize%20%3D%20%221em%22%3Bcb.style.color%20%3D%20%22Crimson%22%3Bcb.style.transform%20%3D%20%22scale(1%2C%201)%20translate(3.5px%2C%203.5px)%20rotate(0deg)%22%3Bcb.addEventListener(%22click%22%2C%20killParent)%3Bcb.addEventListener(%22mousedown%22%2C%20hoverO)%3Bcb.addEventListener(%22mouseover%22%2C%20hoverI)%3Bcb.addEventListener(%22mouseout%22%2C%20hoverO)%3Bcd.appendChild(cb)%3Bvar%20hd%20%3D%20document.createElement(%22div%22)%3Bhd.setAttribute(%22id%22%2C%20id%20%2B%20%22_mover%22)%3Bhd.style.width%20%3D%20%2299%25%22%3Bhd.style.height%20%3D%20%2225%25%22%3Bhd.style.backgroundColor%20%3D%20%22%23000000%22%3Bhd.style.borderTopLeftRadius%20%3D%20%22.15em%22%3Bhd.style.borderTopRightRadius%20%3D%20%22.15em%22%3Bhd.style.padding%20%3D%20%226px%22%3Bhd.style.cursor%20%3D%20'move'%3Bhd.style.boxShadow%20%3D%20%221px%201px%201px%200px%20%23888888%22%3Bhd.addEventListener(%22mouseover%22%2C%20dragElement)%3Bcd.appendChild(hd)%3Bvar%20tf%20%3D%20document.createElement(%22input%22)%3Btf.setAttribute(%22id%22%2C%20id%20%2B%20%22_textfile%22)%3Btf.setAttribute(%22placeholder%22%2C%20%22Atlanta%20OR%20London%20OR%20New%20York%22)%3Btf.style.width%20%3D%20%2266%25%22%3Btf.style.height%20%3D%20%22100%25%22%3Btf.style.padding%20%3D%20%223px%22%3Btf.style.border%20%3D%20%221px%20solid%20%23000000%22%3Btf.style.background%20%3D%20%22%230f0f0f%22%3Btf.style.color%20%3D%20%22%23ffffff%22%3Btf.style.fontSize%20%3D%20%221em%22%3Btf.style.userSelect%20%3D%20%22none%22%3Btf.style.float%20%3D%20%22right%22%3Btf.style.boxShadow%20%3D%20%221px%201px%201px%200px%20%23888888%22%3Btf.addEventListener(%22keydown%22%2C%20(event)%20%3D%3E%20%7Bif%20(event.key%20%3D%3D%20%22Enter%22)%20%7BinitSearchLoop()%3B%7D%7D)%3Bhd.appendChild(tf)%3Bvar%20tb%20%3D%20document.createElement(%22div%22)%3Btb.setAttribute(%22id%22%2C%20id%20%2B%20%22_textarea%22)%3Btb.innerText%20%3D%20%22Add%20your%20location%20OR%20locations%20and%20press%20enter%20to%20start%22%3Btb.style.width%20%3D%20%2299%25%22%3Btb.style.height%20%3D%20%2275%25%22%3Btb.style.padding%20%3D%20%223px%22%3Btb.style.border%20%3D%20%221px%20solid%20%23000000%22%3Btb.style.color%20%3D%20%22%23878787%22%3Btb.style.fontSize%20%3D%20%221em%22%3Btb.style.userSelect%20%3D%20%22none%22%3Btb.style.boxShadow%20%3D%20%221px%201px%201px%200px%20%23888888%22%3Bcd.appendChild(tb)%3Btb.style.backgroundColor%20%3D%20%22%23282828%22%3B%7Dasync%20function%20killParent()%20%7Bthis.style.background%20%3D%20%22Crimson%22%3Bthis.style.transform%20%3D%20%22scale(.001%2C%20.001)%20translate(3px%2C%203px)%20%20rotate(495deg)%22%3Bthis.style.transition%20%3D%20%22all%20106ms%20cubic-bezier(.9%2C.37%2C.66%2C.96)%22%3Bawait%20delay(206)%3Bthis.parentElement.outerHTML%20%3D%20%22%22%3B%7Dasync%20function%20killElm()%20%7Bthis.outerHTML%20%3D%20%22%22%3B%7Dasync%20function%20hoverI()%20%7Bthis.style.border%20%3D%20%222px%20solid%20Crimson%22%3Bawait%20delay(40)%3Bthis.style.border%20%3D%20%221px%20solid%20Crimson%22%3Bawait%20delay(30)%3Bthis.style.border%20%3D%20%221px%20solid%20%23000%22%3Bawait%20delay(20)%3Bthis.style.background%20%3D%20%22Crimson%22%3Bthis.style.color%20%3D%20%22%23000%22%3Bthis.style.transition%20%3D%20%22all%20186ms%20cubic-bezier(.9%2C.37%2C.66%2C.96)%22%3B%7Dasync%20function%20hoverO()%20%7Bthis.style.background%20%3D%20%22%23000%22%3Bthis.style.border%20%3D%20%221px%20solid%20Crimson%22%3Bawait%20delay(66)%3Bthis.style.border%20%3D%20%223px%20solid%20Crimson%22%3Bthis.style.color%20%3D%20%22Crimson%22%3Bthis.style.transition%20%3D%20%22all%20186ms%20cubic-bezier(.9%2C.37%2C.66%2C.96)%22%3B%7Dasync%20function%20getEmailFromProfile(url)%20%7Bvar%20res%20%3D%20await%20fetch(url%20%2B%20'%3Ftab%3Drepositories')%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C%20'text%2Fhtml')%3Bvar%20repos%20%3D%20doc.getElementsByClassName('col-12%20d-flex%20width-full%20py-4%20border-bottom%20public%20source')%3Bvar%20targetRepos%20%3D%20Array.from(repos).map(itm%20%3D%3E%20itm.getElementsByTagName('a')%5B0%5D.href%20%2B%20'%2Fcommit%2Fmaster.patch')%3Breturn%20checkEmailPatch(targetRepos)%3B%7Dasync%20function%20getPatches(link)%20%7Bvar%20res%20%3D%20await%20fetch(link)%3Bvar%20html%20%3D%20await%20res.text()%3Bvar%20email%20%3D%20reg(%2F%5B%5Cw%7C%5C.%5D%2B%40%5CS%2B%5C.%5Ba-zA-Z%5D%2B%2F.exec(html)%2C0)%3Breturn%20email%3B%7Dasync%20function%20checkEmailPatch(repos)%20%7Bfor%20(i%20%3D%200%3B%20i%20%3C%20repos.length%3B%20i%2B%2B)%20%7Bvar%20email%20%3D%20await%20getPatches(repos%5Bi%5D)%3Bif%20(email%20!%3D%20'')%20%7Breturn%20email%3B%7D%7D%7Dasync%20function%20downloadr(str%2C%20name)%20%7Bvar%20type%20%3D%20%22data%3Atext%2Fplain%3Bcharset%3Dutf-8%2C%22%3Bvar%20file%20%3D%20new%20Blob(%5Bstr%5D%2C%20%7Btype%3A%20type%7D)%3Bvar%20a%20%3D%20document.createElement(%22a%22)%2Curl%20%3D%20URL.createObjectURL(file)%3Ba.href%20%3D%20url%3Ba.download%20%3D%20name%3Bdocument.body.appendChild(a)%3Ba.click()%3Bawait%20delay(10)%3Bdocument.body.removeChild(a)%3Bwindow.URL.revokeObjectURL(url)%3B%7Dasync%20function%20getHoverCard(params%2CgeoSearch)%7Bvar%20%7Buser_path%2Crepo_id%2Ccurrent_path%7D%20%3D%20params%3Bvar%20res%20%3D%20await%20fetch(%60https%3A%2F%2Fgithub.com%2Fusers%2F%24%7Buser_path%7D%2Fhovercard%3Fsubject%3Drepository%253A%24%7Brepo_id%7D%26current_path%3D%24%7Bcurrent_path%7D%60%2C%20%7B%22headers%22%3A%20%7B%22accept%22%3A%20%22*%2F*%22%2C%22accept-language%22%3A%20%22en-US%2Cen%3Bq%3D0.9%22%2C%22sec-ch-ua%22%3A%20%22%5C%22%20Not%3BA%20Brand%5C%22%3Bv%3D%5C%2299%5C%22%2C%20%5C%22Microsoft%20Edge%5C%22%3Bv%3D%5C%2297%5C%22%2C%20%5C%22Chromium%5C%22%3Bv%3D%5C%2297%5C%22%22%2C%22sec-ch-ua-mobile%22%3A%20%22%3F0%22%2C%22sec-ch-ua-platform%22%3A%20%22%5C%22Windows%5C%22%22%2C%22sec-fetch-dest%22%3A%20%22empty%22%2C%22sec-fetch-mode%22%3A%20%22cors%22%2C%22sec-fetch-site%22%3A%20%22same-origin%22%2C%22x-requested-with%22%3A%20%22XMLHttpRequest%22%7D%2C%22referrer%22%3A%20%22https%3A%2F%2Fgithub.com%2Fbilibili%2Fflv.js%2F%22%2C%22referrerPolicy%22%3A%20%22no-referrer-when-downgrade%22%2C%22body%22%3A%20null%2C%22method%22%3A%20%22GET%22%2C%22mode%22%3A%20%22cors%22%2C%22credentials%22%3A%20%22include%22%7D)%3Bvar%20text%20%3D%20await%20res.text()%3Breturn%20geoSearch.test(text)%3B%7Dasync%20function%20getNumOfStarGazers(url)%7Bvar%20res%20%3D%20await%20fetch(url)%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C%20'text%2Fhtml')%3Bvar%20repositoryCont%20%3D%20cn(doc%2C%20'repository-content')%5B0%5D%3Bvar%20numGazers%20%3D%20cn(repositoryCont%2C'Counter')%5B0%5D%20%3F%20parseInt(cn(repositoryCont%2C'Counter')%5B0%5D.innerText.replace(%2F%5CD%2B%2Fg%2C%20''))%20%3A%200%3Breturn%20numGazers%3B%7Dasync%20function%20getStarGazers(url%2CgeoSearch)%7Bvar%20res%20%3D%20await%20fetch(url)%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C%20'text%2Fhtml')%3Bvar%20repositoryCont%20%3D%20cn(doc%2C%20'repository-content')%5B0%5D%3Bvar%20followers%20%3D%20tn(repositoryCont%2C'li')%3F.length%20%3F%20Array.from(tn(repositoryCont%2C'li')).map(i%3D%3E%5B%2F(%3F%3C%3Dgithub.com%5C%2F).%2B%2F.exec(i.getElementsByTagName('a')%3F.%5B0%5D%3F.href)%3F.%5B0%5D%2Ci.getElementsByTagName('a')%3F.%5B0%5D%3F.href%5D)%20%3A%20%5B%5D%3Bvar%20filteredFollowers%20%3D%20%5B%5D%3Bfor(var%20i%3D0%3B%20i%3Cfollowers.length%3B%20i%2B%2B)%7Blet%20isMatch%20%3D%20await%20getHoverCard(%7Buser_path%3Afollowers%5Bi%5D%5B0%5D%2Crepo_id%3AArray.from(doc.getElementsByTagName('summary')).map(p%3D%3E%20JSON.parse(p.getAttribute('data-hydro-click'))).filter(p%3D%3E%20p%3F.payload%3F.repository_id)%3F.%5B0%5D%3F.payload%3F.repository_id%2Ccurrent_path%3AencodeURIComponent(%2F(%3F%3C%3Dgithub.com)%5C%2F.%2B%2F.exec(url)%3F.%5B0%5D)%7D%2CgeoSearch)%3Bif(isMatch)%20filteredFollowers.push(followers%5Bi%5D%5B1%5D)%3B%7Dvar%20pages%20%3D%20cn(doc%2C'paginate-container')%5B0%5D%20%3F%20Array.from(tn(cn(doc%2C'paginate-container')%5B0%5D%2C'a'))%20%3A%20null%3Bvar%20pageArray%20%3D%20pages%20%3F%20pages.filter(i%3D%3E%20i.innerText%20%3D%3D%20'Next')%20%3A%20%5B%5D%3Bvar%20pageLink%20%3D%20pageArray.length%20%3E%200%20%3F%20pageArray%5B0%5D.href%20%3A%20null%3Bvar%20outputObj%20%3D%20%7BnextPage%3A%20pageLink%2C%20filteredFollowers%3A%20filteredFollowers%7D%3Bconsole.log(outputObj)%3Breturn%20outputObj%3B%7Dasync%20function%20getProfileDetails(url%2CgeoSearch)%20%7Bvar%20res%20%3D%20await%20fetch(url)%3Bvar%20text%20%3D%20await%20res.text()%3Bvar%20doc%20%3D%20new%20DOMParser().parseFromString(text%2C%20'text%2Fhtml')%3Bvar%20fullname%20%3D%20cn(doc%2C%20'p-name%20vcard-fullname')%5B0%5D%20%3F%20cn(doc%2C%20'p-name%20vcard-fullname')%5B0%5D.innerText.trim().replace(%2F%2C%2Fg%2C'')%20%3A%20''%3Bvar%20vcard%20%3D%20Array.from(tn(cn(doc%2C%20'vcard-details')%5B0%5D%2C%20'li'))%3Bvar%20geo%20%3D%20vcard.filter(elm%20%3D%3E%20elm.getAttribute('itemprop')%20%3D%3D%20'homeLocation')%5B0%5D%20%3F%20vcard.filter(elm%20%3D%3E%20elm.getAttribute('itemprop')%20%3D%3D%20'homeLocation')%5B0%5D.innerText.trim().replace(%2F%2C%2Fg%2C'')%20%3A%20''%3Bvar%20empl%20%3D%20vcard.filter(elm%20%3D%3E%20elm.getAttribute('itemprop')%20%3D%3D%20'worksFor')%5B0%5D%20%3F%20vcard.filter(elm%20%3D%3E%20elm.getAttribute('itemprop')%20%3D%3D%20'worksFor')%5B0%5D.innerText.trim().replace(%2F%2C%2Fg%2C'')%20%3A%20''%3Bif(geoSearch)%7Bvar%20emailCheck%20%3D%20await%20getEmailFromProfile(url)%3Bvar%20email%20%3D%20emailCheck%20%26%26%20%2Fnoreply%2Fi.test(emailCheck)%20%3D%3D%3D%20false%20%3F%20emailCheck%20%3A%20''%3Breturn%20%5Bfullname%2C%20empl%2C%20geo%2C%20email%2C%20url%5D%3B%7Delse%7Breturn%20%5B%5D%3B%7D%7Dasync%20function%20loopThroughStarGazers(url%2CgeoSearch)%7Bvar%20profilesToScrape%20%3D%20%5B%5D%3Bvar%20numGazers%20%3D%20await%20getNumOfStarGazers(url)%3Bvar%20pagesToLoop%20%3D%20Math.ceil(numGazers%2F30)%3Bvar%20firstRes%20%3D%20await%20getStarGazers(url%2CgeoSearch)%3Bvar%20resLink%20%3D%20firstRes.nextPage%3Bif(firstRes.filteredFollowers.length%20%3E%200)%20firstRes.filteredFollowers.forEach(u%3D%3E%20profilesToScrape.push(u))%3Bfor(var%20i%3D0%3B%20i%3CnumGazers%3B%20i%2B%2B)%7Bvar%20elips%20%3D%20''%3Bif(%2F0%24%7C3%24%7C6%24%2F.test(i.toString()))%7Bvar%20elips%20%3D%20'.'%20%3B%7Dif(%2F1%24%7C4%24%7C7%24%2F.test(i.toString()))%7Bvar%20elips%20%3D%20'..'%3B%7Dif(%2F2%24%7C5%24%7C8%24%2F.test(i.toString()))%7Bvar%20elips%20%3D%20'...'%3B%7Dvar%20percentComplete%20%3D%20Math.round((i%2F(pagesToLoop)*10000)%2F100)%3Bdocument.getElementById(popTarget%2B%20%22_textarea%22).innerText%20%3D%20'Building%20List'%2Belips%2B'%5Cn'%2BpercentComplete%2B'%25%20complete'%3Bif(resLink)%7Bvar%20resObj%20%3D%20await%20getStarGazers(resLink%2CgeoSearch)%3Bawait%20delay(111)%3BresLink%20%3D%20resObj.nextPage%3Bvar%20resArr%20%3D%20resObj.filteredFollowers%3Bif(resObj.filteredFollowers.length%20%3E%200)%20resObj.filteredFollowers.forEach(u%3D%3E%20profilesToScrape.push(u))%3B%7D%7Dreturn%20profilesToScrape%3B%7Dasync%20function%20downloadCSVofMatches(url%2CgeoSearch)%20%7Bvar%20filename%20%3D%20reg(%2F(%3F%3C%3D%5C.com%5C%2F).%2B%3F%5C%2F%5Cw%2B%2F.exec(url)%2C%200).replace(%2F%5CW%2B%2Fg%2C%20'_')%20%2B'_'%2B%20document.getElementById(popTarget%2B%20%22_textfile%22).value.replace(%2F%5Cs%2B%2Fg%2C%20'_')%3Bvar%20resArr%20%3D%20await%20loopThroughStarGazers(url%2CgeoSearch)%3Bvar%20temp%20%3D%20%5B%5B'Full%20Name'%2C%20'Company'%2C%20'Location'%2C%20'Email'%2C%20'Github%20Url'%5D%5D%3Bfor%20(let%20i%20%3D%200%3B%20i%20%3C%20resArr.length%3B%20i%2B%2B)%20%7Blet%20row%20%3D%20await%20getProfileDetails(resArr%5Bi%5D%2C%20geoSearch)%3Bif(row.length%20%3E%200)%20temp.push(row)%3B%7Ddownloadr(csvTable(temp)%2C%20filename%20%2B%20'.csv')%3B%7Dfunction%20initSearchLoop()%7Bvar%20geoStr%20%3D%20document.getElementById(popTarget%2B%20%22_textfile%22).value%3Bvar%20searchG%20%3D%20geoStr%20%3F%20new%20RegExp(geoStr.replace(%2F%5Cs%2BOR%5Cs%2B%2Fgi%2C%20'%7C').trim()%2C%20'i')%20%3A%20null%3Bdocument.getElementById(popTarget%2B%20%22_textarea%22).innerText%20%3D%20'Initializing...'%3BdownloadCSVofMatches(startPage%2CsearchG)%3B%7DcreatePopTextArea(popTarget)%7D)() 2 | -------------------------------------------------------------------------------- /bookmarklet_usersearch.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%20rando%20%3D%20(n)%20%3D%3E%20Math.round(Math.random()%20*%20n)%3Bvar%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%20delay%20%3D%20(ms)%20%3D%3E%20new%20Promise(res%20%3D%3E%20setTimeout(res%2C%20ms))%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%20reChar%20%3D%20(s)%20%3D%3E%20s.match(%2F%26%23.%2B%3F%3B%2Fg)%20%26%26%20s.match(%2F%26%23.%2B%3F%3B%2Fg).length%20%3E%200%20%3F%20s.match(%2F%26%23.%2B%3F%3B%2Fg).map(el%20%3D%3E%20%5Bel%2C%20String.fromCharCode(%2Fd%2B%2F.exec(el)%5B0%5D)%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%20parseAsRegexArr(bool)%20%7Bif%20(typeof%20bool%20%3D%3D%20'object')%20%7Breturn%20Array.isArray(bool)%20%3F%20bool%20%3A%20%5Bbool%5D%3B%7D%20else%20%7Bvar%20rxReady%20%3D%20(s)%20%3D%3E%20s%20%3F%20s.replace(%2F%22%2Fg%2C%20'%5C%5Cb').trim().replace(%2F%5C)%2Fg%2C%20'').replace(%2F%5C(%2Fg%2C%20'').replace(%2F%5Cs%2B%2Fg%2C%20'.%7B0%2C2%7D').replace(%2F%5C%2F%2Fg%2C%20'%5C%5C%2F').replace(%2F%5C%2B%2Fg%2C%20'%5C%5C%2B').replace(%2F%5Cs*%5C*%5Cs*%2Fg%2C%20'%5C%5Cs*%5C%5Cw*%5C%5Cs%2B')%20%3A%20s%3Bvar%20checkSimpleOR%20%3D%20(s)%3D%3E%20%2F%5Cbor%5Cb%2Fi.test(s)%20%26%26%20%2F%5C(%2F.test(s)%20%3D%3D%3D%20false%20%26%26%20%2F%5Cb%5Cs%2Band%5Cs%5Cb%2F.test(s)%20%3D%3D%3D%20false%3Bvar%20checkAndOrSimple%20%3D%20(s)%20%3D%3E%20%5B%2F%5Cbor%5Cb%2Fi%2C%2F%5Cband%5Cb%2Fi%5D.every(el%3D%3E%20el.test(s)%20%26%26%20%2F%5C(%2F.test(s)%20%3D%3D%3D%20false)%3Bif(checkAndOrSimple(bool))%7Breturn%20bool.replace(%2F%5Cs%2BOR%5Cs%2B%7C%5Cs*%5C%7C%5Cs*%2Fgi%2C%20'%7C').replace(%2F%5C%2F%2Fg%2C%20'%5C%5C%2F').replace(%2F%22%2Fg%2C%20'%5C%5Cb').replace(%2F%5Cs%2B%2Fg%2C%20'.%7B0%2C2%7D').replace(%2F%5Cs*%5C*%5Cs*%2Fg%2C%20'%5C%5Cs*%5C%5Cw*%5C%5Cs%2B').split(%2F%5Cband%5Cb%2F).map(el%3D%3E%20new%20RegExp(el.trim()%2C%20'i'))%3B%7D%20else%20if%20(checkSimpleOR(bool))%20%7Breturn%20%5Bnew%20RegExp(bool.replace(%2F%5Cs%2BOR%5Cs%2B%7C%5Cs*%5C%7C%5Cs*%2Fgi%2C%20'%7C').replace(%2F%5C%2F%2Fg%2C%20'%5C%5C%2F').replace(%2F%22%2Fg%2C%20'%5C%5Cb').replace(%2F%5Cs%2B%2Fg%2C%20'.%7B0%2C2%7D').replace(%2F%5Cs*%5C*%5Cs*%2Fg%2C%20'%5C%5Cs*%5C%5Cw*%5C%5Cs%2B')%2C%20'i')%5D%3B%7D%20else%20%7Bvar%20orx%20%3D%20%22%5C%5C(.%2B%3F%5C%5C)%7C(%5C%5C(%5C%5Cw%2B%5C%5Cs%7B0%2C1%7DOR%5C%5Cs%7C%5C%5Cw%2B%5C%5Cs%7B0%2C1%7DOR%5C%5Cs)%2B((%5C%5Cw%2B%5Cs)%2B%3F%7C(%5C%5Cw%2B)%5C%5C)%2B)%2B%3F%22%3Bvar%20orMatch%20%3D%20bool%20%3F%20bool.match(new%20RegExp(orx%2C%20'g'))%20%3A%20%5B%5D%3Bvar%20orArr%20%3D%20orMatch%20%3F%20orMatch.map(b%3D%3E%20rxReady(b.replace(%2F%5Cs%2BOR%5Cs%2B%7C%5Cs*%5C%7C%5Cs*%2Fgi%2C%20'%7C'))%20)%20%3A%20%5B%5D%3Bvar%20noOrs%20%3D%20bool%20%3F%20bool.replace(new%20RegExp(orx%2C%20'g')%2C%20'').split(%2F%5Cs%2B%5BAND%5Cs%2B%5D%2B%2Fi)%20%3A%20bool%3Bvar%20ands%20%3D%20noOrs%20%3F%20noOrs.map(a%3D%3E%20rxReady(a))%20%3A%20%5B%5D%3Bvar%20xArr%20%3D%20ands.concat(orArr).filter(i%3D%3E%20i%20!%3D%20'').map(x%3D%3E%20new%20RegExp(x%2C%20'i')%20)%3Breturn%20xArr%3B%7D%7D%7Dvar%20booleanSearch%20%3D%20(bool%2C%20target)%20%3D%3E%20parseAsRegexArr(bool).every(x%3D%3E%20x.test(target))%3Bvar%20langOpts%20%3D%20%5B%22ActionScript%22%2C%20%22C%22%2C%20%22C%23%22%2C%20%22C%2B%2B%22%2C%20%22Clojure%22%2C%20%22CoffeeScript%22%2C%20%22CSS%22%2C%20%22Go%22%2C%20%22Haskell%22%2C%20%22HTML%22%2C%20%22Java%22%2C%20%22JavaScript%22%2C%20%22Lua%22%2C%20%22MATLAB%22%2C%20%22Objective-C%22%2C%20%22Perl%22%2C%20%22PHP%22%2C%20%22Python%22%2C%20%22R%22%2C%20%22Ruby%22%2C%20%22Scala%22%2C%20%22Shell%22%2C%20%22Swift%22%2C%20%22TeX%22%2C%20%22Vim%20script%22%2C%20%221C%20Enterprise%22%2C%20%22ABAP%22%2C%20%22ABNF%22%2C%20%22Ada%22%2C%20%22Adobe%20Font%20Metrics%22%2C%20%22Agda%22%2C%20%22AGS%20Script%22%2C%20%22Alloy%22%2C%20%22Alpine%20Abuild%22%2C%20%22Altium%20Designer%22%2C%20%22AMPL%22%2C%20%22AngelScript%22%2C%20%22Ant%20Build%20System%22%2C%20%22ANTLR%22%2C%20%22ApacheConf%22%2C%20%22Apex%22%2C%20%22API%20Blueprint%22%2C%20%22APL%22%2C%20%22Apollo%20Guidance%20Computer%22%2C%20%22AppleScript%22%2C%20%22Arc%22%2C%20%22AsciiDoc%22%2C%20%22ASN.1%22%2C%20%22ASP%22%2C%20%22AspectJ%22%2C%20%22Assembly%22%2C%20%22Asymptote%22%2C%20%22ATS%22%2C%20%22Augeas%22%2C%20%22AutoHotkey%22%2C%20%22AutoIt%22%2C%20%22Awk%22%2C%20%22Ballerina%22%2C%20%22Batchfile%22%2C%20%22Befunge%22%2C%20%22BibTeX%22%2C%20%22Bison%22%2C%20%22BitBake%22%2C%20%22Blade%22%2C%20%22BlitzBasic%22%2C%20%22BlitzMax%22%2C%20%22Bluespec%22%2C%20%22Boo%22%2C%20%22Brainfuck%22%2C%20%22Brightscript%22%2C%20%22C-ObjDump%22%2C%20%22C2hs%20Haskell%22%2C%20%22Cabal%20Config%22%2C%20%22Cap'n%20Proto%22%2C%20%22CartoCSS%22%2C%20%22Ceylon%22%2C%20%22Chapel%22%2C%20%22Charity%22%2C%20%22ChucK%22%2C%20%22Cirru%22%2C%20%22Clarion%22%2C%20%22Clean%22%2C%20%22Click%22%2C%20%22CLIPS%22%2C%20%22Closure%20Templates%22%2C%20%22Cloud%20Firestore%20Security%20Rules%22%2C%20%22CMake%22%2C%20%22COBOL%22%2C%20%22ColdFusion%22%2C%20%22ColdFusion%20CFC%22%2C%20%22COLLADA%22%2C%20%22Common%20Lisp%22%2C%20%22Common%20Workflow%20Language%22%2C%20%22Component%20Pascal%22%2C%20%22CoNLL-U%22%2C%20%22Cool%22%2C%20%22Coq%22%2C%20%22Cpp-ObjDump%22%2C%20%22Creole%22%2C%20%22Crystal%22%2C%20%22CSON%22%2C%20%22Csound%22%2C%20%22Csound%20Document%22%2C%20%22Csound%20Score%22%2C%20%22CSV%22%2C%20%22Cuda%22%2C%20%22CWeb%22%2C%20%22Cycript%22%2C%20%22Cython%22%2C%20%22D%22%2C%20%22D-ObjDump%22%2C%20%22Darcs%20Patch%22%2C%20%22Dart%22%2C%20%22DataWeave%22%2C%20%22desktop%22%2C%20%22Dhall%22%2C%20%22Diff%22%2C%20%22DIGITAL%20Command%20Language%22%2C%20%22DM%22%2C%20%22DNS%20Zone%22%2C%20%22Dockerfile%22%2C%20%22Dogescript%22%2C%20%22DTrace%22%2C%20%22Dylan%22%2C%20%22E%22%2C%20%22Eagle%22%2C%20%22Easybuild%22%2C%20%22EBNF%22%2C%20%22eC%22%2C%20%22Ecere%20Projects%22%2C%20%22ECL%22%2C%20%22ECLiPSe%22%2C%20%22EditorConfig%22%2C%20%22Edje%20Data%20Collection%22%2C%20%22edn%22%2C%20%22Eiffel%22%2C%20%22EJS%22%2C%20%22Elixir%22%2C%20%22Elm%22%2C%20%22Emacs%20Lisp%22%2C%20%22EmberScript%22%2C%20%22EML%22%2C%20%22EQ%22%2C%20%22Erlang%22%2C%20%22F%23%22%2C%20%22F*%22%2C%20%22Factor%22%2C%20%22Fancy%22%2C%20%22Fantom%22%2C%20%22FIGlet%20Font%22%2C%20%22Filebench%20WML%22%2C%20%22Filterscript%22%2C%20%22fish%22%2C%20%22FLUX%22%2C%20%22Formatted%22%2C%20%22Forth%22%2C%20%22Fortran%22%2C%20%22FreeMarker%22%2C%20%22Frege%22%2C%20%22G-code%22%2C%20%22Game%20Maker%20Language%22%2C%20%22GAML%22%2C%20%22GAMS%22%2C%20%22GAP%22%2C%20%22GCC%20Machine%20Description%22%2C%20%22GDB%22%2C%20%22GDScript%22%2C%20%22Genie%22%2C%20%22Genshi%22%2C%20%22Gentoo%20Ebuild%22%2C%20%22Gentoo%20Eclass%22%2C%20%22Gerber%20Image%22%2C%20%22Gettext%20Catalog%22%2C%20%22Gherkin%22%2C%20%22Git%20Attributes%22%2C%20%22Git%20Config%22%2C%20%22GLSL%22%2C%20%22Glyph%22%2C%20%22Glyph%20Bitmap%20Distribution%20Format%22%2C%20%22GN%22%2C%20%22Gnuplot%22%2C%20%22Golo%22%2C%20%22Gosu%22%2C%20%22Grace%22%2C%20%22Gradle%22%2C%20%22Grammatical%20Framework%22%2C%20%22Graph%20Modeling%20Language%22%2C%20%22GraphQL%22%2C%20%22Graphviz%20(DOT)%22%2C%20%22Groovy%22%2C%20%22Groovy%20Server%20Pages%22%2C%20%22Hack%22%2C%20%22Haml%22%2C%20%22Handlebars%22%2C%20%22HAProxy%22%2C%20%22Harbour%22%2C%20%22Haxe%22%2C%20%22HCL%22%2C%20%22HiveQL%22%2C%20%22HLSL%22%2C%20%22HolyC%22%2C%20%22HTML%2BDjango%22%2C%20%22HTML%2BECR%22%2C%20%22HTML%2BEEX%22%2C%20%22HTML%2BERB%22%2C%20%22HTML%2BPHP%22%2C%20%22HTML%2BRazor%22%2C%20%22HTTP%22%2C%20%22HXML%22%2C%20%22Hy%22%2C%20%22HyPhy%22%2C%20%22IDL%22%2C%20%22Idris%22%2C%20%22Ignore%20List%22%2C%20%22IGOR%20Pro%22%2C%20%22Inform%207%22%2C%20%22INI%22%2C%20%22Inno%20Setup%22%2C%20%22Io%22%2C%20%22Ioke%22%2C%20%22IRC%20log%22%2C%20%22Isabelle%22%2C%20%22Isabelle%20ROOT%22%2C%20%22J%22%2C%20%22Jasmin%22%2C%20%22Java%20Properties%22%2C%20%22Java%20Server%20Pages%22%2C%20%22JavaScript%2BERB%22%2C%20%22JFlex%22%2C%20%22Jison%22%2C%20%22Jison%20Lex%22%2C%20%22Jolie%22%2C%20%22JSON%22%2C%20%22JSON%20with%20Comments%22%2C%20%22JSON5%22%2C%20%22JSONiq%22%2C%20%22JSONLD%22%2C%20%22Jsonnet%22%2C%20%22JSX%22%2C%20%22Julia%22%2C%20%22Jupyter%20Notebook%22%2C%20%22KiCad%20Layout%22%2C%20%22KiCad%20Legacy%20Layout%22%2C%20%22KiCad%20Schematic%22%2C%20%22Kit%22%2C%20%22Kotlin%22%2C%20%22KRL%22%2C%20%22LabVIEW%22%2C%20%22Lasso%22%2C%20%22Latte%22%2C%20%22Lean%22%2C%20%22Less%22%2C%20%22Lex%22%2C%20%22LFE%22%2C%20%22LilyPond%22%2C%20%22Limbo%22%2C%20%22Linker%20Script%22%2C%20%22Linux%20Kernel%20Module%22%2C%20%22Liquid%22%2C%20%22Literate%20Agda%22%2C%20%22Literate%20CoffeeScript%22%2C%20%22Literate%20Haskell%22%2C%20%22LiveScript%22%2C%20%22LLVM%22%2C%20%22Logos%22%2C%20%22Logtalk%22%2C%20%22LOLCODE%22%2C%20%22LookML%22%2C%20%22LoomScript%22%2C%20%22LSL%22%2C%20%22LTspice%20Symbol%22%2C%20%22M%22%2C%20%22M4%22%2C%20%22M4Sugar%22%2C%20%22Makefile%22%2C%20%22Mako%22%2C%20%22Markdown%22%2C%20%22Marko%22%2C%20%22Mask%22%2C%20%22Mathematica%22%2C%20%22Maven%20POM%22%2C%20%22Max%22%2C%20%22MAXScript%22%2C%20%22mcfunction%22%2C%20%22MediaWiki%22%2C%20%22Mercury%22%2C%20%22Meson%22%2C%20%22Metal%22%2C%20%22MiniD%22%2C%20%22Mirah%22%2C%20%22MLIR%22%2C%20%22Modelica%22%2C%20%22Modula-2%22%2C%20%22Modula-3%22%2C%20%22Module%20Management%20System%22%2C%20%22Monkey%22%2C%20%22Moocode%22%2C%20%22MoonScript%22%2C%20%22Motorola%2068K%20Assembly%22%2C%20%22MQL4%22%2C%20%22MQL5%22%2C%20%22MTML%22%2C%20%22MUF%22%2C%20%22mupad%22%2C%20%22Myghty%22%2C%20%22nanorc%22%2C%20%22NCL%22%2C%20%22Nearley%22%2C%20%22Nemerle%22%2C%20%22nesC%22%2C%20%22NetLinx%22%2C%20%22NetLinx%2BERB%22%2C%20%22NetLogo%22%2C%20%22NewLisp%22%2C%20%22Nextflow%22%2C%20%22Nginx%22%2C%20%22Nim%22%2C%20%22Ninja%22%2C%20%22Nit%22%2C%20%22Nix%22%2C%20%22NL%22%2C%20%22NSIS%22%2C%20%22Nu%22%2C%20%22NumPy%22%2C%20%22ObjDump%22%2C%20%22Objective-C%2B%2B%22%2C%20%22Objective-J%22%2C%20%22ObjectScript%22%2C%20%22OCaml%22%2C%20%22Omgrofl%22%2C%20%22ooc%22%2C%20%22Opa%22%2C%20%22Opal%22%2C%20%22OpenCL%22%2C%20%22OpenEdge%20ABL%22%2C%20%22OpenRC%20runscript%22%2C%20%22OpenSCAD%22%2C%20%22OpenStep%20Property%20List%22%2C%20%22OpenType%20Feature%20File%22%2C%20%22Org%22%2C%20%22Ox%22%2C%20%22Oxygene%22%2C%20%22Oz%22%2C%20%22P4%22%2C%20%22Pan%22%2C%20%22Papyrus%22%2C%20%22Parrot%22%2C%20%22Parrot%20Assembly%22%2C%20%22Parrot%20Internal%20Representation%22%2C%20%22Pascal%22%2C%20%22Pawn%22%2C%20%22Pep8%22%2C%20%22Perl%206%22%2C%20%22Pic%22%2C%20%22Pickle%22%2C%20%22PicoLisp%22%2C%20%22PigLatin%22%2C%20%22Pike%22%2C%20%22PLpgSQL%22%2C%20%22PLSQL%22%2C%20%22Pod%22%2C%20%22Pod%206%22%2C%20%22PogoScript%22%2C%20%22Pony%22%2C%20%22PostCSS%22%2C%20%22PostScript%22%2C%20%22POV-Ray%20SDL%22%2C%20%22PowerBuilder%22%2C%20%22PowerShell%22%2C%20%22Processing%22%2C%20%22Prolog%22%2C%20%22Propeller%20Spin%22%2C%20%22Protocol%20Buffer%22%2C%20%22Public%20Key%22%2C%20%22Pug%22%2C%20%22Puppet%22%2C%20%22Pure%20Data%22%2C%20%22PureBasic%22%2C%20%22PureScript%22%2C%20%22Python%20console%22%2C%20%22Python%20traceback%22%2C%20%22q%22%2C%20%22QMake%22%2C%20%22QML%22%2C%20%22Quake%22%2C%20%22Racket%22%2C%20%22Ragel%22%2C%20%22RAML%22%2C%20%22Rascal%22%2C%20%22Raw%20token%20data%22%2C%20%22RDoc%22%2C%20%22REALbasic%22%2C%20%22Reason%22%2C%20%22Rebol%22%2C%20%22Red%22%2C%20%22Redcode%22%2C%20%22Regular%20Expression%22%2C%20%22Ren'Py%22%2C%20%22RenderScript%22%2C%20%22reStructuredText%22%2C%20%22REXX%22%2C%20%22RHTML%22%2C%20%22Rich%20Text%20Format%22%2C%20%22Ring%22%2C%20%22RMarkdown%22%2C%20%22RobotFramework%22%2C%20%22Roff%22%2C%20%22Roff%20Manpage%22%2C%20%22Rouge%22%2C%20%22RPC%22%2C%20%22RPM%20Spec%22%2C%20%22RUNOFF%22%2C%20%22Rust%22%2C%20%22Sage%22%2C%20%22SaltStack%22%2C%20%22SAS%22%2C%20%22Sass%22%2C%20%22Scaml%22%2C%20%22Scheme%22%2C%20%22Scilab%22%2C%20%22SCSS%22%2C%20%22sed%22%2C%20%22Self%22%2C%20%22ShaderLab%22%2C%20%22ShellSession%22%2C%20%22Shen%22%2C%20%22Slash%22%2C%20%22Slice%22%2C%20%22Slim%22%2C%20%22Smali%22%2C%20%22Smalltalk%22%2C%20%22Smarty%22%2C%20%22SmPL%22%2C%20%22SMT%22%2C%20%22Solidity%22%2C%20%22SourcePawn%22%2C%20%22SPARQL%22%2C%20%22Spline%20Font%20Database%22%2C%20%22SQF%22%2C%20%22SQL%22%2C%20%22SQLPL%22%2C%20%22Squirrel%22%2C%20%22SRecode%20Template%22%2C%20%22SSH%20Config%22%2C%20%22Stan%22%2C%20%22Standard%20ML%22%2C%20%22Stata%22%2C%20%22STON%22%2C%20%22Stylus%22%2C%20%22SubRip%20Text%22%2C%20%22SugarSS%22%2C%20%22SuperCollider%22%2C%20%22Svelte%22%2C%20%22SVG%22%2C%20%22SystemVerilog%22%2C%20%22Tcl%22%2C%20%22Tcsh%22%2C%20%22Tea%22%2C%20%22Terra%22%2C%20%22Texinfo%22%2C%20%22Text%22%2C%20%22Textile%22%2C%20%22Thrift%22%2C%20%22TI%20Program%22%2C%20%22TLA%22%2C%20%22TOML%22%2C%20%22TSQL%22%2C%20%22TSX%22%2C%20%22Turing%22%2C%20%22Turtle%22%2C%20%22Twig%22%2C%20%22TXL%22%2C%20%22Type%20Language%22%2C%20%22TypeScript%22%2C%20%22Unified%20Parallel%20C%22%2C%20%22Unity3D%20Asset%22%2C%20%22Unix%20Assembly%22%2C%20%22Uno%22%2C%20%22UnrealScript%22%2C%20%22UrWeb%22%2C%20%22V%22%2C%20%22Vala%22%2C%20%22VCL%22%2C%20%22Verilog%22%2C%20%22VHDL%22%2C%20%22Visual%20Basic%22%2C%20%22Volt%22%2C%20%22Vue%22%2C%20%22Wavefront%20Material%22%2C%20%22Wavefront%20Object%22%2C%20%22wdl%22%2C%20%22Web%20Ontology%20Language%22%2C%20%22WebAssembly%22%2C%20%22WebIDL%22%2C%20%22WebVTT%22%2C%20%22Windows%20Registry%20Entries%22%2C%20%22wisp%22%2C%20%22Wollok%22%2C%20%22World%20of%20Warcraft%20Addon%20Data%22%2C%20%22X%20BitMap%22%2C%20%22X%20Font%20Directory%20Index%22%2C%20%22X%20PixMap%22%2C%20%22X10%22%2C%20%22xBase%22%2C%20%22XC%22%2C%20%22XCompose%22%2C%20%22XML%22%2C%20%22XML%20Property%20List%22%2C%20%22Xojo%22%2C%20%22XPages%22%2C%20%22XProc%22%2C%20%22XQuery%22%2C%20%22XS%22%2C%20%22XSLT%22%2C%20%22Xtend%22%2C%20%22Yacc%22%2C%20%22YAML%22%2C%20%22YANG%22%2C%20%22YARA%22%2C%20%22YASnippet%22%2C%20%22ZAP%22%2C%20%22Zeek%22%2C%20%22ZenScript%22%2C%20%22Zephir%22%2C%20%22Zig%22%2C%20%22ZIL%22%2C%20%22Zimpl%22%5D%3Bfunction%20dragElement()%20%7Bvar%20el%20%3D%20this.parentElement%3Bvar%20pos1%20%3D%200%2Cpos2%20%3D%200%2Cpos3%20%3D%200%2Cpos4%20%3D%200%3Bif%20(document.getElementById(this.id))%20document.getElementById(this.id).onmousedown%20%3D%20dragMouseDown%3Belse%20this.onmousedown%20%3D%20dragMouseDown%3Bfunction%20dragMouseDown(e)%20%7Bpos3%20%3D%20e.clientX%3Bpos4%20%3D%20e.clientY%3Bdocument.onmouseup%20%3D%20closeDragElement%3Bdocument.onmousemove%20%3D%20elementDrag%3B%7Dfunction%20elementDrag(e)%20%7Bpos1%20%3D%20pos3%20-%20e.clientX%3Bpos2%20%3D%20pos4%20-%20e.clientY%3Bpos3%20%3D%20e.clientX%3Bpos4%20%3D%20e.clientY%3Bel.style.top%20%3D%20(el.offsetTop%20-%20pos2)%20%2B%20%22px%22%3Bel.style.left%20%3D%20(el.offsetLeft%20-%20pos1)%20%2B%20%22px%22%3Bel.style.opacity%20%3D%20%220.85%22%3Bel.style.transition%20%3D%20%22opacity%20700ms%22%3B%7Dfunction%20closeDragElement()%20%7Bdocument.onmouseup%20%3D%20null%3Bdocument.onmousemove%20%3D%20null%3Bel.style.opacity%20%3D%20%221%22%3B%7D%7Dvar%20svgs%20%3D%20%7Bclose%3A%20%60%3Csvg%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Cg%20style%3D%22transform%3A%20scale(0.85%2C%200.85)%22%20stroke-width%3D%221%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cg%20transform%3D%22translate(2%2C%202)%22%20stroke%3D%22%23e21212%22%20stroke-width%3D%228%22%3E%3Cpath%20d%3D%22M47.806834%2C19.6743435%20L47.806834%2C77.2743435%22%20transform%3D%22translate(49%2C%2050)%20rotate(225)%20translate(-49%2C%20-50)%20%22%2F%3E%3Cpath%20d%3D%22M76.6237986%2C48.48%20L19.0237986%2C48.48%22%20transform%3D%22translate(49%2C%2050)%20rotate(225)%20translate(-49%2C%20-50)%20%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%60%2C%7D%3Bfunction%20closeView()%20%7Bthis.parentElement.parentElement.outerHTML%20%3D%20''%3Bif(gi(document%2C'langOptions_container'))%20gi(document%2C'langOptions_container').outerHTML%20%3D%20''%3B%7Dfunction%20aninCloseBtn()%20%7Bvar%20l1%20%3D%20tn(this%2C%20'path')%5B0%5D%3Bvar%20l2%20%3D%20tn(this%2C%20'path')%5B1%5D%3Bl1.style.transform%20%3D%20%22translate(49px%2C%2050px)%20rotate(45deg)%20translate(-49px%2C%20-50px)%22%3Bl1.style.transition%20%3D%20%22all%20333ms%22%3Bl2.style.transform%20%3D%20%22translate(49px%2C%2050px)%20rotate(135deg)%20translate(-49px%2C%20-50px)%22%3Bl2.style.transition%20%3D%20%22all%20133ms%22%3B%7Dfunction%20anoutCloseBtn()%20%7Bvar%20l1%20%3D%20tn(this%2C%20'path')%5B0%5D%3Bvar%20l2%20%3D%20tn(this%2C%20'path')%5B1%5D%3Bl1.style.transform%20%3D%20%22translate(49px%2C%2050px)%20rotate(225deg)%20translate(-49px%2C%20-50px)%22%3Bl1.style.transition%20%3D%20%22all%20333ms%22%3Bl2.style.transform%20%3D%20%22translate(49px%2C%2050px)%20rotate(225deg)%20translate(-49px%2C%20-50px)%22%3Bl2.style.transition%20%3D%20%22all%20133ms%22%3B%7Dfunction%20createSearchBox()%20%7Bif(gi(document%2C'githubber_search'))%20gi(document%2C'githubber_search').outerHTML%20%3D%20''%3Bvar%20inputLabels%20%3D%20%5B'Full%20Name'%2C%20'Location'%2C%20'%23%20Followers'%2C%20'%23%20of%20Repos'%5D%3Bvar%20inputPlaceholders%20%3D%20%5B'Evan%20You'%2C%20'California'%2C%20'%3E20'%2C%20'10..100'%5D%3Bvar%20main%20%3D%20ele('div')%3Battr(main%2C%20'style'%2C%20%60position%3A%20fixed%3B%20top%3A%205%25%3B%20left%3A%205%25%3B%20width%3A%2033%25%3B%20z-index%3A%2012212%60)%3Battr(main%2C%20'id'%2C%20'githubber_search')%3Bdocument.body.appendChild(main)%3Bvar%20head%20%3D%20ele('div')%3Battr(head%2C'style'%2C%60background%3A%20%2324292e%3B%20width%3A%20100%25%3B%20height%3A%2040px%3B%20border%3A%201.6px%20solid%20%231c1c1c%3B%20border-top-right-radius%3A%200.3em%3B%20border-top-left-radius%3A%200.3em%3B%20cursor%3A%20move%3B%60)%3Bmain.appendChild(head)%3Bhead.onmouseover%20%3D%20dragElement%3Bvar%20cls%20%3D%20ele('div')%3Bhead.appendChild(cls)%3Battr(cls%2C%20'style'%2C%20'grid-area%3A%201%20%2F%203%3B%20width%3A%2030px%3B%20height%3A%2030px%3B%20cursor%3A%20pointer%3B%20transform%3A%20scale(1.2%2C%201.2)%3B%20float%3A%20right%3B')%3Bcls.innerHTML%20%3D%20svgs.close%3Bcls.onmouseenter%20%3D%20aninCloseBtn%3Bcls.onmouseleave%20%3D%20anoutCloseBtn%3Bcls.onclick%20%3D%20closeView%3Bvar%20box%20%3D%20ele('div')%3Battr(box%2C%20'style'%2C%20%60border%3A%201.6px%20solid%20%23004471%3B%20%20border-bottom-left-radius%3A%200.3em%3B%20border-bottom-right-radius%3A%200.3em%3B%20padding%3A%2016px%3B%20background%3A%20%23fff%3B%60)%3Battr(box%2C%20'id'%2C%20'githubber_search')%3Bmain.appendChild(box)%3Bfor%20(var%20i%20%3D%200%3B%20i%20%3C%20inputLabels.length%3B%20i%2B%2B)%20%7Bvar%20cont%20%3D%20ele('div')%3Battr(cont%2C%20'style'%2C%20'width%3A%20100%25%3B')%3Bbox.appendChild(cont)%3Bvar%20label%20%3D%20ele('div')%3Battr(cont%2C%20'style'%2C%20'width%3A%20100%25%3B')%3Blabel.innerText%20%3D%20inputLabels%5Bi%5D%3Bcont.appendChild(label)%3Bvar%20input%20%3D%20ele('input')%3Battr(input%2C%20'id'%2C%20inputLabels%5Bi%5D.replace(%2F%5E.*%3F(%3F%3D%5BA-Z%5D)%2F%2C%20'').replace(%2F%5Cs%2B%2Fg%2C'').toLowerCase()%20%2B%20'__')%3Battr(input%2C%20'style'%2C%20%60width%3A%20100%25%3B%20border%3A%201px%20solid%20%23004471%3B%20border-radius%3A%200.3em%3B%20padding%3A%203px%3B%60)%3Battr(input%2C%20'placeholder'%2C%20inputPlaceholders%5Bi%5D)%3Bcont.appendChild(input)%3Binput.onkeyup%20%3D%20keyupRun%3B%7Dvar%20selc%20%3D%20ele('div')%3Battr(selc%2C%20'style'%2C%20%60%60)%3Bbox.appendChild(selc)%3Bvar%20lab%20%3D%20ele('div')%3Blab.innerText%20%3D%20'Language'%3Bselc.appendChild(lab)%3Bvar%20langSearch%20%3D%20ele('input')%3Battr(langSearch%2C'id'%2C'language__')%3Battr(langSearch%2C%20'placeholder'%2C%20'JavaScript')%3Battr(langSearch%2C%20'style'%2C%20%60width%3A%20100%25%3B%20border%3A%201px%20solid%20%23004471%3B%20border-radius%3A%200.3em%3B%20padding%3A%203px%3B%60)%3Bselc.appendChild(langSearch)%3BlangSearch.onkeydown%20%3D%20listenForArrow%3BlangSearch.onkeyup%20%3D%20listenForLang%3Bvar%20empt%20%3D%20ele('div')%3Battr(empt%2C%20'style'%2C%20%60width%3A%20100%25%3B%20height%3A%2020px%3B%20border%3A%201px%20solid%20%23fff%3B%20border-radius%3A%200.3em%3B%20padding%3A%203px%3B%60)%3Bbox.appendChild(empt)%3Bvar%20search%20%3D%20ele('div')%3Battr(search%2C%20'style'%2C%20%60width%3A%20100%25%3B%20border%3A%201px%20solid%20%23004471%3B%20border-radius%3A%200.3em%3B%20padding%3A%203px%3B%20text-align%3A%20center%3B%20color%3A%20%23004471%3B%20cursor%3A%20pointer%3B%60)%3Battr(search%2C'id'%2C'githubber_search_btn')%3Bbox.appendChild(search)%3Bsearch.innerText%20%3D%20'Search'%3Bsearch.onmouseup%20%3D%20runSearch%3Bsearch.onmouseenter%20%3D%20sBtnIn%3Bsearch.onmouseleave%20%3D%20sBtnOut%3Bfunction%20sBtnIn()%7Bthis.style.background%20%3D%20'%23defff2'%3B%7D%3Bfunction%20sBtnOut()%7Bthis.style.background%20%3D%20'%23fff'%3B%7D%3B%7Dfunction%20listenForArrow(e)%7Bif(e.key%20%3D%3D%20%22ArrowDown%22)%7Bgi(document%2C'language__').value%20%3D%20cn(document%2C'lang_opts')%5B0%5D.innerText%3Bif(gi(document%2C'langOptions_container'))%20gi(document%2C'langOptions_container').outerHTML%20%3D%20''%3B%7D%7Dfunction%20listenForLang(e)%7Bif(gi(document%2C'langOptions_container'))%20gi(document%2C'langOptions_container').outerHTML%20%3D%20''%3Bvar%20langs%20%3D%20langOpts.filter(el%3D%3E%20booleanSearch(this.value.trim()%2Cel))%3Bvar%20parent%20%3D%20ele('div')%3Bvar%20rect%20%3D%20this.getBoundingClientRect()%3Battr(parent%2C'style'%2C%20%60position%3A%20fixed%3B%20top%3A%20%24%7Brect.bottom%7Dpx%3B%20left%3A%20%24%7Brect.left%7Dpx%3B%20background%3A%20%23fff%3B%20border%3A%201px%20solid%20%23004471%3B%20border-bottom-left-radius%3A%200.2em%3B%20border-bottom-right-radius%3A%200.2em%3B%20padding%3A%209px%3B%20z-index%3A%2013212%3B%60)%3Battr(parent%2C'id'%2C%20%60langOptions_container%60)%3Bdocument.body.appendChild(parent)%3BcreateOptions(parent%2Clangs)%3Bif(e.key%20%3D%3D%20'Enter')%20%7BrunSearch()%3Bif(gi(document%2C'langOptions_container'))%20gi(document%2C'langOptions_container').outerHTML%20%3D%20''%3B%7Dif(this.value.trim().length%3C1)%20gi(document%2C'langOptions_container').outerHTML%20%3D%20''%3B%7Dfunction%20createOptions(parent%2Clangs)%7Bfor%20(var%20i%20%3D%200%3B%20i%3Clangs.length%3B%20i%2B%2B)%20%7Bvar%20opt%20%3D%20ele('div')%3Battr(opt%2C%20'class'%2C%20'lang_opts')%3Battr(opt%2C%20'data'%2C%20langs%5Bi%5D)%3Battr(opt%2C%20'style'%2C%20%60width%3A%20100%25%3B%20border-bottom%3A%201px%20solid%20%23004471%3B%20cursor%3A%20pointer%3B%20padding%3A%204px%3B%20z-index%3A%2013212%3B%60)%3Bparent.appendChild(opt)%3Bopt.innerText%20%3D%20langs%5Bi%5D%3Bopt.onmouseenter%20%3D%20mousein%3Bopt.onmouseleave%20%3D%20mouseout%3Bopt.onmousedown%20%3D%20mousedown%3Bopt.onmouseup%20%3D%20mouseup%3B%7D%7Dfunction%20mousein()%7Bthis.style.background%20%3D%20'%23cbf2e3'%3Bthis.style.transition%20%3D%20'all%20200ms'%3B%7Dfunction%20mouseout()%7Bthis.style.background%20%3D%20'%23fff'%3Bthis.style.transition%20%3D%20'all%20200ms'%3B%7Dfunction%20mousedown()%7Bthis.style.background%20%3D%20'%23b1f0d8'%3Bthis.style.transition%20%3D%20'all%20200ms'%3B%7Dfunction%20mouseup()%7Bgi(document%2C'language__').value%20%3D%20this.innerText.trim()%3Bthis.style.background%20%3D%20'%23cbf2e3'%3Bthis.style.transition%20%3D%20'all%20200ms'%3Bthis.parentElement.outerHTML%20%3D%20''%3B%7Dfunction%20keyupRun(e)%7Bif(e.key%20%3D%3D%20%22Enter%22)%20%7BrunSearch()%7D%7Dfunction%20runSearch()%7Bvar%20nm%20%3D%20gi(document%2C'fullname__')%3Bvar%20lc%20%3D%20gi(document%2C'location__')%3Bvar%20fl%20%3D%20gi(document%2C'followers__')%3Bvar%20rp%20%3D%20gi(document%2C'repos__')%3Bvar%20lg%20%3D%20gi(document%2C'language__')%3Bvar%20name%20%3D%20nm%20%26%26%20nm.value%20%3F%20%60fullname%253A%24%7Bnm.value.trim()%7D%60%20%3A%20''%3Bvar%20geo%20%3D%20lc%20%26%26%20lc.value%20%26%26%20lc.value.split(%2F%2C%5Cs*%2F).length%20%3E%201%3F%20('%2Blocation%253A')%2B(lc.value.split(%2F%2C%5Cs*%2F).reduce((a%2Cb)%3D%3E%20a%2B%60%2Blocation%253A%60%2Bb))%20%3A%20lc%20%26%26%20lc.value%20%26%26%20%2F%5Cb%5Cs%2B%5CbOR%5Cb%5Cs%2B%5Cb%2F.test(lc.value)%3F%20(('%2Blocation%253A')%2B(lc.value.split(%2F%5Cb%5Cs%2B%5CbOR%5Cb%5Cs%2B%5Cb%2F).reduce((a%2Cb)%3D%3E%20a%2B%60%2Blocation%253A%60%2Bb))).replace(%2F(%3F%3C%3D%253A)(%3F%3D%5B%5Cw%5Cs%5D%2B)%2F%2C%20'%22').replace(%2F(%3F%3C%3D%253A%22%5B%5Cw%5Cs%5D%2B)(%3F%3D%5C%2B)%2F%2C%20'%22')%20%3A%20lc%20%26%26%20lc.value%20%26%26%20%2F%5Cb%5Cs%2B%5Cb%2F.test(lc.value)%3F%20'location%253A%2522'%2Blc.value%2B'%2522'%20%3A%20lc%20%26%26%20lc.value%3F%20'location%253A'%2Blc.value%20%3A%20''%3Bvar%20folw%20%3D%20fl%20%26%26%20fl.value%20%3F%20%60%2Bfollowers%253A%24%7Bfl.value%7D%60%20%3A%20''%3Bvar%20repo%20%3D%20rp%20%26%26%20rp.value%20%3F%20%60%2Brepos%253A%24%7Brp.value%7D%60%20%3A%20''%3Bvar%20lang%20%3D%20lg%20%26%26%20lg.value%20%3F%20%60%2Blanguage%253A%24%7Blg.value%7D%60%20%3A%20''%3Bvar%20out%20%3D%20(%60https%3A%2F%2Fgithub.com%2Fsearch%3Fq%3D%60%2Bname%2Bgeo%2Brepo%2Blang%2Bfolw%2B%60%26type%3DUsers%26ref%3Dadvsearch%60).replace(%2F%5C%3D%5C%2B%2F%2C%20'%3D')%3Bif(gi(document%2C'langOptions_container'))%20gi(document%2C'langOptions_container').outerHTML%20%3D%20''%3Bwindow.open(out)%3B%7DcreateSearchBox()%7D)() 2 | -------------------------------------------------------------------------------- /downloadFollowers.js: -------------------------------------------------------------------------------- 1 | var reg = (el, n) => el ? el[n] : ''; 2 | var cn = (ob, nm) => ob.getElementsByClassName(nm); 3 | var tn = (ob, nm) => ob.getElementsByTagName(nm); 4 | var gi = (ob, nm) => ob.getElementById(nm); 5 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 6 | var rando = (n) => Math.round(Math.random() + n); 7 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 8 | 9 | var csvTable = (arr) => arr.map(itm => itm.toString().replace(/$/, '\r')).toString().replace(/\r,/g, '\r'); 10 | 11 | var targetUrl = window.location.href.replace(/\?.+/, '')+"?tab="; 12 | 13 | async function getDoc(url){ 14 | var res = await fetch(url); 15 | var text = await res.text(); 16 | return new DOMParser().parseFromString(text, 'text/html'); 17 | } 18 | 19 | async function getFollow(url,type){ 20 | var doc = await getDoc(url+type); 21 | var followers = Array.from(cn(doc, 'd-table table-fixed col-12 width-full py-4 border-bottom border-gray-light')).map(div=> tn(div, 'a')[0].href); 22 | return followers; 23 | } 24 | 25 | async function getTargets(url){ 26 | var following = await getFollow(url,'following'); 27 | var followers = await getFollow(url,'followers'); 28 | var targets = followers.concat(following); 29 | return targets; 30 | } 31 | async function getEmailFromProfile(url) { 32 | var res = await fetch(url + '?tab=repositories'); 33 | var text = await res.text(); 34 | var doc = new DOMParser().parseFromString(text, 'text/html'); 35 | var repos = doc.getElementsByClassName('col-12 d-flex width-full py-4 border-bottom public source'); 36 | var targetRepos = Array.from(repos).map(itm => itm.getElementsByTagName('a')[0].href + '/commit/master.patch'); 37 | return checkEmailPatch(targetRepos); 38 | } 39 | 40 | async function getPatches(link) { 41 | var res = await fetch(link); 42 | var html = await res.text(); 43 | var email = reg(/[\w|\.]+@\S+\.[a-zA-Z]+/.exec(html),0); 44 | return email; 45 | } 46 | 47 | async function checkEmailPatch(repos) { 48 | for (i = 0; i < repos.length; i++) { 49 | var email = await getPatches(repos[i]); 50 | if (email != '') { 51 | return email; 52 | } 53 | } 54 | } 55 | 56 | async function getProfileDetails(url) { 57 | var parseVcard = (attr) => vcard.filter(elm => elm.getAttribute('itemprop') == attr)[0] ? vcard.filter(elm => elm.getAttribute('itemprop') == attr)[0].innerText.trim().replace(/,/g,'') : ''; 58 | var res = await fetch(url); 59 | var text = await res.text(); 60 | var doc = new DOMParser().parseFromString(text, 'text/html'); 61 | var fullname = cn(doc, 'p-name vcard-fullname')[0] ? cn(doc, 'p-name vcard-fullname')[0].innerText.trim().replace(/,/g,'') : ''; 62 | var vcard = Array.from(tn(cn(doc, 'vcard-details')[0], 'li')); 63 | var geo = parseVcard('homeLocation'); 64 | var empl = parseVcard('worksFor'); 65 | var web = parseVcard('url'); 66 | var emailCheck = await getEmailFromProfile(url); 67 | var email = emailCheck && /noreply/i.test(emailCheck) === false ? emailCheck : ''; 68 | return [fullname, empl, geo, email, web, url]; 69 | } 70 | 71 | async function downloadr(str, name) { 72 | var type = "data:text/plain;charset=utf-8,"; 73 | var file = new Blob([str], { 74 | type: type 75 | }); 76 | var a = document.createElement("a"), 77 | url = URL.createObjectURL(file); 78 | a.href = url; 79 | a.download = name; 80 | document.body.appendChild(a); 81 | a.click(); 82 | await delay(10); 83 | document.body.removeChild(a); 84 | window.URL.revokeObjectURL(url); 85 | } 86 | 87 | async function looper(url){ 88 | var two2arr = ['Full Name','Employer','Location','Email','Website','Github']; 89 | var links = await getTargets(url); 90 | for(var i=0; i document.createElement(t); 5 | var attr = (o, k, v) => o.setAttribute(k, v); 6 | var a = (l, r) => r.forEach(a => attr(l, a[0], a[1])); 7 | var cn = (ob, nm) => ob.getElementsByClassName(nm); 8 | var tn = (ob, nm) => ob.getElementsByTagName(nm); 9 | var gi = (ob, nm) => ob.getElementById(nm); 10 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 11 | var rando = (n) => Math.round(Math.random() + n); 12 | function setQuickliCSS(main_cont_id){ 13 | if(gi(document,`${main_cont_id}_style`)) gi(document,`${main_cont_id}_style`).outerHTML = ''; 14 | let csselm = ele('style'); 15 | a(csselm,[['class',`${main_cont_id}_style`]]); 16 | document.head.appendChild(csselm); 17 | csselm.innerHTML = ` 18 | .always_white always_white{ 19 | color: #3d00ad; 20 | } 21 | .always_white:hover { 22 | color: #ffffff; 23 | } 24 | .quickli_options_container_main { 25 | background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23a6d5, #23d5ab); 26 | background-size: 400% 400%; 27 | animation: gradient_quickli 3s ease infinite; 28 | } 29 | @keyframes gradient_quickli { 30 | 0% { 31 | background-position: 0% 50%; 32 | } 33 | 50% { 34 | background-position: 100% 50%; 35 | } 36 | 100% { 37 | background-position: 0% 50%; 38 | } 39 | }`; 40 | } 41 | setQuickliCSS('quickli_options_container_main'); 42 | function createDownloadHTML() { 43 | if(gi(document,'downloading_notifier')) gi(document,'downloading_notifier').outerHTML = ''; 44 | const body_width = document.body.getBoundingClientRect().width; 45 | const download_bar_width = body_width * 0.8; 46 | let cont = ele('div'); 47 | a(cont, [['id', 'downloading_notifier'], ['style', `position: fixed; top: 100px; left: ${((body_width - download_bar_width)/2)}px; width: ${download_bar_width}px; z-index: ${topZIndexer()}; background: #1c1c1c; border: 2px solid #1c1c1c; border-radius: 0.2em;`]]); 48 | document.body.appendChild(cont); 49 | let perc = ele('div'); 50 | a(perc, [['id', 'downloading_percentage_bar'],['class','quickli_options_container_main'], ['style', `width: 0px; height: 50px; border-bottom-right-radius: 0.2em; border-top-right-radius: 0.2em; transition: all 1s;`]]); 51 | cont.appendChild(perc); 52 | let txt = ele('div'); 53 | a(txt, [['id', 'downloading_percentage_txt'], ['style', `color: #ffffff; width: ${download_bar_width}px;`]]); 54 | perc.appendChild(txt); 55 | txt.innerHTML = 'initiating download...'; 56 | } 57 | function updateDownloadBar(obj){ 58 | const {text,img,iteration,total_results,status} = obj; 59 | const body_width = document.body.getBoundingClientRect().width; 60 | const download_bar_width = body_width * 0.8; 61 | let cont = gi(document,'downloading_notifier'); 62 | let perc = gi(document,'downloading_percentage_bar'); 63 | let txt = gi(document,'downloading_percentage_txt'); 64 | inlineStyler(cont,`{width: ${download_bar_width}px;}`); 65 | perc.style.width = `${( download_bar_width * ( iteration / total_results ) )}px`; 66 | let img_html = ``; 67 | txt.innerHTML = `
${img_html}
${Math.ceil( ( iteration / total_results ) * 100)}%
complete
${text}
`; 68 | if(status !== true) cont.outerHTML = ''; 69 | } 70 | function convertToTSV(params) { 71 | const {fileArray,file_name} = params; 72 | const transpose = (a)=> a[0].map((_, c)=> a.map(r=> r[c])); 73 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 74 | var firstLevel = fileArray.map(el => Object.entries(el)); 75 | var lens = Math.max(...firstLevel.map(el => el.length)); 76 | var header = unq(firstLevel.map(el => el.map(itm => itm[0])).flat()); 77 | var table = [header]; 78 | var str = (o) => typeof o == 'object' ? JSON.stringify(o).replace(/\n|\r/g, ' ') : o.toString().replace(/\n|\r/g, ' '); 79 | for (var i = 0; i < firstLevel.length; i++) { 80 | var arr = []; 81 | var row = []; 82 | for (var s = 0; s < firstLevel[i].length; s++) { 83 | var place = header.indexOf(firstLevel[i][s][0]); 84 | arr[place] = firstLevel[i][s][1]; 85 | } 86 | for (var a = 0; a < arr.length; a++) { 87 | if (arr[a]) { 88 | row.push(arr[a]); 89 | } else { 90 | row.push(''); 91 | } 92 | } 93 | table.push(row); 94 | } 95 | 96 | function downloadr(arr2D, filename) { 97 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el => el.reduce((a, b) => a + '\t' + b)).reduce((a, b) => a + '\r' + b); 98 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 99 | var file = new Blob([data], { 100 | type: type 101 | }); 102 | if (window.navigator.msSaveOrOpenBlob) { 103 | window.navigator.msSaveOrOpenBlob(file, filename); 104 | } else { 105 | var a = document.createElement('a'), 106 | url = URL.createObjectURL(file); 107 | a.href = url; 108 | a.download = filename; 109 | document.body.appendChild(a); 110 | a.click(); 111 | setTimeout(() => { 112 | document.body.removeChild(a); 113 | window.URL.revokeObjectURL(url); 114 | }, 10); 115 | } 116 | } 117 | var output = table.map(el => el.map(itm => str(itm))); 118 | downloadr((output), file_name+'.tsv'); 119 | } 120 | function ymdFormat(d){ 121 | let date = new Date(d); 122 | let yr = date.getFullYear(); 123 | let mo = date.getMonth()+1; 124 | let day = date.getDate(); 125 | return `${yr}-${(mo < 10 ? '0'+mo.toString() : mo)}-${(day < 10 ? '0'+day.toString() : day)}`; 126 | } 127 | async function getContributors(path){ 128 | console.log(path); 129 | var res = await fetch(`https://github.com/${path}/graphs/contributors-data`, { 130 | "headers": { 131 | "accept": "application/json", 132 | "accept-language": "en-US,en;q=0.9", 133 | "sec-ch-ua": "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"97\", \"Chromium\";v=\"97\"", 134 | "sec-ch-ua-mobile": "?0", 135 | "sec-ch-ua-platform": "\"Windows\"", 136 | "sec-fetch-dest": "empty", 137 | "sec-fetch-mode": "cors", 138 | "sec-fetch-site": "same-origin", 139 | "x-requested-with": "XMLHttpRequest" 140 | }, 141 | "referrer": `https://github.com/${path}/graphs/contributors`, 142 | "referrerPolicy": "no-referrer-when-downgrade", 143 | "body": null, 144 | "method": "GET", 145 | "mode": "cors", 146 | "credentials": "include" 147 | }); 148 | var d = await res.json(); 149 | 150 | var top100 = d.map(r=> { 151 | let index_c = Math.max(...r.weeks?.map(i=> i.c)); 152 | 153 | let info = { 154 | added:r.weeks?.map(i=> i.a).reduce((a,b)=> a+b), 155 | deleted:r.weeks?.map(i=> i.d).reduce((a,b)=> a+b), 156 | commits:r.weeks?.map(i=> i.c).reduce((a,b)=> a+b), 157 | last_commit_week:ymdFormat( Math.max(...r.weeks?.map(i=> i.w)) * 1000), 158 | peak_commit_week:ymdFormat( r.weeks[r.weeks?.findIndex(i=> i.c == index_c)].w * 1000 ) 159 | } 160 | return { 161 | 162 | ...r.author, 163 | ...info 164 | } 165 | }) 166 | return top100; 167 | } 168 | 169 | 170 | 171 | 172 | var cleanNumbers = (s)=> /k/.test(s) ? parseFloat(s.replace(/k/))* 1000 : /\d/.test(s) ? parseFloat(s) : s; 173 | 174 | var cleanObject = (ob) => 175 | Object.entries(ob).reduce((r, [k, v]) => { 176 | if( v != null && v != undefined && v !== "" && ( ['string','number','boolean','function','symbol'].some(opt=> typeof v == opt) || (typeof v == 'object' && ((Array.isArray(v) && v.length) || (Array.isArray(v) != true) ) ) ) ) { 177 | r[k] = v; 178 | return r; 179 | } else { 180 | return r; 181 | } 182 | }, {}); 183 | 184 | 185 | function topZIndexer(){ 186 | let n = new Date().getTime() / 1000000; 187 | let r = (n - Math.floor(n)) * 100000; 188 | return (Math.ceil(n+r) * 10); 189 | } 190 | 191 | function inlineStyler(elm,css){ 192 | Object.entries(JSON.parse( 193 | css.replace(/(?<=:)\s*(\b|\B)(?=.+?;)/g,'"') 194 | .replace(/(?<=:\s*.+?);/g,'",') 195 | .replace(/[a-zA-Z-]+(?=:)/g, k=> k.replace(/^\b/,'"').replace(/\b$/,'"')) 196 | .replace(/\s*,\s*\}/g,'}') 197 | )).forEach(kv=> { elm.style[kv[0]] = kv[1]}); 198 | } 199 | 200 | async function getEmailFromProfile(url) { 201 | var res = await fetch(url + '?tab=repositories'); 202 | var text = await res.text(); 203 | var doc = new DOMParser().parseFromString(text, 'text/html'); 204 | var repos = doc.getElementsByClassName('col-12 d-flex width-full py-4 border-bottom public source'); 205 | var targetRepos = Array.from(repos).map(itm => itm.getElementsByTagName('a')[0].href + '/commit/master.patch'); 206 | return await checkEmailPatch(targetRepos); 207 | } 208 | 209 | async function getPatches(link) { 210 | var res = await fetch(link); 211 | var html = await res.text(); 212 | var email = /\b[\w\.\-\+]+@[\w\-]+\.[a-zA-Z]{2,13}(\.[a-zA-Z]{2,13}|\b)/i.exec(html)?.[0]; 213 | return email; 214 | } 215 | 216 | async function checkEmailPatch(repos) { 217 | for (i = 0; i < repos.length; i++) { 218 | var email = await getPatches(repos[i]); 219 | if (email != '') { 220 | return email; 221 | } 222 | } 223 | } 224 | 225 | async function getProfileDetails(url) { 226 | var snakeCaser = (s) => s.split(/(?<=[a-z])\B(?=[A-Z])/).map(i=> i.toLowerCase()).reduce((a,b)=> a+'_'+b) 227 | var res = await fetch(url); 228 | var text = await res.text(); 229 | var doc = new DOMParser().parseFromString(text, 'text/html'); 230 | let follow_hrefs = Array.from(doc.getElementsByTagName('a'))?.filter(i=> /tab\=follow/.test(i.href)); 231 | var email_check = await getEmailFromProfile(url); 232 | var email = email_check && /noreply/i.test(email_check) === false ? email_check : ''; 233 | let vcards = Array.from(Array.from(doc.getElementsByTagName('ul')).filter(i=> i.getAttribute('class') == 'vcard-details')?.[0]?.getElementsByTagName('li'))?.filter(li=> li.getAttribute('itemprop'))?.map(li=> { 234 | return { 235 | [snakeCaser(li.getAttribute('itemprop'))]:li.innerText?.trim()?.replace(/^.+?\n/,'')?.trim() 236 | } 237 | }); 238 | 239 | let output = cleanObject({ 240 | ...{ 241 | num_following:cleanNumbers(follow_hrefs?.filter(i=> /tab\=following/.test(i.href))?.[0]?.getElementsByTagName('span')?.[0]?.innerText?.trim()), 242 | num_followers:cleanNumbers(follow_hrefs?.filter(i=> /tab\=follower/.test(i.href))?.[0]?.getElementsByTagName('span')?.[0]?.innerText?.trim()), 243 | bio: doc.getElementsByClassName('user-profile-bio')?.[0]?.innerText?.trim()?.replace(/\t|\n|\r/g, ' '), 244 | fullname: doc.getElementsByClassName('vcard-fullname')?.[0]?.innerText?.trim()?.replace(/\t|\n|\r/g, ' '), 245 | email:email, 246 | }, 247 | ...(vcards?.length ? vcards.reduce((a,b)=> {return {...a,...b}}) : {}) 248 | }) 249 | return output; 250 | } 251 | async function loopThroughUserProfiles(){ 252 | var contain_arr = []; 253 | createDownloadHTML(); 254 | let top_contributors = await getContributors(/(?<=\.\w+\/)\S+?\/\S+?(?=\/)/.exec(window.location.href)?.[0]); 255 | for(let i =0; i 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 rando = (n) => Math.round(Math.random() * n); 6 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 7 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 8 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 9 | var ele = (t) => document.createElement(t); 10 | var attr = (o, k, v) => o.setAttribute(k, v); 11 | 12 | function hoverSwitch() { /* { used_in: [mapComanyViews] } */ 13 | var back = this.style.background; 14 | var colr = this.style.color; 15 | this.style.background = colr; 16 | this.style.color = back; 17 | this.style.transition = "all 123ms"; 18 | } 19 | 20 | function dragElement() { 21 | var elmnt = this.parentElement; 22 | var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; 23 | if (document.getElementById(this.id)) { 24 | document.getElementById(this.id).onmousedown = dragMouseDown; 25 | } else { 26 | this.onmousedown = dragMouseDown; 27 | } 28 | 29 | function dragMouseDown(e) { 30 | pos3 = e.clientX; 31 | pos4 = e.clientY; 32 | document.onmouseup = closeDragElement; 33 | document.onmousemove = elementDrag; 34 | } 35 | 36 | function elementDrag(e) { 37 | pos1 = pos3 - e.clientX; 38 | pos2 = pos4 - e.clientY; 39 | pos3 = e.clientX; 40 | pos4 = e.clientY; 41 | elmnt.style.top = (elmnt.offsetTop - pos2) + "px"; 42 | elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"; 43 | elmnt.style.opacity = "0.85"; 44 | elmnt.style.transition = "opacity 700ms"; 45 | } 46 | 47 | function closeDragElement() { 48 | document.onmouseup = null; 49 | document.onmousemove = null; 50 | elmnt.style.opacity = "1"; 51 | } 52 | } 53 | 54 | function createSearchContainer(){ 55 | if(gi(document, 'download_cont')) gi(document, 'download_cont').outerHTML = ''; 56 | 57 | var cont = ele("div"); 58 | document.body.appendChild(cont); 59 | attr(cont, "id", "download_cont"); 60 | attr(cont, 'style', 'position: fixed; top: 20%; left: 50%; width: 360px; height: 260px; background: transparent; z-index: 12000;'); 61 | 62 | var head = ele("div"); 63 | attr(head, "id", "download_header"); 64 | attr(head, 'style', 'background: #004471; height: 9%; border: 1.5px solid #004471; border-top-right-radius: 0.25em; border-top-left-radius: 0.25em; padding: 0px; cursor: move;'); 65 | cont.appendChild(head); 66 | head.onmouseover = dragElement; 67 | 68 | 69 | var closeBtn = ele("div"); 70 | attr(closeBtn, "id", "search_btn_close"); 71 | attr(closeBtn, 'style', 'background: transparent; width: 15px; height: 15px; transform: scale(1.8, 1.2) translate(4px, 2px); border-radius: 1em; padding: 0px; color: Crimson; cursor: pointer'); 72 | head.appendChild(closeBtn); 73 | closeBtn.innerText = "X"; 74 | closeBtn.addEventListener("click", close); 75 | 76 | var body = ele("div"); 77 | attr(body, "id", "download_body"); 78 | attr(body, 'style', 'background: #fff; height: 90%; border: 1.5px solid #004471; border-bottom-right-radius: 0.25em; border-bottom-left-radius: 0.25em; padding: 6px;'); 79 | cont.appendChild(body); 80 | 81 | var dbody = ele("div"); 82 | attr(dbody, "id", "download_body_type"); 83 | attr(dbody, 'style', 'background: #fff; border-radius: 0.25em; padding: 6px;'); 84 | body.appendChild(dbody); 85 | 86 | var label = ele('div'); 87 | attr(label, "id", "download_body_label"); 88 | label.innerText = 'Location Search'; 89 | dbody.appendChild(label); 90 | 91 | var hinput = ele("input"); 92 | attr(hinput, "id", "geosearch_string"); 93 | attr(hinput, "placeholder", "Germany OR Finland"); 94 | attr(hinput, 'style', 'width: 98%; background: #fff; color: #004471; border-radius: 0.25em; border: 1px solid #004471; padding: 6px; cursor: text;'); 95 | dbody.appendChild(hinput); 96 | 97 | var dlBtn = ele("div"); 98 | attr(dlBtn, "id", "downloadr_btn"); 99 | attr(dlBtn, 'style', 'background: #fff; width: 30%; color: #004471; border: 1px solid #004471; border-radius: 0.25em; padding: 6px; cursor: pointer; text-align: center;'); 100 | dbody.appendChild(dlBtn); 101 | dlBtn.innerText = 'Run Search'; 102 | dlBtn.onmouseover = hoverSwitch; 103 | dlBtn.onmouseout = hoverSwitch; 104 | dlBtn.onclick = initForkSearch; 105 | 106 | function close() { 107 | document.body.removeChild(cont); 108 | } 109 | } 110 | 111 | function initForkSearch(){ 112 | var geoSearch = gi(document,'geosearch_string').value; 113 | getMatchingProfiles(geoSearch,reg(/(?<=github.com\/).+?\/.+?(?=\/|$)/.exec(window.location.href),0)); 114 | } 115 | 116 | createSearchContainer(); 117 | 118 | function convertToTSV(fileData) { 119 | var firstLevel = fileData.map(el => Object.entries(el)); 120 | var lens = Math.max(...firstLevel.map(el => el.length)); 121 | var header = unq(firstLevel.map(el => el.map(itm => itm[0])).flat()); 122 | var table = [header]; 123 | var str = (o) => typeof o == 'object' ? JSON.stringify(o).replace(/\n|\r/g, ' ') : o.toString().replace(/\n|\r/g, ' '); 124 | for (var i = 0; i < firstLevel.length; i++) { 125 | var arr = []; 126 | var row = []; 127 | for (var s = 0; s < firstLevel[i].length; s++) { 128 | var place = header.indexOf(firstLevel[i][s][0]); 129 | arr[place] = firstLevel[i][s][1]; 130 | } 131 | for (var a = 0; a < arr.length; a++) { 132 | if (arr[a]) { 133 | row.push(arr[a]); 134 | } else { 135 | row.push(''); 136 | } 137 | } 138 | table.push(row); 139 | } 140 | var output = table.map(el => el.map(itm => str(itm))); 141 | return output; 142 | } 143 | 144 | function parseAsRegexArr(bool) { 145 | function rxReady(s){ return s ? s.replace(/"/g, '\\b').trim().replace(/\)/g, '').replace(/\(/g, '').replace(/\s+/g, '.{0,2}').replace(/\//g, '\\/').replace(/\+/g, '\\+').replace(/\s*\*\s*/g, '\\s*\\w*\\s+') : s;} 146 | function checkSimpleOR(s) { return /\bor\b/i.test(s) && /\(/.test(s) === false;} 147 | if (checkSimpleOR(bool)) { 148 | var x = new RegExp(bool.replace(/\s+OR\s+|\s*\|\s*/gi, '|').replace(/\//g, '\\/').replace(/"/g, '\\b').replace(/\s+/g, '.{0,2}').replace(/\s*\*\s*/g, '\\s*\\w*\\s+'), 'i'); 149 | var xArr = [x]; 150 | return xArr; 151 | } else { 152 | var orx = "\\(.+?\\)|(\\(\\w+\\s{0,1}OR\\s|\\w+\\s{0,1}OR\\s)+((\\w+\s)+?|(\\w+)\\)+)+?"; 153 | var orMatch = bool ? bool.match(new RegExp(orx, 'g')) : []; 154 | var orArr = orMatch ? orMatch.map(function(b) {return rxReady(b.replace(/\s+OR\s+|\s*\|\s*/gi, '|'))}) : []; 155 | var noOrs = bool ? bool.replace(new RegExp(orx, 'g'), '').split(/\s+[AND\s+]+/i) : bool; 156 | var ands = noOrs ? noOrs.map(function(a) { return rxReady(a)}) : []; 157 | var xArr = ands.concat(orArr).filter(function(i){ return i != ''}).map(function(x){return new RegExp(x, 'i')}); 158 | return xArr; 159 | } 160 | } 161 | 162 | function booleanSearch(bool,target){ 163 | var arr = parseAsRegexArr(bool); 164 | return arr.every(function(x){ 165 | return x.test(target); 166 | }); 167 | } 168 | 169 | async function getHoverCard(userId,geoSearch){ 170 | var res = await fetch("https://github.com/hovercards?user_id="+userId, {"credentials":"include","headers":{"accept":"*/*","accept-language":"en-US,en;q=0.9","x-requested-with":"XMLHttpRequest"}}); 171 | var text = await res.text(); 172 | var doc = new DOMParser().parseFromString(text, 'text/html'); 173 | var isMatch = booleanSearch(geoSearch,doc.body.innerText); 174 | return isMatch; 175 | } 176 | 177 | async function getForkerIdsByRepo(path){ 178 | var res = await fetch("https://github.com/"+path+"/network/members"); 179 | var text = await res.text(); 180 | var doc = new DOMParser().parseFromString(text, 'text/html'); 181 | var repos = Array.from(cn(doc,'repo')).map(el=> 182 | [reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0), reg(/(?<=user_id=)\d+/.exec(tn(el,'a')[0].getAttribute('data-hovercard-url')),0)]).filter(el=> el[1]); 183 | return repos; 184 | } 185 | 186 | async function loopThroughForkersSearchGeo(geoSearch,repoPath){ 187 | var matchingProfilePaths = []; 188 | var forkers = await getForkerIdsByRepo(repoPath); 189 | for(var i=0; i 200 | Object.entries(ob).reduce((r, [k, v]) => { 201 | if(v) { r[k] = v; return r; 202 | } else { return r; } 203 | }, {}); 204 | 205 | function downloadr(arr2D, filename) { 206 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el=> el.reduce((a,b) => a+'\t'+b )).reduce((a,b) => a+'\r'+b); 207 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 208 | var file = new Blob([data], { type: type }); 209 | if (window.navigator.msSaveOrOpenBlob) { 210 | window.navigator.msSaveOrOpenBlob(file, filename); 211 | } else { 212 | var a = document.createElement('a'), 213 | url = URL.createObjectURL(file); 214 | a.href = url; 215 | a.download = filename; 216 | document.body.appendChild(a); 217 | a.click(); 218 | setTimeout(() => { 219 | document.body.removeChild(a); 220 | window.URL.revokeObjectURL(url); 221 | }, 10); 222 | } 223 | } 224 | 225 | async function getPatches(link) { 226 | var res = await fetch(link); 227 | var html = await res.text(); 228 | var email = reg(/[\w\.+]+@\S+\.[a-zA-Z]+/.exec(html.replace(/\w+@users.noreply.github.com|\+.+?(?=@)/g, '')),0); 229 | var check = /users.noreply.github.com/i.test(email) ? '' : email; 230 | return check; 231 | } 232 | 233 | async function getProfileRepoData(url) { 234 | var res = await fetch(url); 235 | var text = await res.text(); 236 | var doc = new DOMParser().parseFromString(text, 'text/html'); 237 | return doc; 238 | } 239 | 240 | function parseRepo(doc,type){ 241 | return Array.from(cn(doc,`col-12 d-flex width-full py-4 border-bottom public ${type}`)).map(el=> { 242 | var stars = cn(el, 'octicon-star')[0] ? cn(el, 'octicon-star')[0].parentElement.innerText.trim() : 0; 243 | return { 244 | repo: reg(/(?<=github.com\/.+?\/).+?$/.exec(tn(el,'a')[0].href),0), 245 | lang: cn(el, 'ml-0 mr-3')[0] ? cn(el, 'ml-0 mr-3')[0].innerText.trim() : '', 246 | time: tn(el,'relative-time')[0] ? new Date(tn(el,'relative-time')[0].getAttribute('datetime')).getTime() : 0, 247 | stars: stars == 'Unstar' ? 0 : parseInt(stars.replace(/\D+/g,'')), 248 | forks: cn(el,'octicon octicon-repo-forked')[0] ? parseInt(cn(el,'octicon octicon-repo-forked')[0].parentElement.innerText.trim().replace(/\D+/g,'')) : 0 249 | }; 250 | }); 251 | } 252 | 253 | function getFollowCounts(elm,type){ 254 | var follower_a = Array.from(tn(elm,'a')).filter(el=> type.test(el.innerText))[0]; 255 | var follower_s = follower_a ? cn(follower_a,'Counter') : null; 256 | var followerCount = follower_s[0] ? parseInt(follower_s[0].innerText.trim()) : 0; 257 | return followerCount; 258 | } 259 | 260 | async function loopThroughRepos(path){ 261 | var prop = (arr,str) => arr.filter(el=> el.getAttribute('itemprop') == str).map(el=> el ? el.innerText.trim() : ''); 262 | var res = await getProfileRepoData(`https://github.com/${path}?tab=repositories`); 263 | var mainDoc = await getProfileRepoData(`https://github.com/${path}`); 264 | var owns = parseRepo(res,'source'); 265 | var forks = parseRepo(res,'fork'); 266 | var fullname = cn(res,'vcard-fullname')[0] ? cn(res,'vcard-fullname')[0].innerText : ''; 267 | var vcard = cn(res,'vcard-details ')[0] ? Array.from(tn(cn(res,'vcard-details ')[0],'li')) : null; 268 | var geo = vcard ? prop(vcard,'homeLocation') : null; 269 | var email = vcard ? prop(vcard,'email') : null; 270 | var website = vcard ? prop(vcard,'url') : null; 271 | var worksFor = vcard ? prop(vcard,'worksFor') : null; 272 | var followers = getFollowCounts(res,/followers/i); 273 | var following = getFollowCounts(res,/following/i); 274 | var bio = cn(res,'p-note user-profile-bio js-user-profile-bio')[0] ? cn(res,'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : ''; 275 | var contributions = cn(mainDoc,'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc,'graph-before-activity-overview')[0],'day')).map(el=> {return {date: new Date(el.getAttribute('data-date')).getTime(), commits: parseInt(el.getAttribute('data-count'))}}).filter(el=> el.commits) : null; 276 | var pagenate = cn(res,'paginate-container')[0] ? Array.from(tn(cn(res,'paginate-container')[0],'a')).filter(el=> el.innerText == 'Next').map(el=> el.href) : []; 277 | var pages = cn(res,'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0] ? Math.ceil(parseInt(cn(res,'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0].innerText.replace(/\D+/g,''))/30) : 0; 278 | for(var i=2; i<=pages; i++){ 279 | var res2 = await getProfileRepoData(pagenate[0]); 280 | parseRepo(res2,'fork').forEach(el=> forks.push(el)); 281 | parseRepo(res2,'source').forEach(el=> owns.push(el)); 282 | } 283 | if(email == null || email.length == 0){ 284 | for(var r=0; r el.lang).filter(el=> el != '')); 291 | var interest = unq(forks.map(el=> el.lang).filter(el=> el != '')); 292 | var recognized = owns.filter(el=> (el.forks > 0 || el.stars > 0) && el.lang).sort((a,b) => b.time - a.time); 293 | var profile = { 294 | fullname: fullname ? fullname : null, 295 | bio: bio ? bio : null, 296 | github: 'github.com/'+path, 297 | followers: followers, 298 | following: following, 299 | geo: geo ? geo.toString(): null, 300 | worksFor: worksFor && worksFor.length > 0 ? worksFor.toString() : null, 301 | email: email && email.length > 0 ? unq(email) : null, 302 | website: website && website.length > 0 ? website.toString() : null, 303 | langs: langs && langs.length > 0 ? langs : null, 304 | interest: interest && interest.length > 0 ? interest : null, 305 | owns: owns.length > 0 ? owns : null, 306 | forks: forks.length > 0 ? forks : null, 307 | recognized: recognized && recognized.length > 0 ? recognized : null, 308 | contributions: contributions && contributions.length > 0 ? contributions : null, 309 | totalContributions: contributions && contributions.length > 0 ? contributions.map(el=> el.commits).reduce((a,b) => a+b) : null 310 | }; 311 | return cleanObject(profile); 312 | } 313 | 314 | async function getMatchingProfiles(geoSearch,targetRepo){ 315 | var containArr = []; 316 | var profiles = await loopThroughForkersSearchGeo(geoSearch,targetRepo); 317 | for(var i=0; i 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 rando = (n) => Math.round(Math.random() * n); 6 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 7 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 8 | var ele = (t) => document.createElement(t); 9 | var attr = (o, k, v) => o.setAttribute(k, v); 10 | var reChar = (s) => s.match(/&#.+?;/g) && s.match(/&#.+?;/g).length > 0 ? s.match(/&#.+?;/g).map(el=> [el,String.fromCharCode(/d+/.exec(el)[0])]).map(m=> s = s.replace(new RegExp(m[0], 'i'), m[1])).pop() : s; 11 | var unqHsh = (a, o) => a.filter(i => o.hasOwnProperty(i) ? false : (o[i] = true)); 12 | 13 | var prop = (arr, str) => unqHsh(arr.filter(el => el.getAttribute('itemprop') == str).map(el => el ? el.innerText.trim() : '').filter(r=> r),{}); //this is used for identifying the elements containing the target attribute names we wish to scrape. 14 | 15 | async function gihubProfileObject(path) { 16 | var res = await fetch(`https://github.com/${path}?tab=repositories`); //https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API 17 | // HTML scraping would change res to document (current page). 18 | 19 | var text = await res.text(); 20 | 21 | var res = new DOMParser().parseFromString(text, 'text/html'); //https://developer.mozilla.org/en-US/docs/Web/API/DOMParser 22 | 23 | var all = Array.from(res.querySelectorAll('*')); 24 | 25 | var items = [['name','full_name'],['additionalName','profile_path'],['homeLocation','location'],['worksFor','employer'],['url','url'],['email','email'],['programmingLanguage','language']]; 26 | 27 | var obj = {}; 28 | 29 | items.forEach(r=> { 30 | 31 | var val = prop(all, r[0]); 32 | 33 | if(val.length) obj[r[1]] = val[0]; //note: this overrides elements in succession, so multiple itemprops like programmingLanguage, will only show one. If we wanted an array of matches, we would write a condition which checks to see if the key already exists in the object, and if so, then change the value type to an array, and insert matching string. 34 | 35 | }); 36 | 37 | return obj; 38 | 39 | } 40 | 41 | async function getGithubProfileData(){ 42 | var path = reg(/(?<=github.com\/).+?(?=\/|$)/.exec(window.location.href),0); 43 | var obj = await gihubProfileObject(path); 44 | console.log(obj); 45 | 46 | } 47 | 48 | getGithubProfileData() 49 | -------------------------------------------------------------------------------- /githubEmail.txt: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Basync%20function%20initGitEmailFinder()%7Bif(%2F(%3F%3C%3Dgithub%5C.com%5C%2F)%5Cw%2B%2F.exec(window.location.href)%3F.%5B0%5D)%7Bvar%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%20cn%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementsByClassName(nm)%3Bvar%20tn%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementsByTagName(nm)%3Bvar%20gi%20%3D%20(ob%2C%20nm)%20%3D%3E%20ob.getElementById(nm)%3Bfunction%20inlineStyler(elm%2Ccss)%7BObject.entries(JSON.parse(css.replace(%2F(%3F%3C%3D%3A)%5Cs*(%5Cb%7C%5CB)(%3F%3D.%2B%3F%3B)%2Fg%2C'%22').replace(%2F(%3F%3C%3D%3A%5Cs*.%2B%3F)%3B%2Fg%2C'%22%2C').replace(%2F%5Ba-zA-Z-%5D%2B(%3F%3D%3A)%2Fg%2C%20k%3D%3E%20k.replace(%2F%5E%5Cb%2F%2C'%22').replace(%2F%5Cb%24%2F%2C'%22')).replace(%2F%5Cs*%2C%5Cs*%7D%2Fg%2C'%7D'))).forEach(kv%3D%3E%20%7B%20elm.style%5Bkv%5B0%5D%5D%20%3D%20kv%5B1%5D%7D)%3B%7Dfunction%20topZIndexer()%7Blet%20n%20%3D%20new%20Date().getTime()%20%2F%201000000%3Blet%20r%20%3D%20(n%20-%20Math.floor(n))%20*%20100000%3Breturn%20(Math.ceil(n%2Br)%20*%2010)%3B%7Dfunction%20loadingElm()%20%7Bvar%20loaD%20%3D%20document.createElement(%22div%22)%3BloaD.setAttribute(%22id%22%2C%20%22loader-elm%22)%3Bdocument.body.appendChild(loaD)%3BloaD.style.top%20%3D%20%226%25%22%3BloaD.style.left%20%3D%20%2250%25%22%3BloaD.style.position%20%3D%20%22fixed%22%3BloaD.style.zIndex%20%3D%20%2210001%22%3BloaD.innerHTML%20%3D%20'%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20x%3D%220px%22%20y%3D%220px%22%20%20%20%20%20width%3D%22200px%22%20height%3D%22200px%22%20viewBox%3D%220%200%2024%2030%22%20style%3D%22enable-background%3Anew%200%200%2050%2050%3B%22%3E%20%20%20%20%3Crect%20x%3D%220%22%20y%3D%2210%22%20width%3D%224%22%20height%3D%220%22%20fill%3D%22%23333%22%20opacity%3D%220.2%22%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22opacity%22%20values%3D%220.2%3B%201%3B%20.2%22%20begin%3D%220s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22height%22%20values%3D%2210%3B%2020%3B%2010%22%20begin%3D%220s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22y%22values%3D%2210%3B%205%3B%2010%22%20begin%3D%220s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%3C%2Frect%3E%20%20%20%20%3Crect%20x%3D%228%22%20y%3D%2210%22%20width%3D%224%22%20height%3D%2210%22%20fill%3D%22%23333%22%20%20opacity%3D%220.2%22%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22opacity%22%20values%3D%220.2%3B%201%3B%20.2%22%20begin%3D%220.15s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22height%22%20values%3D%2210%3B%2020%3B%2010%22%20begin%3D%220.15s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22y%22%20values%3D%2210%3B%205%3B%2010%22%20begin%3D%220.15s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%3C%2Frect%3E%20%20%20%20%3Crect%20x%3D%2216%22%20y%3D%2210%22%20width%3D%224%22%20height%3D%2210%22%20fill%3D%22%23333%22%20%20opacity%3D%220.2%22%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22opacity%22%20values%3D%220.2%3B%201%3B%20.2%22%20begin%3D%220.3s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22height%22%20values%3D%2210%3B%2020%3B%2010%22%20begin%3D%220.3s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%20%20%3Canimate%20attributeName%3D%22y%22%20values%3D%2210%3B%205%3B%2010%22%20begin%3D%220.3s%22%20dur%3D%22555ms%22%20repeatCount%3D%22indefinite%22%20%2F%3E%20%20%20%20%3C%2Frect%3E%20%20%3C%2Fsvg%3E'%3B%7DloadingElm()%3Basync%20function%20multiFetchDoc(urls)%7Blet%20res%20%3D%20await%20Promise.all(urls.map(e%20%3D%3E%20fetch(e)))%3Blet%20text%20%3D%20await%20Promise.all(res.filter(r%3D%3E%20(r.status%20%3E%20199%20%26%26%20r.status%20%3C%20305)).map(e%20%3D%3E%20e.text()))%3Breturn%20text.map(t%3D%3E%20new%20DOMParser().parseFromString(t%2C'text%2Fhtml'))%3B%7Dasync%20function%20multiPatchCheck(urls)%7Bvar%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))%3Blet%20res%20%3D%20await%20Promise.all(urls.map(e%20%3D%3E%20fetch(e)))%3Blet%20texts%20%3D%20await%20Promise.all(res.filter(r%3D%3E%20(r.status%20%3E%20199%20%26%26%20r.status%20%3C%20305)).map(e%20%3D%3E%20e.text()))%3Breturn%20unqHsh(texts.map(t%3D%3E%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.exec(t)%3F.%5B0%5D)%3F.filter(t%3D%3E%20!%2Fusers.noreply.github%2F.test(t))%2C%7B%7D)%3B%7Dasync%20function%20getPatchLinksFromRepos(arr)%7Bvar%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))%3Blet%20docs%20%3D%20await%20multiFetchDoc(arr)%3Bvar%20commits%20%3D%20unqHsh(docs.map(doc%3D%3E%20Array.from(doc.getElementsByClassName('d-none%20js-permalink-shortcut')).map(elm%3D%3E%20elm.href))%3F.flat()%3F.flat()%2C%7B%7D)%3F.map(url%3D%3E%20url.replace(%2F%5C%2Ftree%5C%2F%2Fg%2C'%2Fcommit%2F')%20%2B%20'.patch')%3Breturn%20commits%3B%7Dasync%20function%20getRepos(urls)%7Bvar%20docs%20%3D%20await%20multiFetchDoc(urls)%3Blet%20next_page%20%3D%20Array.from(docs%3F.%5B0%5D.getElementsByTagName('a')).filter(elm%3D%3E%20%2F%5C%3Fafter%5C%3D%2F.test(elm.href)%20%26%26%20%2Fnext%2Fi.test(elm.innerText)).map(elm%3D%3E%20elm.href)%3F.%5B0%5D%3Bvar%20repos%20%3D%20Array.from(docs%3F.%5B0%5D.getElementsByTagName('li')).filter(li%20%3D%3E%20li.getElementsByTagName('a')%3F.%5B0%5D%3F.getAttribute('itemprop')%20%3D%3D%20'name%20codeRepository'%20%26%26%20!%2FForked%20from%2F.test(li.innerText)).map(li%20%3D%3E%20li.getElementsByTagName('a')%3F.%5B0%5D.href)%3Bvar%20displayed_email%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.exec(docs%3F.%5B0%5D%3F.body%3F.innerText)%3F.%5B0%5D%3Breturn%20%7Bnext_page%3Anext_page%2Crepos%3Arepos%2Cdisplayed_email%3Adisplayed_email%7D%3B%7Dasync%20function%20loopThroughRepos()%7Bvar%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))%3Bvar%20subArr%20%3D%20(r%2C%20n)%20%3D%3E%20r.reduceRight((a%2Cb%2Cc%2Cd)%20%3D%3E%20%5B...a%2C%20d.splice(0%2Cn)%5D%2C%5B%5D)%3Bvar%20contain_arr%20%3D%20%5B%5D%3Bvar%20path%20%3D%20%2F(%3F%3C%3Dgithub%5C.com%5C%2F)%5Cw%2B%2F.exec(window.location.href)%3F.%5B0%5D%3Bvar%20urls%20%3D%20%5B'https%3A%2F%2Fgithub.com%2F'%2Bpath%20%2B%20%22%3Ftab%3Drepositories%22%5D%3Blet%20index%20%3D%2010%3Blet%20loading_elm%20%3D%20gi(document%2C'loader-elm')%3Blet%20loop_elm%20%3D%20ele('div')%3Bloading_elm.appendChild(loop_elm)%3Ba(loop_elm%2C%5B%5B'id'%2C'loop_elm'%5D%5D)%3BinlineStyler(loop_elm%2C%60%7Bcolor%3A%20red%3B%20font-size%3A2em%3B%20transform%3A%20translate(-90px%2C0px)%3B%7D%60)%3Bfor(let%20i%3D0%3B%20i%3Cindex%3B%20i%2B%2B)%7Bloop_elm.innerText%20%3D%20'checking%20repos%20from%20page%20'%20%2B%20(i%2B1)%3Bif(urls%20%26%26%20contain_arr.length%20%3D%3D%200)%7Blet%20page_data%20%3D%20await%20getRepos(urls)%3Burls%20%3D%20page_data%3F.next_page%20%3F%20%5Bpage_data%3F.next_page%5D%20%3A%20null%3Blet%20repos%20%3D%20page_data.repos%20%3F%20subArr(page_data.repos%2C5)%20%3A%20null%3Bif(repos)%7Bfor(let%20n%3D0%3B%20n%20%3C%20repos.length%3B%20n%2B%2B)%7Bloop_elm.innerText%20%3D%20'checking%20'%2B((n%2B1)*5)%2B'%20of%20'%2B((repos.length)*5)%2B'%20repos%20from%20page%20'%20%2B%20(i%2B1)%3Blet%20urls%20%3D%20await%20getPatchLinksFromRepos(repos%5Bn%5D)%3Blet%20emails%20%3D%20await%20multiPatchCheck(urls)%3Bif(emails%3F.length%20%26%26%20emails.some(m%3D%3E%20%2F%40%2F.test(m)))%7Bemails.forEach(m%3D%3E%20contain_arr.push(m))%3Bi%20%3D%20201%3Bbreak%3B%7D%7D%7Dif(page_data%3F.displayed_email)%20contain_arr.push(page_data%3F.displayed_email)%3Bif(page_data%3F.next_page%20%3D%3D%20undefined)%7Bi%20%3D%20201%3Bbreak%7D%7D%7Dreturn%20unqHsh(contain_arr%2C%7B%7D)%3B%7Dvar%20all_emails%20%3D%20await%20loopThroughRepos()%3Bdocument.body.removeChild(document.getElementById(%22loader-elm%22))%3Bfunction%20displayTextWidth(text%2C%20font)%20%7Bvar%20myCanvas%20%3D%20displayTextWidth.canvas%20%7C%7C%20(displayTextWidth.canvas%20%3D%20document.createElement(%22canvas%22))%3Bvar%20context%20%3D%20myCanvas.getContext(%222d%22)%3Bcontext.font%20%3D%20font%3Bvar%20metrics%20%3D%20context.measureText(text)%3Breturn%20metrics.width%3B%7Dfunction%20domplate(output)%20%7Bvar%20el%20%3D%20document.createElement('textarea')%3Bdocument.body.appendChild(el)%3Bel.value%20%3D%20output%3Bel.select()%3Bdocument.execCommand('copy')%3Bel.outerHTML%20%3D%20''%3B%7Dfunction%20setQuickliCSS(main_cont_id)%7Bif(gi(document%2C%60%24%7Bmain_cont_id%7D_style%60))%20gi(document%2C%60%24%7Bmain_cont_id%7D_style%60).outerHTML%20%3D%20''%3Blet%20csselm%20%3D%20ele('style')%3Ba(csselm%2C%5B%5B'class'%2C%60%24%7Bmain_cont_id%7D_style%60%5D%5D)%3Bdocument.head.appendChild(csselm)%3Bcsselm.innerHTML%20%3D%20%60.copy_pill%20%7Bbackground%3A%20%231c1c1c%3Bcolor%3A%20%23A0A0A0%3Bborder-radius%3A%200.2em%3Bpadding%3A%208px%3Bcursor%3Apointer%3Bfont-size%3A%201em%3B%7D.copy_pill%3Ahover%20%7Bbackground%3A%20linear-gradient(-45deg%2C%20%23ee7752%2C%20%23e73c7e%2C%20%2323a6d5%2C%20%2323a6d5%2C%20%2323d5ab)%3Bbackground-size%3A%20400%25%20400%25%3Banimation%3A%20gradient_quickli%202s%20ease%20infinite%3B%7D%40keyframes%20gradient_quickli%20%7B0%25%20%7Bbackground-position%3A%200%25%2050%25%3B%7D50%25%20%7Bbackground-position%3A%20100%25%2050%25%3B%7D100%25%20%7Bbackground-position%3A%200%25%2050%25%3B%7D%7D%60%3B%7Dfunction%20createEmailHolder(all_emails)%7Bif(gi(document%2C'pop_container'))%20gi(document%2C'pop_container').outerHTML%20%3D%20''%3BsetQuickliCSS('git_email_css')%3Blet%20cont%20%3D%20ele('div')%3Bdocument.body.appendChild(cont)%3Ba(cont%2C%5B%5B%22id%22%2C%20%22pop_container%22%5D%5D)%3BinlineStyler(cont%2C%60%7Bposition%3A%20fixed%3B%20top%3A%2050px%3B%20left%3A%2040%25%3B%20z-index%3A%24%7BtopZIndexer()%7D%3B%20background%3A%20%231c1c1c%3B%7D%60)%3Blet%20cls_btn%20%3D%20ele('div')%3Bcont.appendChild(cls_btn)%3Bcls_btn.innerHTML%20%3D%20%60%3Csvg%20style%3D%22border-radius%3A%202em%3B%20height%3A%2030px%3B%20width%3A%2030px%3B%20transform%3A%20rotate(45deg)%3B%20cursor%3Apointer%3B%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Cg%20style%3D%22transform%3A%20scale(1%2C%201)%22%20stroke-width%3D%221%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cg%20transform%3D%22translate(2%2C%202)%22%20stroke%3D%22%23e21212%22%20stroke-width%3D%228%22%3E%3Cpath%20d%3D%22M47.806834%2C19.6743435%20L47.806834%2C77.2743435%22%20transform%3D%22translate(49%2C%2050)%20rotate(0)%20translate(-49%2C%20-50)%20%22%2F%3E%3Cpath%20d%3D%22M76.6237986%2C48.48%20L19.0237986%2C48.48%22%20transform%3D%22translate(49%2C%2050)%20rotate(0)%20translate(-49%2C%20-50)%20%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E%60%3Bcls_btn.onclick%20%3D%20()%3D%3E%20%7Bcont.outerHTML%20%3D%20''%7D%3Blet%20copy_all%20%3D%20ele('div')%3Bcont.appendChild(copy_all)%3Bcopy_all.innerText%20%3D%20all_emails.length%20%3F%20'Copy%20All'%20%3A%20'no%20emails%20found'%3Bif(all_emails.length)%20%7Ba(copy_all%2C%5B%5B'class'%2C'copy_pill'%5D%2C%5B'title'%2C'copy%20all'%5D%5D)%3Bcopy_all.onclick%20%3D%20()%3D%3E%20%7Blet%20emails%20%3D%20Array.from(document.getElementsByClassName('email_pill')).map(elm%3D%3E%20elm.innerText).reduce((a%2Cb)%3D%3E%20a%2B'%5Ct'%2Bb)%3Bdomplate(emails.trim())%3Bcopy_all.innerText%20%3D%20document.getElementsByClassName('email_pill').length%2B'%20email'%2B(all_emails.length%20%3D%3D%201%20%3F%20''%20%3A's')%2B'%20copied%20to%20clipboard'%3B%7D%3B%7Dlet%20pill_cont%20%3D%20ele('div')%3Bcont.appendChild(pill_cont)%3BinlineStyler(pill_cont%2C%60%7Btext-align%3A%20center%3B%20display%3A%20grid%3B%20grid-template-columns%3A%20%24%7Ball_emails.length%20%3F%20all_emails.map(m%3D%3E%20Math.ceil(displayTextWidth(m)*1.8)%2B'px%20').reduce((a%2Cb)%3D%3E%20a%2Bb)%20%3A%20'100px'%7D%3B%20grid-gap%3A6px%3B%7D%60)%3Ball_emails.forEach(email%3D%3E%20%7Blet%20pill%20%3D%20ele('pill')%3Ba(pill%2C%5B%5B'class'%2C'copy_pill%20email_pill'%5D%2C%5B'title'%2C'copy'%5D%5D)%3Bpill_cont.appendChild(pill)%3Bpill.innerText%20%3D%20email%3Bpill.onclick%20%3D%20()%3D%3E%20%7Bcopy_all.innerText%20%3D%20all_emails.length%20%3F%20'Copy%20All'%20%3A%20'no%20emails%20found'%3Bdomplate(email)%7D%3B%7D)%3B%7DcreateEmailHolder(all_emails)%3B%7D%7DinitGitEmailFinder()%7D)() 2 | -------------------------------------------------------------------------------- /github_custom_Search/code_search_scraper.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 rando = (n) => Math.round(Math.random() * n); 6 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 7 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 8 | var ele = (t) => document.createElement(t); 9 | var attr = (o, k, v) => o.setAttribute(k, v); 10 | var reChar = (s) => s.match(/&#.+?;/g) && s.match(/&#.+?;/g).length > 0 ? s.match(/&#.+?;/g).map(el=> [el,String.fromCharCode(/d+/.exec(el)[0])]).map(m=> s = s.replace(new RegExp(m[0], 'i'), m[1])).pop() : s; 11 | 12 | 13 | async function initCodeLooper(){ 14 | var totalResults = reg(/Showing ([\d,]+) available code results/.exec(document.body.innerText),1); 15 | var totalPages = totalResults ? Math.floor(parseInt(totalResults.replace(/\D+/g,'')) / 10) : 0; 16 | createHTML(totalPages); 17 | var pathContainArr = []; 18 | var currentSearch = window.location.href; 19 | var nextObj = await getCodeSearchResPage(currentSearch); 20 | var nextUrl = nextObj.next; 21 | var paths = nextObj.paths; 22 | if(paths && paths.length) paths.forEach(el=> pathContainArr.push(el)); 23 | 24 | for(var i=2; i pathContainArr.push(el)); 32 | } 33 | var users = unq(pathContainArr); 34 | return users; 35 | } 36 | 37 | async function loopThroughUsers(){ 38 | var containArr = []; 39 | var userpaths = await initCodeLooper(); 40 | for(var i=0; i{ 61 | downloadr(tsv,'code_search_profiles.tsv'); 62 | }; 63 | tsvBtn.mouseenter = ()=> {tsvBtn.style.background = '#035185';}; 64 | tsvBtn.mouseleave = ()=> {tsvBtn.style.background = '#004471';}; 65 | 66 | var jsonBtn = ele('div'); 67 | attr(jsonBtn,'id','dl_tsv_btn'); 68 | attr(jsonBtn,'style',`grid-area: 1/2; background: #004471; color: #fff; border: 1px solid transparent; border-radius: 0.3em; padding: 6px; text-align: center; cursor: pointer;`); 69 | btnCont.appendChild(jsonBtn); 70 | jsonBtn.innerText = 'Download JSON'; 71 | jsonBtn.onclick = ()=>{ 72 | downloadr(containArr,'code_search_profiles.json'); 73 | }; 74 | jsonBtn.mouseenter = ()=> {jsonBtn.style.background = '#035185';}; 75 | jsonBtn.mouseleave = ()=> {jsonBtn.style.background = '#004471';}; 76 | 77 | console.log(containArr); 78 | } 79 | 80 | 81 | async function getCodeSearchResPage(url){ 82 | var res = await fetch(url); 83 | var text = await res.text(); 84 | var doc = new DOMParser().parseFromString(text,'text/html'); 85 | var next = getNextPageUrl(doc); 86 | var paths = getUserPath(doc); 87 | return {next: next, paths: paths}; 88 | } 89 | 90 | function getUserPath(doc){ 91 | var cards = Array.from(cn(doc,'code-list-item')); 92 | var paths = cards.length ? cards.map(el=> tn(el,'a').length ? reg(/(?<=github.com\/).+?(?=\/)/.exec(tn(el,'a')[0].href),0) : '') : null; 93 | return paths; 94 | } 95 | function getNextPageUrl(doc){ 96 | var next = Array.from(tn(doc,'a')).filter(el=> el.getAttribute('rel') == 'next'); 97 | return next.length ? next[0].href : null; 98 | } 99 | 100 | var dateString = (s) => new Date(s).toString().replace(/^\S+/, '').replace(/\d\d:\d\d.+/, '').trim().replace(/(?<=[a-zA-Z]{3})\s\d+/, ''); 101 | var parseYearMonths = (n) => { 102 | var m = n / 2629800000; 103 | var years = Math.trunc(m / 12); 104 | var months = Math.round(12 * ((m / 12) - years)); 105 | var str = months && years ? `${years} yr${years>1?'s':''} ${months} mo${months>1?'s':''}` : years && months == 0 ? `${years} year${years>1?'s':''}` : `${months} month${months>1?'s':''}`; 106 | return str; 107 | }; 108 | 109 | function mapLangPerc(arr) { 110 | var containArr = []; 111 | var obj = {}; 112 | var langs = unq(arr.map(el => el.lang).filter(el => el != '')).forEach(el => obj[el] = []); 113 | for (var i = 0; i < arr.length; i++) { 114 | var obs = Object.entries(obj); 115 | for (var o = 0; o < obs.length; o++) { 116 | if (arr[i].lang == obs[o][0]) { 117 | obs[o][1].push(arr[i].time) 118 | } 119 | } 120 | } 121 | var obe = Object.entries(obj); 122 | var total = obe.map(el => el[1].length).reduce((a, b) => a + b); 123 | for (var i = 0; i < obe.length; i++) { 124 | var earliest = Math.min(...obe[i][1]); 125 | var latest = Math.max(...obe[i][1]); 126 | var duration = parseYearMonths(latest - earliest); 127 | var perc = Math.round((obe[i][1].length / total) * 10000) / 100; 128 | var out = { 129 | lang: obe[i][0], 130 | percent: perc, 131 | start: dateString(earliest), 132 | end: dateString(latest), 133 | duration: duration 134 | }; 135 | containArr.push(out) 136 | } 137 | console.log(containArr); 138 | return containArr.sort((a, b) => a.percent - b.percent).reverse(); 139 | } 140 | 141 | var cleanObject = (ob) => 142 | Object.entries(ob).reduce((r, [k, v]) => { 143 | if (v) { 144 | r[k] = v; 145 | return r; 146 | } else { 147 | return r; 148 | } 149 | }, {}); 150 | 151 | async function getPatches(link) { 152 | var res = await fetch(link); 153 | var html = await res.text(); 154 | var email = reg(/\b[\w\.\-\+]+@[\w\-]+\.[a-zA-Z]{2,13}(\.[a-zA-Z]{2,13}|\b)/.exec(html.replace(/\w+@users.noreply.github.com|\+.+?(?=@)/g, '')), 0); 155 | var check = /users.noreply.github.com|@users.noreply.github/i.test(email) ? '' : email; 156 | return check; 157 | } 158 | 159 | async function getProfileRepoData(url) { 160 | var res = await fetch(url); 161 | var text = await res.text(); 162 | var doc = new DOMParser().parseFromString(text, 'text/html'); 163 | return doc; 164 | } 165 | 166 | function parseRepo(doc, type) { 167 | return Array.from(cn(doc, `col-12 d-flex width-full py-4 border-bottom public ${type}`)).map(el => { 168 | var stars = cn(el, 'octicon-star')[0] ? cn(el, 'octicon-star')[0].parentElement.innerText.trim() : 0; 169 | return { 170 | repo: reg(/(?<=github.com\/.+?\/).+?$/.exec(tn(el, 'a')[0].href), 0), 171 | lang: cn(el, 'ml-0 mr-3')[0] ? cn(el, 'ml-0 mr-3')[0].innerText.trim() : '', 172 | time: tn(el, 'relative-time')[0] ? new Date(tn(el, 'relative-time')[0].getAttribute('datetime')).getTime() : 0, 173 | stars: stars == 'Unstar' ? 0 : parseInt(stars.replace(/\D+/g, '')), 174 | forks: cn(el, 'octicon octicon-repo-forked')[0] ? parseInt(cn(el, 'octicon octicon-repo-forked')[0].parentElement.innerText.trim().replace(/\D+/g, '')) : 0 175 | }; 176 | }); 177 | } 178 | 179 | function getFollowCounts(elm, type) { 180 | var follower_a = Array.from(tn(elm, 'a')).filter(el => type.test(el.innerText))[0]; 181 | var follower_s = follower_a ? cn(follower_a, 'Counter') : null; 182 | var followerCount = follower_s && follower_s[0] ? parseInt(follower_s[0].innerText.trim()) : 0; 183 | return followerCount; 184 | } 185 | 186 | async function loopThroughRepos(path) { 187 | var prop = (arr, str) => arr.filter(el => el.getAttribute('itemprop') == str).map(el => el ? el.innerText.trim() : ''); 188 | var res = await getProfileRepoData(`https://github.com/${path}?tab=repositories`); 189 | var mainDoc = res; 190 | var owns = parseRepo(res, 'source'); 191 | var forks = parseRepo(res, 'fork'); 192 | var vcard = cn(res, 'vcard-details ')[0] ? Array.from(tn(cn(res, 'vcard-details ')[0], 'li')) : null; 193 | 194 | var bio = cn(res,'p-note user-profile-bio js-user-profile-bio')[0] ? cn(res,'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : ''; 195 | 196 | var contributions = cn(mainDoc,'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc,'graph-before-activity-overview')[0],'day')).map(el=> {return {date: new Date(el.getAttribute('data-date')).getTime(), commits: parseInt(el.getAttribute('data-count'))}}).filter(el=> el.commits) : null; 197 | 198 | var fullname = cn(res,'vcard-fullname')[0] ? cn(res,'vcard-fullname')[0].innerText : ''; 199 | var geo = vcard ? prop(vcard,'homeLocation') : null; 200 | 201 | var email = vcard ? prop(vcard, 'email') : null; 202 | var website = vcard ? prop(vcard, 'url') : null; 203 | var worksFor = vcard ? prop(vcard, 'worksFor') : null; 204 | var followers = getFollowCounts(res, /followers/i); 205 | var following = getFollowCounts(res, /following/i); 206 | var commits = cn(mainDoc, 'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc, 'graph-before-activity-overview')[0], 'day')).map(el => { 207 | return { 208 | date: new Date(el.getAttribute('data-date')).getTime(), 209 | commits: parseInt(el.getAttribute('data-count')) 210 | } 211 | }).filter(el => el.commits) : null; 212 | 213 | var bio = cn(res, 'p-note user-profile-bio js-user-profile-bio')[0] ? cn(res, 'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : ''; 214 | var contributions = cn(mainDoc, 'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc, 'graph-before-activity-overview')[0], 'day')).map(el => { 215 | return { 216 | date: new Date(el.getAttribute('data-date')).getTime(), 217 | commits: parseInt(el.getAttribute('data-count')) 218 | } 219 | }).filter(el => el.commits) : null; 220 | var pagenate = cn(res, 'paginate-container')[0] ? Array.from(tn(cn(res, 'paginate-container')[0], 'a')).filter(el => el.innerText == 'Next').map(el => el.href) : []; 221 | var pages = cn(res, 'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0] ? Math.ceil(parseInt(cn(res, 'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0].innerText.replace(/\D+/g, '')) / 30) : 0; 222 | for (var i = 2; i <= pages; i++) { 223 | var res2 = await getProfileRepoData(pagenate[0]); 224 | parseRepo(res2, 'fork').forEach(el => forks.push(el)); 225 | parseRepo(res2, 'source').forEach(el => owns.push(el)); 226 | } 227 | if ((email == null || email.length == 0) && owns[0]) { 228 | for (var r = (owns.length - 1); r > ((owns.length - 5) || -1); r--) { 229 | var link = `https://github.com/${path}/${owns[r].repo}/commit/master.patch`; 230 | var patchEmail = await getPatches(link); 231 | console.log(`${r} of ${owns.length-1}`); 232 | if (patchEmail) { 233 | email.push(patchEmail); 234 | console.log(`finished on ${r} of ${owns.length-1}`); 235 | r = -1; 236 | break; 237 | }; 238 | } 239 | } 240 | 241 | var langs = unq(owns.map(el => el.lang).filter(el => el != '')); 242 | var interest = unq(forks.map(el => el.lang).filter(el => el != '')); 243 | var recognized = owns.filter(el => (el.forks > 0 || el.stars > 0) && el.lang).sort((a, b) => b.time - a.time); 244 | var lastActive = owns && owns.length > 0 ? new Date(Math.max(...owns.map(el => el.time))) : 'never'; 245 | var profile = { 246 | fullname: fullname, 247 | path_id: path, 248 | location: geo ? geo.toString() : null, 249 | email: email && email.length > 0 ? unq(email).toString() : null, 250 | langs: langs && langs.length > 0 ? langs : null, 251 | website: website && website.length > 0 ? website.toString() : null, 252 | worksFor: worksFor && worksFor.length > 0 ? worksFor.toString() : null, 253 | interests: interest && interest.length > 0 ? interest : null, 254 | followers: followers, 255 | following: following, 256 | repos: owns.length > 0 ? owns : null, 257 | forks: forks.length > 0 ? forks : null, 258 | recognized: recognized && recognized.length > 0 ? recognized : null, 259 | contributions: contributions && contributions.length > 0 ? contributions : null, 260 | totalCommits: contributions && contributions.length > 0 ? contributions.map(el => el.commits).reduce((a, b) => a + b) : null, 261 | lastActive: lastActive, 262 | bio: cn(mainDoc, 'p-note user-profile-bio js-user-profile-bio')[0] ? cn(mainDoc, 'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : '', 263 | num_commits: commits && commits.length ? commits.map(el => el.commits).reduce((a, b) => a + b) : null, 264 | percent_active: commits && commits.length ? Math.round((commits.length / (365 - (8 - new Date().getDay()))) * 1000) / 10 : '', 265 | langs: langs, 266 | link: 'https://www.github.com/'+path 267 | }; 268 | return cleanObject(profile); 269 | } 270 | 271 | function convertToTSV(fileArray) { 272 | var firstLevel = fileArray.map(el => Object.entries(el)); 273 | var lens = Math.max(...firstLevel.map(el => el.length)); 274 | var header = unq(firstLevel.map(el => el.map(itm => itm[0])).flat()); 275 | var table = [header]; 276 | var str = (o) => typeof o == 'object' ? JSON.stringify(o).replace(/\n|\r/g, ' ') : o.toString().replace(/\n|\r/g, ' '); 277 | for (var i = 0; i < firstLevel.length; i++) { 278 | var arr = []; 279 | var row = []; 280 | for (var s = 0; s < firstLevel[i].length; s++) { 281 | var place = header.indexOf(firstLevel[i][s][0]); 282 | arr[place] = firstLevel[i][s][1]; 283 | } 284 | for (var a = 0; a < arr.length; a++) { 285 | if (arr[a]) { 286 | row.push(arr[a]); 287 | } else { 288 | row.push(''); 289 | } 290 | } 291 | table.push(row); 292 | } 293 | var output = table.map(el => el.map(itm => str(itm))); 294 | return output; 295 | } 296 | 297 | function downloadr(arr2D, filename) { 298 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el => el.reduce((a, b) => a + '\t' + b)).reduce((a, b) => a + '\r' + b); 299 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 300 | var file = new Blob([data], { 301 | type: type 302 | }); 303 | if (window.navigator.msSaveOrOpenBlob) { 304 | window.navigator.msSaveOrOpenBlob(file, filename); 305 | } else { 306 | var a = document.createElement('a'), 307 | url = URL.createObjectURL(file); 308 | a.href = url; 309 | a.download = filename; 310 | document.body.appendChild(a); 311 | a.click(); 312 | setTimeout(() => { 313 | document.body.removeChild(a); 314 | window.URL.revokeObjectURL(url); 315 | }, 10); 316 | } 317 | } 318 | 319 | function createHTML(pages){ 320 | if(gi(document,'code_scrape_container')) gi(document,'code_scrape_container').outerHTML = ''; 321 | var cont = ele('div'); 322 | attr(cont,'style',`position: fixed; top: 10%; left: 33%; width: 400px; padding: 6px;`); 323 | attr(cont,'id','code_scrape_container'); 324 | document.body.appendChild(cont); 325 | 326 | var status = ele('div'); 327 | attr(status,'id','code_status'); 328 | attr(status,'style',`background: #fff; color: #004471; border: 1px solid #004471; border-top-right-radius: 0.3em; border-top-left-radius: 0.3em; padding: 6px;`); 329 | cont.appendChild(status); 330 | status.innerText = `Pulling users from ${pages} pages...`; 331 | 332 | var current = ele('div'); 333 | attr(current,'id','code_current'); 334 | attr(current,'style',`background: #fff; color: #004471; border: 1px solid #004471; border-bottom-right-radius: 0.3em; border-bottom-left-radius: 0.3em; padding: 6px;`); 335 | cont.appendChild(current); 336 | 337 | } 338 | 339 | loopThroughUsers() 340 | -------------------------------------------------------------------------------- /github_custom_Search/fromSearch/getProfilesFromAdvancedUserSearch.js: -------------------------------------------------------------------------------- 1 | /* 2 | This will take hours to comeplete if you have more than 1k search results. 3 | Look in the network tab if you want to see it working. 4 | Output is a JSON file. 5 | It doesnt get every profile from a search, but it gets pretty close. 6 | The larger the search result, the less it gets, but it will get 99% of a 2k search. 7 | 8 | */ 9 | var reg = (o, n) => o ? o[n] : ''; 10 | var cn = (o, s) => o ? o.getElementsByClassName(s) : console.log(o); 11 | var tn = (o, s) => o ? o.getElementsByTagName(s) : console.log(o); 12 | var gi = (o, s) => o ? o.getElementById(s) : console.log(o); 13 | var rando = (n) => Math.round(Math.random() * n); 14 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 15 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 16 | 17 | var ele = (t) => document.createElement(t); 18 | var attr = (o, k, v) => o.setAttribute(k, v); 19 | 20 | var cleanObject = (ob) => 21 | Object.entries(ob).reduce((r, [k, v]) => { 22 | if(v) { r[k] = v; return r; 23 | } else { return r; } 24 | }, {}); 25 | 26 | function downloadr(arr2D, filename) { 27 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el=> el.reduce((a,b) => a+'\t'+b )).reduce((a,b) => a+'\r'+b); 28 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 29 | var file = new Blob([data], { type: type }); 30 | if (window.navigator.msSaveOrOpenBlob) { 31 | window.navigator.msSaveOrOpenBlob(file, filename); 32 | } else { 33 | var a = document.createElement('a'), 34 | url = URL.createObjectURL(file); 35 | a.href = url; 36 | a.download = filename; 37 | document.body.appendChild(a); 38 | a.click(); 39 | setTimeout(() => { 40 | document.body.removeChild(a); 41 | window.URL.revokeObjectURL(url); 42 | }, 10); 43 | } 44 | } 45 | 46 | async function getPatches(link) { 47 | var res = await fetch(link); 48 | var html = await res.text(); 49 | var email = reg(/(?<=From:.+?)\b[\w\.\-\+]+@[\w\-]+\.[a-zA-Z]{2,13}(\.[a-zA-Z]{2,13}|\b)/.exec(html.replace(/\w+@users.noreply.github.com|\+.+?(?=@)/g, '')),0); 50 | var check = /users.noreply.github.com/i.test(email) ? '' : email; 51 | return check; 52 | } 53 | 54 | async function getProfileRepoData(url) { 55 | var res = await fetch(url); 56 | var text = await res.text(); 57 | var doc = new DOMParser().parseFromString(text, 'text/html'); 58 | return doc; 59 | } 60 | 61 | function parseRepo(doc,type){ 62 | return Array.from(cn(doc,`col-12 d-flex width-full py-4 border-bottom public ${type}`)).map(el=> { 63 | var stars = cn(el, 'octicon-star')[0] ? cn(el, 'octicon-star')[0].parentElement.innerText.trim() : 0; 64 | return { 65 | repo: reg(/(?<=github.com\/.+?\/).+?$/.exec(tn(el,'a')[0].href),0), 66 | lang: cn(el, 'ml-0 mr-3')[0] ? cn(el, 'ml-0 mr-3')[0].innerText.trim() : '', 67 | time: tn(el,'relative-time')[0] ? new Date(tn(el,'relative-time')[0].getAttribute('datetime')).getTime() : 0, 68 | stars: stars == 'Unstar' ? 0 : parseInt(stars.replace(/\D+/g,'')), 69 | forks: cn(el,'octicon octicon-repo-forked')[0] ? parseInt(cn(el,'octicon octicon-repo-forked')[0].parentElement.innerText.trim().replace(/\D+/g,'')) : 0 70 | }; 71 | }); 72 | } 73 | 74 | function getFollowCounts(elm,type){ 75 | var follower_a = Array.from(tn(elm,'a')).filter(el=> type.test(el.innerText))[0]; 76 | var follower_s = follower_a ? cn(follower_a,'Counter')[0] : null; 77 | var followerCount = follower_s ? parseInt(follower_s.innerText.trim()) : 0; 78 | return followerCount; 79 | } 80 | 81 | async function loopThroughRepos(path){ 82 | var prop = (arr,str) => arr.filter(el=> el.getAttribute('itemprop') == str).map(el=> el ? el.innerText.trim() : ''); 83 | var res = await getProfileRepoData(`https://github.com/${path}?tab=repositories`); 84 | var mainDoc = await getProfileRepoData(`https://github.com/${path}`); 85 | var owns = parseRepo(res,'source'); 86 | var forks = parseRepo(res,'fork'); 87 | var fullname = cn(res,'vcard-fullname')[0] ? cn(res,'vcard-fullname')[0].innerText : ''; 88 | var vcard = cn(res,'vcard-details ')[0] ? Array.from(tn(cn(res,'vcard-details ')[0],'li')) : null; 89 | var geo = vcard ? prop(vcard,'homeLocation') : null; 90 | var email = vcard ? prop(vcard,'email') : null; 91 | var website = vcard ? prop(vcard,'url') : null; 92 | var worksFor = vcard ? prop(vcard,'worksFor') : null; 93 | var followers = getFollowCounts(res,/followers/i); 94 | var following = getFollowCounts(res,/following/i); 95 | var bio = cn(res,'p-note user-profile-bio js-user-profile-bio')[0] ? cn(res,'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : ''; 96 | var contributions = cn(mainDoc,'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc,'graph-before-activity-overview')[0],'day')).map(el=> {return {date: new Date(el.getAttribute('data-date')).getTime(), commits: parseInt(el.getAttribute('data-count'))}}).filter(el=> el.commits) : null; 97 | var pagenate = cn(res,'paginate-container')[0] ? Array.from(tn(cn(res,'paginate-container')[0],'a')).filter(el=> el.innerText == 'Next').map(el=> el.href) : []; 98 | var pages = cn(res,'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0] ? Math.ceil(parseInt(cn(res,'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0].innerText.replace(/\D+/g,''))/30) : 0; 99 | for(var i=2; i<=pages; i++){ 100 | var res2 = await getProfileRepoData(pagenate[0]); 101 | parseRepo(res2,'fork').forEach(el=> forks.push(el)); 102 | parseRepo(res2,'source').forEach(el=> owns.push(el)); 103 | } 104 | if(email == null || email.length == 0){ 105 | for(var r=0; r el.lang).filter(el=> el != '')); 112 | var interest = unq(forks.map(el=> el.lang).filter(el=> el != '')); 113 | var recognized = owns.filter(el=> (el.forks > 0 || el.stars > 0) && el.lang).sort((a,b) => b.time - a.time); 114 | var profile = { 115 | fullname: fullname ? fullname : null, 116 | bio: bio ? bio : null, 117 | github: 'github.com/'+path, 118 | followers: followers, 119 | following: following, 120 | geo: geo ? geo.toString(): null, 121 | worksFor: worksFor && worksFor.length > 0 ? worksFor.toString() : null, 122 | email: email && email.length > 0 ? unq(email) : null, 123 | website: website && website.length > 0 ? website.toString() : null, 124 | langs: langs && langs.length > 0 ? langs : null, 125 | interest: interest && interest.length > 0 ? interest : null, 126 | owns: owns.length > 0 ? owns : null, 127 | forks: forks.length > 0 ? forks : null, 128 | recognized: recognized && recognized.length > 0 ? recognized : null, 129 | contributions: contributions && contributions.length > 0 ? contributions : null, 130 | totalContributions: contributions && contributions.length > 0 ? contributions.map(el=> el.commits).reduce((a,b) => a+b) : null 131 | }; 132 | return cleanObject(profile); 133 | } 134 | async function loopThroughUserPaths(userpaths){ 135 | var containArr = []; 136 | for(var i=0; i s.replace(/&s=.+?(?=&)/, '').replace(/&o=.+?(?=&)/, ''); 147 | 148 | function downloadr(arr2D, filename) { 149 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el=> el.reduce((a,b) => a+'\t'+b )).reduce((a,b) => a+'\r'+b); 150 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 151 | var file = new Blob([data], { type: type }); 152 | if (window.navigator.msSaveOrOpenBlob) { 153 | window.navigator.msSaveOrOpenBlob(file, filename); 154 | } else { 155 | var a = document.createElement('a'), 156 | url = URL.createObjectURL(file); 157 | a.href = url; 158 | a.download = filename; 159 | document.body.appendChild(a); 160 | a.click(); 161 | setTimeout(() => { 162 | document.body.removeChild(a); 163 | window.URL.revokeObjectURL(url); 164 | }, 10); 165 | } 166 | } 167 | 168 | async function gitSearch(url) { 169 | var res = await fetch(url); 170 | var text = await res.text(); 171 | var doc = new DOMParser().parseFromString(text, 'text/html'); 172 | return doc; 173 | } 174 | 175 | async function loopGitSearch(){ 176 | var getTotalResults = (d) => cn(d,'flex-md-row flex-justify-between')[0] ? reg(/[\d,]+(?=\s+users)/.exec(cn(d,'flex-md-row flex-justify-between')[0].innerText),0).replace(/\D+/g,'') : 0; 177 | var getTotalPages = (s) => s ? Math.ceil(parseInt(s) / 10) : 0; 178 | var getPages2Loop = (s) => s > 100 ? 100 : s; 179 | 180 | var containArr = []; 181 | 182 | var cleanedUrl = cleanUrl(window.location.href); 183 | var doc = await gitSearch(cleanedUrl); 184 | 185 | var results = getTotalResults(doc); 186 | var totalPages = getTotalPages(results); 187 | 188 | async function loopAlternates(searchObj){ 189 | var t_url = cleanedUrl.replace(/(?<=&q=.+?)&/, searchObj.repos+searchObj.follower+'&')+`&s=${searchObj.sort}&o=desc`; 190 | 191 | var check = await gitSearch(t_url); 192 | var strRes = getTotalResults(check); 193 | var t_pages = getTotalPages(strRes); 194 | var loops = getPages2Loop(t_pages); 195 | 196 | console.log(t_pages); 197 | for(var i=1; i<=loops; i++){ 198 | var uri = t_url+'&p='+i; 199 | var doc2 = await gitSearch(uri); 200 | var item2 = Array.from(cn(doc2,'user-list-item')).map(el => reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0)); 201 | item2.forEach(el=> containArr.push(el)); 202 | await delay(rando(1050)+1500); 203 | if(i == 25 || i == 50 || i == 75 || i == 100) await delay(rando(8050)+11000); 204 | 205 | } 206 | if(t_pages > 100){ 207 | for(var i=1; i<=loops; i++){ 208 | var uri = t_url+'&p='+i; 209 | var doc2 = await gitSearch(uri.replace(/o=desc/, 'o=asc')); 210 | var item2 = Array.from(cn(doc2,'user-list-item')).map(el => reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0)); 211 | item2.forEach(el=> containArr.push(el)); 212 | await delay(rando(1050)+1500); 213 | if(i == 25 || i == 50 || i == 75 || i == 100) await delay(rando(8050)+11000); 214 | 215 | } 216 | } 217 | } 218 | 219 | if(totalPages){ 220 | await loopAlternates({sort: "repositories", follower: "", repos: ""}); 221 | } 222 | 223 | if(totalPages > 200){ 224 | await delay(rando(150)+1500); 225 | await loopAlternates({sort: "joined", follower: "", repos: ""}); 226 | await loopAlternates({sort: "", follower: "", repos: "+repos%3A>10"}); 227 | } 228 | 229 | if(totalPages > 300){ 230 | await delay(rando(150)+1500); 231 | await loopAlternates({sort: "followers", follower: "", repos: ""}); 232 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: ""}); 233 | } 234 | 235 | if(totalPages > 400){ 236 | await delay(rando(150)+1500); 237 | await loopAlternates({sort: "", follower: "", repos: "+repos%3A>25"}); 238 | await loopAlternates({sort: "", follower: "", repos: "+repos%3A<25"}); 239 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A>10"}); 240 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A<10"}); 241 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>10"}); 242 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A<10"}); 243 | } 244 | 245 | if(totalPages > 500){ 246 | await delay(rando(150)+1500); 247 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A>25"}); 248 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A<25"}); 249 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>25"}); 250 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A<25"}); 251 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A>5"}); 252 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A<5"}); 253 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>5"}); 254 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A<5"}); 255 | } 256 | 257 | if(totalPages > 600){ 258 | await delay(rando(150)+1500); 259 | await loopAlternates({sort: "", follower: "+followers%3A<10", repos: "+repos%3A>5"}); 260 | await loopAlternates({sort: "", follower: "+followers%3A<10", repos: "+repos%3A<5"}); 261 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>50"}); 262 | await loopAlternates({sort: "", follower: "+followers%3A>10", repos: "+repos%3A<50"}); 263 | await loopAlternates({sort: "", follower: "+followers%3A<200", repos: "+repos%3A>50"}); 264 | } 265 | var paths = unq(containArr); 266 | console.log(paths); 267 | if(containArr.length>0) loopThroughUserPaths(paths); 268 | } 269 | 270 | loopGitSearch(); 271 | -------------------------------------------------------------------------------- /github_custom_Search/getPathsFromCurrentSearch.js: -------------------------------------------------------------------------------- 1 | 2 | var reg = (o, n) => o ? o[n] : ''; 3 | var cn = (o, s) => o ? o.getElementsByClassName(s) : console.log(o); 4 | var tn = (o, s) => o ? o.getElementsByTagName(s) : console.log(o); 5 | var gi = (o, s) => o ? o.getElementById(s) : console.log(o); 6 | var rando = (n) => Math.round(Math.random() * n); 7 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 8 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 9 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 10 | var ele = (t) => document.createElement(t); 11 | var attr = (o, k, v) => o.setAttribute(k, v); 12 | var cleanUrl = (s) => s.replace(/&s=.+?(?=&)/, '').replace(/&o=.+?(?=&)/, ''); 13 | 14 | function downloadr(arr2D, filename) { 15 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el=> el.reduce((a,b) => a+'\t'+b )).reduce((a,b) => a+'\r'+b); 16 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 17 | var file = new Blob([data], { type: type }); 18 | if (window.navigator.msSaveOrOpenBlob) { 19 | window.navigator.msSaveOrOpenBlob(file, filename); 20 | } else { 21 | var a = document.createElement('a'), 22 | url = URL.createObjectURL(file); 23 | a.href = url; 24 | a.download = filename; 25 | document.body.appendChild(a); 26 | a.click(); 27 | setTimeout(() => { 28 | document.body.removeChild(a); 29 | window.URL.revokeObjectURL(url); 30 | }, 10); 31 | } 32 | } 33 | 34 | async function gitSearch(url) { 35 | // obj,p,ordr 36 | // `https://github.com/search?o=${ordr}&p=${p}&q=location%3A${obj.geo}+language%3A${obj.lang}${obj.follower}&s=${obj.sort}${obj.repos}&type=Users` 37 | var res = await fetch(url); 38 | var text = await res.text(); 39 | var doc = new DOMParser().parseFromString(text, 'text/html'); 40 | return doc; 41 | } 42 | 43 | async function loopGitSearch(){ 44 | var getTotalResults = (d) => cn(d,'flex-md-row flex-justify-between')[0] ? reg(/[\d,]+(?=\s+users)/.exec(cn(d,'flex-md-row flex-justify-between')[0].innerText),0).replace(/\D+/g,'') : 0; 45 | var getTotalPages = (s) => s ? Math.ceil(parseInt(s) / 10) : 0; 46 | var getPages2Loop = (s) => s > 100 ? 100 : s; 47 | 48 | var containArr = []; 49 | // var search = {sort: "repositories", follower: "", repos: ""}; 50 | var cleanedUrl = cleanUrl(window.location.href); 51 | var doc = await gitSearch(cleanedUrl); 52 | 53 | var results = getTotalResults(doc); 54 | var totalPages = getTotalPages(results); 55 | 56 | async function loopAlternates(searchObj){ 57 | var t_url = cleanedUrl.replace(/(?<=&q=.+?)&/, searchObj.repos+searchObj.follower+'&')+`&s=${searchObj.sort}&o=desc`; 58 | 59 | var check = await gitSearch(t_url); 60 | var strRes = getTotalResults(check); 61 | var t_pages = getTotalPages(strRes); 62 | var loops = getPages2Loop(t_pages); 63 | 64 | console.log(t_pages); 65 | for(var i=1; i<=loops; i++){ 66 | var uri = t_url+'&p='+i; 67 | var doc2 = await gitSearch(uri); 68 | var item2 = Array.from(cn(doc2,'user-list-info')).map(el => reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0)); 69 | item2.forEach(el=> containArr.push(el)); 70 | await delay(rando(1050)+1500); 71 | if(i == 25 || i == 50 || i == 75 || i == 100) await delay(rando(8050)+11000); 72 | 73 | } 74 | if(t_pages > 100){ 75 | for(var i=1; i<=loops; i++){ 76 | var uri = t_url+'&p='+i; 77 | var doc2 = await gitSearch(uri.replace(/o=desc/, 'o=asc')); 78 | var item2 = Array.from(cn(doc2,'user-list-info')).map(el => reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0)); 79 | item2.forEach(el=> containArr.push(el)); 80 | await delay(rando(1050)+1500); 81 | if(i == 25 || i == 50 || i == 75 || i == 100) await delay(rando(8050)+11000); 82 | 83 | } 84 | } 85 | } 86 | 87 | if(totalPages){ 88 | await loopAlternates({sort: "repositories", follower: "", repos: ""}); 89 | } 90 | 91 | if(totalPages > 200){ 92 | await delay(rando(150)+1500); 93 | await loopAlternates({sort: "joined", follower: "", repos: ""}); 94 | await loopAlternates({sort: "", follower: "", repos: "+repos%3A>10"}); 95 | } 96 | 97 | if(totalPages > 300){ 98 | await delay(rando(150)+1500); 99 | await loopAlternates({sort: "followers", follower: "", repos: ""}); 100 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: ""}); 101 | } 102 | 103 | if(totalPages > 400){ 104 | await delay(rando(150)+1500); 105 | await loopAlternates({sort: "", follower: "", repos: "+repos%3A>25"}); 106 | await loopAlternates({sort: "", follower: "", repos: "+repos%3A<25"}); 107 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A>10"}); 108 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A<10"}); 109 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>10"}); 110 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A<10"}); 111 | } 112 | 113 | if(totalPages > 500){ 114 | await delay(rando(150)+1500); 115 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A>25"}); 116 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A<25"}); 117 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>25"}); 118 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A<25"}); 119 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A>5"}); 120 | await loopAlternates({sort: "", follower: "+followers%3A<5", repos: "+repos%3A<5"}); 121 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>5"}); 122 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A<5"}); 123 | } 124 | 125 | if(totalPages > 600){ 126 | await delay(rando(150)+1500); 127 | await loopAlternates({sort: "", follower: "+followers%3A<10", repos: "+repos%3A>5"}); 128 | await loopAlternates({sort: "", follower: "+followers%3A<10", repos: "+repos%3A<5"}); 129 | await loopAlternates({sort: "", follower: "+followers%3A>5", repos: "+repos%3A>50"}); 130 | await loopAlternates({sort: "", follower: "+followers%3A>10", repos: "+repos%3A<50"}); 131 | await loopAlternates({sort: "", follower: "+followers%3A<200", repos: "+repos%3A>50"}); 132 | } 133 | var paths = unq(containArr); 134 | console.log(paths); 135 | if(containArr.length>0) downloadr(paths,'gitSearchPaths.json'); 136 | } 137 | 138 | loopGitSearch() 139 | -------------------------------------------------------------------------------- /github_custom_Search/getProfileDetails.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 rando = (n) => Math.round(Math.random() * n); 6 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 7 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 8 | 9 | var cleanObject = (ob) => 10 | Object.entries(ob).reduce((r, [k, v]) => { 11 | if(v) { r[k] = v; return r; 12 | } else { return r; } 13 | }, {}); 14 | 15 | function downloadr(arr2D, filename) { 16 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el=> el.reduce((a,b) => a+'\t'+b )).reduce((a,b) => a+'\r'+b); 17 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 18 | var file = new Blob([data], { type: type }); 19 | if (window.navigator.msSaveOrOpenBlob) { 20 | window.navigator.msSaveOrOpenBlob(file, filename); 21 | } else { 22 | var a = document.createElement('a'), 23 | url = URL.createObjectURL(file); 24 | a.href = url; 25 | a.download = filename; 26 | document.body.appendChild(a); 27 | a.click(); 28 | setTimeout(() => { 29 | document.body.removeChild(a); 30 | window.URL.revokeObjectURL(url); 31 | }, 10); 32 | } 33 | } 34 | 35 | async function getPatches(link) { 36 | var res = await fetch(link); 37 | var html = await res.text(); 38 | var email = reg(/[\w\.+]+@\S+\.[a-zA-Z]+/.exec(html.replace(/\w+@users.noreply.github.com|\+.+?(?=@)/g, '')),0); 39 | var check = /users.noreply.github.com/i.test(email) ? '' : email; 40 | return check; 41 | } 42 | 43 | async function getProfileRepoData(url) { 44 | var res = await fetch(url); 45 | var text = await res.text(); 46 | var doc = new DOMParser().parseFromString(text, 'text/html'); 47 | return doc; 48 | } 49 | 50 | function parseRepo(doc,type){ 51 | return Array.from(cn(doc,`col-12 d-flex width-full py-4 border-bottom public ${type}`)).map(el=> { 52 | var stars = cn(el, 'octicon-star')[0] ? cn(el, 'octicon-star')[0].parentElement.innerText.trim() : 0; 53 | return { 54 | repo: reg(/(?<=github.com\/.+?\/).+?$/.exec(tn(el,'a')[0].href),0), 55 | lang: cn(el, 'ml-0 mr-3')[0] ? cn(el, 'ml-0 mr-3')[0].innerText.trim() : '', 56 | time: tn(el,'relative-time')[0] ? new Date(tn(el,'relative-time')[0].getAttribute('datetime')).getTime() : 0, 57 | stars: stars == 'Unstar' ? 0 : parseInt(stars.replace(/\D+/g,'')), 58 | forks: cn(el,'octicon octicon-repo-forked')[0] ? parseInt(cn(el,'octicon octicon-repo-forked')[0].parentElement.innerText.trim().replace(/\D+/g,'')) : 0 59 | }; 60 | }); 61 | } 62 | 63 | function getFollowCounts(elm,type){ 64 | var follower_a = Array.from(tn(elm,'a')).filter(el=> type.test(el.innerText))[0]; 65 | var follower_s = follower_a ? cn(follower_a,'Counter')[0] : null; 66 | var followerCount = follower_s ? parseInt(follower_s.innerText.trim()) : 0; 67 | return followerCount; 68 | } 69 | 70 | async function loopThroughRepos(path,primaryLang){ 71 | var prop = (arr,str) => arr.filter(el=> el.getAttribute('itemprop') == str).map(el=> el ? el.innerText.trim() : ''); 72 | var res = await getProfileRepoData(`https://github.com/${path}?tab=repositories`); 73 | var mainDoc = await getProfileRepoData(`https://github.com/${path}`); 74 | var owns = parseRepo(res,'source'); 75 | var forks = parseRepo(res,'fork'); 76 | var fullname = cn(res,'vcard-fullname')[0] ? cn(res,'vcard-fullname')[0].innerText : ''; 77 | var vcard = cn(res,'vcard-details ')[0] ? Array.from(tn(cn(res,'vcard-details ')[0],'li')) : null; 78 | var geo = vcard ? prop(vcard,'homeLocation') : null; 79 | var email = vcard ? prop(vcard,'email') : null; 80 | var website = vcard ? prop(vcard,'url') : null; 81 | var worksFor = vcard ? prop(vcard,'worksFor') : null; 82 | var followers = getFollowCounts(res,/followers/i); 83 | var following = getFollowCounts(res,/following/i); 84 | var bio = cn(res,'p-note user-profile-bio js-user-profile-bio')[0] ? cn(res,'p-note user-profile-bio js-user-profile-bio')[0].innerText.trim() : ''; 85 | var contributions = cn(mainDoc,'graph-before-activity-overview')[0] ? Array.from(cn(cn(mainDoc,'graph-before-activity-overview')[0],'day')).map(el=> {return {date: new Date(el.getAttribute('data-date')).getTime(), commits: parseInt(el.getAttribute('data-count'))}}).filter(el=> el.commits) : null; 86 | var pagenate = cn(res,'paginate-container')[0] ? Array.from(tn(cn(res,'paginate-container')[0],'a')).filter(el=> el.innerText == 'Next').map(el=> el.href) : []; 87 | var pages = cn(res,'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0] ? Math.ceil(parseInt(cn(res,'UnderlineNav-item mr-0 mr-md-1 mr-lg-3 selected ')[0].innerText.replace(/\D+/g,''))/30) : 0; 88 | for(var i=2; i<=pages; i++){ 89 | var res2 = await getProfileRepoData(pagenate[0]); 90 | parseRepo(res2,'fork').forEach(el=> forks.push(el)); 91 | parseRepo(res2,'source').forEach(el=> owns.push(el)); 92 | } 93 | if(email == null || email.length == 0){ 94 | for(var r=0; r el.lang).filter(el=> el != '')); 101 | var interest = unq(forks.map(el=> el.lang).filter(el=> el != '')); 102 | var recognized = owns.filter(el=> (el.forks > 0 || el.stars > 0) && el.lang).sort((a,b) => b.time - a.time); 103 | var profile = { 104 | fullname: fullname ? fullname : null, 105 | bio: bio ? bio : null, 106 | github: 'github.com/'+path, 107 | primaryLang: primaryLang, 108 | followers: followers, 109 | following: following, 110 | geo: geo ? geo.toString(): null, 111 | worksFor: worksFor && worksFor.length > 0 ? worksFor.toString() : null, 112 | email: email && email.length > 0 ? unq(email) : null, 113 | website: website && website.length > 0 ? website.toString() : null, 114 | langs: langs && langs.length > 0 ? langs : null, 115 | interest: interest && interest.length > 0 ? interest : null, 116 | owns: owns.length > 0 ? owns : null, 117 | forks: forks.length > 0 ? forks : null, 118 | recognized: recognized && recognized.length > 0 ? recognized : null, 119 | contributions: contributions && contributions.length > 0 ? contributions : null, 120 | totalContributions: contributions && contributions.length > 0 ? contributions.map(el=> el.commits).reduce((a,b) => a+b) : null 121 | } 122 | return cleanObject(profile); 123 | } 124 | async function loopThroughUserPaths(obj,geo){ 125 | var userpaths = obj.paths; 126 | var containArr = []; 127 | for(var i=0; i 100) await delay(rando(505)+10100); 139 | } 140 | } 141 | initProfileDownloadLoops('Atlanta'); 142 | -------------------------------------------------------------------------------- /github_custom_Search/getUserPathsBy_LangGeo.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 rando = (n) => Math.round(Math.random() * n); 6 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 7 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 8 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 9 | var ele = (t) => document.createElement(t); 10 | var attr = (o, k, v) => o.setAttribute(k, v); 11 | 12 | 13 | function downloadr(arr2D, filename) { 14 | var data = /\.json$|.js$/.test(filename) ? JSON.stringify(arr2D) : arr2D.map(el=> el.reduce((a,b) => a+'\t'+b )).reduce((a,b) => a+'\r'+b); 15 | var type = /\.json$|.js$/.test(filename) ? 'data:application/json;charset=utf-8,' : 'data:text/plain;charset=utf-8,'; 16 | var file = new Blob([data], { type: type }); 17 | if (window.navigator.msSaveOrOpenBlob) { 18 | window.navigator.msSaveOrOpenBlob(file, filename); 19 | } else { 20 | var a = document.createElement('a'), 21 | url = URL.createObjectURL(file); 22 | a.href = url; 23 | a.download = filename; 24 | document.body.appendChild(a); 25 | a.click(); 26 | setTimeout(() => { 27 | document.body.removeChild(a); 28 | window.URL.revokeObjectURL(url); 29 | }, 10); 30 | } 31 | } 32 | 33 | async function gitSearch(obj,p,ordr) { 34 | var res = await fetch(`https://github.com/search?o=${ordr}&p=${p}&q=location%3A${obj.geo}+language%3A${obj.lang}${obj.follower}&s=${obj.sort}${obj.repos}&type=Users`); 35 | var text = await res.text(); 36 | var doc = new DOMParser().parseFromString(text, 'text/html'); 37 | return doc; 38 | } 39 | 40 | async function loopGitSearch(lang,geoName){ 41 | var getTotalResults = (d) => cn(d,'flex-md-row flex-justify-between')[0] ? reg(/[\d,]+(?=\s+users)/.exec(cn(d,'flex-md-row flex-justify-between')[0].innerText),0).replace(/\D+/g,'') : 0; 42 | var getTotalPages = (s) => s ? Math.ceil(parseInt(s) / 10) : 0; 43 | var getPages2Loop = (s) => s > 100 ? 100 : s; 44 | 45 | var containArr = []; 46 | var search = {lang: lang, geo: geoName, sort: "repositories", follower: "", repos: ""}; 47 | 48 | var doc = await gitSearch(search,1,'desc'); 49 | 50 | var results = getTotalResults(doc); 51 | var totalPages = getTotalPages(results); 52 | 53 | async function loopAlternates(searchObj,ordr){ 54 | var check = await gitSearch(search,1,'desc'); 55 | var strRes = getTotalResults(check); 56 | var t_pages = getTotalPages(strRes); 57 | var loops = getPages2Loop(t_pages); 58 | console.log(t_pages); 59 | for(var i=1; i<=loops; i++){ 60 | var doc2 = await gitSearch(searchObj,i,'desc'); 61 | var item2 = Array.from(cn(doc2,'user-list-info')).map(el => reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0)); 62 | item2.forEach(el=> containArr.push(el)); 63 | await delay(rando(1050)+1500); 64 | if(i == 25 || i == 50 || i == 75 || i == 100) await delay(rando(1050)+10000); 65 | } 66 | if(t_pages > 100){ 67 | for(var i=1; i<=loops; i++){ 68 | var doc2 = await gitSearch(searchObj,i,'asc'); 69 | var item2 = Array.from(cn(doc2,'user-list-info')).map(el => reg(/(?<=github.com\/).+/.exec(tn(el,'a')[0].href),0)); 70 | item2.forEach(el=> containArr.push(el)); 71 | await delay(rando(1050)+1500); 72 | } 73 | } 74 | } 75 | 76 | if(totalPages){ 77 | await loopAlternates(search,totalPages); 78 | } 79 | 80 | if(totalPages > 200){ 81 | await delay(rando(150)+1500); 82 | await loopAlternates({lang: lang, geo: geoName, sort: "joined", follower: "", repos: ""}); 83 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "", repos: "+repos%3A>10"}); 84 | } 85 | 86 | if(totalPages > 300){ 87 | await delay(rando(150)+1500); 88 | await loopAlternates({lang: lang, geo: geoName, sort: "followers", follower: "", repos: ""}); 89 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: ""}); 90 | } 91 | 92 | if(totalPages > 400){ 93 | await delay(rando(150)+1500); 94 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "", repos: "+repos%3A>25"}); 95 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "", repos: "+repos%3A<25"}); 96 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<5", repos: "+repos%3A>10"}); 97 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<5", repos: "+repos%3A<10"}); 98 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A>10"}); 99 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A<10"}); 100 | } 101 | 102 | if(totalPages > 500){ 103 | await delay(rando(150)+1500); 104 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<5", repos: "+repos%3A>25"}); 105 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<5", repos: "+repos%3A<25"}); 106 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A>25"}); 107 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A<25"}); 108 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<5", repos: "+repos%3A>5"}); 109 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<5", repos: "+repos%3A<5"}); 110 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A>5"}); 111 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A<5"}); 112 | } 113 | 114 | if(totalPages > 600){ 115 | await delay(rando(150)+1500); 116 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<10", repos: "+repos%3A>5"}); 117 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<10", repos: "+repos%3A<5"}); 118 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>5", repos: "+repos%3A>50"}); 119 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A>10", repos: "+repos%3A<50"}); 120 | await loopAlternates({lang: lang, geo: geoName, sort: "", follower: "+followers%3A<200", repos: "+repos%3A>50"}); 121 | } 122 | var paths = unq(containArr); 123 | var pathObj = {lang: decodeURIComponent(lang.replace(/"/g,'')).replace(/\+/g, ' '), paths: paths}; 124 | console.log(paths); 125 | if(containArr.length>0) downloadr(pathObj,lang+'_'+geoName.replace(/\+/g,'-')+'.json'); 126 | } 127 | 128 | async function loopLangsByLocal(targetGeo){ 129 | var targetlangs = ["ActionScript","HTML","Java","C","C%23","C%2B%2B","Clojure","CoffeeScript","CSS","Go","Haskell","JavaScript","Lua","MATLAB","Objective-C","Perl","PHP","Python","R","Ruby","Scala","Shell","Swift","TeX","\"Vim+script\"","\"1C+Enterprise\"","ABAP","ABNF","Ada","\"Adobe+Font+Metrics\"","Agda","\"AGS+Script\"","Alloy","\"Alpine+Abuild\"","\"Altium+Designer\"","AMPL","AngelScript","\"Ant+Build+System\"","ANTLR","ApacheConf","Apex","\"API+Blueprint\"","APL","\"Apollo+Guidance+Computer\"","AppleScript","Arc","AsciiDoc","ASN.1","ASP","AspectJ","Assembly","Asymptote","ATS","Augeas","AutoHotkey","AutoIt","Awk","Ballerina","Batchfile","Befunge","Bison","BitBake","Blade","BlitzBasic","BlitzMax","Bluespec","Boo","Brainfuck","Brightscript","C-ObjDump","\"C2hs+Haskell\"","\"Cabal+Config\"","\"Cap'n+Proto\"","CartoCSS","Ceylon","Chapel","Charity","ChucK","Cirru","Clarion","Clean","Click","CLIPS","\"Closure+Templates\"","\"Cloud+Firestore+Security+Rules\"","CMake","COBOL","ColdFusion","\"ColdFusion+CFC\"","COLLADA","\"Common+Lisp\"","\"Common+Workflow+Language\"","\"Component+Pascal\"","CoNLL-U","Cool","Coq","Cpp-ObjDump","Creole","Crystal","CSON","Csound","\"Csound+Document\"","\"Csound+Score\"","CSV","Cuda","CWeb","Cycript","Cython","D","D-ObjDump","\"Darcs+Patch\"","Dart","DataWeave","desktop","Dhall","Diff","\"DIGITAL+Command+Language\"","DM","\"DNS+Zone\"","Dockerfile","Dogescript","DTrace","Dylan","E","Eagle","Easybuild","EBNF","eC","\"Ecere+Projects\"","ECL","ECLiPSe","EditorConfig","\"Edje+Data+Collection\"","edn","Eiffel","EJS","Elixir","Elm","\"Emacs+Lisp\"","EmberScript","EML","EQ","Erlang","F%23","F*","Factor","Fancy","Fantom","\"FIGlet+Font\"","\"Filebench+WML\"","Filterscript","fish","FLUX","Formatted","Forth","Fortran","FreeMarker","Frege","G-code","\"Game+Maker+Language\"","GAMS","GAP","\"GCC+Machine+Description\"","GDB","GDScript","Genie","Genshi","\"Gentoo+Ebuild\"","\"Gentoo+Eclass\"","\"Gerber+Image\"","\"Gettext+Catalog\"","Gherkin","\"Git+Attributes\"","\"Git+Config\"","GLSL","Glyph","\"Glyph+Bitmap+Distribution+Format\"","GN","Gnuplot","Golo","Gosu","Grace","Gradle","\"Grammatical+Framework\"","\"Graph+Modeling+Language\"","GraphQL","\"Graphviz+(DOT)\"","Groovy","\"Groovy+Server+Pages\"","Hack","Haml","Handlebars","HAProxy","Harbour","Haxe","HCL","HiveQL","HLSL","HolyC","HTML%2BDjango","HTML%2BECR","HTML%2BEEX","HTML%2BERB","HTML%2BPHP","HTML%2BRazor","HTTP","HXML","Hy","HyPhy","IDL","Idris","\"Ignore+List\"","\"IGOR+Pro\"","\"Inform+7\"","INI","\"Inno+Setup\"","Io","Ioke","\"IRC+log\"","Isabelle","\"Isabelle+ROOT\"","J","Jasmin","\"Java+Properties\"","\"Java+Server+Pages\"","JavaScript%2BERB","JFlex","Jison","\"Jison+Lex\"","Jolie","JSON","\"JSON+with+Comments\"","JSON5","JSONiq","JSONLD","Jsonnet","JSX","Julia","\"Jupyter+Notebook\"","\"KiCad+Layout\"","\"KiCad+Legacy+Layout\"","\"KiCad+Schematic\"","Kit","Kotlin","KRL","LabVIEW","Lasso","Latte","Lean","Less","Lex","LFE","LilyPond","Limbo","\"Linker+Script\"","\"Linux+Kernel+Module\"","Liquid","\"Literate+Agda\"","\"Literate+CoffeeScript\"","\"Literate+Haskell\"","LiveScript","LLVM","Logos","Logtalk","LOLCODE","LookML","LoomScript","LSL","\"LTspice+Symbol\"","M","M4","M4Sugar","Makefile","Mako","Markdown","Marko","Mask","Mathematica","\"Maven+POM\"","Max","MAXScript","mcfunction","MediaWiki","Mercury","Meson","Metal","MiniD","Mirah","Modelica","Modula-2","Modula-3","\"Module+Management+System\"","Monkey","Moocode","MoonScript","\"Motorola+68K+Assembly\"","MQL4","MQL5","MTML","MUF","mupad","Myghty","nanorc","NCL","Nearley","Nemerle","nesC","NetLinx","NetLinx%2BERB","NetLogo","NewLisp","Nextflow","Nginx","Nim","Ninja","Nit","Nix","NL","NSIS","Nu","NumPy","ObjDump","Objective-C%2B%2B","Objective-J","ObjectScript","OCaml","Omgrofl","ooc","Opa","Opal","OpenCL","\"OpenEdge+ABL\"","\"OpenRC+runscript\"","OpenSCAD","\"OpenType+Feature+File\"","Org","Ox","Oxygene","Oz","P4","Pan","Papyrus","Parrot","\"Parrot+Assembly\"","\"Parrot+Internal+Representation\"","Pascal","Pawn","Pep8","\"Perl+6\"","Pic","Pickle","PicoLisp","PigLatin","Pike","PLpgSQL","PLSQL","Pod","\"Pod+6\"","PogoScript","Pony","PostCSS","PostScript","\"POV-Ray+SDL\"","PowerBuilder","PowerShell","Processing","Prolog","\"Propeller+Spin\"","\"Protocol+Buffer\"","\"Public+Key\"","Pug","Puppet","\"Pure+Data\"","PureBasic","PureScript","\"Python+console\"","\"Python+traceback\"","q","QMake","QML","Quake","Racket","Ragel","RAML","Rascal","\"Raw+token+data\"","RDoc","REALbasic","Reason","Rebol","Red","Redcode","\"Regular+Expression\"","Ren'Py","RenderScript","reStructuredText","REXX","RHTML","\"Rich+Text+Format\"","Ring","RMarkdown","RobotFramework","Roff","\"Roff+Manpage\"","Rouge","RPC","\"RPM+Spec\"","RUNOFF","Rust","Sage","SaltStack","SAS","Sass","Scaml","Scheme","Scilab","SCSS","sed","Self","ShaderLab","ShellSession","Shen","Slash","Slice","Slim","Smali","Smalltalk","Smarty","SMT","Solidity","SourcePawn","SPARQL","\"Spline+Font+Database\"","SQF","SQL","SQLPL","Squirrel","\"SRecode+Template\"","\"SSH+Config\"","Stan","\"Standard+ML\"","Stata","STON","Stylus","\"SubRip+Text\"","SugarSS","SuperCollider","Svelte","SVG","SystemVerilog","Tcl","Tcsh","Tea","Terra","Text","Textile","Thrift","\"TI+Program\"","TLA","TOML","TSQL","TSX","Turing","Turtle","Twig","TXL","\"Type+Language\"","TypeScript","\"Unified+Parallel+C\"","\"Unity3D+Asset\"","\"Unix+Assembly\"","Uno","UnrealScript","UrWeb","Vala","VCL","Verilog","VHDL","\"Visual+Basic\"","Volt","Vue","\"Wavefront+Material\"","\"Wavefront+Object\"","wdl","\"Web+Ontology+Language\"","WebAssembly","WebIDL","WebVTT","\"Windows+Registry+Entries\"","wisp","Wollok","\"World+of+Warcraft+Addon+Data\"","\"X+BitMap\"","\"X+Font+Directory+Index\"","\"X+PixMap\"","X10","xBase","XC","XCompose","XML","Xojo","XPages","XProc","XQuery","XS","XSLT","Xtend","Yacc","YAML","YANG","YARA","YASnippet","ZAP","Zeek","ZenScript","Zephir","Zig","ZIL","Zimpl"]; 130 | for(var i=0; i arr.filter(el=> el.owns).filter(el => el.owns.some(itm=> booleanSearch(str,itm.repo))); 27 | var repoNameOrLangSearch = (arr,str) => arr.filter(el=> el.owns).filter(el => el.owns.some(itm=> booleanSearch(str,itm.lang) || booleanSearch(str,itm.repo))); 28 | 29 | var forkNameSearch = (arr,str) => arr.filter(el=> el.forks).filter(el => el.forks.some(itm=> booleanSearch(str,itm.repo))); 30 | var forkNameOrLangSearch = (arr,str) => arr.filter(el=> el.forks).filter(el => el.forks.some(itm=> booleanSearch(str,itm.lang) || booleanSearch(str,itm.repo))); 31 | 32 | var langSearch = (arr,str) => arr.filter(el=> el.langs).filter(el => el.langs.some(itm=> booleanSearch(str,itm))); 33 | var interestSearch = (arr,str) => arr.filter(el=> el.interest).filter(el => el.interest.some(itm=> booleanSearch(str,itm))); 34 | 35 | var primaryLangSearch = (arr,str) => arr.filter(el=> el.primaryLang).filter(el => booleanSearch(str,el.primaryLang)); 36 | 37 | var bioSearch = (arr,str) => arr.filter(el=> el.bio).filter(el => booleanSearch(str,el.bio)); 38 | 39 | forkNameOrLangSearch(fileArray,'"R"') 40 | -------------------------------------------------------------------------------- /starGazerSearchByLocation.js: -------------------------------------------------------------------------------- 1 | var reg = (elm, n) => elm != null ? elm[n] : ''; 2 | var cn = (ob, nm) => ob.getElementsByClassName(nm); 3 | var tn = (ob, nm) => ob.getElementsByTagName(nm); 4 | var gi = (ob, nm) => ob.getElementById(nm); 5 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 6 | var rando = (n) => Math.round(Math.random() + n); 7 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 8 | 9 | var currentPage = window.location.href; 10 | var startPage = currentPage.replace(/(?<=stargazers).+/, ''); 11 | 12 | var csvTable = (arr) => arr.map(itm => itm.toString().replace(/$/, '\r')).toString().replace(/\r,/g, '\r'); 13 | 14 | var popTarget = "gitStarPop"; 15 | 16 | var reg = (elm, n) => elm != null ? elm[n] : ''; 17 | var cn = (ob, nm) => ob.getElementsByClassName(nm); 18 | var tn = (ob, nm) => ob.getElementsByTagName(nm); 19 | var gi = (ob, nm) => ob.getElementById(nm); 20 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 21 | var rando = (n) => Math.round(Math.random() + n); 22 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 23 | 24 | var csvTable = (arr) => arr.map(itm => itm.toString().replace(/$/, '\r')).toString().replace(/\r,/g, '\r'); 25 | 26 | function dragElement() { 27 | var elmnt = this.parentElement; 28 | var pos1 = 0, 29 | pos2 = 0, 30 | pos3 = 0, 31 | pos4 = 0; 32 | if (document.getElementById(this.id)) { 33 | document.getElementById(this.id).onmousedown = dragMouseDown; 34 | } else { 35 | this.onmousedown = dragMouseDown; 36 | } 37 | 38 | function dragMouseDown(e) { 39 | pos3 = e.clientX; 40 | pos4 = e.clientY; 41 | document.onmouseup = closeDragElement; 42 | document.onmousemove = elementDrag; 43 | } 44 | 45 | function elementDrag(e) { 46 | pos1 = pos3 - e.clientX; 47 | pos2 = pos4 - e.clientY; 48 | pos3 = e.clientX; 49 | pos4 = e.clientY; 50 | elmnt.style.top = (elmnt.offsetTop - pos2) + "px"; 51 | elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"; 52 | elmnt.style.opacity = "0.85"; 53 | elmnt.style.transition = "opacity 1000ms"; 54 | } 55 | 56 | function closeDragElement() { 57 | document.onmouseup = null; 58 | document.onmousemove = null; 59 | elmnt.style.opacity = "1"; 60 | } 61 | } 62 | 63 | function createPopTextArea(id) { 64 | if (document.getElementById(id)) document.getElementById(id).outerHTML = ""; 65 | 66 | var cd = document.createElement("div"); 67 | cd.setAttribute("id", id); 68 | cd.style.display = "inline-block"; 69 | cd.style.position = "fixed"; 70 | cd.style.top = "10%"; 71 | cd.style.left = "50%"; 72 | cd.style.width = "22%"; 73 | cd.style.height = "16%"; 74 | cd.style.background = "transparent"; 75 | cd.style.borderRadius = ".15em"; 76 | cd.style.padding = "2px"; 77 | cd.style.zIndex = "10000"; 78 | document.body.appendChild(cd); 79 | 80 | var cb = document.createElement("button"); 81 | cb.setAttribute("id", id + "_close"); 82 | cb.style.float = "left"; 83 | cb.style.background = "#000"; 84 | cb.style.height = "20px"; 85 | cb.style.width = "20px"; 86 | cb.style.borderRadius = "50%"; 87 | cb.style.boxShadow = "0px"; 88 | cb.style.border = "3px solid Crimson"; 89 | cb.style.textAlign = "center"; 90 | cb.style.cursor = "pointer"; 91 | cb.style.userSelect = "none"; 92 | cb.style.fontSize = "1em"; 93 | cb.style.color = "Crimson"; 94 | cb.style.transform = "scale(1, 1) translate(3.5px, 3.5px) rotate(0deg)"; 95 | cb.addEventListener("click", killParent); 96 | cb.addEventListener("mousedown", hoverO); 97 | cb.addEventListener("mouseover", hoverI); 98 | cb.addEventListener("mouseout", hoverO); 99 | cd.appendChild(cb); 100 | 101 | var hd = document.createElement("div"); 102 | hd.setAttribute("id", id + "_mover"); 103 | hd.style.width = "99%"; 104 | hd.style.height = "25%"; 105 | hd.style.backgroundColor = "#000000"; 106 | hd.style.borderTopLeftRadius = ".15em"; 107 | hd.style.borderTopRightRadius = ".15em"; 108 | hd.style.padding = "6px"; 109 | hd.style.cursor = 'move'; 110 | hd.style.boxShadow = "1px 1px 1px 0px #888888"; 111 | hd.addEventListener("mouseover", dragElement); 112 | cd.appendChild(hd); 113 | 114 | 115 | var tf = document.createElement("input"); 116 | tf.setAttribute("id", id + "_textfile"); 117 | tf.setAttribute("placeholder", "Atlanta OR London OR New York"); 118 | tf.style.width = "66%"; 119 | tf.style.height = "100%"; 120 | tf.style.padding = "3px"; 121 | tf.style.border = "1px solid #000000"; 122 | tf.style.background = "#0f0f0f"; 123 | tf.style.color = "#ffffff"; 124 | tf.style.fontSize = "1em"; 125 | tf.style.userSelect = "none"; 126 | tf.style.float = "right"; 127 | tf.style.boxShadow = "1px 1px 1px 0px #888888"; 128 | tf.addEventListener("keydown", (event) => { 129 | if (event.key == "Enter") { 130 | initSearchLoop(); 131 | } 132 | }); 133 | hd.appendChild(tf); 134 | 135 | var tb = document.createElement("div"); 136 | tb.setAttribute("id", id + "_textarea"); 137 | tb.innerText = "Add your location OR locations and press enter to start"; 138 | tb.style.width = "99%"; 139 | tb.style.height = "75%"; 140 | tb.style.padding = "3px"; 141 | tb.style.border = "1px solid #000000"; 142 | tb.style.color = "#878787"; 143 | tb.style.fontSize = "1em"; 144 | tb.style.userSelect = "none"; 145 | tb.style.boxShadow = "1px 1px 1px 0px #888888"; 146 | cd.appendChild(tb); 147 | tb.style.backgroundColor = "#282828"; 148 | 149 | } 150 | 151 | async function killParent() { 152 | this.style.background = "Crimson"; 153 | this.style.transform = "scale(.001, .001) translate(3px, 3px) rotate(495deg)"; 154 | this.style.transition = "all 106ms cubic-bezier(.9,.37,.66,.96)"; 155 | await delay(206); 156 | this.parentElement.outerHTML = ""; 157 | } 158 | async function killElm() { 159 | this.outerHTML = ""; 160 | } 161 | async function hoverI() { 162 | this.style.border = "2px solid Crimson"; 163 | await delay(40); 164 | this.style.border = "1px solid Crimson"; 165 | await delay(30); 166 | this.style.border = "1px solid #000"; 167 | await delay(20); 168 | this.style.background = "Crimson"; 169 | this.style.color = "#000"; 170 | this.style.transition = "all 186ms cubic-bezier(.9,.37,.66,.96)"; 171 | } 172 | async function hoverO() { 173 | this.style.background = "#000"; 174 | this.style.border = "1px solid Crimson"; 175 | await delay(66); 176 | this.style.border = "3px solid Crimson"; 177 | this.style.color = "Crimson"; 178 | this.style.transition = "all 186ms cubic-bezier(.9,.37,.66,.96)"; 179 | } 180 | 181 | 182 | 183 | async function getEmailFromProfile(url) { 184 | var res = await fetch(url + '?tab=repositories'); 185 | var text = await res.text(); 186 | var doc = new DOMParser().parseFromString(text, 'text/html'); 187 | var repos = doc.getElementsByClassName('col-12 d-flex width-full py-4 border-bottom public source'); 188 | var targetRepos = Array.from(repos).map(itm => itm.getElementsByTagName('a')[0].href + '/commit/master.patch'); 189 | return checkEmailPatch(targetRepos); 190 | } 191 | 192 | async function getPatches(link) { 193 | var res = await fetch(link); 194 | var html = await res.text(); 195 | var email = reg(/[\w|\.]+@\S+\.[a-zA-Z]+/.exec(html),0); 196 | return email; 197 | } 198 | 199 | async function checkEmailPatch(repos) { 200 | for (i = 0; i < repos.length; i++) { 201 | var email = await getPatches(repos[i]); 202 | if (email != '') { 203 | return email; 204 | } 205 | } 206 | } 207 | 208 | async function downloadr(str, name) { 209 | var type = "data:text/plain;charset=utf-8,"; 210 | var file = new Blob([str], { 211 | type: type 212 | }); 213 | var a = document.createElement("a"), 214 | url = URL.createObjectURL(file); 215 | a.href = url; 216 | a.download = name; 217 | document.body.appendChild(a); 218 | a.click(); 219 | await delay(10); 220 | document.body.removeChild(a); 221 | window.URL.revokeObjectURL(url); 222 | } 223 | 224 | async function getHoverCard(params,geoSearch){ 225 | var {user_path,repo_id,current_path} = params; 226 | 227 | var res = await fetch(`https://github.com/users/${user_path}/hovercard?subject=repository%3A${repo_id}¤t_path=${current_path}`, { 228 | "headers": { 229 | "accept": "*/*", 230 | "accept-language": "en-US,en;q=0.9", 231 | "sec-ch-ua": "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"97\", \"Chromium\";v=\"97\"", 232 | "sec-ch-ua-mobile": "?0", 233 | "sec-ch-ua-platform": "\"Windows\"", 234 | "sec-fetch-dest": "empty", 235 | "sec-fetch-mode": "cors", 236 | "sec-fetch-site": "same-origin", 237 | "x-requested-with": "XMLHttpRequest" 238 | }, 239 | "referrer": "https://github.com/bilibili/flv.js/", 240 | "referrerPolicy": "no-referrer-when-downgrade", 241 | "body": null, 242 | "method": "GET", 243 | "mode": "cors", 244 | "credentials": "include" 245 | }); 246 | var text = await res.text(); 247 | return geoSearch.test(text); 248 | } 249 | 250 | 251 | 252 | async function getNumOfStarGazers(url){ 253 | var res = await fetch(url); 254 | var text = await res.text(); 255 | var doc = new DOMParser().parseFromString(text, 'text/html'); 256 | var repositoryCont = cn(doc, 'repository-content')[0]; 257 | var numGazers = cn(repositoryCont,'Counter')[0] ? parseInt(cn(repositoryCont,'Counter')[0].innerText.replace(/\D+/g, '')) : 0; 258 | return numGazers; 259 | } 260 | 261 | async function getStarGazers(url,geoSearch){ 262 | var res = await fetch(url); 263 | var text = await res.text(); 264 | var doc = new DOMParser().parseFromString(text, 'text/html'); 265 | var repositoryCont = cn(doc, 'repository-content')[0]; 266 | var followers = tn(repositoryCont,'li')?.length ? Array.from(tn(repositoryCont,'li')).map(i=> 267 | [ 268 | /(?<=github.com\/).+/.exec(i.getElementsByTagName('a')?.[0]?.href)?.[0], 269 | i.getElementsByTagName('a')?.[0]?.href 270 | 271 | ] 272 | ) : []; 273 | 274 | var filteredFollowers = []; 275 | 276 | for(var i=0; i JSON.parse(p.getAttribute('data-hydro-click'))).filter(p=> p?.payload?.repository_id)?.[0]?.payload?.repository_id, 280 | current_path:encodeURIComponent(/(?<=github.com)\/.+/.exec(url)?.[0]) 281 | },geoSearch); 282 | if(isMatch) filteredFollowers.push(followers[i][1]); 283 | } 284 | var pages = cn(doc,'paginate-container')[0] ? Array.from(tn(cn(doc,'paginate-container')[0],'a')) : null; 285 | var pageArray = pages ? pages.filter(i=> i.innerText == 'Next') : []; 286 | var pageLink = pageArray.length > 0 ? pageArray[0].href : null; 287 | 288 | var outputObj = {nextPage: pageLink, filteredFollowers: filteredFollowers}; 289 | console.log(outputObj); 290 | return outputObj; 291 | } 292 | 293 | 294 | 295 | async function getProfileDetails(url,geoSearch) { 296 | var res = await fetch(url); 297 | var text = await res.text(); 298 | var doc = new DOMParser().parseFromString(text, 'text/html'); 299 | var fullname = cn(doc, 'p-name vcard-fullname')[0] ? cn(doc, 'p-name vcard-fullname')[0].innerText.trim().replace(/,/g,'') : ''; 300 | var vcard = Array.from(tn(cn(doc, 'vcard-details')[0], 'li')); 301 | var geo = vcard.filter(elm => elm.getAttribute('itemprop') == 'homeLocation')[0] ? vcard.filter(elm => elm.getAttribute('itemprop') == 'homeLocation')[0].innerText.trim().replace(/,/g,'') : ''; 302 | var empl = vcard.filter(elm => elm.getAttribute('itemprop') == 'worksFor')[0] ? vcard.filter(elm => elm.getAttribute('itemprop') == 'worksFor')[0].innerText.trim().replace(/,/g,'') : ''; 303 | 304 | if(geoSearch){ 305 | var emailCheck = await getEmailFromProfile(url); 306 | var email = emailCheck && /noreply/i.test(emailCheck) === false ? emailCheck : ''; 307 | return [fullname, empl, geo, email, url]; 308 | }else{ 309 | return []; 310 | } 311 | } 312 | 313 | async function loopThroughStarGazers(url,geoSearch){ 314 | var profilesToScrape = []; 315 | var numGazers = await getNumOfStarGazers(url); 316 | var pagesToLoop = Math.ceil(numGazers/30); 317 | var firstRes = await getStarGazers(url,geoSearch); 318 | var resLink = firstRes.nextPage; 319 | if(firstRes.filteredFollowers.length > 0) firstRes.filteredFollowers.forEach(u=> profilesToScrape.push(u)); 320 | 321 | for(var i=0; i 0) resObj.filteredFollowers.forEach(u=> profilesToScrape.push(u)); 340 | } 341 | } 342 | return profilesToScrape; 343 | } 344 | 345 | async function downloadCSVofMatches(url,geoSearch) { 346 | var filename = reg(/(?<=\.com\/).+?\/\w+/.exec(url), 0).replace(/\W+/g, '_') +'_'+ document.getElementById(popTarget+ "_textfile").value.replace(/\s+/g, '_'); 347 | var resArr = await loopThroughStarGazers(url,geoSearch); 348 | var temp = [ 349 | ['Full Name', 'Company', 'Location', 'Email', 'Github Url'] 350 | ]; 351 | for (let i = 0; i < resArr.length; i++) { 352 | let row = await getProfileDetails(resArr[i], geoSearch); 353 | if(row.length > 0) temp.push(row); 354 | } 355 | downloadr(csvTable(temp), filename + '.csv'); 356 | } 357 | 358 | function initSearchLoop(){ 359 | var geoStr = document.getElementById(popTarget+ "_textfile").value; 360 | var searchG = geoStr ? new RegExp(geoStr.replace(/\s+OR\s+/gi, '|').trim(), 'i') : null; 361 | document.getElementById(popTarget+ "_textarea").innerText = 'Initializing...'; 362 | downloadCSVofMatches(startPage,searchG); 363 | } 364 | createPopTextArea(popTarget); 365 | -------------------------------------------------------------------------------- /usersearch.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 rando = (n) => Math.round(Math.random() * n); 6 | var unq = (arr) => arr.filter((e, p, a) => a.indexOf(e) == p); 7 | var delay = (ms) => new Promise(res => setTimeout(res, ms)); 8 | var ele = (t) => document.createElement(t); 9 | var attr = (o, k, v) => o.setAttribute(k, v); 10 | var reChar = (s) => s.match(/&#.+?;/g) && s.match(/&#.+?;/g).length > 0 ? s.match(/&#.+?;/g).map(el => [el, String.fromCharCode(/d+/.exec(el)[0])]).map(m => s = s.replace(new RegExp(m[0], 'i'), m[1])).pop() : s; 11 | 12 | function parseAsRegexArr(bool) { 13 | if (typeof bool == 'object') { 14 | return Array.isArray(bool) ? bool : [bool]; 15 | } else { 16 | var rxReady = (s) => s ? s.replace(/"/g, '\\b').trim().replace(/\)/g, '').replace(/\(/g, '').replace(/\s+/g, '.{0,2}').replace(/\//g, '\\/').replace(/\+/g, '\\+').replace(/\s*\*\s*/g, '\\s*\\w*\\s+') : s; 17 | var checkSimpleOR = (s)=> /\bor\b/i.test(s) && /\(/.test(s) === false && /\b\s+and\s\b/.test(s) === false; 18 | var checkAndOrSimple = (s) => [/\bor\b/i,/\band\b/i].every(el=> el.test(s) && /\(/.test(s) === false); 19 | 20 | if(checkAndOrSimple(bool)){ 21 | return bool.replace(/\s+OR\s+|\s*\|\s*/gi, '|').replace(/\//g, '\\/').replace(/"/g, '\\b').replace(/\s+/g, '.{0,2}').replace(/\s*\*\s*/g, '\\s*\\w*\\s+').split(/\band\b/).map(el=> new RegExp(el.trim(), 'i')); 22 | 23 | } else if (checkSimpleOR(bool)) { 24 | return [new RegExp(bool.replace(/\s+OR\s+|\s*\|\s*/gi, '|').replace(/\//g, '\\/').replace(/"/g, '\\b').replace(/\s+/g, '.{0,2}').replace(/\s*\*\s*/g, '\\s*\\w*\\s+'), 'i')]; 25 | 26 | } else { 27 | var orx = "\\(.+?\\)|(\\(\\w+\\s{0,1}OR\\s|\\w+\\s{0,1}OR\\s)+((\\w+\s)+?|(\\w+)\\)+)+?"; 28 | var orMatch = bool ? bool.match(new RegExp(orx, 'g')) : []; 29 | var orArr = orMatch ? orMatch.map(b=> rxReady(b.replace(/\s+OR\s+|\s*\|\s*/gi, '|')) ) : []; 30 | var noOrs = bool ? bool.replace(new RegExp(orx, 'g'), '').split(/\s+[AND\s+]+/i) : bool; 31 | var ands = noOrs ? noOrs.map(a=> rxReady(a)) : []; 32 | var xArr = ands.concat(orArr).filter(i=> i != '').map(x=> new RegExp(x, 'i') ); 33 | return xArr; 34 | } 35 | } 36 | } 37 | var booleanSearch = (bool, target) => parseAsRegexArr(bool).every(x=> x.test(target)); 38 | 39 | var langOpts = ["ActionScript", "C", "C#", "C++", "Clojure", "CoffeeScript", "CSS", "Go", "Haskell", "HTML", "Java", "JavaScript", "Lua", "MATLAB", "Objective-C", "Perl", "PHP", "Python", "R", "Ruby", "Scala", "Shell", "Swift", "TeX", "Vim script", "1C Enterprise", "ABAP", "ABNF", "Ada", "Adobe Font Metrics", "Agda", "AGS Script", "Alloy", "Alpine Abuild", "Altium Designer", "AMPL", "AngelScript", "Ant Build System", "ANTLR", "ApacheConf", "Apex", "API Blueprint", "APL", "Apollo Guidance Computer", "AppleScript", "Arc", "AsciiDoc", "ASN.1", "ASP", "AspectJ", "Assembly", "Asymptote", "ATS", "Augeas", "AutoHotkey", "AutoIt", "Awk", "Ballerina", "Batchfile", "Befunge", "BibTeX", "Bison", "BitBake", "Blade", "BlitzBasic", "BlitzMax", "Bluespec", "Boo", "Brainfuck", "Brightscript", "C-ObjDump", "C2hs Haskell", "Cabal Config", "Cap'n Proto", "CartoCSS", "Ceylon", "Chapel", "Charity", "ChucK", "Cirru", "Clarion", "Clean", "Click", "CLIPS", "Closure Templates", "Cloud Firestore Security Rules", "CMake", "COBOL", "ColdFusion", "ColdFusion CFC", "COLLADA", "Common Lisp", "Common Workflow Language", "Component Pascal", "CoNLL-U", "Cool", "Coq", "Cpp-ObjDump", "Creole", "Crystal", "CSON", "Csound", "Csound Document", "Csound Score", "CSV", "Cuda", "CWeb", "Cycript", "Cython", "D", "D-ObjDump", "Darcs Patch", "Dart", "DataWeave", "desktop", "Dhall", "Diff", "DIGITAL Command Language", "DM", "DNS Zone", "Dockerfile", "Dogescript", "DTrace", "Dylan", "E", "Eagle", "Easybuild", "EBNF", "eC", "Ecere Projects", "ECL", "ECLiPSe", "EditorConfig", "Edje Data Collection", "edn", "Eiffel", "EJS", "Elixir", "Elm", "Emacs Lisp", "EmberScript", "EML", "EQ", "Erlang", "F#", "F*", "Factor", "Fancy", "Fantom", "FIGlet Font", "Filebench WML", "Filterscript", "fish", "FLUX", "Formatted", "Forth", "Fortran", "FreeMarker", "Frege", "G-code", "Game Maker Language", "GAML", "GAMS", "GAP", "GCC Machine Description", "GDB", "GDScript", "Genie", "Genshi", "Gentoo Ebuild", "Gentoo Eclass", "Gerber Image", "Gettext Catalog", "Gherkin", "Git Attributes", "Git Config", "GLSL", "Glyph", "Glyph Bitmap Distribution Format", "GN", "Gnuplot", "Golo", "Gosu", "Grace", "Gradle", "Grammatical Framework", "Graph Modeling Language", "GraphQL", "Graphviz (DOT)", "Groovy", "Groovy Server Pages", "Hack", "Haml", "Handlebars", "HAProxy", "Harbour", "Haxe", "HCL", "HiveQL", "HLSL", "HolyC", "HTML+Django", "HTML+ECR", "HTML+EEX", "HTML+ERB", "HTML+PHP", "HTML+Razor", "HTTP", "HXML", "Hy", "HyPhy", "IDL", "Idris", "Ignore List", "IGOR Pro", "Inform 7", "INI", "Inno Setup", "Io", "Ioke", "IRC log", "Isabelle", "Isabelle ROOT", "J", "Jasmin", "Java Properties", "Java Server Pages", "JavaScript+ERB", "JFlex", "Jison", "Jison Lex", "Jolie", "JSON", "JSON with Comments", "JSON5", "JSONiq", "JSONLD", "Jsonnet", "JSX", "Julia", "Jupyter Notebook", "KiCad Layout", "KiCad Legacy Layout", "KiCad Schematic", "Kit", "Kotlin", "KRL", "LabVIEW", "Lasso", "Latte", "Lean", "Less", "Lex", "LFE", "LilyPond", "Limbo", "Linker Script", "Linux Kernel Module", "Liquid", "Literate Agda", "Literate CoffeeScript", "Literate Haskell", "LiveScript", "LLVM", "Logos", "Logtalk", "LOLCODE", "LookML", "LoomScript", "LSL", "LTspice Symbol", "M", "M4", "M4Sugar", "Makefile", "Mako", "Markdown", "Marko", "Mask", "Mathematica", "Maven POM", "Max", "MAXScript", "mcfunction", "MediaWiki", "Mercury", "Meson", "Metal", "MiniD", "Mirah", "MLIR", "Modelica", "Modula-2", "Modula-3", "Module Management System", "Monkey", "Moocode", "MoonScript", "Motorola 68K Assembly", "MQL4", "MQL5", "MTML", "MUF", "mupad", "Myghty", "nanorc", "NCL", "Nearley", "Nemerle", "nesC", "NetLinx", "NetLinx+ERB", "NetLogo", "NewLisp", "Nextflow", "Nginx", "Nim", "Ninja", "Nit", "Nix", "NL", "NSIS", "Nu", "NumPy", "ObjDump", "Objective-C++", "Objective-J", "ObjectScript", "OCaml", "Omgrofl", "ooc", "Opa", "Opal", "OpenCL", "OpenEdge ABL", "OpenRC runscript", "OpenSCAD", "OpenStep Property List", "OpenType Feature File", "Org", "Ox", "Oxygene", "Oz", "P4", "Pan", "Papyrus", "Parrot", "Parrot Assembly", "Parrot Internal Representation", "Pascal", "Pawn", "Pep8", "Perl 6", "Pic", "Pickle", "PicoLisp", "PigLatin", "Pike", "PLpgSQL", "PLSQL", "Pod", "Pod 6", "PogoScript", "Pony", "PostCSS", "PostScript", "POV-Ray SDL", "PowerBuilder", "PowerShell", "Processing", "Prolog", "Propeller Spin", "Protocol Buffer", "Public Key", "Pug", "Puppet", "Pure Data", "PureBasic", "PureScript", "Python console", "Python traceback", "q", "QMake", "QML", "Quake", "Racket", "Ragel", "RAML", "Rascal", "Raw token data", "RDoc", "REALbasic", "Reason", "Rebol", "Red", "Redcode", "Regular Expression", "Ren'Py", "RenderScript", "reStructuredText", "REXX", "RHTML", "Rich Text Format", "Ring", "RMarkdown", "RobotFramework", "Roff", "Roff Manpage", "Rouge", "RPC", "RPM Spec", "RUNOFF", "Rust", "Sage", "SaltStack", "SAS", "Sass", "Scaml", "Scheme", "Scilab", "SCSS", "sed", "Self", "ShaderLab", "ShellSession", "Shen", "Slash", "Slice", "Slim", "Smali", "Smalltalk", "Smarty", "SmPL", "SMT", "Solidity", "SourcePawn", "SPARQL", "Spline Font Database", "SQF", "SQL", "SQLPL", "Squirrel", "SRecode Template", "SSH Config", "Stan", "Standard ML", "Stata", "STON", "Stylus", "SubRip Text", "SugarSS", "SuperCollider", "Svelte", "SVG", "SystemVerilog", "Tcl", "Tcsh", "Tea", "Terra", "Texinfo", "Text", "Textile", "Thrift", "TI Program", "TLA", "TOML", "TSQL", "TSX", "Turing", "Turtle", "Twig", "TXL", "Type Language", "TypeScript", "Unified Parallel C", "Unity3D Asset", "Unix Assembly", "Uno", "UnrealScript", "UrWeb", "V", "Vala", "VCL", "Verilog", "VHDL", "Visual Basic", "Volt", "Vue", "Wavefront Material", "Wavefront Object", "wdl", "Web Ontology Language", "WebAssembly", "WebIDL", "WebVTT", "Windows Registry Entries", "wisp", "Wollok", "World of Warcraft Addon Data", "X BitMap", "X Font Directory Index", "X PixMap", "X10", "xBase", "XC", "XCompose", "XML", "XML Property List", "Xojo", "XPages", "XProc", "XQuery", "XS", "XSLT", "Xtend", "Yacc", "YAML", "YANG", "YARA", "YASnippet", "ZAP", "Zeek", "ZenScript", "Zephir", "Zig", "ZIL", "Zimpl"]; 40 | 41 | function dragElement() { 42 | var el = this.parentElement; 43 | var pos1 = 0, 44 | pos2 = 0, 45 | pos3 = 0, 46 | pos4 = 0; 47 | if (document.getElementById(this.id)) document.getElementById(this.id).onmousedown = dragMouseDown; 48 | else this.onmousedown = dragMouseDown; 49 | 50 | function dragMouseDown(e) { 51 | pos3 = e.clientX; 52 | pos4 = e.clientY; 53 | document.onmouseup = closeDragElement; 54 | document.onmousemove = elementDrag; 55 | } 56 | 57 | function elementDrag(e) { 58 | pos1 = pos3 - e.clientX; 59 | pos2 = pos4 - e.clientY; 60 | pos3 = e.clientX; 61 | pos4 = e.clientY; 62 | el.style.top = (el.offsetTop - pos2) + "px"; 63 | el.style.left = (el.offsetLeft - pos1) + "px"; 64 | el.style.opacity = "0.85"; 65 | el.style.transition = "opacity 700ms"; 66 | } 67 | 68 | function closeDragElement() { 69 | document.onmouseup = null; 70 | document.onmousemove = null; 71 | el.style.opacity = "1"; 72 | } 73 | } 74 | 75 | var svgs = { 76 | close: ``, 77 | }; 78 | 79 | function closeView() { 80 | this.parentElement.parentElement.outerHTML = ''; 81 | if(gi(document,'langOptions_container')) gi(document,'langOptions_container').outerHTML = ''; 82 | } 83 | 84 | function aninCloseBtn() { 85 | var l1 = tn(this, 'path')[0]; 86 | var l2 = tn(this, 'path')[1]; 87 | l1.style.transform = "translate(49px, 50px) rotate(45deg) translate(-49px, -50px)"; 88 | l1.style.transition = "all 333ms"; 89 | l2.style.transform = "translate(49px, 50px) rotate(135deg) translate(-49px, -50px)"; 90 | l2.style.transition = "all 133ms"; 91 | } 92 | 93 | function anoutCloseBtn() { 94 | var l1 = tn(this, 'path')[0]; 95 | var l2 = tn(this, 'path')[1]; 96 | l1.style.transform = "translate(49px, 50px) rotate(225deg) translate(-49px, -50px)"; 97 | l1.style.transition = "all 333ms"; 98 | l2.style.transform = "translate(49px, 50px) rotate(225deg) translate(-49px, -50px)"; 99 | l2.style.transition = "all 133ms"; 100 | } 101 | 102 | function createSearchBox() { 103 | if(gi(document,'githubber_search')) gi(document,'githubber_search').outerHTML = ''; 104 | 105 | var inputLabels = ['Full Name', 'Location', '# Followers', '# of Repos']; 106 | var inputPlaceholders = ['Evan You', 'California', '>20', '10..100']; 107 | 108 | var main = ele('div'); 109 | attr(main, 'style', `position: fixed; top: 5%; left: 5%; width: 33%; z-index: 12212`); 110 | attr(main, 'id', 'githubber_search'); 111 | document.body.appendChild(main); 112 | 113 | var head = ele('div'); 114 | attr(head,'style',`background: #24292e; width: 100%; height: 40px; border: 1.6px solid #1c1c1c; border-top-right-radius: 0.3em; border-top-left-radius: 0.3em; cursor: move;`); 115 | main.appendChild(head); 116 | head.onmouseover = dragElement; 117 | 118 | var cls = ele('div'); 119 | head.appendChild(cls); 120 | attr(cls, 'style', 'grid-area: 1 / 3; width: 30px; height: 30px; cursor: pointer; transform: scale(1.2, 1.2); float: right;'); 121 | cls.innerHTML = svgs.close; 122 | cls.onmouseenter = aninCloseBtn; 123 | cls.onmouseleave = anoutCloseBtn; 124 | cls.onclick = closeView; 125 | 126 | var box = ele('div'); 127 | attr(box, 'style', `border: 1.6px solid #004471; border-bottom-left-radius: 0.3em; border-bottom-right-radius: 0.3em; padding: 16px; background: #fff;`); 128 | attr(box, 'id', 'githubber_search'); 129 | main.appendChild(box); 130 | 131 | for (var i = 0; i < inputLabels.length; i++) { 132 | var cont = ele('div'); 133 | attr(cont, 'style', 'width: 100%;'); 134 | box.appendChild(cont); 135 | 136 | var label = ele('div'); 137 | attr(cont, 'style', 'width: 100%;'); 138 | label.innerText = inputLabels[i]; 139 | cont.appendChild(label); 140 | 141 | var input = ele('input'); 142 | attr(input, 'id', inputLabels[i].replace(/^.*?(?=[A-Z])/, '').replace(/\s+/g,'').toLowerCase() + '__'); 143 | attr(input, 'style', `width: 100%; border: 1px solid #004471; border-radius: 0.3em; padding: 3px;`); 144 | attr(input, 'placeholder', inputPlaceholders[i]); 145 | cont.appendChild(input); 146 | input.onkeyup = keyupRun; 147 | } 148 | 149 | var selc = ele('div'); 150 | attr(selc, 'style', ``); 151 | box.appendChild(selc); 152 | 153 | var lab = ele('div'); 154 | lab.innerText = 'Language'; 155 | selc.appendChild(lab); 156 | 157 | var langSearch = ele('input'); 158 | attr(langSearch,'id','language__'); 159 | attr(langSearch, 'placeholder', 'JavaScript'); 160 | attr(langSearch, 'style', `width: 100%; border: 1px solid #004471; border-radius: 0.3em; padding: 3px;`); 161 | selc.appendChild(langSearch); 162 | langSearch.onkeydown = listenForArrow; 163 | langSearch.onkeyup = listenForLang; 164 | 165 | 166 | var empt = ele('div'); 167 | attr(empt, 'style', `width: 100%; height: 20px; border: 1px solid #fff; border-radius: 0.3em; padding: 3px;`); 168 | box.appendChild(empt); 169 | 170 | var search = ele('div'); 171 | attr(search, 'style', `width: 100%; border: 1px solid #004471; border-radius: 0.3em; padding: 3px; text-align: center; color: #004471; cursor: pointer;`); 172 | attr(search,'id','githubber_search_btn'); 173 | box.appendChild(search); 174 | search.innerText = 'Search'; 175 | search.onmouseup = runSearch; 176 | search.onmouseenter = sBtnIn; 177 | search.onmouseleave = sBtnOut; 178 | function sBtnIn(){this.style.background = '#defff2';}; 179 | function sBtnOut(){this.style.background = '#fff';}; 180 | } 181 | 182 | 183 | function listenForArrow(e){ 184 | if(e.key == "ArrowDown"){ 185 | gi(document,'language__').value = cn(document,'lang_opts')[0].innerText; 186 | if(gi(document,'langOptions_container')) gi(document,'langOptions_container').outerHTML = ''; 187 | } 188 | } 189 | 190 | function listenForLang(e){ 191 | if(gi(document,'langOptions_container')) gi(document,'langOptions_container').outerHTML = ''; 192 | var langs = langOpts.filter(el=> booleanSearch(this.value.trim(),el)); 193 | var parent = ele('div'); 194 | var rect = this.getBoundingClientRect(); 195 | attr(parent,'style', `position: fixed; top: ${rect.bottom}px; left: ${rect.left}px; background: #fff; border: 1px solid #004471; border-bottom-left-radius: 0.2em; border-bottom-right-radius: 0.2em; padding: 9px; z-index: 13212;`); 196 | attr(parent,'id', `langOptions_container`); 197 | document.body.appendChild(parent); 198 | createOptions(parent,langs); 199 | if(e.key == 'Enter') { 200 | runSearch(); 201 | if(gi(document,'langOptions_container')) gi(document,'langOptions_container').outerHTML = ''; 202 | } 203 | if(this.value.trim().length<1) gi(document,'langOptions_container').outerHTML = ''; 204 | } 205 | 206 | function createOptions(parent,langs){ 207 | for (var i = 0; i 1 251 | ? ('+location%3A')+(lc.value.split(/,\s*/).reduce((a,b)=> a+`+location%3A`+b)) : lc && lc.value && /\b\s+\bOR\b\s+\b/.test(lc.value) 252 | ? (('+location%3A')+(lc.value.split(/\b\s+\bOR\b\s+\b/).reduce((a,b)=> a+`+location%3A`+b))).replace(/(?<=%3A)(?=[\w\s]+)/, '"').replace(/(?<=%3A"[\w\s]+)(?=\+)/, '"') : lc && lc.value && /\b\s+\b/.test(lc.value) 253 | ? 'location%3A%22'+lc.value+'%22' : lc && lc.value 254 | ? 'location%3A'+lc.value : ''; 255 | 256 | var folw = fl && fl.value ? `+followers%3A${fl.value}` : ''; 257 | var repo = rp && rp.value ? `+repos%3A${rp.value}` : ''; 258 | var lang = lg && lg.value ? `+language%3A${lg.value}` : ''; 259 | var out = (`https://github.com/search?q=`+name+geo+repo+lang+folw+`&type=Users&ref=advsearch`).replace(/\=\+/, '='); 260 | if(gi(document,'langOptions_container')) gi(document,'langOptions_container').outerHTML = ''; 261 | window.open(out); 262 | } 263 | createSearchBox() 264 | --------------------------------------------------------------------------------