functions.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from PIL import Image, ImageDraw, ImageFont, ImageFilter
  2. from random import randint
  3. import speedtest
  4. import aiohttp
  5. def generate_captcha():
  6. # Generate one letter
  7. def gen_letter():
  8. return chr(randint(65, 90))
  9. def rndColor():
  10. return (randint(64, 255), randint(64, 255), randint(64, 255))
  11. def rndColor2():
  12. return (randint(32, 127), randint(32, 127), randint(32, 127))
  13. # Generate a 4 letter word
  14. def gen_wrong_answer():
  15. word = ""
  16. for _ in range(4):
  17. word += gen_letter()
  18. return word
  19. # Generate 8 wrong captcha answers
  20. wrong_answers = []
  21. for _ in range(8):
  22. wrong_answers.append(gen_wrong_answer())
  23. width = 80 * 4
  24. height = 100
  25. correct_answer = ""
  26. font = ImageFont.truetype("assets/arial.ttf", 55)
  27. file = f"assets/{randint(1000, 9999)}.jpg"
  28. image = Image.new('RGB', (width, height), (255, 255, 255))
  29. draw = ImageDraw.Draw(image)
  30. # Draw random points on image
  31. for x in range(width):
  32. for y in range(height):
  33. draw.point((x, y), fill=rndColor())
  34. for t in range(4):
  35. letter = gen_letter()
  36. correct_answer += letter
  37. draw.text(
  38. (60 * t + 50, 15),
  39. letter,
  40. font=font,
  41. fill=rndColor2()
  42. )
  43. image = image.filter(ImageFilter.BLUR)
  44. image.save(file, 'jpeg')
  45. return [file, correct_answer, wrong_answers]
  46. async def test_speedtest():
  47. def speed_convert(size):
  48. power = 2 ** 10
  49. zero = 0
  50. units = {0: "", 1: "Kb/s", 2: "Mb/s", 3: "Gb/s", 4: "Tb/s"}
  51. while size > power:
  52. size /= power
  53. zero += 1
  54. return f"{round(size, 2)} {units[zero]}"
  55. speed = speedtest.Speedtest()
  56. info = speed.get_best_server()
  57. download = speed.download()
  58. upload = speed.upload()
  59. return [speed_convert(download), speed_convert(upload), info]
  60. async def file_size_from_url(url: str) -> int:
  61. async with aiohttp.ClientSession() as session:
  62. async with session.get(url) as resp:
  63. size = int(resp.headers['content-length'])
  64. return size