mirror of
https://github.com/hastagAB/Awesome-Python-Scripts.git
synced 2024-11-27 22:11:07 +00:00
c19ba9da50
url_shortener.py skel was created the script has completed README.md description and requirements.txt were added The project was added to README.md
124 lines
3.3 KiB
Python
Executable File
124 lines
3.3 KiB
Python
Executable File
#!/usr/bin/python3
|
|
# Created by Sam Ebison ( https://github.com/ebsa491 )
|
|
# If you have found any important bug or vulnerability,
|
|
# contact me pls, I love learning ( email: ebsa491@gmail.com )
|
|
|
|
"""
|
|
Some urls are really long, you should short them with this script!
|
|
This script uses ``requests`` for sending HTTP requests and
|
|
uses ``BeautifulSoup`` from ``bs4`` for web scraping.
|
|
"""
|
|
|
|
import sys
|
|
import argparse
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
|
|
RED_COLOR = "\033[1;31m"
|
|
GREEN_COLOR = "\033[1;32m"
|
|
NO_COLOR = "\033[0m"
|
|
|
|
API_URL = "https://www.shorturl.at/shortener.php"
|
|
API_PARAM = "u"
|
|
# Creadit => www.shorturl.at
|
|
|
|
class API:
|
|
"""A class for managing the API results."""
|
|
|
|
def __init__(self):
|
|
""" __init__ """
|
|
self.__long_url = ""
|
|
|
|
def set_url(self, url):
|
|
"""This method sets the self.__long_url = url (self.__long_url setter)."""
|
|
self.__long_url = url
|
|
|
|
def get_short_url(self):
|
|
"""This method returns the self.__short_url (self.__short_url getter)."""
|
|
return self.__short_url
|
|
|
|
def request_short_url(self):
|
|
"""This method sends a POST request to the API and returns the result text."""
|
|
|
|
prarams = {API_PARAM: self.__long_url}
|
|
|
|
try:
|
|
result = requests.post(API_URL, data = prarams)
|
|
except ConnectionError as err:
|
|
return -1, err
|
|
|
|
return 1, result.text
|
|
|
|
def extract_data_from_html(self, html_page):
|
|
"""
|
|
This method parses the html text
|
|
and finds the input tag with id=\'shortenurl\' for shorten url.
|
|
"""
|
|
|
|
# Response sample =>
|
|
# <input id="shortenurl" onclick="this.select();" type="text" value="shorturl.at/SOME_CODE"/>
|
|
|
|
soup = BeautifulSoup(html_page, 'html.parser')
|
|
input_tag = soup.find("input", attrs={"id": "shortenurl"})
|
|
|
|
try:
|
|
self.__short_url = input_tag.attrs["value"]
|
|
return 1
|
|
except:
|
|
return -1
|
|
|
|
def main():
|
|
"""The main function of the program."""
|
|
|
|
if args.url == '' or args.url is None:
|
|
args.url = input("Enter the url> ")
|
|
|
|
api_manager = API()
|
|
|
|
api_manager.set_url(args.url)
|
|
response_stauts, result = api_manager.request_short_url() # Sends the request to the API
|
|
|
|
if response_stauts == -1:
|
|
# Can't connect to the API
|
|
|
|
print(f"[{RED_COLOR}-{NO_COLOR}] Error in connecting to the API server...")
|
|
ans = input("Do you want to know the error? [Y/n] ") # For more information about thr error
|
|
if ans.lower() != 'n':
|
|
print(result)
|
|
|
|
sys.exit(1)
|
|
return
|
|
|
|
if api_manager.extract_data_from_html(result) == -1:
|
|
# Can't parse the html_page
|
|
|
|
print(f"[{RED_COLOR}-{NO_COLOR}] Error in parsing the response...")
|
|
sys.exit(1)
|
|
return
|
|
|
|
print("=========================")
|
|
print(GREEN_COLOR + api_manager.get_short_url() + NO_COLOR)
|
|
print("=========================")
|
|
|
|
sys.exit(0)
|
|
return
|
|
|
|
if __name__ == '__main__':
|
|
global args # The program arguments
|
|
|
|
parser = argparse.ArgumentParser(description="URL Shortener")
|
|
|
|
# -u | --url URL
|
|
parser.add_argument(
|
|
'-u',
|
|
'--url',
|
|
metavar='url',
|
|
type=str,
|
|
default='',
|
|
help='the URL'
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
main()
|