#!/usr/bin/env python from flask import Flask, render_template, request, redirect import requests from datetime import datetime, timezone import html import re import json import sys from bs4 import BeautifulSoup ERRROR_MESSAGE = 'Uh oh, could not connect to urban dictionary api' DEFINE = "https://urbandictionary.com/define.php?term=" AUTHOR = "https://urbandictionary.com/author.php?author=" RANDOM = "https://urbandictionary.com/random.php" HOME = "https://urbandictionary.com/" def scrape(url, arg=None): if arg == None: data = requests.get(url) else: data = requests.get(f"{url}{arg}") if data.status_code == 200: our_path = re.sub(r".*://.*/", "/", request.url) path = re.sub(r".*://.*/", "/", data.url) if our_path != path: return f"REDIRECT {path}" ret = [] soup = BeautifulSoup(data.text, "html.parser") for div in soup.find_all("div"): defid = div.get('data-defid') if defid != None: definition = soup.find(attrs={"data-defid": [defid]}) word = definition.select("div div h1 a, div div h2 a")[0].text meaning = definition.find(attrs={"class" : ["break-words meaning mb-4"]}).decode_contents() example = definition.find(attrs={"class" : ["break-words example italic mb-4"]}).decode_contents() contributor = definition.find(attrs={"class" : ["contributor font-bold"]}) ret.append([defid, word, meaning, example, contributor]) pages = soup.find(attrs={"class" : ["pagination text-xl text-center"]}) if pages == None: pages = "" return (ret, pages) else: return f"Couldn't get data from the API\n{data.status_code}" def render(data): return render_template('index.html', data=data) app = Flask(__name__, template_folder="templates", static_folder="static") @app.route('/') def home(): scraped = scrape(HOME + {True: f"?page={request.args.get('page')}", False: ""} [request.args.get('page') != None]) if type(scraped) == str and scraped.startswith("REDIRECT"): return redirect(scraped.replace("REDIRECT ", ""), 302) return render(scraped) @app.route('/define.php') def define(): if request.args.get('term') != None: scraped = scrape(DEFINE + request.args.get('term') + {True: f"&page={request.args.get('page')}", False: ""} [request.args.get('page') != None]) if type(scraped) == str and scraped.startswith("REDIRECT"): return redirect(scraped.replace("REDIRECT ", ""), 302) else: return redirect("/", 302) return render(scraped) @app.route('/author.php') def author(): if request.args.get('author') != None: scraped = scrape(AUTHOR + request.args.get('author') + {True: f"&page={request.args.get('page')}", False: ""} [request.args.get('page') != None]) if type(scraped) == str and scraped.startswith("REDIRECT"): return redirect(scraped.replace("REDIRECT ", ""), 302) else: return redirect("/", 302) scraped = (scraped[0], str(scraped[1]).replace("»", "»").replace("›", "›").replace("«", "«").replace("‹", "‹")) return render(scraped) @app.route('/random.php') def random(): scraped = scrape(RANDOM) if type(scraped) == str and scraped.startswith("REDIRECT"): return redirect(scraped.replace("REDIRECT ", ""), 302) return render(scraped) if __name__ == '__main__': app.run(port=8000)