main.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/env python
  2. from flask import Flask, render_template, request, redirect
  3. import requests
  4. from datetime import datetime, timezone
  5. import html
  6. import re
  7. import json
  8. import sys
  9. from bs4 import BeautifulSoup
  10. ERRROR_MESSAGE = 'Uh oh, could not connect to urban dictionary api'
  11. DEFINE = "https://urbandictionary.com/define.php?term="
  12. AUTHOR = "https://urbandictionary.com/author.php?author="
  13. RANDOM = "https://urbandictionary.com/random.php"
  14. HOME = "https://urbandictionary.com/"
  15. def scrape(url, arg=None):
  16. if arg == None:
  17. data = requests.get(url)
  18. else:
  19. data = requests.get(f"{url}{arg}")
  20. if data.status_code == 200:
  21. our_path = re.sub(r".*://.*/", "/", request.url)
  22. path = re.sub(r".*://.*/", "/", data.url)
  23. if our_path != path:
  24. return f"REDIRECT {path}"
  25. ret = []
  26. soup = BeautifulSoup(data.text, "html.parser")
  27. for div in soup.find_all("div"):
  28. defid = div.get('data-defid')
  29. if defid != None:
  30. definition = soup.find(attrs={"data-defid": [defid]})
  31. word = definition.select("div div h1 a, div div h2 a")[0].text
  32. meaning = definition.find(attrs={"class" : ["break-words meaning mb-4"]}).decode_contents()
  33. example = definition.find(attrs={"class" : ["break-words example italic mb-4"]}).decode_contents()
  34. contributor = definition.find(attrs={"class" : ["contributor font-bold"]})
  35. ret.append([defid, word, meaning, example, contributor])
  36. pages = soup.find(attrs={"class" : ["pagination text-xl text-center"]})
  37. if pages == None:
  38. pages = ""
  39. return (ret, pages)
  40. else:
  41. return f"Couldn't get data from the API\n{data.status_code}"
  42. def render(data):
  43. return render_template('index.html', data=data)
  44. app = Flask(__name__, template_folder="templates", static_folder="static")
  45. @app.route('/')
  46. def home():
  47. scraped = scrape(HOME + {True: f"?page={request.args.get('page')}", False: ""} [request.args.get('page') != None])
  48. if type(scraped) == str and scraped.startswith("REDIRECT"):
  49. return redirect(scraped.replace("REDIRECT ", ""), 302)
  50. return render(scraped)
  51. @app.route('/define.php')
  52. def define():
  53. if request.args.get('term') != None:
  54. scraped = scrape(DEFINE + request.args.get('term') + {True: f"&page={request.args.get('page')}", False: ""} [request.args.get('page') != None])
  55. if type(scraped) == str and scraped.startswith("REDIRECT"):
  56. return redirect(scraped.replace("REDIRECT ", ""), 302)
  57. else:
  58. return redirect("/", 302)
  59. return render(scraped)
  60. @app.route('/author.php')
  61. def author():
  62. if request.args.get('author') != None:
  63. scraped = scrape(AUTHOR + request.args.get('author') + {True: f"&page={request.args.get('page')}", False: ""} [request.args.get('page') != None])
  64. if type(scraped) == str and scraped.startswith("REDIRECT"):
  65. return redirect(scraped.replace("REDIRECT ", ""), 302)
  66. else:
  67. return redirect("/", 302)
  68. scraped = (scraped[0], str(scraped[1]).replace("»", "»").replace("›", "›").replace("«", "«").replace("‹", "‹"))
  69. return render(scraped)
  70. @app.route('/random.php')
  71. def random():
  72. scraped = scrape(RANDOM)
  73. if type(scraped) == str and scraped.startswith("REDIRECT"):
  74. return redirect(scraped.replace("REDIRECT ", ""), 302)
  75. return render(scraped)
  76. if __name__ == '__main__':
  77. app.run(port=8000)