Skip to content

Instantly share code, notes, and snippets.

@bethropolis
Created December 19, 2023 00:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bethropolis/5be49522b30fd19635f4f5878ec6bf78 to your computer and use it in GitHub Desktop.
Save bethropolis/5be49522b30fd19635f4f5878ec6bf78 to your computer and use it in GitHub Desktop.
take a sceenshot of the websites under is-a.dev domain
package main
import (
"context"
"encoding/json"
"log"
"os"
"path/filepath"
"runtime"
"sync"
"time"
"github.com/chromedp/chromedp"
)
func main() {
subdomains, err := readSubdomains("subdomains.json")
checkError(err, "Error reading subdomains")
maxWorkers := runtime.NumCPU()
runtime.GOMAXPROCS(maxWorkers)
var wg sync.WaitGroup
wg.Add(len(subdomains))
semaphore := make(chan struct{}, maxWorkers)
bufPool := sync.Pool{
New: func() interface{} {
return make([]byte, 0, 1024*1024) // Adjust the size according to your needs
},
}
screenshotDir := "./screenshots"
if err := os.MkdirAll(screenshotDir, os.ModePerm); err != nil {
log.Fatalf("Error creating screenshots directory: %v", err)
}
for _, subdomain := range subdomains {
subdomain := subdomain
semaphore <- struct{}{}
go func() {
defer func() {
<-semaphore
wg.Done()
}()
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
ctx, cancel = context.WithTimeout(ctx, 2*time.Minute) // Adjust the timeout according to your needs
defer cancel()
buf := bufPool.Get().([]byte)
defer bufPool.Put(buf[:0])
fullURL := "https://" + subdomain + ".is-a.dev" // Append the domain
res := make([]byte, 0) // Create a byte slice to store the screenshot
if err := chromedp.Run(ctx, screenshot(ctx, fullURL, &res)); err != nil {
log.Printf("Error capturing screenshot for %s: %v", subdomain, err)
return
}
fileName := filepath.Join(screenshotDir, subdomain+"_screenshot.png")
if err := os.WriteFile(fileName, res, 0644); err != nil {
log.Printf("Error saving screenshot for %s: %v", subdomain, err)
return
}
log.Printf("Screenshot captured for %s and saved as '%s'", subdomain, fileName)
}()
}
wg.Wait()
log.Println("All screenshots captured")
}
func screenshot(ctx context.Context, urlstr string, res *[]byte) chromedp.Tasks {
return chromedp.Tasks{
chromedp.Navigate(urlstr),
chromedp.CaptureScreenshot(res),
}
}
func readSubdomains(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
var subdomains []string
if err := json.NewDecoder(file).Decode(&subdomains); err != nil {
return nil, err
}
return subdomains, nil
}
func checkError(err error, message string) {
if err != nil {
log.Fatalf("%s: %v", message, err)
}
}
[
"a-ditya",
"a-furry",
"a1x5h04",
"aadarshksingh",
"aadi",
"aakanksha",
"aakash",
"aakashcse",
"aakashs",
"aakhilv",
"aakrisht",
"aaksa",
"aantarip",
"aaraam",
"aarav",
"aargh",
"aarno",
"aaron",
"aashutosh",
"aayush-bharti",
"aayush",
"aayushakacloudy",
"aayushbh",
"aayushbharti",
"abdeba",
"abdeljallil",
"abdullah",
"abdulrahman",
"abdulrshaikh",
"abegehr",
"abelblue",
"abeltranp94",
"abh80",
"abhi",
"abhigyantrips",
"abhijit",
"abhinav",
"abhint",
"abhisekp",
"abhishek",
"abhishekkumar",
"abhishekpanda",
"abhishekpb",
"abishek",
"abubakar",
"abysmal",
"ac21",
"acaiberii",
"ace",
"acey",
"acgaming",
"achim",
"achraf",
"activities.maskduck",
"acto",
"acutewoof",
"ad1107",
"adais",
"adam",
"adamkarepin",
"adamousmer",
"adarsh-a-inamdar",
"adarsh",
"adarshs",
"adarshvijay",
"addison",
"adeshsingh",
"adhi",
"adhitht",
"adi",
"adigen",
"adioblu",
"aditya",
"adityabh",
"adityabhattacharya",
"adityajyoti",
"adityakotha",
"adityapcgaming",
"adityaredflag",
"adityavag",
"adiy",
"adnan",
"adolar0042",
"adonisfx",
"adri",
"adrian",
"adriichu",
"advik",
"aeolus",
"afcu",
"afrtite",
"afton",
"ag",
"agam778",
"agamjot-singh",
"agold",
"agrim",
"aguspedhot",
"ahaan",
"ahku",
"ahmad-muhajir",
"ahmadeyamin",
"ahmedashraf",
"ahmedeldin",
"ahmosys",
"ahsw",
"ahuja-m",
"ahysa.andgyk",
"aidan",
"aidhani",
"aiko",
"aizuu",
"aj",
"ajay-charotariya",
"ajayisdev",
"ajit-thakor",
"ajlemon",
"ak",
"akai",
"akas",
"akash",
"aknb",
"akpi",
"akshath",
"akshatt",
"akshay-n",
"akshayan",
"akshayashok",
"akta-chavda",
"al-bagra",
"alan",
"albert",
"albin",
"albinpraveen",
"albinvar",
"albuman",
"alby",
"alcyoneus",
"aldenizenmc",
"alejosm",
"aleks",
"alenalex",
"alephdiallo",
"alessandro",
"alestor123",
"alex-s",
"alex",
"alexanderzhx",
"alexey",
"alexidk",
"alexis",
"alexjoseph",
"alexlykesas",
"alexmercerind",
"alexpcooper",
"alexr",
"alexsquibbs",
"alfred",
"algebraic-effects.akshay",
"ali-abdurrazzak",
"ali",
"alian",
"aliazhar",
"alimd",
"alireza",
"alisabry",
"alkadhumi",
"allancoding",
"allen",
"allvaa",
"ally",
"almatch",
"almightynan",
"almuqbel",
"alokik",
"aloo-bun",
"alperen",
"alpha",
"alphabet",
"altude",
"aluwi",
"am",
"amal-sebastian",
"amal",
"amanda",
"amanthakur",
"amar",
"amarjeet",
"amazing.devs",
"amazing",
"amazingdev",
"amazingdevel",
"amazingdevels",
"amazingdevs",
"ambaskaryash",
"amelia",
"amey",
"ameysawant",
"amila",
"amine-brahmi",
"amit",
"amity",
"amiyo",
"amjad",
"ammy",
"amodity",
"amol254542",
"amol3",
"amuffin",
"amulyasingh",
"amy",
"amya",
"anakhalal",
"analogsombra",
"analytics",
"anamay",
"anandyeole",
"ananth",
"anas",
"anautonell",
"anay",
"andgyk",
"andr",
"andrea",
"andrei",
"andremor",
"andrewstech",
"andrewtest",
"andrewtest22",
"andrianina",
"andronasef",
"andros",
"andy",
"angelo",
"angelwuff",
"anger",
"angi-talk",
"angi",
"aniketrajsingh",
"anime",
"anindra",
"anish",
"anjayy",
"ankiprajapati",
"ankit-acquaintsoft",
"ankit",
"annihilatorrrr",
"anon",
"ansari-atharnadim",
"ansari-saify",
"anshbhimani",
"anshdadwal",
"anshtyagi",
"anthony",
"anthony2be",
"anticens",
"anto",
"antogamer",
"antoine",
"antonio",
"antton",
"anttondev",
"anubhav823",
"anuj",
"anujjamdade",
"anukarop",
"anurag",
"aozora",
"apa",
"apanel",
"apexweb",
"api-kirito",
"api.anshtyagi",
"api.autoplay88.xyz",
"api.catzboy",
"api.dhyan99",
"api",
"api.karyakarsa.willo",
"api.semant",
"api.stefdp",
"api.zeppelin.maskduck",
"apigeon",
"apoloz",
"app.allancoding",
"applesfruit",
"appscom",
"aqsakhan",
"aqua",
"arafatrahaman",
"aramos",
"aravindh",
"arboy",
"arcade",
"arch",
"archelaus",
"arctix",
"argonnetworkmainframe",
"arijit",
"arizerr",
"arjix",
"armoredvortex",
"arnav",
"arpana",
"arpitbatra",
"arsdorint",
"arslan",
"art",
"arter",
"arthur",
"artiefuzzz",
"artix",
"arul",
"arunava",
"arunodmanohara",
"arv",
"arwi",
"arya",
"aryamaan",
"aryan",
"asad-khan",
"asgarrrr",
"ash",
"ashan",
"ashc1ty",
"asher",
"ashesh",
"ashey",
"asheyxd",
"ashish-g-gupta",
"ashish",
"ashishbinu",
"ashl3y",
"ashleymavericks",
"ashutosh-pandey",
"ashutosh",
"ashutoshkumar",
"ashwa",
"ashwin",
"asif",
"asim",
"aslipatov",
"asmin",
"asmo",
"asp",
"aspect",
"asriel",
"asthriona",
"astris.api",
"asuna",
"aswin-vs",
"aswin",
"asyncedd",
"ataim",
"atechadventurer",
"atharv-jha",
"atharv",
"atharva",
"atharvaupadhyay",
"athifrahmawan",
"athir",
"athira-li",
"atuel",
"atul",
"au",
"augustine",
"auq3l",
"aura",
"ausy",
"authorises",
"auuub",
"ave",
"avellea",
"avery",
"avg",
"avi",
"avidevs31",
"avikek",
"avnoor-gamerz",
"avon",
"avversion",
"awan",
"aware",
"axd",
"axel",
"axewbotx",
"axviii3",
"ayaan",
"ayaanhaider",
"aymenjelassi",
"aymo",
"aypro",
"ayush",
"ayushi",
"ayushmann",
"ayushmansarkar",
"ayushshivaji",
"ayxdacat",
"azeez",
"azer",
"azul",
"azurezeng",
"azw",
"b0q",
"b45i",
"b5i",
"b69029a2925ad960f5af027cd6d10ed9",
"ba9",
"baba",
"bacherik",
"backend.jzitnik",
"badzlan",
"baer",
"baijiu.yec",
"balam314",
"balls",
"bampa",
"banana",
"bank",
"bao",
"baptiste",
"baquir",
"bardia",
"bartoszm77",
"bashafk",
"basi",
"basil",
"batema",
"bayu",
"bear",
"bebo",
"bedanth",
"belle",
"ben",
"benediktreck",
"benjae",
"benjo",
"bento64",
"berry",
"berzcodetechnologies",
"berzerk",
"berztech",
"bhadra",
"bhargav-gohil",
"bhargav",
"bhattcodes",
"bhavesh-acquaintsoft",
"bhavesh-p-patel",
"bhavishya",
"bhavishyadahiya",
"bhavyasingh",
"bhumkah-patel",
"bibhu",
"bilal",
"bimal",
"bing-chilling",
"bipin-bheda",
"biplob",
"birabittoh",
"bitter-130",
"bitter130",
"bk",
"bkmd",
"blackdx",
"blaine",
"blake",
"blankparticle",
"blast",
"blazyflash",
"blema",
"blessingmwiti",
"blinx",
"blob",
"blob2763",
"block",
"blockchaindevpanther",
"blog.catzboy",
"blog.dhruva",
"blog.efrecon",
"blog.ron",
"blog.syntaxloopers",
"blogs.aakanksha",
"blogs.shaunak",
"bloomy",
"blox",
"blucifer",
"blue",
"blueberry",
"bluemoon",
"blueysh",
"blurnope",
"bmbs",
"bmh",
"bmhien",
"bni.co.id",
"bnyro",
"bob",
"boba",
"bobert",
"bogdan",
"boggy",
"bolt",
"boolean44",
"boon",
"booogle",
"borboss",
"boredcodebyk",
"boris1993",
"botolbaba",
"bots.trung",
"bovas",
"box",
"boxey",
"bracketproto",
"brahianf",
"brandnewwick",
"brandon-hoffman",
"brandon",
"brawley",
"bread",
"breadomaticc",
"bree",
"brian",
"brin",
"brokiem",
"brooklyn",
"brownvinci",
"brpro",
"bruhx",
"bruno",
"bryan",
"bs",
"bsapi",
"bulkypanda",
"bumbleboss",
"bur",
"burandby",
"byigit",
"c00l",
"c22",
"cagdas",
"caiden",
"caiden.xyz",
"caillou",
"cakihorse",
"cal",
"calculator.notaperson535",
"caleb",
"callumjt",
"cameo007",
"canarddu38",
"canaris",
"caodoc",
"carince",
"carlosgiralt",
"carmelo",
"carol3n",
"cartar",
"cartyoo",
"casper",
"casperong",
"cassie",
"catr3kd",
"catsarecoo",
"cattopytheweb",
"catzboy",
"caz",
"cb",
"cc",
"ccnicebruh",
"ccortina",
"cd",
"cdn.aayush",
"cdn.nziie",
"cdn.semant",
"cdn.yfa",
"celestial",
"censor",
"ceon",
"certurix",
"cetus",
"cgprograms",
"cha0tic",
"chaaya",
"chad",
"chaey",
"chaman",
"chandra",
"chandrabose",
"chandrakant",
"chang",
"changliu",
"chaotic",
"charalampos",
"charcg",
"charge",
"charlie",
"charlz",
"chasecraft",
"chat-with.sx9",
"chauhan-pradip",
"checkmate-os.sx9",
"cheeriomark1",
"chef",
"chenpeng",
"chethan",
"chino",
"chintan-prajapati",
"chip-1925",
"chirag-adhvaryu",
"chirag-parikh",
"chirag",
"chirathtimodh",
"chloe",
"chris",
"chris8889",
"christian",
"chrystom",
"chucha",
"chyves",
"ciaobot",
"cihatksm",
"cindy",
"cinnamonshrine",
"circular",
"ck",
"clarex",
"clay",
"cli",
"clicpow",
"client.nziie",
"cljhs14",
"cloneslist.aymo",
"closure",
"cloud9store",
"cloudy",
"cloudz",
"clp",
"clyde",
"cmd410",
"code.creeper76",
"code.trung",
"codefoster",
"coderpy4",
"codershayan",
"codesz",
"codethoma",
"codingbobby",
"codingkitten",
"cole",
"colin",
"collin",
"comicly",
"community.syntaxloopers",
"community2.syntaxloopers",
"computer.guy",
"computerguy",
"connor",
"conorsheehan1",
"constvar",
"contact.trung",
"contentbot",
"convertlink",
"coolcodersj",
"copysland",
"core",
"corentin-sotoca",
"cozymy",
"cr",
"cr0nus",
"craftyy",
"crazymax",
"creature",
"creeper76",
"creepso",
"creepycraft",
"creve",
"crispy",
"cristianmihai",
"crllect",
"crypt",
"crystal",
"cs",
"csprance",
"ctk",
"cucusise",
"curse",
"cutedog5695",
"cutt37",
"cuzimbisonratte",
"cv.tomgxz",
"cyan",
"cyanic76",
"cyanide",
"cycno",
"d3c",
"d3nxel",
"d3vboi",
"d4rabi",
"daanbreur",
"daanschenkel",
"daboltgod",
"dadcuy",
"dag",
"dailycat",
"dailycats",
"dainfloop",
"damned-support",
"damned",
"dan-habot",
"dan",
"dangdat",
"dani",
"danialajamil",
"daniel",
"daniel4-scratch",
"dannydandan",
"dano",
"danterus",
"dany",
"daria",
"darian",
"darji-ravi",
"dark-pizza",
"dark",
"darkdarcool",
"darkdevil",
"darrem",
"darren",
"dartanman",
"dasdebanna",
"dasshark",
"dast",
"data",
"datamind",
"dave",
"dave9123",
"davidadrian8a",
"davidheredia",
"davidpuerta",
"davipatricio",
"dax",
"daxoron",
"dayowebevents",
"dc.jakub",
"de.whine",
"dea",
"deadcode",
"deadshot",
"dean",
"debargha",
"debasishdutta",
"debertjamie",
"debjit-mandal",
"debug",
"debxd",
"declan",
"deecoyz",
"deekshasharma",
"deepak",
"deepesh",
"defalco64",
"dehteam3",
"deko",
"delasheras",
"deliable",
"delta",
"deltafumble",
"deltara",
"demir",
"demon",
"demonitize",
"demonkingswarn",
"den",
"denboy0123",
"denis",
"denismnoger",
"denix",
"deniz",
"denizak",
"denizbee",
"dennis",
"denver",
"deoxy",
"designer",
"detox",
"dev-dco",
"dev",
"deva",
"devan",
"devanmed",
"devchaudhary",
"devcomp",
"devdk",
"devel",
"developer",
"developerjosh",
"devfate",
"devgd",
"devhavok",
"devmail",
"devmirza",
"devon",
"devpanther",
"devs",
"dew",
"dexar",
"dexo",
"dhaloi",
"dhanush",
"dharmx",
"dharti-mungara",
"dhaval-kareliya",
"dheirya",
"dhinesh",
"dhruvil",
"dhyan99",
"dhyeypatel",
"diamondbroplayz",
"dibster",
"didimukhtar",
"didntpot",
"didotb",
"diedyesterday",
"diego",
"dilshad",
"dima",
"dimasandriano",
"dimi",
"dincertekin",
"dinesh-vaghasia",
"dinesh",
"dinhq",
"dipan",
"dipmala-shrimali",
"dirgha-ukani",
"discord-corp",
"discord.amulyasingh",
"discord.deadcode",
"discord.jakub",
"discord",
"divik",
"divine",
"divyadesh",
"divyam",
"divyansh",
"diyar",
"dmmay",
"dnoxl",
"do-gia-huy",
"docs",
"docs.stefdp",
"dodinhphuc",
"doge-v4-proxy",
"dogeleader",
"dogenetwork",
"dolba3b",
"domathdotid",
"dominic",
"dominik",
"dommor",
"donate.gornostay25",
"donkaos",
"donno2048",
"donut",
"dooly",
"dot",
"dott",
"downgit",
"dqmn",
"dr-therapy",
"drastic",
"drasticroy",
"drdilyor",
"drenxhyliqi",
"drish-xd",
"drively",
"drizion",
"drk-bot",
"drmonocle",
"drmzahid",
"drormaman",
"drpleaserespect",
"drv.su",
"drv123323",
"dsaw",
"dsgaasdgsdag",
"dsgamer",
"dsrev",
"duck",
"duckinc",
"dudani-meet",
"dulackmugi",
"dumkalpoly",
"dumprr",
"dunkan",
"durlavkalita",
"dushmanta",
"duy",
"dwii",
"dwk",
"dxler",
"dxomg",
"dydestroyer",
"dylanmarsili",
"dynamic-homepage",
"dyno",
"eacbypasser",
"earth.sx9",
"eazyblack",
"ebaa",
"ebonato",
"ecalzo",
"echo",
"echo2477",
"eclair",
"eclipse",
"eden",
"edgar",
"edjva",
"edmonddevera",
"edrea",
"edward",
"edwin",
"eesa",
"eeshwar",
"eevee",
"efe",
"ehmad",
"ejaz",
"ekinvarli",
"elbenja",
"elbernaoui",
"elbkr",
"eldano",
"eldin",
"eldinesh",
"elementalst",
"eletrixtalkapp",
"elf",
"elias",
"elijah629",
"eliteflix",
"elixss",
"ella",
"elma",
"eloisa",
"elvis",
"email.nota",
"email.zerow",
"emhl",
"emily",
"emmanuel",
"emre",
"emtyfay",
"endercass",
"enderdev",
"enderpoint",
"endouven",
"endxrmxn",
"enoughsdv",
"entenico",
"epgeroy",
"epic",
"epnq",
"epsooraj",
"eray",
"erdem",
"erdogan",
"erdogansad",
"erdwpe",
"eren",
"eric",
"ericpessoa",
"ericthomas",
"erik",
"erisa",
"ermal",
"erogemaster225",
"error404",
"errornointernet",
"esemv-evan",
"esp",
"essiessara",
"esteban",
"eternal-network",
"eternal",
"eternalluxury",
"eternalnetwork",
"ethxrnity",
"ethyl",
"eturbo",
"eutrix",
"eva",
"evan",
"evelio",
"everybody",
"evils",
"ez",
"ezzoubair",
"fa-fifi",
"fabiancrx",
"faelixyz",
"fafu",
"fahmifareed",
"faisal",
"faiz",
"fake",
"falguni-prajapati",
"farag",
"farhan",
"faris0520",
"farish",
"farjanul",
"farvessafiyudeen",
"farzan",
"fasdaa",
"fastering",
"fauzi",
"fayasnoushad",
"fbi",
"fcircle-doc",
"fd-gods-clan",
"fdciabdul",
"fear",
"fel1x0u",
"felipesantos",
"felix",
"felixalguzman",
"felixtr",
"femboy",
"fengkch",
"ffj20",
"files.allancoding",
"files.dqmn",
"files.hosts",
"filip-razek",
"filip769",
"filmflu",
"filo",
"fincho",
"finny",
"finsniper",
"fire",
"firedemon",
"firework",
"fishycraft",
"fitrahmunir",
"fjavierlh",
"fjuro",
"flame",
"flamexode",
"flazepe",
"flex",
"floppa",
"floppy",
"florin",
"fluxate",
"fluxxyboi",
"flymeth",
"fndn",
"fong",
"foo",
"fordevs",
"foreskin",
"formalite",
"formuna",
"forsas",
"foufou-exe",
"fourjuaneight",
"fox",
"foxie.arman",
"foxsden",
"foxy4096",
"fqcxn",
"franciskafieh",
"frazix",
"frcat",
"frd",
"freebies",
"freehuntx",
"freitaseric",
"friendslikebd",
"frog",
"frost",
"frost2k5",
"frostx",
"frozzare",
"fsanchir",
"fuccsoc",
"fuentes",
"fullpwn",
"fulminatingmoat",
"fumi",
"fundid",
"furkancetinkaya",
"furret",
"furry",
"furrycality",
"furti",
"furycraft",
"futurex",
"fxrysh",
"g-pratik",
"gab",
"gabimaciel",
"gabolemus",
"gabriel",
"gaetan",
"gala",
"galacyber",
"galaxyfps.riviox",
"gamersindo",
"gamew",
"gamingboots",
"ganesh",
"ganyu",
"gapindang",
"garden",
"gattinhosbot",
"gaurav",
"gaurav87565",
"gauravgupta",
"gauravgupta256",
"gauravkulkarni",
"gautham",
"gavin",
"gavinw",
"gavrielsatrio",
"gbot",
"gdbotlist",
"geckopico",
"genevera",
"geopjr",
"george",
"georgekaran",
"getify",
"gfn",
"gg.io",
"ggio",
"ghalibcraft",
"ghex",
"ghost",
"ghostyt",
"gifaldyazka",
"giovanni",
"giovannirapa",
"giovstechs",
"girigummadi",
"git-hoe",
"git",
"git.maskduck",
"gitcat3",
"github",
"gitninja",
"givinghawk",
"gizmo",
"gizmora2",
"gizzy",
"gkr",
"gkucmierz",
"glitchish",
"glncy",
"glomdom",
"glpzzz",
"glqch",
"gman",
"gnanaelisa",
"go.avasthi",
"godwhite",
"godwhitelight",
"gokul",
"goobric",
"gooplancton",
"gopalji",
"gorkem",
"gornostay25",
"gouthamkrishnakv",
"govind",
"govinda",
"grapeapplefruit",
"gravy",
"grif",
"grishma-chhayani",
"grusio",
"gruu",
"gstudiosx",
"guess-who",
"guilherme",
"gunethra",
"gurkirat",
"gurubhai",
"gurubot",
"gustavo",
"guyen",
"gwada",
"gxlpes",
"h3r3t1c",
"h4rl",
"h4sh",
"habeel",
"habib",
"hachi",
"hackerhawks",
"hackerman",
"haco",
"hafidu",
"halelui",
"halil",
"halokod",
"hamza",
"hanchow",
"hans0805",
"hansen",
"happyenderman",
"hardik-chandan",
"hardik",
"hari",
"haridarshan",
"hariienesh",
"harikrishnan",
"harikrishnanps",
"harjakrepp",
"harmputman",
"harrigan",
"harry",
"harrystudy",
"harrythenegro",
"harsh-mehta",
"harsh-patel",
"harshad-patoliya",
"harshad",
"harshatwo",
"harshk",
"harshrai",
"haru",
"haruki",
"haruki.py",
"harukipy",
"haseena",
"hashir",
"hassenmajor",
"hatkid",
"hatkidchan",
"haubaka",
"havoc",
"haykaody",
"hazelnut",
"hazib.brahim",
"hazwana",
"hcs",
"hecterbonha",
"hector-vigil",
"heet",
"hehe",
"heindale",
"hekker",
"heli-joshi",
"hellaz",
"hello.qqg00",
"hellscaped",
"hemanth",
"henry",
"herbert",
"herkura",
"hero",
"hex4",
"hexaa",
"hextris",
"heyjumanji",
"hi-lrmn",
"hiddenblack",
"hifzur",
"hilmansyah",
"hilmysakti",
"himanshu",
"himanshusardana",
"himanshusri",
"himashu",
"hinal-sanghvi",
"hipo",
"hirako",
"hiren-brahmbhatt",
"hiren",
"hiro",
"hironichu",
"hisham",
"hitesh-makodiya",
"hiwind",
"hjmao",
"hkamran",
"hntr",
"hoang3409",
"holgeb",
"homemadestea58",
"horn7x.is-a.dev",
"horn7x",
"hosting-test",
"hosts",
"hotdevs",
"hotmayonaise",
"hotspot",
"houlton",
"houxiaozhao",
"hozzywozzy",
"hqmt",
"hqmtgaming",
"httphypixelnet",
"hu-kaixiang",
"huby",
"human",
"hung-contact",
"hung",
"huntroid",
"husain",
"huseyin",
"huyen",
"hvlxh",
"hvn",
"hycord",
"hydrogen",
"hyena",
"hyno",
"hypernexus",
"hypnomacka",
"hyro",
"hzmi",
"hzyusuf",
"i2rys",
"iagobruno",
"iakshay",
"iakzs",
"iamchoiiril",
"iammelvink",
"iammithani",
"iamthedefender",
"ian",
"iancheung",
"ibrahim",
"ice-head",
"ice",
"iceed",
"icehead",
"icevixen",
"icm",
"ico",
"icy",
"ida64",
"idoli",
"idot",
"igna",
"igor",
"ihk",
"ihkgpt",
"ihzan",
"ikraiyan",
"ilakian",
"imad",
"imat",
"imd",
"imdew",
"imdsamimakhter",
"img.suki",
"imlasiya",
"imlasiyah",
"imlauera",
"imran",
"imskanand",
"imu",
"imy",
"imzulkar",
"in3pire",
"inam",
"incbom",
"inf",
"infernum",
"infiniteloop",
"infinity",
"infinityhackers",
"info.trung",
"inj3c7i0n",
"inkilu",
"intergrav",
"interstellar",
"interstellar.ultrix",
"interstellaros",
"invalidnoah",
"inxlo",
"ipuppyyt",
"ireknazm",
"irfan",
"irumvanselme",
"is-a-dev-testing",
"isa",
"isaacrobinson",
"isabelrosillo",
"isaiahday",
"isdwk",
"ishaanmehta",
"ishan",
"ishh",
"isqne",
"isrmicha",
"itsdemongamez",
"itsdharmik",
"itskorn",
"itsmealdo",
"itsnicecraft",
"itsomsarraf",
"itsvick",
"itzhenry",
"itzliam",
"ivan",
"ivedant",
"j-x01",
"j-x1",
"j3ffjessie",
"jack",
"jackfrost",
"jackiso",
"jackson",
"jacob",
"jadebetty",
"jagan",
"jagdhish-mer",
"jagdish-mer",
"jagi",
"jagruti-metaliya",
"jainam",
"jairomorales",
"jake",
"jakehe",
"jakub",
"jalaj",
"james",
"jamieisgeek",
"jamig",
"jams",
"janleigh",
"janmb",
"janmikowa",
"januantara",
"jarren",
"jason",
"jasonthomas",
"jatin",
"jatinkr",
"java",
"javier",
"javierpastore",
"jay-bhalodiya",
"jay-d-dave",
"jayantkageri",
"jaycedotbin",
"jayg",
"jayy",
"jbugel",
"jc-wu",
"jcarpenter",
"jckli",
"jcquieta",
"jcs",
"jdev082",
"jdszekeres",
"jean-arthur",
"jean",
"jeel",
"jeevan",
"jeferson",
"jefferson",
"jeffrey",
"jegatchalian",
"jellobow",
"jeremie",
"jeremy",
"jerikchan",
"jeros",
"jerry",
"jesgran",
"jessehoekema",
"jeweetzelf",
"jewishlewish",
"jeydin",
"jeymen",
"jhos",
"jim",
"jimmster",
"jimmy",
"jindx",
"jinso",
"jishnupsamal",
"jite",
"jithumon",
"jj",
"jjhjkhk",
"jkb-bio",
"joaovitorzv",
"joaozeira",
"jobcmax",
"joe-dawley",
"joe",
"joel",
"joelbobanoffline",
"joelee",
"joesbrandt",
"joesjourney",
"johan",
"johansansebastian",
"john",
"johna",
"johndo",
"johndoe",
"johnmortan",
"johnny",
"johnny1337",
"johnsonlee",
"johnythomas",
"jojojux",
"joker",
"jonas",
"jonathancarrillo",
"joordih",
"jorge",
"joshatticus",
"jovan",
"jpedro",
"jqshuv",
"jrdrwn",
"json-generator",
"json",
"jsworld",
"jtgr",
"juanjo",
"juhair",
"juikulkarni",
"julio",
"juliocesar",
"juliusknuff",
"jumanji",
"junior",
"jupie",
"just-muzz",
"justcody",
"justevil",
"justforever",
"justin",
"justtobbi",
"justtrynacode",
"jwaxy",
"jx-1",
"jx1",
"jxcb",
"jz",
"jzitnik",
"k93msy",
"kacem",
"kaden",
"kagchi",
"kaguwo",
"kai",
"kainer",
"kaish",
"kaivalya",
"kakarot",
"kalebhumpal",
"kamek",
"kapoor",
"kappurumedia",
"karan",
"karanxidhu",
"kartik",
"kashif-kadri",
"kasu",
"kasun",
"kasuu",
"kaushal",
"kaushik-bhadarka",
"kaushik.kashyap",
"kaustubh",
"kavi",
"kavinned",
"kaweees",
"kaweendra",
"kawet",
"kayden",
"kaz",
"kaze",
"kckarnige",
"kd",
"keczuu",
"kefir",
"keirnegn",
"keithkhaotic",
"keju",
"kekda",
"keli5",
"kells",
"kelvinmjr707",
"ken",
"kenanneo",
"kenney",
"kenwu",
"kerlos",
"kev",
"keyaan",
"keyboarding-advanced-test",
"keylock",
"keyurnimavat",
"kh",
"kha",
"khag",
"khaled",
"khang",
"khanh",
"khasan-tokhirov",
"khcrv",
"khushraj",
"kiara",
"kicrops",
"kiir0n",
"kilic",
"killerf",
"killua",
"kime",
"king",
"kingq23",
"kio",
"kira",
"kiran",
"kirbeh",
"kishan-bagiya",
"kiss",
"kitten",
"kiwozen",
"kiyora",
"kleb",
"klindos.jzitnik",
"klouqzz",
"kmrvarun",
"knsrinath",
"kntlpop",
"kodex",
"koding",
"komovie",
"komovies",
"koolwiza",
"koopa",
"koopacode",
"korauo",
"korigamik",
"koru",
"kory",
"koshikkumar17",
"koslz",
"kotikov",
"koton-bads",
"koushik",
"kramiikk",
"krazy",
"kresswell",
"krinzal",
"kris-patel",
"kris",
"krish",
"krishna",
"krishna03",
"krishna033",
"krix",
"kriz",
"kronifer",
"kryclopz",
"krzysiu",
"ksingh",
"ksvkabra",
"kuat",
"kuba",
"kubov",
"kunal",
"kurokami",
"kuyacarlos",
"kuzey",
"kweller",
"kxden",
"kyakou",
"kyhros",
"kylemartin",
"kylomaskgamer",
"kyoki",
"kyotox",
"kyoya",
"kz",
"l0ser",
"l6174",
"lacti",
"lacyx",
"lakhani-palak",
"lalmanthakur",
"laluxx",
"lam",
"lambda",
"lamdev",
"lamfun",
"lamger",
"lamgerr",
"lamgerxd",
"lap",
"laqie",
"larei",
"larryst",
"larrystudios",
"latealways",
"latestnews",
"latuh",
"laufey",
"lavafroth",
"laymoth",
"lazyllama",
"lcdled",
"learn-to-code-now",
"legalise",
"legend-sabbir",
"legendsayantan",
"leha",
"lemon",
"lenicyl",
"lenn106",
"lennymaxmine",
"leo",
"leogoetz",
"leon3321",
"leon332157",
"levani",
"levi",
"lewe",
"lf",
"liam-h",
"liancg",
"light",
"lihun",
"liju",
"likalium",
"lilac",
"limbanitejal",
"linbuxiao",
"lingle",
"link",
"linkme.noma",
"links",
"linusx",
"linux",
"lio",
"liq",
"littleneko",
"lizhenghao",
"lknows",
"llama",
"llanero",
"llko",
"lndr2501",
"lnfnunes",
"lodestone",
"logan",
"logan2005",
"loganpaxton",
"logxnic",
"loisvelasco",
"lok",
"loky",
"lol.squaresmp",
"lolz",
"lonelil",
"lordshoray",
"lordwolfy",
"lori28167",
"loser",
"losr",
"lostdir69",
"lotra",
"louis",
"lovis",
"lovishprabhakar",
"lpkeates",
"lrmn",
"lrxrn",
"lsy",
"ltln",
"luanrt",
"luca",
"lucaforever",
"lucas",
"lucaszick",
"lucid",
"lucy",
"ludwig",
"luihh",
"luis-ciber",
"luishdez",
"luistena",
"lukas",
"luke",
"luminexcloud",
"lumix",
"lunah",
"lunax0390",
"luni",
"luqmanity",
"luxxy",
"luzivr",
"lwes",
"lxquid",
"lxz",
"lytwest",
"lyubo",
"m04",
"m1cro",
"m42e",
"m4hbod",
"mac",
"maceng",
"machi",
"macos.notaperson535",
"maddy",
"madebytragic",
"madhan",
"madhav",
"madhavgupta",
"madhavjhawar",
"madhead341",
"madhurya",
"madmusician",
"maestro194",
"mafarag",
"magdi",
"mageclient",
"magenta",
"magic4me",
"magma",
"magniquick",
"mahaviraenterprises",
"mahesh",
"maheta-bhavik",
"mahevish-husseni",
"mahfuz",
"mahir",
"mahmoud",
"mahmud",
"mai",
"maikeru",
"mail-noma",
"mail.arman",
"mail.badboy",
"mail.deadcode",
"mail.enderpoint",
"mail.icehead",
"mail",
"mail.l6174",
"mail.minmit",
"mail.mrjunkyz",
"mail.mxnticek",
"mail.neki",
"mail.notaperson535",
"mail.rika",
"mail.stefdp",
"mail.sx9",
"mail.toasty",
"mail.whine",
"maindak",
"maintainers",
"majorhead",
"mak448a",
"makeshiftartist",
"makhbaz",
"maks",
"malbouy",
"malfunzionato",
"malo",
"mamad",
"mammad",
"mamun",
"manage",
"manas",
"manash",
"manav",
"mandaninikunj",
"manga",
"maninder",
"manish",
"manit",
"manojbarman",
"mantas",
"manu",
"manuel",
"marby",
"marc",
"marcchew",
"marcel.kitzbichler",
"marcelomrwin",
"marchiba99",
"marco",
"marcus",
"maria",
"marioannier",
"marketplace.syntaxloopers",
"markos",
"markus",
"markvayson",
"martial",
"maryll",
"maskduck",
"masmiyen",
"masood",
"massick",
"master",
"matbak",
"match",
"matheus",
"mathiassm",
"mathiscool",
"mathu-lmn",
"matrix.vi0leta",
"matrixcoder",
"matt3o0",
"mattdavison",
"matthew",
"mattw",
"mauricio",
"mausami-parmar",
"mawoka",
"maximumdevmode",
"maxt",
"mayank-rathva",
"mayank2808sharma",
"mayerfried",
"mayur",
"mazengohar",
"mazimez",
"mb",
"mburguete",
"mcotocel",
"mcsavvy",
"mdbesoain",
"mean",
"medhanite",
"meenbeese",
"meerveld",
"mega-lag.sx9",
"mega",
"megalith",
"mehmetabak",
"melainegerard",
"meloun7",
"melvin",
"melwyn",
"mendy",
"mersillc",
"mert",
"mfarag",
"mfused",
"mhmd",
"micah",
"michael",
"michioxd",
"micky",
"micorksen",
"midlaj",
"migoreng",
"miguel",
"mihai",
"mihir-patel-agc",
"miho",
"mihrpsah",
"mijhelt",
"mikapikazo",
"mike",
"mikey",
"mikko",
"mikronet",
"milan",
"milan090",
"milcon",
"milind",
"miljte",
"milkshake",
"mine.craft",
"mineek",
"mingihihi",
"minh2000",
"minhh2792",
"minhmmb",
"minihoot",
"minkxx",
"minmit",
"minnb-bit",
"minto",
"mioscape",
"miraclecherrypie",
"mirozr",
"mirror",
"mirzosharif",
"mishal",
"misi",
"mitch",
"miti",
"miti99",
"miu",
"miyonaki",
"mizu",
"mj1532",
"mjn",
"mk",
"mkk",
"mlemingcapoo",
"mnoger",
"mnsrulz",
"moca",
"moddedstuffguy",
"modi",
"mofuru",
"moh",
"moha",
"mohab",
"mohamad",
"mohamed",
"mohammed",
"mohammedasif-shaikh",
"mohand",
"mohannadk28",
"mohdjariullah",
"mohdsohel",
"molai",
"molai777",
"momu54",
"moni",
"monissh",
"mono",
"moo",
"moon",
"moonmachine",
"moothecow",
"mopamo",
"moritz",
"morning3tar",
"mosaab",
"mostafaefafi",
"mostafizur-rahman",
"motortruck1221",
"mpangobank",
"mpm",
"mpult",
"mpy",
"mqhirr",
"mqrshie",
"mqry",
"mr",
"mr.noname",
"mrasif",
"mrcl",
"mrcorpz",
"mrcrbrth",
"mricecream",
"mrinjamul",
"mrinmoy",
"mrj",
"mrjunkyz",
"mrkos",
"mrprime",
"mrrob0t",
"mrrobot",
"mrshoe",
"mrtemp70",
"mrthundergod",
"mrugeshtank",
"mrweez",
"mryusuf",
"msg",
"mst",
"mthia",
"mubashiryasin",
"muchenski",
"mudee",
"muff",
"muhammadbasitobaid",
"muheko",
"mukesh-tadpad",
"mukeshkumarcharak",
"muntasir",
"murder",
"murodovazizmurod",
"music",
"musikid",
"mustafa",
"mutsis",
"muzammil",
"mxnticek",
"mxnuchim",
"mystery",
"mystie",
"mytac",
"mythsman",
"myvps",
"myxi",
"mzakyr",
"n1ghtmare",
"n3rcy",
"n4n5",
"nadeem",
"nagarajgond",
"nahid",
"naki",
"nalin",
"naman-machchhar",
"naman",
"namesmt",
"namishpande",
"nan",
"nand",
"naokoshoto",
"narayana",
"narender",
"nassro",
"nat",
"natalievu",
"nathan",
"natya",
"naveen",
"naveenlam",
"naveenxd",
"nayam",
"nayan-gorasiya",
"nayan",
"nc",
"nebula",
"neelsani",
"neeraj-2401",
"neeyl",
"negodev",
"nekaoumike",
"neki",
"neko7sora",
"nekoibot",
"nekomiyasorato",
"nelson",
"nengsriaryati",
"neomc.xyz",
"neon",
"nepy",
"neranjana",
"neria",
"nes",
"neslinesli93",
"nettles",
"neuron",
"neuronbot",
"neven",
"neville",
"new.sx9",
"newkernel",
"nextcloud.vi0leta",
"nexus",
"nguyenkhanhhoa",
"nhat",
"nhemgomia",
"nicatdcw",
"niceeli",
"nicekun",
"nickooms",
"nico",
"nicol",
"nicoladen",
"nidhis-patel",
"niemiets",
"nightmaregods",
"nightsfall",
"nihaltm",
"nik",
"nikhil",
"niki-tiwari",
"nikita",
"niklas",
"nikolas",
"nikolus",
"nileshhaldar98",
"nilhem",
"nils",
"ninjaasmoke",
"ninju",
"nino",
"niper",
"nipul-bhogayat",
"nirav-bhut",
"nisarga",
"nischay",
"nishantattrey",
"nishantb",
"nitesh-rathod",
"nitesh",
"nix",
"noah",
"noahvocat",
"nobody",
"node",
"noel",
"noflare",
"noicemath",
"noir",
"noma",
"nonograms.talinsharma",
"nooz",
"norkart",
"normturtle",
"not-ethan",
"nota",
"notaperson535",
"notaussie",
"notcoded",
"notedwin",
"notefct",
"notfenixio",
"notify-api",
"notjadeja",
"notrana",
"notskillz",
"notugotskillz",
"notzsfell",
"noxsin",
"noxturnix",
"npc",
"nqdev",
"nrdybhu1",
"nsh",
"ntg",
"nthn",
"null",
"nunya-9018",
"nuxsh",
"nv2k3",
"nvme0n1p",
"nxb1t",
"nxnetwork",
"nxnlab",
"nxrmqlly",
"nxyoo",
"nxyy",
"nyan",
"nyda",
"nyel",
"nypd",
"nyx",
"nziie",
"obaydmerz",
"objectrecognisation.syntaxloopers",
"ocean",
"ofersadan",
"ofv",
"ohcrazy",
"ohgodanoob",
"ohm",
"ohmdeb",
"ohqte",
"okyanusoz",
"oleg",
"oleksa",
"olili",
"omarplayz",
"omarzaghlool",
"omera",
"omi",
"oneclick-macos-simple-kvm.notaperson535",
"onion",
"oniondev",
"onlive",
"onvy",
"oops",
"optidium",
"orange",
"orangeleaf36",
"oreo",
"orestsaban",
"orhanyigitdurmaz",
"orion",
"osada",
"osakihsieh",
"otter",
"ovillafuerte94",
"owonico",
"oxmc",
"oxoomy",
"oyepriyansh",
"p-kinjal",
"p3nguin",
"paban",
"paddycooper",
"pafias",
"paiva",
"pajsen",
"pal-rakesh-2",
"palmino",
"panchal-chirag",
"panchal-jatin",
"panchal-meet",
"pandaninjas",
"pandya-riddhi",
"panel-luxxy",
"pansy",
"panther",
"paoloclimaco",
"papyrus",
"paranoiasystem",
"parmar-dixita",
"parovoz",
"parpok",
"parshnt",
"parth",
"parthpanchal",
"pascal-jacq",
"pasindu",
"patel-darshit",
"patel-hetal",
"patel-jatin",
"patel-kalpesh",
"patel-komal",
"patel-monal",
"patel-parthiv",
"patel-radhika",
"patelhardik-p",
"pathan-imran",
"pathdog",
"pati",
"patriciafelix",
"patrickzhou",
"patsore",
"patuiqx",
"paul",
"paulpfeiffer",
"pavi",
"pawix",
"peach",
"peacy",
"pelfex",
"peme969",
"pemtshewang",
"pengubin",
"penguin",
"penguinmod",
"penieldialu",
"penieldialundama",
"peris",
"peter",
"phakh",
"phamvandien",
"phantom",
"phelix",
"phelixdusengimana",
"philcajurao",
"phoenix",
"phuc",
"pi",
"pic.cfp",
"picklerick",
"picloud",
"picosvelte.zarqi",
"pie",
"pieter",
"pinchese",
"pingoda",
"pink",
"pinkyplant",
"pinont",
"pipc",
"piplup7575",
"pirate-project",
"pirpal",
"pivko",
"pixel",
"pixelgeek",
"pixelplayz",
"pixelwhiz",
"pixie",
"pixl8",
"pixyshare",
"piyush",
"piyushrb",
"plague",
"plopilpy",
"plumaxe",
"plun",
"plush",
"pmint05",
"pndaboi",
"poetry.m1dnight",
"poked",
"polars",
"poliwhirl",
"polopro",
"polosteor",
"polygon6233",
"popcorn",
"poppy",
"posandu",
"potatoenergy",
"potatoland4492",
"poyo",
"ppg00",
"pplg",
"ppy",
"pr.whine",
"pr0k41",
"prabesh",
"prabhakaranjm",
"prabin",
"prachiti",
"practical",
"pradeepvarma22",
"prafit",
"prajapati-divya",
"prajjwal",
"prakhar",
"prakhillohiya",
"pramod-rawat",
"pranavagrawal",
"pranavsaxena",
"pranjal",
"praquron",
"prasadsawant",
"prateek",
"prathamesh",
"pratike-patel",
"pratikmali",
"pratikp-patel",
"pratyay",
"praveen",
"predefine",
"pricing.syntaxloopers",
"prima",
"pringelsdc",
"priti-shide",
"privacy",
"priyanka",
"priyansh",
"priyas-rana",
"prnice",
"pro",
"proautotest",
"probir-sarkar",
"prodefix",
"profile",
"proghead00",
"projakob",
"projassets.oxmc",
"projects.catzboy",
"prokai-kun",
"prokai",
"pronicio",
"proo",
"prototalk",
"proudmuslim",
"prox",
"proxy",
"proxyjohnny",
"proxzima",
"prozt",
"prtksunal",
"psicmi",
"psj",
"psy",
"puchikat",
"puffer",
"pushpak",
"pxd",
"pxseu",
"pyro",
"pythonplumber",
"pythonscratcher",
"pyve",
"q31265503-bio",
"q31265503",
"qhungg289",
"qing762",
"qnos",
"qqg00",
"quantamphysics",
"quartz",
"queirozt",
"querko",
"quest",
"quick",
"quydang",
"qwel",
"qwertx",
"qwerty",
"qwertyr0",
"r04nx",
"r4yish",
"ra",
"raadsel",
"rabbi-shuki",
"racembenamar",
"rachit",
"rachmadsuharja",
"radio.mxnticek",
"radio.slashed",
"radke",
"rafalmeida73",
"rafsan",
"rafsanrakib",
"raga",
"raghavkorde",
"raghavyuva",
"rahil",
"rahul-rabari",
"rahul-ray",
"rahul.ray",
"rahulcodes",
"rahulkirangaddam",
"rahulol",
"rahulps",
"rahulray",
"raiden-16f7",
"raiin",
"rain",
"raiyaad-raad",
"raiyaad",
"raj",
"rajasbhagatkar",
"raka",
"rakibahmed",
"rakibrafsaaan",
"rakibrafsan",
"raksix",
"raku",
"ramakrishna",
"rameez",
"rana",
"ranamoh",
"ranjit",
"raofin",
"rapixar",
"rasmus",
"rasp",
"raspi",
"ravana",
"raven",
"ravi-pate",
"raviteja",
"raw-api",
"raw-kirito",
"raw",
"rawir",
"rayan",
"rayane-nekena",
"raymar",
"raymond",
"raymondlu",
"raymonzhang",
"rayr",
"raystatic",
"rayvid",
"razvy",
"rdc",
"reading",
"rebokdev",
"receipes",
"receiptify",
"recoderdrastic",
"rededge",
"redirect.nziie",
"rednek46",
"reed",
"reef",
"reefsalty",
"reegan",
"refact0r",
"refactoring",
"refat",
"regiondavid",
"register-bot",
"register",
"rehanaf",
"reizy",
"rekto",
"relicrb",
"ren",
"renata",
"rep",
"respect",
"restart",
"retr0",
"retr0xraiden",
"return",
"reuben",
"reyzo",
"rezz",
"rferee",
"rfwn",
"rherly",
"rhyk",
"rhylso",
"ri1",
"ricardo",
"rice",
"ricecx",
"richard",
"rifkisaputra",
"rifzki",
"rihards",
"riii",
"rilecraft",
"riley",
"rin",
"ringoxd",
"riskybotredirect",
"riskymh",
"riskymhredirect",
"risshi",
"rithinjose",
"ritshu",
"ritwick2006",
"riviox",
"riya",
"rizky",
"rizmyabdulla",
"rizvan",
"rlewsley",
"rlx",
"rmd",
"rnv",
"roadblocked",
"robsd",
"robskan",
"rockstarbuddies",
"rocky",
"roger",
"rohan",
"rohanpawar",
"rohansharma",
"rohit-sony",
"rohit",
"rohith",
"rohithill",
"rohithkumar",
"rohitkaushal",
"roig",
"roj",
"roktim",
"rollwaifu",
"romi",
"romidev",
"ron",
"ronit",
"rony",
"roobini-gamer",
"roshan",
"rowan",
"roxza",
"roy",
"royalahmed",
"royalty",
"roydon",
"roydondsouza",
"rozay",
"rpj",
"rqtl",
"rrcoder0167",
"rrrokhtar",
"rtxeon",
"ruben",
"rubensalinas",
"rubyscans",
"rudra",
"ruiwenge2",
"ruizo",
"rumesh",
"rusiru",
"rustemb",
"rutkuli",
"ruu3f",
"rv178",
"rvsp",
"rwithik",
"rxyhn",
"rya",
"ryan.ginut",
"ryanzam",
"rylie",
"ryn",
"ryo",
"rzkyfhrzi21",
"s-kunjan",
"s-nishit",
"s4ib0t",
"s7nx",
"s97",
"saahil",
"saammaaeel",
"saatvik",
"saba",
"sabelgames",
"sabil",
"sachin",
"sacul-6",
"sadie",
"sadiq",
"sadiz",
"saeef",
"saeful",
"safone",
"sag",
"saharsh",
"sahil",
"sahilchoudhary",
"sai-mehar",
"saiganeshganoju",
"sailesh",
"sailohitaksh-cryptic",
"saisandeepvaddi",
"saivikram",
"saizuo",
"sakko",
"salar",
"salsa",
"sam-jspn",
"sam",
"sama",
"samanyu",
"samara",
"samarth-asthana",
"samarth",
"sambhrama",
"samcarson",
"sameer",
"sameera",
"sameerk",
"samet",
"sami",
"samia-islam-sua",
"samihatasnim",
"samir-vaghela",
"samir",
"samirp",
"samirpaul",
"saml",
"samlim",
"sammy",
"samo",
"samriddha",
"samuel",
"samuelnihbos",
"sanana",
"sanchay",
"sandeepv",
"sandi",
"sandira",
"sandro",
"sangelo",
"sanjay-makasana",
"sanjay-suryavanshi",
"sanjay",
"sanketborade",
"sanni",
"sannidhya",
"santhosh",
"santito",
"sappy",
"saqlainbrawl",
"sarang",
"sarath",
"saraxa",
"sarcaster",
"sarfaraz",
"sasial",
"saswatsamal",
"sathish",
"satoshi",
"saturn-net",
"satvikg7",
"satyamv7",
"saumon",
"saunear",
"saurabh-kirve",
"saurabh",
"saurabhkirve",
"savan-makawana",
"savinov",
"savio",
"saviomartin",
"saya",
"sayantan",
"sayolight",
"sc",
"school",
"schummler",
"scientific-dev",
"scor32k",
"scorcism",
"scott",
"scythe",
"sdizdarevic",
"sdp",
"sdxqw",
"seanconroy",
"search.l6174",
"sebastian",
"sebaz",
"sebitalent04",
"sedat",
"sedat3344",
"seizedforge",
"sekuji",
"selenite",
"semant",
"semant.panda",
"semanteo",
"senix",
"senninseyi",
"senzore",
"sephrost",
"seppegeuens",
"seraphic",
"serena",
"sergeyzarechnev",
"seria",
"seriuos",
"serstars",
"server.chiragnahata",
"server.drpleaserespect",
"server.stefdp",
"services.not-ethan",
"sethpython",
"sev",
"sex",
"sezersinanoglu",
"sfe",
"sfsef",
"sfx",
"sgogov",
"sgyt",
"sh-crm",
"sh",
"sh1nyhunt3r27",
"sh9351",
"shabnam",
"shad",
"shadowalker",
"shafi100",
"shahjenish",
"shajanjp",
"shake",
"shakeel-ahamad",
"shakera-vora",
"shambhavi",
"shamshitty",
"shane",
"shaquib",
"sharad-rajyaguru",
"sharafat",
"sharan",
"sharath",
"sharath3",
"sharathchandra",
"sharex.phoenix",
"sharifclick",
"shashankag",
"shaunak",
"shaunfurtado",
"shawty",
"shayokh",
"shays",
"she",
"sheldon",
"shell",
"shenjunru",
"shept",
"shevon",
"shiba",
"shibiliya",
"shift",
"shilab",
"shilinlee",
"shin",
"shiv",
"shivang",
"shivathmika",
"shiyaf",
"shizotechie",
"shmeeseeks",
"shoaib-shaikhh",
"shobhit9945",
"shobhitb",
"shoyeb",
"shrek",
"shresth",
"shreya",
"shreyasitb",
"shuawe",
"shubham",
"shubhambattoo",
"shubhamkumar",
"shubhamlal",
"shubhamverma",
"shuchirjain",
"shuriken",
"shuvam",
"shuvo",
"shweta-gotecha",
"shyran",
"sia",
"siamrahman",
"sid",
"sidd",
"siddhant",
"siddharthtewari",
"siddhu",
"sife",
"siful",
"sigmassimo",
"silicoflare",
"simo",
"simon",
"simonknowsstuff",
"simonwong",
"sincererflame71",
"singh-jitendar",
"siow-kai-yang",
"sirens",
"siris",
"sirmacr0",
"sirsimonson",
"sjlptpsnh",
"skar",
"skduck",
"skillz",
"skullfiredevil",
"sky",
"skydiver-web",
"skydonald",
"skyopg",
"slashed",
"slavicman",
"slime",
"slow",
"smartlinuxcoder",
"smeagol",
"smitty119",
"smittykjohnson",
"smtp.zerow",
"snake",
"snazzah",
"snek",
"snip",
"snipc",
"snippyivan",
"snippytech",
"snowcatridge10",
"snowy",
"snowyid",
"snxx",
"soap",
"sof009",
"sofa",
"soham",
"sohamkansodaria",
"solareclipse995",
"soldierp",
"somenicetables",
"someone",
"somesh",
"someshsrichandan",
"someshtiwari",
"son",
"soni-aakas",
"sonu",
"soothe",
"sotoyer",
"sotto",
"soulis",
"soumya-das",
"soup",
"sourov-khan-nahid",
"sow",
"sowmik",
"sowmiksudo",
"soyuj",
"spa",
"spaace",
"sparkfire298",
"sparkle",
"spaxly",
"spd",
"spechide",
"specteado",
"spectra",
"speedie",
"spicyaxolotl",
"spicywars",
"spike",
"spill",
"splashy",
"splatboy-dev",
"splatterxl",
"spongly",
"spoozy",
"sppidy",
"spud",
"sputnick567",
"spydea",
"spyminer",
"spynet",
"spyrisk",
"squaresmp",
"sreevikram",
"srihari",
"srn",
"srujan",
"ss",
"ss.kleb",
"sser",
"sshdgjeienjdje",
"sso.nqdev",
"stacksyz",
"staff",
"stamina",
"stanasx",
"star",
"starkblaze01",
"starnumber",
"starry",
"status.cfp",
"status.gattinhosbot",
"status",
"status.jzitnik",
"status.stefdp",
"stefan",
"stefdp",
"steffen",
"stellar",
"stellaros",
"stephan",
"stev",
"steven",
"stodja",
"stoneleaf-dh",
"store",
"strafe",
"strider-studios",
"string-null",
"stringent",
"strtsnm",
"stvn",
"stx",
"sty",
"styy",
"sua",
"subhadeepzilong",
"subhayu",
"sudania-ajay",
"sudev",
"sudi",
"sudip",
"suhasdissa",
"sujal",
"sujan",
"sujandeb",
"suki",
"suleymanduzgun",
"suman",
"sumanjay",
"sumedhaa",
"sumit",
"sunny",
"sunpodder",
"sunshine",
"superharmony910",
"suraj",
"surajh-patel",
"surendran-soumya",
"surge",
"surv",
"suryaansh",
"suryaaprakassh",
"suryajith",
"suryansh",
"sushi",
"suspense",
"sussypranav",
"sutirth",
"svg",
"svloog",
"swapnil",
"swargarajbhowmik",
"sweta-solanki",
"sx9",
"sxe",
"sxurxbh",
"sxvr",
"syahiramali",
"sycured",
"syd",
"syed",
"syedomershah",
"sylestic",
"syntaxloopers",
"syofyanzuhad",
"sys32",
"systemm32",
"tagbot.maskduck",
"taha",
"taha2002",
"tahakocabuga",
"tahmidrayat",
"takase",
"tal7aouy",
"talinsharma",
"tallerthanshort",
"tamton-aquib",
"tanish",
"tanish2002",
"tanmay",
"tanmayjaiswal",
"tanos",
"tanx-009",
"tanyalai",
"tarik",
"tariqul",
"tarun57",
"tarun577",
"tas33n",
"tashvik",
"tat2008",
"taufikmaulidi",
"tavignesh",
"tawqeer",
"tazer",
"tazmyan",
"tbhgodpro",
"tca",
"tcdavo",
"tcl",
"tclement0922",
"tcxone",
"td",
"tdh",
"tdm",
"team",
"team.tnt",
"tech-geek-united",
"tech-is-god",
"tech",
"techgenius",
"techke",
"technofusiontech",
"technohacker",
"technopaws",
"techpundit",
"techpunditke",
"techside",
"techstarmahesh",
"techy",
"tehpig",
"tejas-luthra",
"tekno",
"temp.stefdp",
"ten",
"teobouvard",
"termonoid",
"terraegg",
"terroid",
"tessa",
"test2214",
"test373",
"test849205",
"testluxxy",
"tetris.vi0leta",
"texh",
"textures1245",
"tfuifebfiubiu",
"thabanii",
"thabresh",
"thaihung",
"thakuraman",
"thamizh",
"thanbv1510",
"tharindu",
"tharindudarshana",
"tharinduj",
"tharukrenuja",
"that",
"thatbigderp",
"thatkoslz",
"theamazing0",
"theavian",
"thebestdeveloper",
"thecode-breaker",
"theconcepteur",
"thedeveloper03",
"thedivided",
"thedt",
"thegloriousduck",
"thehackerdude1083",
"thehuytong",
"thejus-m",
"themagicmush",
"thequackyduck",
"therealgeodash",
"theresonance",
"therookiecoder",
"thesanju",
"theschoology",
"thesct22",
"thesonofdevilhunter",
"thesyed",
"thet3o",
"thetechguy",
"thetechnikfreak",
"thewickedkarma",
"thiago",
"thiagomarsili",
"thiomains",
"this",
"thisiskeanyvy",
"thisqoutedoesntexist",
"thomas-shelby",
"thomas",
"thomasc",
"thordevs",
"thorgathis",
"thund3r",
"tiantcl",
"tibebe",
"tibor",
"tien",
"tientiny",
"tilak",
"tim",
"tim232",
"time",
"timemee",
"timo",
"timoelrichs",
"timotheelefebvre",
"timothynn",
"tin",
"tinergy",
"tinny",
"tiwknowsall",
"tm-incognito",
"tm-math",
"tmozki",
"tnt",
"toasta",
"toasted",
"toasty",
"tobez",
"tokyo",
"tom",
"tomas",
"tomcollis",
"tomgxz",
"tommyboucher",
"tomokat",
"tomteck",
"tong",
"tonywu",
"too-obvious-that.maskduck",
"topher",
"tosh",
"toster",
"toxocious",
"tpglitch",
"tpke",
"tr5kyradio",
"tracking.sonet",
"trailblazertech",
"tranthanhlong",
"trasadiyasmeet",
"trauma",
"tricked",
"trio",
"tristan",
"triyatna",
"trueuser",
"trug",
"trung",
"tsognyam",
"tsull360",
"tudbut",
"tukimi",
"tungtran",
"turtlecode",
"turvenuija",
"tushar",
"tushardeo",
"tw",
"twisted",
"tylermwise",
"typed",
"typeling1578",
"tyrkinn",
"tzvika",
"uberkey",
"udaya",
"uiopler",
"ujalakhasiya",
"ukirio",
"ukrio",
"ultimatemedia",
"ultrix",
"umesh",
"unchained",
"undeadevs",
"unicatevn",
"unichord",
"unidentifiedx",
"unixtz",
"unknowncheats",
"unseen",
"up",
"upcraft",
"upd.oxmc",
"uptime.stefdp",
"uptime.trung",
"urduck",
"urgent.afcu",
"urgent.afcubanking",
"url.aditya",
"user-exe",
"user.nqdev",
"usingh",
"utility.icevixen",
"utils",
"utkn",
"utsav",
"utsavsingh",
"uynilo9",
"v0",
"v1.neon",
"v2ray.vi0leta",
"va1dee",
"vachanmn",
"vaibhav",
"val",
"valeron",
"valorant",
"valowolf",
"vanillia",
"vansh",
"vapedevv",
"var",
"varun",
"varunhere",
"varunkumarbilwal",
"vasharma05",
"vasu",
"vbc6",
"vbkg",
"veen",
"veirt",
"vendors.syntaxloopers",
"venkateshpagdikar",
"venquidev",
"vercte",
"verma-sanjeet",
"verse",
"versions.johna",
"vertex",
"vhd",
"vi0leta",
"vian",
"vibez",
"vic",
"victoneux",
"victor",
"victoroliveira",
"victorvickie",
"vien",
"vigkrishna",
"vikram",
"vikyaiyer",
"vilari",
"vimalsaraswat",
"vin-decoder",
"vinayak",
"vinaychaudhary",
"vincent-cly",
"vincyxir",
"vineet-khemnani",
"vineet",
"vineetkhemnani",
"vinicius",
"viperadnan",
"viplav-mistry",
"vipul",
"viraj",
"viral-gadhiya",
"viren-trivedi",
"vishal",
"vishalg",
"vishalkrsharma",
"vishnu",
"vishok",
"vishwa",
"vishwapinnawala",
"visionavtr",
"vivek",
"vivekkumar",
"vixcord",
"vk",
"vleov",
"vo",
"voh",
"void",
"voidz",
"voldemort",
"vollow",
"voltic",
"voonyuan",
"vsecoder",
"vt-d",
"vulcanwm",
"vvp",
"vyas-rahul",
"vysakh",
"wahid",
"wahid7852",
"waiyanmt",
"wan",
"wang",
"wangjoui",
"wankhede",
"wansies",
"wap",
"warofzen",
"warvan",
"wassim",
"watercat",
"wavingcat",
"wbalaile",
"wcaleniekubaa",
"web-design-zone",
"webber",
"webmail.mrjunkyz",
"webmarshalls",
"webraku",
"werz",
"west",
"what",
"whine",
"whitekj",
"who",
"whxyu",
"whyme",
"wibu",
"wiggly",
"wiicreation",
"will",
"william",
"williamsebastian",
"willian",
"willo",
"win11-tutorial.notaperson535",
"win11.notaperson535",
"windfarms",
"window5",
"winniepat",
"wired",
"wiredmind",
"withercubes",
"wizq",
"wkrzywiec",
"wojciechzieciak",
"wolflangtw",
"woosh",
"wopian",
"worm",
"woundrite",
"woxdev",
"wrdg",
"wscr",
"wtfdrshn",
"wusong",
"wwei",
"www.amulyasingh",
"www",
"wzx",
"x0ba",
"x3ric",
"x8t",
"xanudu",
"xash",
"xave",
"xaxa",
"xcut",
"xdlyy",
"xelxen",
"xen",
"xeno",
"xenon",
"xenoxanite",
"xevion",
"xgorn",
"xian",
"xiaolangkong",
"xiaolei",
"xiaowu",
"xiaoxi-tw",
"xiaozhe",
"xinful",
"xinfull",
"xiro",
"xorisx",
"xoronium",
"xorro",
"xrcs",
"xream",
"xryshirfxn",
"xthe",
"xuanwu",
"xuefeng",
"xuxxi",
"xyter",
"yacineboussoufa",
"yacoreq",
"yaelmassieu",
"yahya-rabii",
"yairmedina",
"yajtpg",
"yakiyo",
"yandao",
"yang",
"yanmaker",
"yash-khattar",
"yash-poojara",
"yash",
"yashas",
"yashh-chauhan",
"yashraj",
"yashrao",
"yashwardhan",
"yasser",
"yassin",
"yassine",
"yassinm",
"yc-gen",
"yedu",
"yeetedwin",
"yef",
"yejun",
"yeppiidev",
"yerin",
"yescyyt",
"yfa",
"yfadev",
"yieldray",
"yiff",
"yiro",
"yiyi",
"yoitsrt",
"yokaicord",
"yolobnb",
"yootou",
"yorodm",
"yose",
"youfoundalpha",
"youple",
"yourdad",
"yourmom",
"yourtilak",
"yousefzidan",
"youssef",
"yozie",
"yozieb",
"yozieeee",
"ypratham",
"ysfchn",
"yt.amulyasingh",
"yug",
"yujia",
"yuk1ch",
"yuk7",
"yuki",
"yukii",
"yuksel",
"yumi",
"yuphie",
"yuphiee",
"yurihsq",
"yush",
"yusuf-rawat",
"yusuf",
"yuto",
"yutong",
"yuukari",
"yuuto",
"yuyu",
"yuzuki",
"yxlr",
"yyw",
"z4xi",
"zaid-kadri",
"zaid",
"zarqi.aicha",
"zarqi.ezzoubair",
"zarqi.fatima",
"zarqi",
"zarqi.loubna",
"zarwin",
"zaydocs",
"zelle",
"zemerik",
"zen",
"zener",
"zenpai",
"zeptar",
"zepvil",
"zer0",
"zero",
"zerolandcode",
"zeroratedtm",
"zerotwo",
"zerow",
"zh4ck",
"zhangximufeng",
"zhenchai",
"zhiyao",
"zhougonglai",
"zhu",
"zhxck",
"ziari",
"zidanify",
"zirconiac",
"ziue",
"ziyad",
"ziyn",
"zizibibi",
"zjfc",
"zoronium",
"zplusfour",
"ztrax",
"ztzt",
"zuhaib",
"zuhair",
"zwzodo",
"zxpau",
"zye",
"zyrouge",
"zyztem"
]
@bethropolis
Copy link
Author

