From 57e98728eb85c42ab9907b606720e2c90e74f5d8 Mon Sep 17 00:00:00 2001 From: woni <320753691@qq.com> Date: Sun, 4 Feb 2024 19:35:23 +0800 Subject: [PATCH] add crontab task --- .env | 5 + .gitignore | 1 + app/__init__.py | 6 +- app/__pycache__/__init__.cpython-310.pyc | Bin 3154 -> 3749 bytes app/__pycache__/make_celery.cpython-310.pyc | Bin 245 -> 243 bytes app/__pycache__/task.cpython-310.pyc | Bin 845 -> 2370 bytes app/make_celery.py | 7 ++ app/task.py | 15 ++- app/{ => utils}/utils.py | 0 app/utils/yd_utils.py | 100 ++++++++++++++++++++ docker-compose.yaml | 37 +++++++- poetry.lock | 91 +++++++++++++++++- pyproject.toml | 2 + 13 files changed, 259 insertions(+), 5 deletions(-) rename app/{ => utils}/utils.py (100%) create mode 100644 app/utils/yd_utils.py diff --git a/.env b/.env index c2c33a6..850b974 100644 --- a/.env +++ b/.env @@ -17,3 +17,8 @@ TABLE_ID=tblwgGCDCE74Ugv6 # REDIS BROKER_URL=redis://office-xbot-redis RESULT_BACKEND=redis://office-xbot-redis + + +# Yingdao PassWord +XBOT_USERNAME=jxcs@bigdata +XBOT_PASSWORD=320753691love diff --git a/.gitignore b/.gitignore index f7275bb..5c2e673 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ venv/ +*.pyc diff --git a/app/__init__.py b/app/__init__.py index b84647d..b306877 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -15,7 +15,7 @@ from lark_oapi.api.im.v1 import * from lark_oapi.api.bitable.v1 import * from app.task import * -from app.utils import * +from app.utils.utils import * from app.task import * load_dotenv() @@ -106,6 +106,10 @@ def create_app() -> Flask: add.delay(1, 2) return {"test": "ok"} + @app.route("/index", methods=["GET"]) + def index(): + return {"test": "ok"} + return app diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc index 0d08cec9ce7ed10bc4fc1ce24bc1f45575770a3a..8ce99c3f0c525de0c9b6259d00cd27e26d6f7257 100644 GIT binary patch delta 1607 zcmZ7$O-~y~bZ7R%yNfYj25caFG{nRqwF4muQ7KJB5*5<85ms+*LvS?-h1=j8^1~Ya4F%n zwwe-r$6x+J|A-$Y2GFac@$WPuk(k?Y^y7mRNfcA0t(c}#xr?-?rD9*ib#MiJ@L^{I z7c(Fa*T-n4f&7LTpw&m z#YvK+#wsR#q#wL*k^yRfMuYR0$RKE@2zn}IhxlvsBG*5^xVE-3HGkuYy|}u% zNo}A59PwH?R@M*X6TNYul%xZ-hH5H7Gg1u$#Xx1CGEfDmG9v|My(NeTtwADa3)*XH zLqk%~5pdDbh0m{+A02*vKEgqW%_&w;GgX<)~8 z-4)x}2vtH|doR@NYBkC%s81b61OC!Xw}ggcJL}XUCB}cn1JhZJbwR+WhA3^6jzvjK z$E7y2h#lC+5*r7%x4Hbfw@LFm75+D#JDdcS-v`K)+ff{uNWnU4{uCTX%Dbe@-UqXT z0G)n)DZ)SYWar0mP-R=gR~NJ4H4}HCJEB^TzZDY z_Q0sy`Ca7=%J8^)J1O#?r)OypSNO8}?GPJ2v;5EJ9vIg7KWgT1U(1(ZHFp0~3s@yl z>{9?=EI2^~m&8+%3+x`q>|=q>gPwCy2h=F!Cip~m*71HCrfvt+f)&WkxE`#CKbr$D zOn3RHmeX#CcoTeC%imT)8N8xvG;@iLT*wt=Fwf&Hi8Q19CvBuPp}^c__Nh4VnE$E$ zg_8WY*jFgW$MoSVPlUPv=oqobf{&_>!s(VJw$`$?xvPJK9`ILsW=`C`>9csoMc&3E z*Y-D-0Jgy3i^=KIAYz{blSQE(fW>lLpH1;@V-h{&pBO{eqKv{LG#%d3LqbT*WW=@5c9++eA~hf|BbuaTueO?Gp1U zY($)V4-h{vM>^PLA&v@k((a$lWtCkK_K}usuXr9|+uYgaJ`{fqEYIzh%H*^-74=mV zc3~P9dN{M`ku8_bidW??aTFh#){%xy*+eF8f`XNZ?^BXEf#RU;l#@wKH4%QN$vRRH Kew#3RhW`Z+jd6qk delta 976 zcmYjO&rcIU6yDiRx83azpe+UZgSI9VDuzN)IAB3VG(^RNnwTcC*>naeY`e{D!C*`@ z2IECd$VB7813h@?MQQo@6G%2-uvXiV9*K#Gzrd= zt1Wt{?gbO*-QM`~z0a3=sk9L$!6B&>YkNIBg64|7O}UhXIK4kgvrS~bq0;`C@Q_6M zXpV#kTEiqvBD=VB8W_AW{+H_~QT_s@rUvMlro2Dglu88>qUxGV2FVa)Pm>r`fl;77 zP7=VJCFquvOY%eXlE0OU{1^74Bd)sRatrfGoQSm$>jUX6iN)bMp3JXXRhoZb)hc`! zF9z~J9?1X^#FG36PNZ2FA{G(QFCZpB)Sf_s-*68WrbRp~AO+xfs?@fP`?L%}=eWT0 zfGvXA>-@F5fHKak9-9*%Rl;3kJ}wZ2I!_HWjjLmiG=p|?ODvh z`#mt*4-i2?cQ5iH4PnH@OYWQ_TegEYY^%n`fN)gPV4J#S)GKTNVs=e{*gq5Na@=b| zC=&wtb$@+Sg_aXrjf!bI9$MS3FstS$!08p@XyUdh%(TJ3`7_*)hdk`>Hu?g0eU4f- z%Ij1o6~=3U+(1$^=vmyd8&){y*Lad}}N@^Mg$CjJ1j^4nSf diff --git a/app/__pycache__/make_celery.cpython-310.pyc b/app/__pycache__/make_celery.cpython-310.pyc index 5bcde861e517a42fb75edabc25faa1f180f4482c..ab1bbc896209748caa2e941931e081ca1bb77e43 100644 GIT binary patch delta 32 mcmey$_?eMApO=@50SGcKEuY9em(x%`BR@A)zdUc^W+wofEDBEm delta 34 ocmey&_?3}6pO=@50SI2&ubjv|m)lrBBR@A)zdS!LbK*uP0I&ZG82|tP diff --git a/app/__pycache__/task.cpython-310.pyc b/app/__pycache__/task.cpython-310.pyc index d779ea837a22e01f1701d3a21dcfdff1e76e7ce6..8019e29a36cee7dc7957a3c8cf80c20cc18ca8be 100644 GIT binary patch literal 2370 zcmZ`4+iDv}bZ4}?TCGGQ*t5D&zRR*j{OULC_QIn7DTr9c< zjE_Ek%KrlBZ``~*@~}AqGx-%3W-t;N3&THIAh4$qZRHkn1kZAj*|HWa4VwVl3$})> zD1X}E7PDD?l`w}ptN_#H&Z5o6n0LwSk%a=cdIp?x4>Rwu11srtC5EK^9HVILIWr?e3>aP<~{M_Q$|d7o_BwH*2tB zRt!m#z^*iFWDaQD+pS11v$IlGVdc#1S>172WRePMYPiJaA6PN`IW~M0!>lS`m`&q^xe!Ok|Ti zY%aSX8WY+Y54G!@pPEyK@>+1Aev{YbN{2)C#BB-LqY4RcGcM{OQ|^cYV6zh^Qst!I zggW8p0SsGBRR~)sVVSR7aE{c|1o#f7Sb|$W{I>Pej~jQs*nE0V(U7GDI2>HQIe7GN z{ozApX}%P*ZT-)$H=jJ&`2NfFM}KTwzBagW`;aO&Lg_amUVoYF%KGE}D`WvC{%BzN zn=t2LCX=um-N5p$Fa-HQ;zX>D}2VOk@zZ zI)^_&sik;r!j)l zhxSYluC8v~x%}+LrD41V4}O34=<4Qg_XbbC8(h9O`1!`ONB1|^?r!uS@89$6?&{#$ zHygLU8r-|O{`mU(LuWk%kdmqOze?>YK!W!UO2g z(8Um`a!oD;x}=JWB5u_~$pyw-^FRuyyx^V453nOj5q8uhFg*7e8h@M$M0P|78lkO3 zvCja{LSMPil;Ld%V!>Xt7**VEJwt@5VxrZXB2GIav9%rIAXp^c(`Jp5Kwp+}wljjM zLf{8Wyv{i_Zs^(7}@dBZfRN$_)Rm*D46hm_#+NQssR zz39+MI4cpytl$|?c*LYtz`E3<6=K>IA}}f81;xsmtCe)1m3cOa+fbHpnKF)}WO&1N zz#}eJ1U^9mt3;I{Ar7Q6jFRCB(~SVgbs9p?M22v!m|w1u@oQDQ|M z8wJBfxDesirx4phbVA6h>99u{FXz2<%&qG3p4rgZwK*O+2HZ7#9kz$bM7Qsf=_s4Q zzF*==Dj8f!mFyYLkAAs7sxr@VyB{ZmvA5<1k^-)~q0Ci(G(}R`o_vIQ_971!hDAO@ zXi?47b%q>9e<7&2voxb*pwrZhQ)BAMCU{Vh#P1TJBonO@mdRY0I|ChSx+fErEOTOw xrgJhsq{xyxN&i|8=5%7z|GbLl6o&5cB*B|lp8_+|27}9<9=KK$lwxPqf^Tu~U8w*7 diff --git a/app/make_celery.py b/app/make_celery.py index 1878ad2..9f31f72 100644 --- a/app/make_celery.py +++ b/app/make_celery.py @@ -2,3 +2,10 @@ from app import create_app flask_app = create_app() celery_app = flask_app.extensions["celery"] +celery_app.conf.beat_schedule = { + "add-every-30-seconds": { + "task": "app.task.sync_xbot_activity_info", + "schedule": 1800, + } +} +celery_app.conf.timezone = "UTC" diff --git a/app/task.py b/app/task.py index a313178..d693e96 100644 --- a/app/task.py +++ b/app/task.py @@ -6,7 +6,8 @@ from itertools import chain from celery import shared_task from celery import Task -from app.utils import * +from app.utils.utils import * +from app.utils.yd_utils import get_token, get_activity_info @shared_task(ignore_result=False) @@ -88,3 +89,15 @@ def process_message_callback( # 回复群组的消息 content = f'{{"text": "反馈的问题已经记录到多维表格, 稍后有小伙伴跟进"}}' send_group_message(client, message_id, content) + + +@shared_task() +def sync_xbot_activity_info(): + xbot_username = os.environ["XBOT_USERNAME"] + xbot_password = os.environ["XBOT_PASSWORD"] + token = get_token(xbot_username, xbot_password) + office_activity_uuids: list = get_activity_info(token) + for item in office_activity_uuids: + uuid = item.get("uuid") + package_viewName = item.get("packageViewName") + print(uuid, package_viewName) diff --git a/app/utils.py b/app/utils/utils.py similarity index 100% rename from app/utils.py rename to app/utils/utils.py diff --git a/app/utils/yd_utils.py b/app/utils/yd_utils.py new file mode 100644 index 0000000..7c34fb1 --- /dev/null +++ b/app/utils/yd_utils.py @@ -0,0 +1,100 @@ +import os +import requests +import dotenv + +from urllib import parse + + +def get_token(username, password): + """ + 利用网页端获取 token + :param username: 用户名 + :param password: 密码 + :return: token + """ + + url = "https://api.winrobot360.com/oauth/token" + data = { + "username": username, + "password": password, + "grant_type": "password", + "scope": "all", + } + + payload = parse.urlencode(data) + headers = { + "accept": "application/json", + "authorization": "Basic Y29uc29sZTpzVVdpeTZzTmlYZDBlNUxo", + "content-type": "application/x-www-form-urlencoded;charset=UTF-8", + } + response = requests.request("POST", url, headers=headers, data=payload).json() + + if response.get("success") == "false": + raise ValueError(response.get("msg")) + return response.get("access_token") + + +def get_activity_info(token, page=1, size=200): + """ + 获取活动信息列表 + :param token: 认证用的 token + :param page: 分页页码,默认为 1 + :param size: 分页大小,默认为 10 + :return: 所有页的数据列表 + """ + url = "https://api.winrobot360.com/api/v1/robot/activity/package/list" + all_data = [] + while True: + payload = { + "source": "market", + "page": page, + "size": size, + "groupInfoUuid": "22222222-2222-2222-2222-222222222222", + "marketUiTag": "", + "uiaType": "pc", + "order": "desc", + } + headers = { + "Authorization": f"bearer {token}", + "Accept": "application/json", + "Accept-Encoding": "json", + } + response = requests.get(url, headers=headers, params=payload) + response_json = response.json() + if not response.ok or not response_json.get("success"): + raise ValueError(response_json.get("msg")) + data = response_json.get("data") + all_data.extend(data) + if not data or len(data) < size: + break + page += 1 + return all_data + + +def get_activity_detail(token, package_name, package_version): + """ + 获取自定义指令的相关信息 + :param token: token + :param sdk: 自定义指令 + :return: package_name, package_url + """ + + url = f"https://api.winrobot360.com/api/v1/robot/use/activity/package/detail?packageName={package_name}&version={package_version}" + payload = {} + headers = { + "Authorization": f"bearer {token}", + "Accept": "application/json", + "Accept-Encoding": "json", + } + response = requests.request("GET", url, headers=headers, data=payload) + return response.json().get("data") + + +if __name__ == "__main__": + dotenv.load_dotenv() + xbot_username = os.environ["XBOT_USERNAME"] + xbot_password = os.environ["XBOT_PASSWORD"] + token = get_token(xbot_username, xbot_password) + office_activity_uuids: list = get_activity_info(token) + for item in office_activity_uuids: + print(item) diff --git a/docker-compose.yaml b/docker-compose.yaml index 63d5fc9..c23768a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,11 +15,20 @@ services: - TABLE_ID=${TABLE_ID} - BROKER_URL=${BROKER_URL} - RESULT_BACKEND=${RESULT_BACKEND} + - XBOT_USERNAME=${XBOT_USERNAME} + - XBOT_PASSWORD=${XBOT_PASSWORD} + healthcheck: + test: ["CMD", "curl", "-f", "http://office-xbot-app/index"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + start_interval: 5s office-xbot-celery: container_name: office-xbot-celery image: "${APP_IMAGE}" - command: "celery -A app.make_celery worker --loglevel INFO" + command: "celery -A app.make_celery worker -B --loglevel INFO" environment: - APP_ID=${APP_ID} - APP_SECRET=${APP_SECRET} @@ -29,12 +38,38 @@ services: - TABLE_ID=${TABLE_ID} - BROKER_URL=${BROKER_URL} - RESULT_BACKEND=${RESULT_BACKEND} + - XBOT_USERNAME=${XBOT_USERNAME} + - XBOT_PASSWORD=${XBOT_PASSWORD} + healthcheck: + test: ["CMD", "celery", "inspect", "ping"] + interval: 10s + timeout: 10s + retries: 3 + depends_on: + - office-xbot-redis office-xbot-redis: container_name: office-xbot-redis image: redis:latest ports: - "6379:6379" + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 10s + retries: 3 + + office-xbot-flower: + container_name: office-xbot-flower + image: "${APP_IMAGE}" + command: "celery --broker=${BROKER_URL} flower --loglevel INFO" + ports: + - "5555:5555" + depends_on: + office-xbot-celery: + condition: service_healthy + restart: true + networks: office-xbot-network: diff --git a/poetry.lock b/poetry.lock index 26d174e..86979ca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. [[package]] name = "amqp" @@ -308,6 +308,38 @@ Werkzeug = ">=3.0.0" async = ["asgiref (>=3.2)"] dotenv = ["python-dotenv"] +[[package]] +name = "flower" +version = "2.0.1" +description = "Celery Flower" +optional = false +python-versions = ">=3.7" +files = [ + {file = "flower-2.0.1-py2.py3-none-any.whl", hash = "sha256:9db2c621eeefbc844c8dd88be64aef61e84e2deb29b271e02ab2b5b9f01068e2"}, + {file = "flower-2.0.1.tar.gz", hash = "sha256:5ab717b979530770c16afb48b50d2a98d23c3e9fe39851dcf6bc4d01845a02a0"}, +] + +[package.dependencies] +celery = ">=5.0.5" +humanize = "*" +prometheus-client = ">=0.8.0" +pytz = "*" +tornado = ">=5.0.0,<7.0.0" + +[[package]] +name = "humanize" +version = "4.9.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, + {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + [[package]] name = "idna" version = "3.6" @@ -425,6 +457,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -457,6 +499,20 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "prometheus-client" +version = "0.19.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, + {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, +] + +[package.extras] +twisted = ["twisted"] + [[package]] name = "prompt-toolkit" version = "3.0.43" @@ -540,6 +596,17 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + [[package]] name = "redis" version = "5.0.1" @@ -604,6 +671,26 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + [[package]] name = "tzdata" version = "2023.4" @@ -673,4 +760,4 @@ watchdog = ["watchdog (>=2.3)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "52a8819fa1ada0e76b575b691fdc306fdca4671d11b3aa118a6f227a1535cf64" +content-hash = "2e056586ede929b134afce8a0b28ce5189b1ea298f1682472fdfde6e3e88cb79" diff --git a/pyproject.toml b/pyproject.toml index 5e15bfe..e88cabf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,8 @@ python-dotenv = "^1.0.0" lark-oapi = "^1.0.28" celery = "^5.3.6" redis = "^5.0.1" +requests = "^2.31.0" +flower = "^2.0.1" [build-system]