mirror of
https://github.com/bellingcat/octosuite.git
synced 2026-06-12 21:38:34 +03:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
77ddfa4b02 | ||
|
|
66192c2a63 | ||
|
|
f591764343 | ||
|
|
f6dbd8ec49 | ||
|
|
99deaf04f3 | ||
|
|
56eead2f26 | ||
|
|
73e7c339e6 | ||
|
|
3cd6442d91 | ||
|
|
7ebb90790a | ||
|
|
ca0d2dc268 | ||
|
|
51babb3c45 | ||
|
|
12e9dbcae9 | ||
|
|
be4e88d99b | ||
|
|
f7ac0fb8d5 | ||
|
|
fc7a65c593 | ||
|
|
51f2a46c65 | ||
|
|
4afbc5adaa |
1
.logs/.log
Normal file
1
.logs/.log
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
95
README.md
95
README.md
@@ -1,14 +1,22 @@
|
|||||||
|

|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
> *Simply gather OSINT on Github users & organizations like a God🔥*
|
> *Simply gather OSINT on Github users & organizations like a God🔥*
|
||||||
|
|
||||||
|
# INSTALLATION
|
||||||
|
Installation instructions are on the wiki, in addition to all other documentation.
|
||||||
|
|
||||||
|
[Refer to the Wiki](https://github.com/rly0nheart/octosuite/wiki)
|
||||||
|
|
||||||
|
***
|
||||||
# FEATURES
|
# FEATURES
|
||||||
- [x] Fetches organization info
|
- [x] Fetches organization info
|
||||||
- [x] Fetches user info
|
- [x] Fetches user info
|
||||||
@@ -28,77 +36,7 @@
|
|||||||
- [x] Automatically logs network activity (.logs folder)
|
- [x] Automatically logs network activity (.logs folder)
|
||||||
- [x] User can view, read and delete log files
|
- [x] User can view, read and delete log files
|
||||||
|
|
||||||
# INSTALLATION
|
***
|
||||||
## Clone from Github
|
|
||||||
|
|
||||||
```
|
|
||||||
git clone https://github.com/rly0nheart/octosuite.git
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
cd octosuite
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Install from PyPI
|
|
||||||
```
|
|
||||||
pip install octosuite
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
# GITHUB FORK USAGE
|
|
||||||
## Linux
|
|
||||||
```
|
|
||||||
sudo chmod +x octosuite
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo ./octosuite
|
|
||||||
```
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
```
|
|
||||||
python3 octosuite
|
|
||||||
```
|
|
||||||
|
|
||||||
## Mac
|
|
||||||
```
|
|
||||||
python3 octosuite
|
|
||||||
```
|
|
||||||
|
|
||||||
# PYPI PACKAGE USAGE
|
|
||||||
## Linux
|
|
||||||
```
|
|
||||||
octosuite
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
```
|
|
||||||
octosuite
|
|
||||||
```
|
|
||||||
|
|
||||||
## Mac
|
|
||||||
```
|
|
||||||
octosuite
|
|
||||||
```
|
|
||||||
|
|
||||||
# AVAILABLE COMMANDS
|
# AVAILABLE COMMANDS
|
||||||
| COMMAND | DESCRIPTION|
|
| COMMAND | DESCRIPTION|
|
||||||
| ------------- |:---------:|
|
| ------------- |:---------:|
|
||||||
@@ -125,19 +63,28 @@ octosuite
|
|||||||
| ``help`` | *show usage/help* |
|
| ``help`` | *show usage/help* |
|
||||||
| ``exit`` | *exit session* |
|
| ``exit`` | *exit session* |
|
||||||
|
|
||||||
|
***
|
||||||
# NOTE
|
# NOTES
|
||||||
* *octosuite automatically logs network and minor user activity. The logs are saved by date and time in .logs folder*
|
* *octosuite automatically logs network and minor user activity. The logs are saved by date and time in .logs folder*
|
||||||
* *Although octosuite was developed to work on **Mac**, **Windows**, or any **Linux** *Distribution*, it has only been tested on **Termux** *and* **Kali Linux***
|
* *Although octosuite was developed to work on **Mac**, **Windows**, or any **Linux** *Distribution*, it has only been tested on **Termux** *and* **Kali Linux***
|
||||||
* *If you believe octosuite can be better, feel free to open a pull request with your improvements* ✌🏾🙂
|
* *If you believe octosuite can be better, feel free to open a pull request with your improvements* ✌🏾🙂
|
||||||
|
|
||||||
|
***
|
||||||
# PYPI
|
# PYPI
|
||||||
[PyPI Package](https://pypi.org/project/octosuite)
|
[PyPI Package](https://pypi.org/project/octosuite)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
***
|
||||||
# LICENSE
|
# LICENSE
|
||||||

|

|
||||||
|
|
||||||
|
***
|
||||||
# ABOUT DEVELOPER
|
# ABOUT DEVELOPER
|
||||||
[About.me](https://about.me/rly0nheart)
|
[About.me](https://about.me/rly0nheart)
|
||||||
|
|
||||||
|
***
|
||||||
|
# DONATIONS
|
||||||
|
Love octosuite? Please consider buying me a coffee, I will appreciate really it. ☕👌🏾😊
|
||||||
|
|
||||||
|
<a href="https://www.buymeacoffee.com/189381184" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
|
||||||
|
|||||||
@@ -1,23 +1,25 @@
|
|||||||
import os
|
import os
|
||||||
from lib.colors import red,white,white_bg,red_bg,reset
|
from lib.colors import red, white, green, red_bg,reset
|
||||||
|
|
||||||
|
version = 'v1.9.0'
|
||||||
banner = f'''{red}
|
banner = f'''{red}
|
||||||
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
|
▒█████ ▄████▄ ▄▄▄█████▓ ▒█████ ██████ █ ██ ██▓▄▄▄█████▓▓█████
|
||||||
▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀
|
▒██▒ ██▒▒██▀ ▀█ ▓ ██▒ ▓▒▒██▒ ██▒▒██ ▒ ██ ▓██▒▓██▒▓ ██▒ ▓▒▓█ ▀
|
||||||
▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███
|
▒██░ ██▒▒▓█ ▄ ▒ ▓██░ ▒░▒██░ ██▒░ ▓██▄ ▓██ ▒██░▒██▒▒ ▓██░ ▒░▒███
|
||||||
▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄
|
▒██ ██░▒▓▓▄ ▄██▒░ ▓██▓ ░ ▒██ ██░ ▒ ██▒▓▓█ ░██░░██░░ ▓██▓ ░ ▒▓█ ▄
|
||||||
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
|
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
|
||||||
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
|
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
|
||||||
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
|
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
|
||||||
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg}v1.7.0-dev{reset}{red}
|
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ {red_bg} {version} {reset}{red}
|
||||||
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
||||||
░ {white}— Advanced Github {red}OSINT{white} Framework{reset}
|
░ {white}— Advanced Github {red}OSINT{white} Framework{reset}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> {white}Current user: {white_bg}{os.getlogin()}{reset}
|
> {white}Current user: {green}{os.getlogin()}{reset}
|
||||||
> {white}Use {white_bg}help{reset}{white} command for usage{reset}
|
> {white}Use {green}help{reset}{white} command for usage{reset}
|
||||||
> {white}Commands are {white_bg}case sensitive{reset}
|
> {white}Commands are case sensitive{reset}
|
||||||
{'-'*30}
|
{'-'*27}
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|||||||
@@ -10,28 +10,42 @@ if machine.lower().startswith(("os", "win", "darwin","ios")):
|
|||||||
colors = False
|
colors = False
|
||||||
|
|
||||||
if not colors:
|
if not colors:
|
||||||
reset = red = white = green = green_bg = white_bg = red_bg = ""
|
reset = red = white = green = red_bg = ""
|
||||||
|
|
||||||
else:
|
else:
|
||||||
date_time = datetime.now()
|
date_time = datetime.now()
|
||||||
print(f"\n\t OCTOSUITE © 2022 Richard Mwewa\n\t{date_time.strftime('%A %d %B %Y, %H:%M:%S%p')}\n\n\nOS: {platform.system()}\nProcessor: {platform.processor()}\nNode: {platform.node()}\nRelease: {platform.release()}\nArchitecture: {platform.architecture()}\nVersion: {platform.version()}\n\n")
|
sys_info = [("Processor",platform.processor),
|
||||||
|
("Node", platform.node),
|
||||||
|
("Release", platform.release),
|
||||||
|
("Architecture", platform.architecture),
|
||||||
|
("Version", platform.version)]
|
||||||
|
|
||||||
|
banner = f"""
|
||||||
|
OCTOSUITE © 2022 Richard Mwewa
|
||||||
|
{date_time.strftime('%A %d %B %Y, %H:%M:%S%p')}
|
||||||
|
|
||||||
|
|
||||||
|
{platform.system()}"""
|
||||||
|
|
||||||
|
print(banner)
|
||||||
|
for key, value in sys_info:
|
||||||
|
print(f"\t├─ {key}: {value()}")
|
||||||
|
print("\n")
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? (y/n) ")
|
color_chooser = input(f"[ ? ] Welcome {os.getlogin()}, would you like to enable colors for this session? (y/n) ")
|
||||||
if color_chooser.lower() == "y":
|
if color_chooser.lower() == "y":
|
||||||
white = "\033[97m"
|
white = "\033[97m"
|
||||||
white_bg = "\033[47;30m"
|
|
||||||
red = "\033[91m"
|
red = "\033[91m"
|
||||||
reset = "\033[0m"
|
reset = "\033[0m"
|
||||||
green = "\033[92m"
|
green = "\033[92m"
|
||||||
green_bg = "\033[42;37m"
|
|
||||||
red_bg = "\033[41;37m"
|
red_bg = "\033[41;37m"
|
||||||
break
|
break
|
||||||
elif color_chooser.lower() == "n":
|
elif color_chooser.lower() == "n":
|
||||||
red = white = green = green_bg = white_bg = red_bg = reset = ""
|
red = white = green = red_bg = reset = ""
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print(f"\n[ ! ] Your response ({color_chooser}) is invalid (expected y or n)")
|
print(f"\n[ ! ] Your response ({color_chooser}) is invalid (expected y or n)")
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
exit(f"[ ! ] Process interrupted with Ctrl+C")
|
exit(f"[ ! ] Process interrupted with (Ctrl+C)")
|
||||||
|
|||||||
@@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
from src.main import *
|
from src.main import *
|
||||||
from lib.colors import red,red_bg,white,reset
|
from lib.colors import red,white,reset
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
octosuite().on_start()
|
octosuite().on_start()
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
logging.warning('Process interrupted with Ctrl+C')
|
logging.warning('Session terminated with (Ctrl+C)')
|
||||||
exit(f'\n{white}[{red} x {white}] Process interrupted with {red_bg}Ctrl+C{reset}')
|
exit(f'\n{white}[{red} x {white}] Session terminated with ({red}Ctrl{white}+{red}C{reset}{white}).{reset}')
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f'Session terminated on error: {e}')
|
logging.error(f'Session terminated on error: {e}')
|
||||||
exit(f'\n{white}[{red} ! {white}] Session {red_bg}terminated{reset}{white} on error: {red}{e}{reset}')
|
exit(f'\n{white}[{red} ! {white}] Session terminated on error: {red}{e}{reset}')
|
||||||
|
|||||||
95
src/main.py
95
src/main.py
@@ -21,9 +21,9 @@ import platform
|
|||||||
import subprocess
|
import subprocess
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from lib.banner import banner
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from lib.colors import red, white, green, green_bg, white_bg, red_bg, reset
|
from lib.banner import banner, version
|
||||||
|
from lib.colors import red, white, green, red_bg, reset
|
||||||
|
|
||||||
class octosuite:
|
class octosuite:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -200,7 +200,8 @@ class octosuite:
|
|||||||
# Author dictionary
|
# Author dictionary
|
||||||
self.author_dict = {'Alias': 'rly0nheart',
|
self.author_dict = {'Alias': 'rly0nheart',
|
||||||
'Country': 'Zambia, Africa',
|
'Country': 'Zambia, Africa',
|
||||||
'About.me': 'https://about.me/rly0nheart'}
|
'About.me': 'https://about.me/rly0nheart',
|
||||||
|
'BuyMeACoffee': 'https://buymeacoffee.com/189381184'}
|
||||||
|
|
||||||
|
|
||||||
def on_start(self):
|
def on_start(self):
|
||||||
@@ -225,15 +226,15 @@ class octosuite:
|
|||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
input(f'\n{white}[{green} ? {white}] Press {white_bg}any key{reset}{white} to continue{reset} ')
|
input(f'\n{white}[{green} ? {white}] Press any key to continue{reset} ')
|
||||||
|
|
||||||
# Fetching organization info
|
# Fetching organization info
|
||||||
def org_info(self):
|
def org_info(self):
|
||||||
organization = input(f'\n{white}[{white_bg}@Organization{reset}{white}] (username){reset} ')
|
organization = input(f'\n{white}--> @{green}organization{white} (username){reset} ')
|
||||||
api = f'https://api.github.com/orgs/{organization}'
|
api = f'https://api.github.com/orgs/{organization}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{white}[{red}-{white}] Organization @{organization} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] Organization ({organization}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
print(f"\n{white}{response['name']}{reset}")
|
print(f"\n{white}{response['name']}{reset}")
|
||||||
@@ -243,11 +244,11 @@ class octosuite:
|
|||||||
|
|
||||||
# Fetching user information
|
# Fetching user information
|
||||||
def user_profile(self):
|
def user_profile(self):
|
||||||
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
|
username = input(f'\n{white}--> @{green}username{reset} ')
|
||||||
api = f'https://api.github.com/users/{username}'
|
api = f'https://api.github.com/users/{username}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
print(f"\n{white}{response['name']}{reset}")
|
print(f"\n{white}{response['name']}{reset}")
|
||||||
@@ -257,12 +258,12 @@ class octosuite:
|
|||||||
|
|
||||||
# Fetching repository information
|
# Fetching repository information
|
||||||
def repo_info(self):
|
def repo_info(self):
|
||||||
repo_name = input(f'\n{white}[{white_bg}%reponame{reset}{white}]{reset} ')
|
repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
|
||||||
username = input(f'{white}[{white_bg}@Owner{reset}{white}] (username){reset} ')
|
username = input(f'{white}--> @{green}owner{white} (username){reset} ')
|
||||||
api = f'https://api.github.com/repos/{username}/{repo_name}'
|
api = f'https://api.github.com/repos/{username}/{repo_name}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{white}[{red} - {white}] Repository %{repo_name} or user @{username} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] Repository ({repo_name}) or user ({username}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
print(f"\n{white}{response['full_name']}{reset}")
|
print(f"\n{white}{response['full_name']}{reset}")
|
||||||
@@ -272,13 +273,13 @@ class octosuite:
|
|||||||
|
|
||||||
# Get path contents
|
# Get path contents
|
||||||
def path_contents(self):
|
def path_contents(self):
|
||||||
repo_name = input(f'\n{white}[{white_bg}%reponame{reset}{white}]{reset} ')
|
repo_name = input(f'\n{white}--> %{green}reponame{reset} ')
|
||||||
username = input(f'{white}[{white_bg}@Owner{reset}{white}] (username){reset} ')
|
username = input(f'{white}--> @{green}owner{white} (username){reset} ')
|
||||||
path_name = input(f'{white}[{white_bg}/path/name{reset}{white}]{reset} ')
|
path_name = input(f'{white}--> ~{green}/path/name{reset} ')
|
||||||
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
|
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{white}[{red} - {white}] Information {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] Information not found.{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
for item in response:
|
for item in response:
|
||||||
@@ -289,11 +290,11 @@ class octosuite:
|
|||||||
|
|
||||||
# Fetching organization repositories
|
# Fetching organization repositories
|
||||||
def org_repos(self):
|
def org_repos(self):
|
||||||
organization = input(f'\n{white}[{white_bg}@Organization{reset}{white}] (username){reset} ')
|
organization = input(f'\n{white}--> @{green}organization{white} (username){reset} ')
|
||||||
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
|
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{white}[{red} - {white}] Organization @{organization} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] Organization ({organization}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
for repo in response:
|
for repo in response:
|
||||||
@@ -305,11 +306,11 @@ class octosuite:
|
|||||||
|
|
||||||
# Fetching user repositories
|
# Fetching user repositories
|
||||||
def user_repos(self):
|
def user_repos(self):
|
||||||
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
|
username = input(f'\n{white}--> @{green}username{reset} ')
|
||||||
api = f'https://api.github.com/users/{username}/repos?per_page=100'
|
api = f'https://api.github.com/users/{username}/repos?per_page=100'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
for repo in response:
|
for repo in response:
|
||||||
@@ -321,13 +322,13 @@ class octosuite:
|
|||||||
|
|
||||||
# Fetching user's gists
|
# Fetching user's gists
|
||||||
def user_gists(self):
|
def user_gists(self):
|
||||||
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
|
username = input(f'\n{white}--> @{green}username{reset} ')
|
||||||
api = f'https://api.github.com/users/{username}/gists'
|
api = f'https://api.github.com/users/{username}/gists'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
if response == []:
|
if response == []:
|
||||||
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}does not{reset}{white} have any active gists.{reset}')
|
print(f'\n{white}[{red} - {white}] User ({username}) does not have any active gists.{reset}')
|
||||||
elif "Not Found" in response['message']:
|
elif "not found" in response['message']:
|
||||||
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
for item in response:
|
for item in response:
|
||||||
print(f"\n{white}{item['id']}{reset}")
|
print(f"\n{white}{item['id']}{reset}")
|
||||||
@@ -338,13 +339,13 @@ class octosuite:
|
|||||||
|
|
||||||
# Fetching user's followera'
|
# Fetching user's followera'
|
||||||
def followers(self):
|
def followers(self):
|
||||||
username = input(f'\n{white}[{white_bg}@Username{reset}{white}]{reset} ')
|
username = input(f'\n{white}--> @{green}username{reset} ')
|
||||||
api = f'https://api.github.com/users/{username}/followers?per_page=100'
|
api = f'https://api.github.com/users/{username}/followers?per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
if response == []:
|
if response == []:
|
||||||
print(f'\n{white}[{red} - {white}]User @{username} {red_bg}does not{reset}{white} have followers.{reset}')
|
print(f'\n{white}[{red} - {white}]User ({username}) does not have followers.{reset}')
|
||||||
elif "Not Found" in response['message']:
|
elif "not found" in response['message']:
|
||||||
print(f'\n{white}[{red} - {white}] User @{username} {red_bg}Not Found{reset}')
|
print(f'\n{white}[{red} - {white}] User ({username}) not found.{reset}')
|
||||||
else:
|
else:
|
||||||
for item in response:
|
for item in response:
|
||||||
print(f"\n{white}@{item['login']}{reset}")
|
print(f"\n{white}@{item['login']}{reset}")
|
||||||
@@ -355,19 +356,19 @@ class octosuite:
|
|||||||
|
|
||||||
# Checking whether or not user[A] follows user[B]
|
# Checking whether or not user[A] follows user[B]
|
||||||
def following(self):
|
def following(self):
|
||||||
user_a = input(f'\n{white}[{white_bg}@User A{reset}{white}] (username){reset} ')
|
user_a = input(f'\n{white}--> @{green}user{white}[A] (username){reset} ')
|
||||||
user_b = input(f'{white}[{white_bg}@User B{reset}{white}] (username){reset} ')
|
user_b = input(f'{white}--> @{green}user{white}[B] (username){reset} ')
|
||||||
api = f'https://api.github.com/users/{user_a}/following/{user_b}'
|
api = f'https://api.github.com/users/{user_a}/following/{user_b}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code == 204:
|
if response.status_code == 204:
|
||||||
print(f'\n{white}[{green} + {white}] @{user_a} {green_bg}follows{reset}{white} @{user_b}.{reset}')
|
print(f'\n{white}[{green} + {white}] @{user_a} follows @{user_b}.{reset}')
|
||||||
else:
|
else:
|
||||||
print(f'\n{white}[{red} - {white}] @{user_a} {red_bg}does not{reset}{white} follow @{user_b}.{reset}')
|
print(f'\n{white}[{red} - {white}] @{user_a} does not follow @{user_b}.{reset}')
|
||||||
|
|
||||||
|
|
||||||
# User search
|
# User search
|
||||||
def user_search(self):
|
def user_search(self):
|
||||||
query = input(f'\n{white}[{white_bg}#@Query{reset}{white}]{reset} ')
|
query = input(f'\n{white}--> @{green}query{white} (eg. john){reset} ')
|
||||||
api = f'https://api.github.com/search/users?q={query}&per_page=100'
|
api = f'https://api.github.com/search/users?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
@@ -379,7 +380,7 @@ class octosuite:
|
|||||||
|
|
||||||
# Repository search
|
# Repository search
|
||||||
def repo_search(self):
|
def repo_search(self):
|
||||||
query = input(f'\n{white}[{white_bg}#%Query{reset}{white}]{reset} ')
|
query = input(f'\n{white}--> %{green}query{white} (eg. git){reset} ')
|
||||||
api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
|
api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
@@ -391,7 +392,7 @@ class octosuite:
|
|||||||
|
|
||||||
# Topics search
|
# Topics search
|
||||||
def topic_search(self):
|
def topic_search(self):
|
||||||
query = input(f'\n{white}[{white_bg}##Query{reset}{white}]{reset} ')
|
query = input(f'\n{white}--> #{green}query{white} (eg. osint){reset} ')
|
||||||
api = f'https://api.github.com/search/topics?q={query}&per_page=100'
|
api = f'https://api.github.com/search/topics?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
@@ -403,7 +404,7 @@ class octosuite:
|
|||||||
|
|
||||||
# Issue search
|
# Issue search
|
||||||
def issue_search(self):
|
def issue_search(self):
|
||||||
query = input(f'\n{white}[{white_bg}#!Query{reset}{white}]{reset} ')
|
query = input(f'\n{white}--> !{green}query{white} (eg. error){reset} ')
|
||||||
api = f'https://api.github.com/search/issues?q={query}&per_page=100'
|
api = f'https://api.github.com/search/issues?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
@@ -415,13 +416,13 @@ class octosuite:
|
|||||||
|
|
||||||
# Commits search
|
# Commits search
|
||||||
def commits_search(self):
|
def commits_search(self):
|
||||||
query = input(f'\n{white}[{white_bg}#:Query{reset}{white}]{reset} ')
|
query = input(f'\n{white}--> :{green}query{white} (eg. filename:index.php){reset} ')
|
||||||
api = f'https://api.github.com/search/commits?q={query}&per_page=100'
|
api = f'https://api.github.com/search/commits?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
number=0
|
number=0
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
number+=1
|
number+=1
|
||||||
print(f'{white}{number}.{reset}')
|
print(f'\n{white}-> {number}.{reset}')
|
||||||
pprint(item['commit'])
|
pprint(item['commit'])
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
@@ -437,7 +438,7 @@ class octosuite:
|
|||||||
|
|
||||||
# Delete a specified log file
|
# Delete a specified log file
|
||||||
def delete_log(self):
|
def delete_log(self):
|
||||||
log_file = input(f"\n{white}[{white_bg}logfile{reset}{white}]{reset} ")
|
log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
|
||||||
if sys.platform.lower().startswith(('win','darwin')):
|
if sys.platform.lower().startswith(('win','darwin')):
|
||||||
subprocess.run(['del',f'{os.getcwd()}/.logs/{log_file}'])
|
subprocess.run(['del',f'{os.getcwd()}/.logs/{log_file}'])
|
||||||
else:
|
else:
|
||||||
@@ -449,7 +450,7 @@ class octosuite:
|
|||||||
|
|
||||||
# Read a specified log file
|
# Read a specified log file
|
||||||
def read_log(self):
|
def read_log(self):
|
||||||
log_file = input(f"\n{white}[{white_bg}logfile{reset}{white}]{reset} ")
|
log_file = input(f"\n{white}--> logfile (eg. 2022-04-27 10:09:36.068312.log){reset} ")
|
||||||
with open(f'.logs/{log_file}', 'r') as log:
|
with open(f'.logs/{log_file}', 'r') as log:
|
||||||
logging.info(f'Reading log file: {log_file}')
|
logging.info(f'Reading log file: {log_file}')
|
||||||
print("\n"+log.read())
|
print("\n"+log.read())
|
||||||
@@ -466,7 +467,7 @@ class octosuite:
|
|||||||
code.close()
|
code.close()
|
||||||
|
|
||||||
logging.info('Update complete.')
|
logging.info('Update complete.')
|
||||||
exit(f'{white}[{green} + {white}] {green_bg}Updated{reset}{white} successfully. Re-run octosuite.{reset}')
|
exit(f'{white}[{green} + {white}] Update complete. Re-run octosuite.{reset}')
|
||||||
|
|
||||||
|
|
||||||
# Show changelog
|
# Show changelog
|
||||||
@@ -474,13 +475,9 @@ class octosuite:
|
|||||||
# lol yes the changelog is hard coded
|
# lol yes the changelog is hard coded
|
||||||
changelog_text = f'''
|
changelog_text = f'''
|
||||||
|
|
||||||
{red_bg}v1.7.0-dev [CHANGELOG] {reset}
|
{red_bg} {version} [CHANGELOG] {reset}
|
||||||
• Changed (y/n) behavior in color chooser (where any input apart from 'y' was considered as 'n')
|
• Minor bug fixes and improvements
|
||||||
• Added 'logs:view' command for viewing octosuite logs
|
{red_bg} {reset}'''
|
||||||
• Added 'logs:read' command for reading a specified log file
|
|
||||||
• Added 'logs:delete' command for deleting a specified log file
|
|
||||||
• Minor improvements
|
|
||||||
{red_bg} {reset}'''
|
|
||||||
print(changelog_text)
|
print(changelog_text)
|
||||||
|
|
||||||
|
|
||||||
@@ -493,8 +490,8 @@ class octosuite:
|
|||||||
|
|
||||||
# Close session
|
# Close session
|
||||||
def exit_session(self):
|
def exit_session(self):
|
||||||
logging.info('Session closed with \'exit\' command.')
|
logging.info('Session closed with (exit) command.')
|
||||||
exit(f'\n{white}[{green} ! {white}] Session closed with {white_bg}exit{reset}{white} command.{reset}')
|
exit(f'\n{white}[{green} ! {white}] Session closed with ({green}exit{reset}{white}) command.{reset}')
|
||||||
|
|
||||||
|
|
||||||
# Help/usage
|
# Help/usage
|
||||||
|
|||||||
Reference in New Issue
Block a user