Explanation is AI generated (Bing AI)

Here is a summary of what the code does:

  • It reads a list of subdomains from a JSON file and stores them in a slice of strings.
  • It creates a directory to save the screenshots of the websites corresponding to the subdomains.
  • It launches a number of Goroutines equal to the number of subdomains, each with its own context and browser.
  • It uses a semaphore to limit the number of concurrent Goroutines to the number of CPU cores.
  • It uses a pool of byte slices to reuse memory and reduce allocation and garbage collection overhead.
  • It uses chromedp to navigate to each website and capture its screenshot as a byte slice.
  • It saves each screenshot as a PNG file in the screenshots directory.
  • It logs any errors or successes along the way.
    Now, let's go through your code line by line and explain the APIs, types, and data being used.
package main

This line declares the package name of your program. Executable commands must always use package main.

import (
    "context"
    "encoding/json"
    "log"
    "os"
    "path/filepath"
    "runtime"
    "sync"
    "time"

    "github.com/chromedp/chromedp"
)

This block imports the packages that your program depends on. A package is a collection of source files in the same directory that are compiled together. The packages in the standard library do not have a module path prefix, while the packages from external modules have a module path joined with their subdirectory within the module. For example, the package "github.com/chromedp/chromedp" is from the module "github.com/chromedp/chromedp" and the subdirectory "chromedp".
Here is a brief description of each package you imported:

  • "context": This package provides functionality for passing deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes.
  • "encoding/json": This package provides functionality for encoding and decoding JSON data.
  • "log": This package provides functionality for logging messages with a timestamp.
  • "os": This package provides functionality for platform-independent interface to operating system functionality.
  • "path/filepath": This package provides functionality for manipulating filename paths in a way compatible with the target operating system-defined file paths.
  • "runtime": This package provides functionality for interacting with the Go runtime system, such as the number of CPU cores, the Go scheduler, and the garbage collector.
  • "sync": This package provides functionality for synchronization primitives, such as mutexes, wait groups, and pools.
  • "time": This package provides functionality for measuring and displaying time.
  • "github.com/chromedp/chromedp": This package provides functionality for controlling a headless browser and performing various actions on web pages, such as taking screenshots.
