Skip to content

Instantly share code, notes, and snippets.

@iamshreeram
Last active February 27, 2024 20:23
Show Gist options
  • Save iamshreeram/228cf01c2e501cf8243a9fab77c99ce9 to your computer and use it in GitHub Desktop.
Save iamshreeram/228cf01c2e501cf8243a9fab77c99ce9 to your computer and use it in GitHub Desktop.
checking github username availability
from logging import Logger
import requests
import time
import datetime
import random
from multiprocessing import Process, Lock
# proxy server details comes from
# https://github.com/themiralay/Proxy-List-World
# https://github.com/vakhov/fresh-proxy-list
# https://github.com/Zaeem20/FREE_PROXIES_LIST
# https://github.com/im-razvan/proxy_list
mutex = Lock()
max_concurrency = 50
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64 x6 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarypY0ZR04TrrTRUxDC',
'Accept': '*/*',
'Origin': 'https://github.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Accept-Language': 'en-US,en;q=0.9'
}
proxies_list = open("proxies.txt", "r").read().strip().split("\n")
unchecked = set(proxies_list[0:50])
working = set()
not_working = set()
def reset_proxy(proxy):
unchecked.add(proxy)
working.discard(proxy)
not_working.discard(proxy)
def set_working(proxy):
unchecked.discard(proxy)
working.add(proxy)
not_working.discard(proxy)
def set_not_working(proxy):
unchecked.discard(proxy)
working.discard(proxy)
not_working.add(proxy)
def get_random_proxy():
available_proxies = tuple(unchecked.union(working))
if not available_proxies:
raise Exception("no proxies available")
return random.choice(available_proxies)
def checkUsername(username, ct):
proxy = get_random_proxy()
# print("Proxy: ", proxy)
s = requests.Session()
try:
r = s.get("http://github.com/" + username, headers=headers, proxies={'http': f"http://{proxy}"}, timeout=10) # removing this from proxy - , 'https': f"https://{proxy}";Changing github from https://github to http://github.com -> to make sure, the request.session communicates via http
if r.status_code == 404:
set_working(proxy)
return "Username Available", proxy
elif r.status_code == 200:
set_working(proxy)
return "Username Unavailable", proxy
elif r.status_code == 429:
set_not_working(proxy)
print(str(ct) + " | " + proxy + " | Too Many Requests - need to sleep")
time.sleep(10)
checkUsername(username, ct)
return None, None
else:
set_not_working(proxy)
print(str(ct) + " | " + proxy + " | Unknown error")
checkUsername(username, ct)
return None, None
except Exception as e:
checkUsername(username, ct)
set_not_working(proxy)
raise e
# slow processing - if the proxy list is not hygine; if the list of proxies dont have any issues, this is best way to check
def check_username_with_lock(word, lock, ct):
# with lock:
resp, proxy = checkUsername(word, ct)
if resp != None:
with open('username_status.txt', 'a') as status_file:
status_file.write(f"{ct} | {proxy} | {resp} : {word}\n")
else:
print(f"{ct} | {proxy} | Error Occured : {word}\n")
if __name__ == "__main__":
with open('perm-dyn-digit-out.txt') as f:
content = f.readlines()
content = [x.strip() for x in content]
processes = []
for word in content:
ct = datetime.datetime.now()
if len(processes) == max_concurrency:
for p in processes:
p.join()
processes = []
p = Process(target=check_username_with_lock, args=(word, mutex, ct))
p.start()
processes.append(p)
# time.sleep(10)
for p in processes:
p.join()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment