-
Notifications
You must be signed in to change notification settings - Fork 0
/
githubBot.py
170 lines (115 loc) · 5.42 KB
/
githubBot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time
import os
import sys
# Initializing options for selenium web driver
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-logging'])
# Give path to you chromedriver.exe here, to use selenium automation
# just put chromedriver.exe in same folder as your script
driver = webdriver.Chrome(executable_path=os.path.join(sys.path[0],'chromedriver.exe'), options=option)
## also can add path like this
# PATH = r'D:\\Code Programmin\\python\\Scraping\\Github-Bot\chromedriver.exe'
# driver = webdriver.Chrome(executable_path = PATH)
# Method used to login once at start of the automation
def login(user_name,pass_word):
# Open github login page
driver.get('https://github.com/login')
# Let the browser load page completely by waiting 3 seconds
time.sleep(2)
# Input username
username = driver.find_element_by_xpath('//*[@id="login_field"]')
username.send_keys(user_name)
# Input password
password = driver.find_element_by_xpath('//*[@id="password"]')
password.send_keys(pass_word)
# Click on sigin button
sigin = driver.find_element_by_xpath('//*[@id="login"]/div[4]/form/div/input[12]')
sigin.click()
time.sleep(1)
## checking for invalid credentials alert box
## if it find alert box it means one of user provided credentials is wrong
ErrorDict = {'error':None, 'message':None}
try:
error = driver.find_element_by_xpath('//*[@id="js-flash-container"]/div/div').text
ErrorDict['error'] = True
ErrorDict['message'] = error
except NoSuchElementException:
ErrorDict['error'] = False
ErrorDict['message'] = None
return ErrorDict
# Method to take repository name to create, description to add, private flag, and readme flag
# added extra parameter(uploading_folder_path) to avoid manually adding folder path in line no: 116
def github_repo( repository_name, uploading_folder_path,descriptions=False,
private=False, readme=False):
github_homepage_url = 'https://github.com/MyTest54/'
# Create new repo.
new_repo = driver.find_element_by_xpath('//*[@id="repos-container"]/h2/a')
new_repo.click()
# Enter Repo. name
repositoryname = driver.find_element_by_xpath('//*[@id="repository_name"]')
repositoryname.send_keys(repository_name)
# Optional
# Enter Description
if descriptions:
description = driver.find_element_by_xpath(
'//*[@id="repository_description"]')
description.send_keys(descriptions)
# Private Mode
if private:
private = driver.find_element_by_xpath(
'//*[@id="repository_visibility_private"]')
private.click()
# Create ReadMe File
if readme:
readme = driver.find_element_by_xpath(
'//*[@id="repository_auto_init"]')
readme.click()
time.sleep(2)
# Create new repo here using above details
create = driver.find_element_by_xpath('//*[@id="new_repository"]/div[4]/button')
create.click();
# Now that our remote repo has been created,
# we need to upload content from our local machine folder to remote repo
# Using OS module, we are executing git commands to initialize local repo, add content,
# do commit and finally push the content to remote repo
print(os.chdir(uploading_folder_path+"\\"+repository_name))
print(os.system('echo "# This repository is Uploaded with GITHUB Bot created by Muzamil Nawaz " >> README.md'))
print(os.system('git init'))
print(os.system('git add .'))
print(os.system('git commit -m \"first commit\"'))
print(os.system('git branch -M main'))
# Here we are converting general repo name into repo specific format ('-' instead of spaces)
print(os.system(f'git remote add origin https://github.com/Muzamil-Nawaz/'+generateRepoName(repository_name)+'.git'))
print(os.system('git push -u origin main'))
print(repository_name+" uploaded successfully.")
# After creating a repo, and uploading content, move again to homepage for creating next one.
driver.get("https://github.com/")
# Wait for homepage to load completely
time.sleep(3)
# Method used for converting general string to github_repo_format_string
def generateRepoName(str):
# Replace all spaces in name with '-'
return str.replace(" ","-")
return str;
# Method to get all project directory names from the given path folder
def main(uploading_folder_path,github_username,github_password):
os.chdir(uploading_folder_path)
dirs = os.listdir()
# Login with username password at start of automation
# and checking error, if error is found the message will be printed
ErrorDict = login(github_username,github_password)
if ErrorDict.get('error'):
print(ErrorDict.get('message'))
return
# Loop through direcotories one by one by creating their remote repos
time.sleep(2)
for dir_name in dirs:
github_repo(dir_name,uploading_folder_path)
if __name__ == '__main__':
# Directory path where your projects are, which you want to upload on Github
uploading_folder_path = 'D:\\Code Programmin\\python\\Scraping\\tttt'
github_username = '[email protected]'
github_password = '@bleomessi'
main(uploading_folder_path,github_username, github_password)