func main() {
    subdomains, err := readSubdomains("subdomains.json")
    checkError(err, "Error reading subdomains")

This block defines the main function of your program, which is the entry point for execution. The main function has no parameters and no return values.
The first line calls the readSubdomains function, which takes a filename as a string and returns a slice of strings and an error value. A slice is a dynamically-sized, flexible view into the elements of an array. An error is a built-in interface type that represents an error condition with a message. The := operator is a short variable declaration that infers the types of the variables from the right-hand side. The subdomains variable holds the slice of strings, and the err variable holds the error value.
The second line calls the checkError function, which takes an error value and a message as strings and logs and exits the program if the error is not nil. Nil is a predeclared identifier that represents zero values for pointers, interfaces, maps, slices, channels and function types.

    maxWorkers := runtime.NumCPU()
    runtime.GOMAXPROCS(maxWorkers)

This block sets the number of Goroutines that can run simultaneously to the number of CPU cores. A Goroutine is a lightweight thread of execution managed by the Go runtime. The runtime.NumCPU function returns the number of logical CPUs usable by the current process. The runtime.GOMAXPROCS function sets the maximum number of CPUs that can be executing simultaneously and returns the previous setting.

    var wg sync.WaitGroup
    wg.Add(len(subdomains))

This block creates and initializes a WaitGroup, which is a synchronization primitive that blocks until a collection of Goroutines are done. The sync.WaitGroup type has a counter that starts at zero and can be incremented by calling the Add method with a positive delta, and decremented by calling the Done method. The Wait method blocks until the counter becomes zero. The len function returns the length of a slice.

    semaphore := make(chan struct{}, maxWorkers)

This line creates and initializes a semaphore, which is a synchronization primitive that limits the number of concurrent Goroutines. A semaphore is implemented using a buffered channel, which is a communication mechanism that allows sending and receiving values with the operator <-. The make function allocates and initializes an object of type channel, slice, or map. The struct{} type is an empty struct, which occupies zero bytes of storage. The second argument to make specifies the capacity of the channel, which is the number of values that can be sent to it without blocking.

    bufPool := sync.Pool{
        New: func() interface{} {
            return make([]byte, 0, 1024*1024) // Adjust the size according to your needs
        },
    }

This block creates and initializes a pool of byte slices, which is a synchronization primitive that caches allocated but unused items for later reuse, reducing pressure on the garbage collector. The sync.Pool type has a New field, which is a function that takes no arguments and returns an interface{} value, which is the empty interface that can hold values of any type . The function returns a newly allocated byte slice with zero length and one megabyte capacity.

    screenshotDir := "./screenshots"
    if err := os.MkdirAll(screenshotDir, os.ModePerm); err != nil {
        log.Fatalf("Error creating screenshots directory: %v", err)
    }

This block creates a directory to save the screenshots of the websites. The screenshotDir variable holds the path of the directory as a string. The os.MkdirAll function creates a directory along with any necessary parents, and returns an error value if any. The os.ModePerm constant is a file mode that represents permission bits for the owner, group, and others. The if statement executes a statement and then tests a condition. The log.Fatalf function prints a message with a timestamp and the given arguments, and then calls os.Exit(1) to terminate the program. The %v verb formats the value in a default way, which is useful for printing error values.

    for _, subdomain := range subdomains {
        subdomain := subdomain

This block starts a for loop that iterates over the slice of subdomains. The for statement executes a block of code repeatedly until a condition is false. The range clause provides a way to iterate over a slice, returning the index and the value for each element. The blank identifier _ is used to ignore the index value. The subdomain variable holds the value of each element, which is a string. The subdomain := subdomain line creates a new variable with the same name and value as the original one, but in a different scope. This is necessary to avoid a common mistake of using the same variable for multiple Goroutines, which can lead to unexpected results.

        semaphore <- struct{}{}

This line acquires the semaphore by sending an empty struct value to the buffered channel. This operation blocks if the channel is full, meaning that the maximum number of concurrent Goroutines has been reached.

        go func() {
            defer func() {
                <-semaphore
                wg.Done()
            }()

This block launches a new Goroutine that executes an anonymous function. The go statement starts the execution of a function call as an independent concurrent thread of control, or Goroutine, within the same address space. The func keyword introduces a function literal, which is an unnamed function. The () at the end of the function literal invokes it immediately after being evaluated.
The first line of the function uses the defer statement, which schedules a function call to be run after the function returns. The deferred function is another anonymous function that executes two statements: it receives a value from the semaphore channel, which releases the semaphore, and it calls the wg.Done method, which decrements the WaitGroup counter by one .

           ctx, cancel := chromedp.NewContext(context.Background())
           defer cancel()

This block creates and initializes a new context and a cancel function for each Goroutine. The context.Background function returns a non-nil, empty context that is never canceled, has no values, and has no deadline. The chromedp.NewContext function allocates a new browser and creates a context associated with it, and returns the context and a cancel function that can be used to terminate the browser. The defer statement schedules the cancel function to be called after the Goroutine returns.

            ctx, cancel = context.WithTimeout(ctx, 2*time.Minute) // Adjust the timeout according to your needs
            defer cancel()

This block creates and initializes a new context and a cancel function with a timeout for each Goroutine. The context.WithTimeout function takes a parent context and a duration, and returns a new context and a cancel function that cancel the context when the timeout expires or the parent context is canceled, whichever happens first. The defer statement schedules the cancel function to be called after the Goroutine returns.

            buf := bufPool.Get().([]byte)
            defer bufPool.Put(buf[:0])

This block gets and puts a byte slice from the pool for each Goroutine. The bufPool.Get method returns an interface{} value from the pool, which is then type asserted to a []byte value. The buf variable holds the byte slice, which is initially empty but has a certain capacity. The defer statement schedules the bufPool.Put method to be called after the Goroutine returns, with the argument buf[:0], which is a slice expression that creates a new slice with zero length but the same capacity as buf.

            fullURL := "https://" + subdomain + ".is-a.dev" // Append the domain
            res := make([]byte, 0) // Create a byte slice to store the screenshot
            if err := chromedp.Run(ctx, screenshot(ctx, fullURL, &res)); err != nil {
                log.Printf("Error capturing screenshot for %s: %v", subdomain, err)
                return
            }

This block runs the screenshot task for each Goroutine. The fullURL variable holds the full URL of the website as a string, which is constructed by concatenating the "https://" prefix, the subdomain, and the ".is-a.dev" suffix. The res variable holds a new byte slice with zero length and capacity, which is created by the make function. The chromedp.Run function executes a list of actions in the given context, and returns an error value if any. The screenshot function returns a list of actions that navigate to the URL and capture the screenshot as a byte slice. The & operator takes the address of the res variable, which is a pointer to a byte slice. The if statement executes a statement and then tests a condition. The log.Printf function prints a message with a timestamp and the given arguments, and the return statement terminates the execution of the Goroutine.

            fileName := filepath.Join(screenshotDir, subdomain+"_screenshot.png")
            if err := os.WriteFile(fileName, res, 0644); err != nil {
                log.Printf("Error saving screenshot for %s: %v", subdomain, err)
                return
            }

This block saves the screenshot as a file for each Goroutine. The fileName variable holds the path of the file as a string, which is constructed by joining the screenshotDir variable, the subdomain, and the "_screenshot.png" suffix using the filepath.Join function, which cleans the path according to the OS-specific rules. The os.WriteFile function writes the data to the named file, creating it if necessary, and returns an error value if any. The 0644 argument is a file mode that represents read/write permissions for the owner and read permissions for others. The if statement executes a statement and then tests a condition. The log.Printf function prints a message with a timestamp and the given arguments, and the return statement terminates the execution of the Goroutine.

            log.Printf("Screenshot captured for %s and saved as '%s'", subdomain, fileName)
        }()
    }

This block logs the success of the screenshot task for each Goroutine. The log.Printf function prints a message with a timestamp and the given arguments, using the %s verb to format the values as strings . The () at the end of the function literal invokes it immediately after being evaluated. The for loop ends when there are no more elements in the subdomains slice.

    wg.Wait()
    log.Println("All screenshots captured")
}

This block waits for all the Goroutines to finish and logs the completion of the program. The wg.Wait method blocks until the WaitGroup counter becomes zero. The log.Println function prints a message with a timestamp and a newline. The main function returns and the program exits.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment