├── README.md ├── TheBot.py └── super_follower.py /README.md: -------------------------------------------------------------------------------- 1 | # GitHub-Bot 2 | Hi 👋 I am a GitHub 🤖 3 | 4 | - Requirements: 5 | `python3.6+` 6 | 7 | - Python Packages: 8 | `requests` 9 | 10 | - How to run? 11 | `Add your GitHub Token` 12 | `Give a name to start with` 13 | 14 | ## #BotsMatterToo 15 | -------------------------------------------------------------------------------- /TheBot.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import random 3 | import requests 4 | import json 5 | 6 | ## Configurations 7 | logging.basicConfig(level=logging.WARNING, \ 8 | filename='GitHubBOT.log', filemode='a', format='%(name)s - %(levelname)s - %(message)s') 9 | 10 | ## GLOBALS 11 | TOKEN = "YOUR TOKEN HERE | SCOPE OF TOKEN SHOULD BE REPOS + FORK + YOUR_CHOICE" 12 | #STARTING_USERNAME = '1UC1F3R616' # Example: torvalds 13 | 14 | 15 | ## Fetching User Followers 16 | def all_followers(username): 17 | followers = requests.get('https://api.github.com/users/{}/followers'.format(username), \ 18 | headers={'Authorization': 'token {}'.format(TOKEN)}) 19 | followers = followers.text 20 | followers = json.loads(followers) 21 | 22 | followers_list = [] 23 | for user in followers: 24 | followers_list.append(user.get('login')) 25 | logging.debug(str(followers_list)) # DEBUG 26 | return followers_list 27 | 28 | ## Get all Repos 29 | def all_repos(username): 30 | repos = requests.get('https://api.github.com/users/{}/repos'.format(username), \ 31 | headers={'Authorization': 'token {}'.format(TOKEN)}) 32 | repos = repos.text 33 | repos = json.loads(repos) 34 | 35 | repos_list = [] 36 | for repo in repos: 37 | repos_list.append(repo.get('full_name')) 38 | logging.debug(str(repos_list)) # DEBUG 39 | return repos_list 40 | 41 | 42 | ## Follow A User 43 | def follow_user(username): 44 | try: 45 | # If it's self then don't go deep 46 | if (username == 'D-E-F-E-A-T'): # Replace with self username 47 | logging.info('[-] {} is Already Followed'.format(username)) # INFO 48 | print('[-] {} is Already Followed'.format(username)) 49 | return 404 50 | 51 | # Check if Already Followed 52 | followed = requests.get('https://api.github.com/user/following/{}'.format(username), \ 53 | headers={'Authorization': 'token {}'.format(TOKEN)}) 54 | 55 | if followed.status_code == 204: 56 | logging.info('[-] {} is Already Followed'.format(username)) # INFO 57 | print('[-] {} is Already Followed'.format(username)) 58 | return 404 59 | 60 | r = requests.put('https://api.github.com/user/following/{}'.format(username), \ 61 | headers={'Authorization': 'token {}'.format(TOKEN)}) 62 | if(r.status_code == 204): # 204 is OK 63 | print('Followed {}'.format(username)) 64 | logging.info('Followed {}'.format(username)) # INFO 65 | else: 66 | logging.warning("! {}: Failed to Follow {}".format(str(r.status_code), username)) # WARNING 67 | print("! {}: Failed to Follow {}".format(str(r.status_code), username)) 68 | return 200 69 | except: 70 | logging.error('! Error in Following {}'.format(follow_user)) #ERROR 71 | print('! Error in Following {}'.format(follow_user)) 72 | return 200 73 | 74 | ## Fork a Repo 75 | def fork_repo(repo_name): 76 | try: 77 | # No fork for self 78 | if (repo_name.split('/')[0] == 'D-E-F-E-A-T'): # replace with self username 79 | return 80 | 81 | # Check if Already Forked -- Since users are filltered so it's OK :/ 82 | # Saving API and code because it will cost 1 request any way if we are checking using get 83 | 84 | r = requests.post('https://api.github.com/repos/{}/forks'.format(repo_name), \ 85 | headers={'Authorization': 'token {}'.format(TOKEN)}) 86 | if (r.status_code == 202): # 202 is OK 87 | logging.info('Forked {}'.format(repo_name)) # INFO 88 | print('Forked {}'.format(repo_name)) 89 | else: 90 | logging.warning("! {}: Fork Failed for {}".format(str(r.status_code), repo_name)) # WARNING 91 | print("! {}: Fork Failed for {}".format(str(r.status_code), repo_name)) 92 | except: 93 | logging.error('! Error in Forking {}'.format(repo_name)) #ERROR 94 | print('! Error in Forking {}'.format(repo_name)) 95 | 96 | ## Star a Repo | Getting 404, not a scope issue 97 | def star_repo(repo_name): 98 | r = requests.post('https://api.github.com/user/starred/{}'.format(repo_name), \ 99 | headers={'Authorization': 'token {}'.format(TOKEN)}) 100 | print(r.status_code) 101 | 102 | 103 | def run(username): 104 | 105 | # Follow a Random Person 106 | followers = all_followers(username) 107 | followers_copy = list(followers) 108 | followers_len = len(followers) 109 | if followers_len!=0: # Let it be Wild / Follow less than Half a users 110 | while(followers_len > 0): 111 | index = (len(followers_copy)-1)%(random.choice((1, 1000))) # Random Selection of Person 112 | if follow_user(followers_copy.pop(index)) == 404: # Remove any person already followed 113 | followers.pop(index) 114 | followers_len -= 1 115 | followers_len -= random.choice((1, 10)) # Decrease this to go Wild 116 | del followers_copy 117 | 118 | repos = [] 119 | for person in range(len(followers)%8): # Let it be full for wild | Forking repos from only 8 users 120 | repos += all_repos(followers[person]) # Don't use append without iteration 121 | repos_copy = list(repos) 122 | repos_length = len(repos) 123 | 124 | # Fork a random Repo 125 | if repos_length!=0: # Let it be Wild / Fork less than Half a repos 126 | while(repos_length > 0): 127 | fork_repo(repos_copy.pop()) 128 | repos_length -= random.choice((1, 30)) # Increase this number to make fork lesser 129 | 130 | del repos 131 | del repos_copy 132 | 133 | # Depth == 10 134 | for x in range(10): 135 | try: 136 | run(followers.pop()) 137 | except: 138 | print('No More Followers') 139 | 140 | run('manikandanraji') 141 | 142 | 143 | -------------------------------------------------------------------------------- /super_follower.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import random 3 | import requests 4 | import json 5 | 6 | """ 7 | Deprecating forking as that causes github to allocate me new memory which I 8 | don't want them to. So from now on Following only. 9 | """ 10 | 11 | ## Configurations 12 | logging.basicConfig(level=logging.WARNING, \ 13 | filename='GitHubBOT.log', filemode='a', format='%(name)s - %(levelname)s - %(message)s') 14 | 15 | ## GLOBALS 16 | TOKEN = "YOUR TOKEN HERE | SCOPE OF TOKEN SHOULD BE REPOS + FORK + YOUR_CHOICE" 17 | 18 | 19 | ## Fetching User Followers 20 | def all_followers(username): 21 | followers = requests.get('https://api.github.com/users/{}/followers'.format(username), \ 22 | headers={'Authorization': 'token {}'.format(TOKEN)}) 23 | followers = followers.text 24 | followers = json.loads(followers) 25 | 26 | followers_list = [] 27 | for user in followers: 28 | followers_list.append(user.get('login')) 29 | logging.debug(str(followers_list)) # DEBUG 30 | return followers_list 31 | 32 | ## Get all Repos 33 | def all_repos(username): 34 | repos = requests.get('https://api.github.com/users/{}/repos'.format(username), \ 35 | headers={'Authorization': 'token {}'.format(TOKEN)}) 36 | repos = repos.text 37 | repos = json.loads(repos) 38 | 39 | repos_list = [] 40 | for repo in repos: 41 | repos_list.append(repo.get('full_name')) 42 | logging.debug(str(repos_list)) # DEBUG 43 | return repos_list 44 | 45 | 46 | ## Follow A User 47 | def follow_user(username): 48 | try: 49 | # If it's self then don't go deep 50 | if (username == 'D-E-F-E-A-T'): # Replace with self username 51 | logging.info('[-] {} is Already Followed'.format(username)) # INFO 52 | print('[-] {} is Already Followed'.format(username)) 53 | return 404 54 | 55 | # Check if Already Followed 56 | followed = requests.get('https://api.github.com/user/following/{}'.format(username), \ 57 | headers={'Authorization': 'token {}'.format(TOKEN)}) 58 | 59 | if followed.status_code == 204: 60 | logging.info('[-] {} is Already Followed'.format(username)) # INFO 61 | print('[-] {} is Already Followed'.format(username)) 62 | return 404 63 | 64 | r = requests.put('https://api.github.com/user/following/{}'.format(username), \ 65 | headers={'Authorization': 'token {}'.format(TOKEN)}) 66 | if(r.status_code == 204): # 204 is OK 67 | print('Followed {}'.format(username)) 68 | logging.info('Followed {}'.format(username)) # INFO 69 | else: 70 | logging.warning("! {}: Failed to Follow {}".format(str(r.status_code), username)) # WARNING 71 | print("! {}: Failed to Follow {}".format(str(r.status_code), username)) 72 | return 200 73 | except: 74 | logging.error('! Error in Following {}'.format(follow_user)) #ERROR 75 | print('! Error in Following {}'.format(follow_user)) 76 | return 200 77 | 78 | 79 | 80 | 81 | def run(username): 82 | 83 | # Follow a Random Person 84 | followers = all_followers(username) 85 | followers_len = len(followers) 86 | if followers_len!=0: # Let it be Wild / Follow less than Half a users 87 | while(followers_len > 0): 88 | #index = (len(followers)-1)%(random.choice((1, 1000))) # Random Selection of Person 89 | index = followers_len - 1 # Sequential Selection of Person 90 | if follow_user(followers[index]) == 404: # Remove any person already followed 91 | followers.pop(index) 92 | followers_len -= 1 93 | followers_len -= random.choice((1, 1)) # Decrease this to go Wild 94 | 95 | 96 | try: 97 | run(followers.pop()) 98 | except: 99 | print('No More Followers') 100 | 101 | run('kautukkundan') 102 | 103 | 104 | --------------------------------------------------------------------------------