commit 40031043287c1472b7899d62eee4c5b52fac5cb9
Author: quantulr <35954003+quantulr@users.noreply.github.com>
Date: Thu Jan 11 17:26:20 2024 +0800
init
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/get_qrcode.iml b/.idea/get_qrcode.iml
new file mode 100644
index 0000000..d0876a7
--- /dev/null
+++ b/.idea/get_qrcode.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..61efeba
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..9c39cc7
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/get_qrcode/__init__.py b/get_qrcode/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/get_qrcode/__pycache__/__init__.cpython-312.pyc b/get_qrcode/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000..20f1567
Binary files /dev/null and b/get_qrcode/__pycache__/__init__.cpython-312.pyc differ
diff --git a/get_qrcode/__pycache__/main.cpython-312.pyc b/get_qrcode/__pycache__/main.cpython-312.pyc
new file mode 100644
index 0000000..626502a
Binary files /dev/null and b/get_qrcode/__pycache__/main.cpython-312.pyc differ
diff --git a/get_qrcode/main.py b/get_qrcode/main.py
new file mode 100644
index 0000000..69ccf0a
--- /dev/null
+++ b/get_qrcode/main.py
@@ -0,0 +1,65 @@
+import base64
+import json
+import time
+import redis
+from selenium import webdriver
+from selenium.common import NoSuchElementException, NoSuchWindowException
+from selenium.webdriver.common.by import By
+
+
+# from selenium.webdriver.support import expected_conditions
+# from selenium.webdriver.support.wait import WebDriverWait
+
+
+def get_qrcode():
+ driver = webdriver.Chrome()
+ redis_client = redis.StrictRedis(host="localhost", port=6379, db=0)
+ driver.get("http://localhost:3030")
+ json_str_temp = ""
+ while True:
+ try:
+ qrcode_canvas = driver.find_element(By.CLASS_NAME, "qrcode")
+ qrcode_base64 = driver.execute_script("return arguments[0].toDataURL('image/png').substring(22);",
+ qrcode_canvas)
+ qrcode_png = base64.b64decode(qrcode_base64)
+ json_str = json.dumps({"qrcode": qrcode_base64})
+ if json_str != json_str_temp:
+ json_str_temp = json_str
+ redis_client.publish("qrcode", json_str)
+ with open("qrcode.json", "w") as qrcode_json_file:
+ qrcode_json_file.write(json_str)
+ with open("qrcode.png", "wb") as qrcode_png_file:
+ qrcode_png_file.write(qrcode_png)
+ print("二维码文件已更新")
+ except NoSuchElementException:
+ print("二维码不存在")
+ except NoSuchWindowException:
+ print("窗口已关闭")
+ break
+ time.sleep(0.5)
+ driver.quit()
+
+
+def main():
+ get_qrcode()
+ # driver = webdriver.Chrome()
+ # driver.get("http://localhost:3030")
+ # # qrcode_login = driver.find_element(By.ID, "lbApp")
+ # # qrcode_login.click()
+ # # qrcode_canvas = None
+ #
+ # qrcode_canvas = WebDriverWait(driver, 1000 * 60 * 60 * 24).until(
+ # expected_conditions.presence_of_element_located((By.CSS_SELECTOR, ".qrcode"))
+ # )
+ # qrcode_base64 = driver.execute_script("return arguments[0].toDataURL('image/png').substring(22);", qrcode_canvas)
+ #
+ # qrcode_png = base64.b64decode(qrcode_base64)
+ #
+ # with open("qrcode.png", "wb") as qrcode_png_file:
+ # qrcode_png_file.write(qrcode_png)
+ # # time.sleep(8)
+ # driver.quit()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/get_qrcode/qrcode.json b/get_qrcode/qrcode.json
new file mode 100644
index 0000000..5f141e2
--- /dev/null
+++ b/get_qrcode/qrcode.json
@@ -0,0 +1 @@
+{"qrcode": "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"}
\ No newline at end of file
diff --git a/get_qrcode/qrcode.png b/get_qrcode/qrcode.png
new file mode 100644
index 0000000..ec6885f
Binary files /dev/null and b/get_qrcode/qrcode.png differ
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..6f60cfa
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,400 @@
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+
+[[package]]
+name = "attrs"
+version = "23.2.0"
+description = "Classes Without Boilerplate"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"},
+ {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"},
+]
+
+[package.extras]
+cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
+dev = ["attrs[tests]", "pre-commit"]
+docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
+tests = ["attrs[tests-no-zope]", "zope-interface"]
+tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
+tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
+
+[[package]]
+name = "certifi"
+version = "2023.11.17"
+description = "Python package for providing Mozilla's CA Bundle."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"},
+ {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"},
+]
+
+[[package]]
+name = "cffi"
+version = "1.16.0"
+description = "Foreign Function Interface for Python calling C code."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"},
+ {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"},
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"},
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"},
+ {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"},
+ {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"},
+ {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"},
+ {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"},
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"},
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"},
+ {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"},
+ {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"},
+ {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"},
+ {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"},
+ {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"},
+ {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"},
+ {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"},
+ {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"},
+ {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"},
+ {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"},
+ {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"},
+ {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"},
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"},
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"},
+ {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"},
+ {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"},
+ {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"},
+]
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+name = "charset-normalizer"
+version = "3.3.2"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+optional = false
+python-versions = ">=3.7.0"
+files = [
+ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"},
+ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
+ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
+]
+
+[[package]]
+name = "idna"
+version = "3.6"
+description = "Internationalized Domain Names in Applications (IDNA)"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
+ {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+]
+
+[[package]]
+name = "outcome"
+version = "1.3.0.post0"
+description = "Capture the outcome of Python function calls."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"},
+ {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"},
+]
+
+[package.dependencies]
+attrs = ">=19.2.0"
+
+[[package]]
+name = "pycparser"
+version = "2.21"
+description = "C parser in Python"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
+ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
+]
+
+[[package]]
+name = "pysocks"
+version = "1.7.1"
+description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information."
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"},
+ {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"},
+ {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"},
+]
+
+[[package]]
+name = "redis"
+version = "5.0.1"
+description = "Python client for Redis database and key-value store"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f"},
+ {file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"},
+]
+
+[package.extras]
+hiredis = ["hiredis (>=1.0.0)"]
+ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"]
+
+[[package]]
+name = "requests"
+version = "2.31.0"
+description = "Python HTTP for Humans."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
+ {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
+]
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = ">=2,<4"
+idna = ">=2.5,<4"
+urllib3 = ">=1.21.1,<3"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+
+[[package]]
+name = "selenium"
+version = "4.16.0"
+description = ""
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "selenium-4.16.0-py3-none-any.whl", hash = "sha256:aec71f4e6ed6cb3ec25c9c1b5ed56ae31b6da0a7f17474c7566d303f84e6219f"},
+ {file = "selenium-4.16.0.tar.gz", hash = "sha256:b2e987a445306151f7be0e6dfe2aa72a479c2ac6a91b9d5ef2d6dd4e49ad0435"},
+]
+
+[package.dependencies]
+certifi = ">=2021.10.8"
+trio = ">=0.17,<1.0"
+trio-websocket = ">=0.9,<1.0"
+urllib3 = {version = ">=1.26,<3", extras = ["socks"]}
+
+[[package]]
+name = "sniffio"
+version = "1.3.0"
+description = "Sniff out which async library your code is running under"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
+ {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
+]
+
+[[package]]
+name = "sortedcontainers"
+version = "2.4.0"
+description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
+optional = false
+python-versions = "*"
+files = [
+ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"},
+ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"},
+]
+
+[[package]]
+name = "trio"
+version = "0.24.0"
+description = "A friendly Python library for async concurrency and I/O"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "trio-0.24.0-py3-none-any.whl", hash = "sha256:c3bd3a4e3e3025cd9a2241eae75637c43fe0b9e88b4c97b9161a55b9e54cd72c"},
+ {file = "trio-0.24.0.tar.gz", hash = "sha256:ffa09a74a6bf81b84f8613909fb0beaee84757450183a7a2e0b47b455c0cac5d"},
+]
+
+[package.dependencies]
+attrs = ">=20.1.0"
+cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""}
+idna = "*"
+outcome = "*"
+sniffio = ">=1.3.0"
+sortedcontainers = "*"
+
+[[package]]
+name = "trio-websocket"
+version = "0.11.1"
+description = "WebSocket library for Trio"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"},
+ {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"},
+]
+
+[package.dependencies]
+trio = ">=0.11"
+wsproto = ">=0.14"
+
+[[package]]
+name = "urllib3"
+version = "2.1.0"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"},
+ {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"},
+]
+
+[package.dependencies]
+pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""}
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["zstandard (>=0.18.0)"]
+
+[[package]]
+name = "wsproto"
+version = "1.2.0"
+description = "WebSockets state-machine based protocol implementation"
+optional = false
+python-versions = ">=3.7.0"
+files = [
+ {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"},
+ {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"},
+]
+
+[package.dependencies]
+h11 = ">=0.9.0,<1"
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.12"
+content-hash = "7ae25f005588c3e5cd3636a04dd108acd630da76d38e622c90f5fe02c2b2c847"
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..f2b840e
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,20 @@
+[tool.poetry]
+name = "get-qrcode"
+version = "0.1.0"
+description = ""
+authors = ["quantulr <35954003+quantulr@users.noreply.github.com>"]
+readme = "README.md"
+
+[tool.poetry.dependencies]
+python = "^3.12"
+selenium = "^4.16.0"
+requests = "^2.31.0"
+redis = "^5.0.1"
+
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
+
+[tool.poetry.scripts]
+dev = "get_qrcode.main:main"
diff --git a/qrcode.json b/qrcode.json
new file mode 100644
index 0000000..7e5dcf5
--- /dev/null
+++ b/qrcode.json
@@ -0,0 +1 @@
+{"qrcode": "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"}
\ No newline at end of file
diff --git a/qrcode.png b/qrcode.png
new file mode 100644
index 0000000..00286ec
Binary files /dev/null and b/qrcode.png differ
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29