Last active
February 27, 2024 20:23
-
-
Save iamshreeram/228cf01c2e501cf8243a9fab77c99ce9 to your computer and use it in GitHub Desktop.
checking github username availability
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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