commit 17fda3ca36d51b50400148c178f7f35025bd9f1a Author: xtaodada Date: Sun Nov 3 14:13:14 2024 +0800 first commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..64b9cb8 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +DEBUG=false +DOMAIN= +HOST=0.0.0.0 +PORT=8888 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b6caf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,162 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8bba3c8 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# GeetestBypass + +**本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。** + +**本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。** + +**本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。** + +九宫格、图标点选成功率均接近100%(1000次测试全部成功) + +# 协议 + +本项目遵循 AGPL-3.0 协议开源,请遵守相关协议。 + +# 鸣谢 + +[taskmgr818/MihoyoBBS-gt-server](https://github.com/taskmgr818/MihoyoBBS-gt-server) 提供 nine 相关 + +[Amorter/biliTicker_gt](https://github.com/Amorter/biliTicker_gt) 提供 clik 相关 diff --git a/main.py b/main.py new file mode 100644 index 0000000..12a5376 --- /dev/null +++ b/main.py @@ -0,0 +1,16 @@ +from persica.context.application import ApplicationContext +from persica.applicationbuilder import ApplicationBuilder + + +def main(): + app = ( + ApplicationBuilder() + .set_application_context_class(ApplicationContext) + .set_scanner_packages(["src.core", "src.route"]) + .build() + ) + app.run() + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..f3d0fd7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[project] +name = "GeetestBypass" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "bili-ticket-gt-python>=0.2.7", + "cryptography>=43.0.3", + "fastapi>=0.115.4", + "httpx>=0.27.2", + "numpy>=2.1.3", + "onnxruntime>=1.20.0", + "persica>=0.1.0a4", + "pillow>=11.0.0", + "pydantic>=2.9.2", + "python-dotenv>=1.0.1", + "python-multipart>=0.0.16", + "starlette>=0.41.2", + "uvicorn>=0.32.0", +] + +[tool.uv] +index-url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7eae77d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,37 @@ +# This file was autogenerated by uv via the following command: +# uv export -o requirements.txt --no-hashes +annotated-types==0.7.0 +anyio==4.6.2.post1 +bili-ticket-gt-python==0.2.7 +certifi==2024.8.30 +cffi==1.17.1 ; platform_python_implementation != 'PyPy' +click==8.1.7 +colorama==0.4.6 ; platform_system == 'Windows' +coloredlogs==15.0.1 +cryptography==43.0.3 +fastapi==0.115.4 +flatbuffers==24.3.25 +h11==0.14.0 +httpcore==1.0.6 +httpx==0.27.2 +humanfriendly==10.0 +idna==3.10 +mpmath==1.3.0 +networkx==3.4.2 +numpy==2.1.3 +onnxruntime==1.20.0 +packaging==24.1 +persica==0.1.0a4 +pillow==11.0.0 +protobuf==5.28.3 +pycparser==2.22 ; platform_python_implementation != 'PyPy' +pydantic==2.9.2 +pydantic-core==2.23.4 +pyreadline3==3.5.4 ; sys_platform == 'win32' +python-dotenv==1.0.1 +python-multipart==0.0.17 +sniffio==1.3.1 +starlette==0.41.2 +sympy==1.13.3 +typing-extensions==4.12.2 +uvicorn==0.32.0 diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/__init__.py b/src/assets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/icon/0.jpg b/src/assets/icon/0.jpg new file mode 100644 index 0000000..e755b0e Binary files /dev/null and b/src/assets/icon/0.jpg differ diff --git a/src/assets/icon/1.jpg b/src/assets/icon/1.jpg new file mode 100644 index 0000000..4e181ee Binary files /dev/null and b/src/assets/icon/1.jpg differ diff --git a/src/assets/icon/10.jpg b/src/assets/icon/10.jpg new file mode 100644 index 0000000..89c65c7 Binary files /dev/null and b/src/assets/icon/10.jpg differ diff --git a/src/assets/icon/11.jpg b/src/assets/icon/11.jpg new file mode 100644 index 0000000..339f0c6 Binary files /dev/null and b/src/assets/icon/11.jpg differ diff --git a/src/assets/icon/12.jpg b/src/assets/icon/12.jpg new file mode 100644 index 0000000..f8c043a Binary files /dev/null and b/src/assets/icon/12.jpg differ diff --git a/src/assets/icon/13.jpg b/src/assets/icon/13.jpg new file mode 100644 index 0000000..341d80a Binary files /dev/null and b/src/assets/icon/13.jpg differ diff --git a/src/assets/icon/14.jpg b/src/assets/icon/14.jpg new file mode 100644 index 0000000..3e4db9d Binary files /dev/null and b/src/assets/icon/14.jpg differ diff --git a/src/assets/icon/15.jpg b/src/assets/icon/15.jpg new file mode 100644 index 0000000..ae4cd69 Binary files /dev/null and b/src/assets/icon/15.jpg differ diff --git a/src/assets/icon/16.jpg b/src/assets/icon/16.jpg new file mode 100644 index 0000000..cdff577 Binary files /dev/null and b/src/assets/icon/16.jpg differ diff --git a/src/assets/icon/17.jpg b/src/assets/icon/17.jpg new file mode 100644 index 0000000..97fe064 Binary files /dev/null and b/src/assets/icon/17.jpg differ diff --git a/src/assets/icon/18.jpg b/src/assets/icon/18.jpg new file mode 100644 index 0000000..f3acb8b Binary files /dev/null and b/src/assets/icon/18.jpg differ diff --git a/src/assets/icon/19.jpg b/src/assets/icon/19.jpg new file mode 100644 index 0000000..7462ef8 Binary files /dev/null and b/src/assets/icon/19.jpg differ diff --git a/src/assets/icon/2.jpg b/src/assets/icon/2.jpg new file mode 100644 index 0000000..b023b0b Binary files /dev/null and b/src/assets/icon/2.jpg differ diff --git a/src/assets/icon/20.jpg b/src/assets/icon/20.jpg new file mode 100644 index 0000000..ed14571 Binary files /dev/null and b/src/assets/icon/20.jpg differ diff --git a/src/assets/icon/21.jpg b/src/assets/icon/21.jpg new file mode 100644 index 0000000..902b33b Binary files /dev/null and b/src/assets/icon/21.jpg differ diff --git a/src/assets/icon/22.jpg b/src/assets/icon/22.jpg new file mode 100644 index 0000000..ed4a9ce Binary files /dev/null and b/src/assets/icon/22.jpg differ diff --git a/src/assets/icon/23.jpg b/src/assets/icon/23.jpg new file mode 100644 index 0000000..11b718a Binary files /dev/null and b/src/assets/icon/23.jpg differ diff --git a/src/assets/icon/24.jpg b/src/assets/icon/24.jpg new file mode 100644 index 0000000..123bd14 Binary files /dev/null and b/src/assets/icon/24.jpg differ diff --git a/src/assets/icon/25.jpg b/src/assets/icon/25.jpg new file mode 100644 index 0000000..9607a26 Binary files /dev/null and b/src/assets/icon/25.jpg differ diff --git a/src/assets/icon/26.jpg b/src/assets/icon/26.jpg new file mode 100644 index 0000000..cd23315 Binary files /dev/null and b/src/assets/icon/26.jpg differ diff --git a/src/assets/icon/27.jpg b/src/assets/icon/27.jpg new file mode 100644 index 0000000..2296375 Binary files /dev/null and b/src/assets/icon/27.jpg differ diff --git a/src/assets/icon/28.jpg b/src/assets/icon/28.jpg new file mode 100644 index 0000000..42b3aa9 Binary files /dev/null and b/src/assets/icon/28.jpg differ diff --git a/src/assets/icon/29.jpg b/src/assets/icon/29.jpg new file mode 100644 index 0000000..33f6a40 Binary files /dev/null and b/src/assets/icon/29.jpg differ diff --git a/src/assets/icon/3.jpg b/src/assets/icon/3.jpg new file mode 100644 index 0000000..f8d8ed0 Binary files /dev/null and b/src/assets/icon/3.jpg differ diff --git a/src/assets/icon/30.jpg b/src/assets/icon/30.jpg new file mode 100644 index 0000000..14b5486 Binary files /dev/null and b/src/assets/icon/30.jpg differ diff --git a/src/assets/icon/31.jpg b/src/assets/icon/31.jpg new file mode 100644 index 0000000..2299109 Binary files /dev/null and b/src/assets/icon/31.jpg differ diff --git a/src/assets/icon/32.jpg b/src/assets/icon/32.jpg new file mode 100644 index 0000000..3f06996 Binary files /dev/null and b/src/assets/icon/32.jpg differ diff --git a/src/assets/icon/33.jpg b/src/assets/icon/33.jpg new file mode 100644 index 0000000..57fc7b7 Binary files /dev/null and b/src/assets/icon/33.jpg differ diff --git a/src/assets/icon/34.jpg b/src/assets/icon/34.jpg new file mode 100644 index 0000000..5c3a344 Binary files /dev/null and b/src/assets/icon/34.jpg differ diff --git a/src/assets/icon/35.jpg b/src/assets/icon/35.jpg new file mode 100644 index 0000000..9a4e006 Binary files /dev/null and b/src/assets/icon/35.jpg differ diff --git a/src/assets/icon/36.jpg b/src/assets/icon/36.jpg new file mode 100644 index 0000000..8b61c8c Binary files /dev/null and b/src/assets/icon/36.jpg differ diff --git a/src/assets/icon/37.jpg b/src/assets/icon/37.jpg new file mode 100644 index 0000000..a5e5408 Binary files /dev/null and b/src/assets/icon/37.jpg differ diff --git a/src/assets/icon/38.jpg b/src/assets/icon/38.jpg new file mode 100644 index 0000000..55aa3e4 Binary files /dev/null and b/src/assets/icon/38.jpg differ diff --git a/src/assets/icon/39.jpg b/src/assets/icon/39.jpg new file mode 100644 index 0000000..92f80eb Binary files /dev/null and b/src/assets/icon/39.jpg differ diff --git a/src/assets/icon/4.jpg b/src/assets/icon/4.jpg new file mode 100644 index 0000000..66e1e68 Binary files /dev/null and b/src/assets/icon/4.jpg differ diff --git a/src/assets/icon/40.jpg b/src/assets/icon/40.jpg new file mode 100644 index 0000000..71772b3 Binary files /dev/null and b/src/assets/icon/40.jpg differ diff --git a/src/assets/icon/41.jpg b/src/assets/icon/41.jpg new file mode 100644 index 0000000..02134a3 Binary files /dev/null and b/src/assets/icon/41.jpg differ diff --git a/src/assets/icon/42.jpg b/src/assets/icon/42.jpg new file mode 100644 index 0000000..1eb8799 Binary files /dev/null and b/src/assets/icon/42.jpg differ diff --git a/src/assets/icon/43.jpg b/src/assets/icon/43.jpg new file mode 100644 index 0000000..5780f52 Binary files /dev/null and b/src/assets/icon/43.jpg differ diff --git a/src/assets/icon/44.jpg b/src/assets/icon/44.jpg new file mode 100644 index 0000000..c6e1d26 Binary files /dev/null and b/src/assets/icon/44.jpg differ diff --git a/src/assets/icon/45.jpg b/src/assets/icon/45.jpg new file mode 100644 index 0000000..2bea75f Binary files /dev/null and b/src/assets/icon/45.jpg differ diff --git a/src/assets/icon/46.jpg b/src/assets/icon/46.jpg new file mode 100644 index 0000000..db94981 Binary files /dev/null and b/src/assets/icon/46.jpg differ diff --git a/src/assets/icon/47.jpg b/src/assets/icon/47.jpg new file mode 100644 index 0000000..b60f42e Binary files /dev/null and b/src/assets/icon/47.jpg differ diff --git a/src/assets/icon/48.jpg b/src/assets/icon/48.jpg new file mode 100644 index 0000000..3cbf075 Binary files /dev/null and b/src/assets/icon/48.jpg differ diff --git a/src/assets/icon/49.jpg b/src/assets/icon/49.jpg new file mode 100644 index 0000000..84a059b Binary files /dev/null and b/src/assets/icon/49.jpg differ diff --git a/src/assets/icon/5.jpg b/src/assets/icon/5.jpg new file mode 100644 index 0000000..86add46 Binary files /dev/null and b/src/assets/icon/5.jpg differ diff --git a/src/assets/icon/50.jpg b/src/assets/icon/50.jpg new file mode 100644 index 0000000..c880368 Binary files /dev/null and b/src/assets/icon/50.jpg differ diff --git a/src/assets/icon/51.jpg b/src/assets/icon/51.jpg new file mode 100644 index 0000000..d23d3fa Binary files /dev/null and b/src/assets/icon/51.jpg differ diff --git a/src/assets/icon/52.jpg b/src/assets/icon/52.jpg new file mode 100644 index 0000000..116bc97 Binary files /dev/null and b/src/assets/icon/52.jpg differ diff --git a/src/assets/icon/53.jpg b/src/assets/icon/53.jpg new file mode 100644 index 0000000..c1d6ff3 Binary files /dev/null and b/src/assets/icon/53.jpg differ diff --git a/src/assets/icon/54.jpg b/src/assets/icon/54.jpg new file mode 100644 index 0000000..415cfce Binary files /dev/null and b/src/assets/icon/54.jpg differ diff --git a/src/assets/icon/55.jpg b/src/assets/icon/55.jpg new file mode 100644 index 0000000..85c6b9c Binary files /dev/null and b/src/assets/icon/55.jpg differ diff --git a/src/assets/icon/56.jpg b/src/assets/icon/56.jpg new file mode 100644 index 0000000..76f7d72 Binary files /dev/null and b/src/assets/icon/56.jpg differ diff --git a/src/assets/icon/57.jpg b/src/assets/icon/57.jpg new file mode 100644 index 0000000..770bf92 Binary files /dev/null and b/src/assets/icon/57.jpg differ diff --git a/src/assets/icon/58.jpg b/src/assets/icon/58.jpg new file mode 100644 index 0000000..552836b Binary files /dev/null and b/src/assets/icon/58.jpg differ diff --git a/src/assets/icon/59.jpg b/src/assets/icon/59.jpg new file mode 100644 index 0000000..90076aa Binary files /dev/null and b/src/assets/icon/59.jpg differ diff --git a/src/assets/icon/6.jpg b/src/assets/icon/6.jpg new file mode 100644 index 0000000..a58d23b Binary files /dev/null and b/src/assets/icon/6.jpg differ diff --git a/src/assets/icon/60.jpg b/src/assets/icon/60.jpg new file mode 100644 index 0000000..b98fb57 Binary files /dev/null and b/src/assets/icon/60.jpg differ diff --git a/src/assets/icon/61.jpg b/src/assets/icon/61.jpg new file mode 100644 index 0000000..95d5247 Binary files /dev/null and b/src/assets/icon/61.jpg differ diff --git a/src/assets/icon/62.jpg b/src/assets/icon/62.jpg new file mode 100644 index 0000000..07ec11c Binary files /dev/null and b/src/assets/icon/62.jpg differ diff --git a/src/assets/icon/63.jpg b/src/assets/icon/63.jpg new file mode 100644 index 0000000..98500c0 Binary files /dev/null and b/src/assets/icon/63.jpg differ diff --git a/src/assets/icon/64.jpg b/src/assets/icon/64.jpg new file mode 100644 index 0000000..00b933a Binary files /dev/null and b/src/assets/icon/64.jpg differ diff --git a/src/assets/icon/65.jpg b/src/assets/icon/65.jpg new file mode 100644 index 0000000..360d934 Binary files /dev/null and b/src/assets/icon/65.jpg differ diff --git a/src/assets/icon/66.jpg b/src/assets/icon/66.jpg new file mode 100644 index 0000000..9d90a8a Binary files /dev/null and b/src/assets/icon/66.jpg differ diff --git a/src/assets/icon/67.jpg b/src/assets/icon/67.jpg new file mode 100644 index 0000000..e65fb92 Binary files /dev/null and b/src/assets/icon/67.jpg differ diff --git a/src/assets/icon/68.jpg b/src/assets/icon/68.jpg new file mode 100644 index 0000000..c8f5bf6 Binary files /dev/null and b/src/assets/icon/68.jpg differ diff --git a/src/assets/icon/69.jpg b/src/assets/icon/69.jpg new file mode 100644 index 0000000..7f4cdf4 Binary files /dev/null and b/src/assets/icon/69.jpg differ diff --git a/src/assets/icon/7.jpg b/src/assets/icon/7.jpg new file mode 100644 index 0000000..ce89718 Binary files /dev/null and b/src/assets/icon/7.jpg differ diff --git a/src/assets/icon/70.jpg b/src/assets/icon/70.jpg new file mode 100644 index 0000000..a7d0f69 Binary files /dev/null and b/src/assets/icon/70.jpg differ diff --git a/src/assets/icon/71.jpg b/src/assets/icon/71.jpg new file mode 100644 index 0000000..0893f45 Binary files /dev/null and b/src/assets/icon/71.jpg differ diff --git a/src/assets/icon/72.jpg b/src/assets/icon/72.jpg new file mode 100644 index 0000000..dbdbbf8 Binary files /dev/null and b/src/assets/icon/72.jpg differ diff --git a/src/assets/icon/73.jpg b/src/assets/icon/73.jpg new file mode 100644 index 0000000..5452ff8 Binary files /dev/null and b/src/assets/icon/73.jpg differ diff --git a/src/assets/icon/74.jpg b/src/assets/icon/74.jpg new file mode 100644 index 0000000..b2c5517 Binary files /dev/null and b/src/assets/icon/74.jpg differ diff --git a/src/assets/icon/75.jpg b/src/assets/icon/75.jpg new file mode 100644 index 0000000..ba7d7d4 Binary files /dev/null and b/src/assets/icon/75.jpg differ diff --git a/src/assets/icon/76.jpg b/src/assets/icon/76.jpg new file mode 100644 index 0000000..fdfb0c8 Binary files /dev/null and b/src/assets/icon/76.jpg differ diff --git a/src/assets/icon/77.jpg b/src/assets/icon/77.jpg new file mode 100644 index 0000000..ca4c2e3 Binary files /dev/null and b/src/assets/icon/77.jpg differ diff --git a/src/assets/icon/78.jpg b/src/assets/icon/78.jpg new file mode 100644 index 0000000..0a45b56 Binary files /dev/null and b/src/assets/icon/78.jpg differ diff --git a/src/assets/icon/79.jpg b/src/assets/icon/79.jpg new file mode 100644 index 0000000..4d46d21 Binary files /dev/null and b/src/assets/icon/79.jpg differ diff --git a/src/assets/icon/8.jpg b/src/assets/icon/8.jpg new file mode 100644 index 0000000..e9b9ac5 Binary files /dev/null and b/src/assets/icon/8.jpg differ diff --git a/src/assets/icon/80.jpg b/src/assets/icon/80.jpg new file mode 100644 index 0000000..2f8fb2e Binary files /dev/null and b/src/assets/icon/80.jpg differ diff --git a/src/assets/icon/81.jpg b/src/assets/icon/81.jpg new file mode 100644 index 0000000..e401f65 Binary files /dev/null and b/src/assets/icon/81.jpg differ diff --git a/src/assets/icon/82.jpg b/src/assets/icon/82.jpg new file mode 100644 index 0000000..e1f875a Binary files /dev/null and b/src/assets/icon/82.jpg differ diff --git a/src/assets/icon/83.jpg b/src/assets/icon/83.jpg new file mode 100644 index 0000000..f29d0a6 Binary files /dev/null and b/src/assets/icon/83.jpg differ diff --git a/src/assets/icon/84.jpg b/src/assets/icon/84.jpg new file mode 100644 index 0000000..393a6d6 Binary files /dev/null and b/src/assets/icon/84.jpg differ diff --git a/src/assets/icon/85.jpg b/src/assets/icon/85.jpg new file mode 100644 index 0000000..c91bc68 Binary files /dev/null and b/src/assets/icon/85.jpg differ diff --git a/src/assets/icon/86.jpg b/src/assets/icon/86.jpg new file mode 100644 index 0000000..8ce81ab Binary files /dev/null and b/src/assets/icon/86.jpg differ diff --git a/src/assets/icon/87.jpg b/src/assets/icon/87.jpg new file mode 100644 index 0000000..7a51cf0 Binary files /dev/null and b/src/assets/icon/87.jpg differ diff --git a/src/assets/icon/88.jpg b/src/assets/icon/88.jpg new file mode 100644 index 0000000..4f7d92d Binary files /dev/null and b/src/assets/icon/88.jpg differ diff --git a/src/assets/icon/89.jpg b/src/assets/icon/89.jpg new file mode 100644 index 0000000..2da20ec Binary files /dev/null and b/src/assets/icon/89.jpg differ diff --git a/src/assets/icon/9.jpg b/src/assets/icon/9.jpg new file mode 100644 index 0000000..52adcaa Binary files /dev/null and b/src/assets/icon/9.jpg differ diff --git a/src/assets/icon/90.jpg b/src/assets/icon/90.jpg new file mode 100644 index 0000000..7421a5a Binary files /dev/null and b/src/assets/icon/90.jpg differ diff --git a/src/assets/mousepath.json b/src/assets/mousepath.json new file mode 100644 index 0000000..3e6aadb --- /dev/null +++ b/src/assets/mousepath.json @@ -0,0 +1,336 @@ +[ + ["move", 170, 514, 1721639139496, "pointermove"], + ["move", 171, 514, 1721639139518, "pointermove"], + ["move", 172, 514, 1721639139564, "pointermove"], + ["move", 174, 514, 1721639139578, "pointermove"], + ["move", 174, 514, 1721639139586, "pointermove"], + ["move", 175, 514, 1721639139646, "pointermove"], + ["move", 178, 514, 1721639139651, "pointermove"], + ["move", 177, 513, 1721639139652, "mousemove"], + ["move", 179, 514, 1721639139660, "pointermove"], + ["move", 182, 514, 1721639139676, "pointermove"], + ["move", 186, 514, 1721639139682, "pointermove"], + ["move", 190, 514, 1721639139690, "pointermove"], + ["move", 195, 514, 1721639139697, "pointermove"], + ["move", 195, 513, 1721639139698, "mousemove"], + ["move", 202, 514, 1721639139705, "pointermove"], + ["move", 210, 514, 1721639139712, "pointermove"], + ["move", 218, 514, 1721639139719, "pointermove"], + ["move", 230, 513, 1721639139727, "pointermove"], + ["move", 242, 512, 1721639139735, "pointermove"], + ["move", 254, 510, 1721639139741, "pointermove"], + ["move", 263, 507, 1721639139749, "pointermove"], + ["move", 263, 507, 1721639139750, "mousemove"], + ["move", 274, 504, 1721639139757, "pointermove"], + ["move", 283, 503, 1721639139765, "pointermove"], + ["move", 283, 503, 1721639139766, "mousemove"], + ["move", 292, 501, 1721639139772, "pointermove"], + ["move", 302, 500, 1721639139779, "pointermove"], + ["move", 310, 500, 1721639139787, "pointermove"], + ["move", 316, 499, 1721639139795, "pointermove"], + ["move", 316, 499, 1721639139796, "mousemove"], + ["move", 322, 498, 1721639139801, "pointermove"], + ["move", 326, 498, 1721639139810, "pointermove"], + ["move", 328, 497, 1721639139817, "pointermove"], + ["move", 330, 497, 1721639139825, "pointermove"], + ["move", 331, 497, 1721639139831, "pointermove"], + ["move", 332, 497, 1721639139839, "pointermove"], + ["move", 334, 496, 1721639139856, "pointermove"], + ["move", 335, 496, 1721639139861, "pointermove"], + ["move", 336, 496, 1721639139869, "pointermove"], + ["move", 336, 496, 1721639139870, "mousemove"], + ["move", 338, 496, 1721639139886, "pointermove"], + ["move", 339, 496, 1721639139891, "pointermove"], + ["move", 342, 495, 1721639139900, "pointermove"], + ["move", 346, 495, 1721639139907, "pointermove"], + ["move", 350, 494, 1721639139916, "pointermove"], + ["move", 354, 493, 1721639139921, "pointermove"], + ["move", 359, 493, 1721639139929, "pointermove"], + ["move", 359, 493, 1721639139930, "mousemove"], + ["move", 364, 492, 1721639139937, "pointermove"], + ["move", 370, 491, 1721639139946, "pointermove"], + ["move", 375, 490, 1721639139951, "pointermove"], + ["move", 382, 489, 1721639139959, "pointermove"], + ["move", 387, 488, 1721639139967, "pointermove"], + ["move", 394, 487, 1721639139975, "pointermove"], + ["move", 400, 487, 1721639139981, "pointermove"], + ["move", 406, 486, 1721639139989, "pointermove"], + ["move", 411, 485, 1721639139997, "pointermove"], + ["move", 415, 483, 1721639140006, "pointermove"], + ["move", 419, 482, 1721639140011, "pointermove"], + ["move", 422, 481, 1721639140019, "pointermove"], + ["move", 426, 480, 1721639140028, "pointermove"], + ["move", 427, 479, 1721639140041, "pointermove"], + ["move", 430, 478, 1721639140050, "pointermove"], + ["move", 430, 477, 1721639140057, "pointermove"], + ["move", 431, 476, 1721639140066, "pointermove"], + ["move", 431, 475, 1721639140072, "pointermove"], + ["move", 431, 474, 1721639140088, "pointermove"], + ["move", 431, 472, 1721639140102, "pointermove"], + ["move", 431, 471, 1721639140110, "pointermove"], + ["move", 431, 469, 1721639140118, "pointermove"], + ["move", 431, 468, 1721639140126, "pointermove"], + ["move", 431, 466, 1721639140132, "pointermove"], + ["move", 431, 464, 1721639140148, "pointermove"], + ["move", 431, 462, 1721639140156, "pointermove"], + ["move", 431, 460, 1721639140186, "pointermove"], + ["move", 431, 459, 1721639140261, "pointermove"], + ["move", 432, 460, 1721639140530, "pointermove"], + ["move", 432, 462, 1721639140538, "pointermove"], + ["move", 434, 462, 1721639140546, "pointermove"], + ["move", 434, 463, 1721639140552, "pointermove"], + ["move", 432, 464, 1721639140912, "pointermove"], + ["move", 429, 466, 1721639140920, "pointermove"], + ["move", 426, 467, 1721639140928, "pointermove"], + ["move", 422, 470, 1721639140934, "pointermove"], + ["move", 417, 471, 1721639140942, "pointermove"], + ["move", 413, 472, 1721639140950, "pointermove"], + ["move", 408, 474, 1721639140964, "pointermove"], + ["move", 404, 475, 1721639140972, "pointermove"], + ["move", 399, 475, 1721639140980, "pointermove"], + ["move", 395, 476, 1721639140988, "pointermove"], + ["move", 390, 478, 1721639140994, "pointermove"], + ["move", 386, 478, 1721639141002, "pointermove"], + ["move", 381, 479, 1721639141010, "pointermove"], + ["move", 376, 479, 1721639141018, "pointermove"], + ["move", 370, 479, 1721639141024, "pointermove"], + ["move", 364, 479, 1721639141032, "pointermove"], + ["move", 357, 479, 1721639141040, "pointermove"], + ["move", 352, 479, 1721639141048, "pointermove"], + ["move", 347, 479, 1721639141054, "pointermove"], + ["move", 342, 479, 1721639141062, "pointermove"], + ["move", 339, 478, 1721639141070, "pointermove"], + ["move", 336, 478, 1721639141078, "pointermove"], + ["move", 334, 478, 1721639141084, "pointermove"], + ["move", 333, 478, 1721639141100, "pointermove"], + ["move", 332, 479, 1721639141138, "pointermove"], + ["move", 331, 479, 1721639141152, "pointermove"], + ["move", 330, 479, 1721639141160, "pointermove"], + ["move", 329, 480, 1721639141168, "pointermove"], + ["move", 328, 482, 1721639141182, "pointermove"], + ["move", 327, 483, 1721639141198, "pointermove"], + ["move", 326, 483, 1721639141204, "pointermove"], + ["move", 324, 484, 1721639141212, "pointermove"], + ["move", 322, 486, 1721639141220, "pointermove"], + ["move", 319, 487, 1721639141228, "pointermove"], + ["move", 316, 488, 1721639141234, "pointermove"], + ["move", 313, 491, 1721639141242, "pointermove"], + ["move", 310, 494, 1721639141250, "pointermove"], + ["move", 306, 495, 1721639141258, "pointermove"], + ["move", 304, 495, 1721639141264, "pointermove"], + ["move", 301, 498, 1721639141272, "pointermove"], + ["move", 299, 499, 1721639141280, "pointermove"], + ["move", 297, 499, 1721639141288, "pointermove"], + ["move", 295, 499, 1721639141294, "pointermove"], + ["move", 293, 499, 1721639141302, "pointermove"], + ["move", 292, 500, 1721639141310, "pointermove"], + ["move", 291, 500, 1721639141324, "pointermove"], + ["down", 291, 500, 1721639141543, "pointerdown"], + ["up", 291, 500, 1721639141580, "pointerup"], + ["move", 294, 500, 1721639141654, "pointermove"], + ["move", 299, 500, 1721639141662, "pointermove"], + ["move", 306, 500, 1721639141670, "pointermove"], + ["move", 314, 499, 1721639141678, "pointermove"], + ["move", 323, 498, 1721639141684, "pointermove"], + ["move", 334, 497, 1721639141692, "pointermove"], + ["move", 344, 495, 1721639141708, "pointermove"], + ["move", 356, 493, 1721639141714, "pointermove"], + ["move", 367, 491, 1721639141722, "pointermove"], + ["move", 378, 489, 1721639141730, "pointermove"], + ["move", 387, 487, 1721639141738, "pointermove"], + ["move", 395, 485, 1721639141744, "pointermove"], + ["move", 402, 483, 1721639141752, "pointermove"], + ["move", 407, 482, 1721639141760, "pointermove"], + ["move", 410, 481, 1721639141768, "pointermove"], + ["move", 412, 480, 1721639141774, "pointermove"], + ["move", 414, 479, 1721639141924, "pointermove"], + ["move", 415, 479, 1721639141932, "pointermove"], + ["move", 416, 478, 1721639141940, "pointermove"], + ["move", 419, 477, 1721639141949, "pointermove"], + ["move", 422, 475, 1721639141954, "pointermove"], + ["move", 426, 475, 1721639141962, "pointermove"], + ["move", 430, 473, 1721639141970, "pointermove"], + ["move", 434, 472, 1721639141978, "pointermove"], + ["move", 436, 470, 1721639141984, "pointermove"], + ["move", 440, 469, 1721639141992, "pointermove"], + ["move", 443, 468, 1721639142000, "pointermove"], + ["move", 446, 467, 1721639142008, "pointermove"], + ["move", 450, 466, 1721639142014, "pointermove"], + ["move", 450, 466, 1721639142022, "pointermove"], + ["move", 451, 466, 1721639142030, "pointermove"], + ["move", 452, 466, 1721639142038, "pointermove"], + ["move", 454, 466, 1721639142044, "pointermove"], + ["down", 454, 466, 1721639142082, "pointerdown"], + ["up", 454, 466, 1721639142134, "pointerup"], + ["move", 454, 467, 1721639142194, "pointermove"], + ["move", 454, 471, 1721639142202, "pointermove"], + ["move", 451, 475, 1721639142210, "pointermove"], + ["move", 448, 479, 1721639142216, "pointermove"], + ["move", 444, 483, 1721639142224, "pointermove"], + ["move", 439, 488, 1721639142232, "pointermove"], + ["move", 434, 494, 1721639142240, "pointermove"], + ["move", 429, 499, 1721639142246, "pointermove"], + ["move", 424, 503, 1721639142262, "pointermove"], + ["move", 419, 508, 1721639142270, "pointermove"], + ["move", 415, 512, 1721639142276, "pointermove"], + ["move", 411, 516, 1721639142284, "pointermove"], + ["move", 407, 520, 1721639142292, "pointermove"], + ["move", 404, 524, 1721639142300, "pointermove"], + ["move", 402, 527, 1721639142306, "pointermove"], + ["move", 399, 530, 1721639142314, "pointermove"], + ["move", 398, 531, 1721639142322, "pointermove"], + ["move", 397, 531, 1721639142330, "pointermove"], + ["move", 396, 532, 1721639142336, "pointermove"], + ["move", 395, 534, 1721639142344, "pointermove"], + ["move", 394, 535, 1721639142352, "pointermove"], + ["move", 393, 535, 1721639142360, "pointermove"], + ["move", 392, 536, 1721639142366, "pointermove"], + ["move", 391, 538, 1721639142374, "pointermove"], + ["move", 390, 539, 1721639142382, "pointermove"], + ["move", 389, 539, 1721639142390, "pointermove"], + ["move", 387, 540, 1721639142396, "pointermove"], + ["move", 386, 542, 1721639142404, "pointermove"], + ["move", 384, 543, 1721639142412, "pointermove"], + ["move", 383, 546, 1721639142420, "pointermove"], + ["move", 381, 547, 1721639142426, "pointermove"], + ["move", 379, 550, 1721639142434, "pointermove"], + ["move", 378, 551, 1721639142450, "pointermove"], + ["move", 377, 551, 1721639142456, "pointermove"], + ["move", 376, 554, 1721639142464, "pointermove"], + ["move", 376, 555, 1721639142472, "pointermove"], + ["move", 375, 556, 1721639142480, "pointermove"], + ["move", 373, 558, 1721639142486, "pointermove"], + ["move", 372, 559, 1721639142495, "pointermove"], + ["move", 371, 562, 1721639142502, "pointermove"], + ["move", 370, 563, 1721639142511, "pointermove"], + ["move", 370, 564, 1721639142516, "pointermove"], + ["move", 369, 566, 1721639142524, "pointermove"], + ["down", 369, 566, 1721639142554, "pointerdown"], + ["up", 369, 566, 1721639142606, "pointerup"], + ["move", 369, 564, 1721639142652, "pointermove"], + ["move", 369, 562, 1721639142661, "pointermove"], + ["move", 368, 558, 1721639142666, "pointermove"], + ["move", 366, 554, 1721639142674, "pointermove"], + ["move", 363, 548, 1721639142682, "pointermove"], + ["move", 359, 541, 1721639142690, "pointermove"], + ["move", 353, 534, 1721639142696, "pointermove"], + ["move", 346, 524, 1721639142704, "pointermove"], + ["move", 337, 514, 1721639142712, "pointermove"], + ["move", 328, 505, 1721639142720, "pointermove"], + ["move", 318, 496, 1721639142726, "pointermove"], + ["move", 308, 487, 1721639142734, "pointermove"], + ["move", 299, 480, 1721639142742, "pointermove"], + ["move", 291, 474, 1721639142750, "pointermove"], + ["move", 283, 468, 1721639142756, "pointermove"], + ["move", 277, 464, 1721639142764, "pointermove"], + ["move", 273, 460, 1721639142772, "pointermove"], + ["move", 270, 457, 1721639142780, "pointermove"], + ["move", 268, 455, 1721639142786, "pointermove"], + ["move", 266, 453, 1721639142794, "pointermove"], + ["move", 265, 451, 1721639142802, "pointermove"], + ["move", 264, 448, 1721639142816, "pointermove"], + ["move", 263, 446, 1721639142824, "pointermove"], + ["move", 262, 444, 1721639142832, "pointermove"], + ["move", 262, 442, 1721639142840, "pointermove"], + ["move", 261, 440, 1721639142846, "pointermove"], + ["move", 261, 438, 1721639142854, "pointermove"], + ["move", 261, 436, 1721639142862, "pointermove"], + ["move", 261, 434, 1721639142870, "pointermove"], + ["move", 261, 432, 1721639142876, "pointermove"], + ["move", 261, 430, 1721639142884, "pointermove"], + ["move", 261, 428, 1721639142892, "pointermove"], + ["move", 261, 426, 1721639142900, "pointermove"], + ["move", 261, 424, 1721639142906, "pointermove"], + ["move", 261, 423, 1721639142914, "pointermove"], + ["move", 261, 421, 1721639142922, "pointermove"], + ["move", 261, 420, 1721639142930, "pointermove"], + ["move", 261, 418, 1721639142936, "pointermove"], + ["move", 261, 415, 1721639142952, "pointermove"], + ["move", 260, 414, 1721639142960, "pointermove"], + ["move", 259, 412, 1721639142974, "pointermove"], + ["move", 258, 411, 1721639142982, "pointermove"], + ["move", 258, 410, 1721639142990, "pointermove"], + ["move", 258, 407, 1721639143012, "pointermove"], + ["move", 257, 406, 1721639143020, "pointermove"], + ["move", 256, 404, 1721639143034, "pointermove"], + ["move", 256, 403, 1721639143042, "pointermove"], + ["move", 255, 402, 1721639143050, "pointermove"], + ["down", 255, 401, 1721639143124, "pointerdown"], + ["up", 255, 401, 1721639143192, "pointerup"], + ["move", 256, 404, 1721639143252, "pointermove"], + ["move", 258, 410, 1721639143260, "pointermove"], + ["move", 262, 415, 1721639143266, "pointermove"], + ["move", 266, 423, 1721639143274, "pointermove"], + ["move", 271, 431, 1721639143282, "pointermove"], + ["move", 276, 439, 1721639143290, "pointermove"], + ["move", 282, 448, 1721639143296, "pointermove"], + ["move", 286, 459, 1721639143304, "pointermove"], + ["move", 294, 470, 1721639143312, "pointermove"], + ["move", 300, 482, 1721639143320, "pointermove"], + ["move", 307, 492, 1721639143326, "pointermove"], + ["move", 314, 503, 1721639143334, "pointermove"], + ["move", 322, 515, 1721639143342, "pointermove"], + ["move", 330, 523, 1721639143348, "pointermove"], + ["move", 336, 535, 1721639143356, "pointermove"], + ["move", 344, 544, 1721639143372, "pointermove"], + ["move", 354, 555, 1721639143378, "pointermove"], + ["move", 362, 563, 1721639143386, "pointermove"], + ["move", 370, 572, 1721639143394, "pointermove"], + ["move", 375, 580, 1721639143402, "pointermove"], + ["move", 380, 587, 1721639143408, "pointermove"], + ["move", 386, 595, 1721639143416, "pointermove"], + ["move", 391, 600, 1721639143424, "pointermove"], + ["move", 396, 607, 1721639143433, "pointermove"], + ["move", 402, 612, 1721639143438, "pointermove"], + ["move", 406, 619, 1721639143446, "pointermove"], + ["move", 410, 624, 1721639143454, "pointermove"], + ["move", 415, 630, 1721639143462, "pointermove"], + ["move", 419, 635, 1721639143468, "pointermove"], + ["move", 422, 640, 1721639143476, "pointermove"], + ["move", 426, 644, 1721639143484, "pointermove"], + ["move", 430, 647, 1721639143492, "pointermove"], + ["move", 431, 650, 1721639143498, "pointermove"], + ["move", 434, 651, 1721639143506, "pointermove"], + ["move", 434, 652, 1721639143514, "pointermove"], + ["move", 435, 655, 1721639143522, "pointermove"], + ["move", 436, 656, 1721639143528, "pointermove"], + ["move", 436, 658, 1721639143536, "pointermove"], + ["move", 438, 659, 1721639143544, "pointermove"], + ["move", 438, 659, 1721639143552, "pointermove"], + ["move", 438, 660, 1721639143574, "pointermove"], + ["move", 439, 660, 1721639143656, "pointermove"], + ["move", 440, 662, 1721639143672, "pointermove"], + ["move", 442, 663, 1721639143678, "pointermove"], + ["move", 443, 663, 1721639143686, "pointermove"], + ["move", 444, 664, 1721639143695, "pointermove"], + ["move", 446, 666, 1721639143702, "pointermove"], + ["move", 446, 666, 1721639143708, "pointermove"], + ["move", 447, 667, 1721639143716, "pointermove"], + ["move", 447, 666, 1721639143717, "mousemove"], + ["move", 448, 667, 1721639143724, "pointermove"], + ["move", 450, 667, 1721639143732, "pointermove"], + ["move", 450, 670, 1721639143746, "pointermove"], + ["move", 452, 671, 1721639143754, "pointermove"], + ["move", 454, 672, 1721639143762, "pointermove"], + ["move", 456, 675, 1721639143768, "pointermove"], + ["move", 458, 676, 1721639143776, "pointermove"], + ["move", 460, 679, 1721639143784, "pointermove"], + ["move", 462, 680, 1721639143792, "pointermove"], + ["move", 466, 683, 1721639143798, "pointermove"], + ["move", 467, 684, 1721639143806, "pointermove"], + ["move", 470, 687, 1721639143814, "pointermove"], + ["move", 470, 688, 1721639143822, "pointermove"], + ["move", 472, 691, 1721639143828, "pointermove"], + ["move", 474, 692, 1721639143836, "pointermove"], + ["move", 475, 695, 1721639143844, "pointermove"], + ["move", 478, 696, 1721639143852, "pointermove"], + ["move", 479, 699, 1721639143858, "pointermove"], + ["move", 482, 700, 1721639143866, "pointermove"], + ["move", 482, 703, 1721639143874, "pointermove"], + ["move", 483, 703, 1721639143882, "pointermove"], + ["move", 483, 704, 1721639143888, "pointermove"], + ["move", 483, 706, 1721639143912, "pointermove"], + ["down", 483, 706, 1721639143965, "pointerdown"], + ["focus", 1721639143965], + ["up", 483, 706, 1721639144024, "pointerup"] +] \ No newline at end of file diff --git a/src/assets/mousepath.py b/src/assets/mousepath.py new file mode 100644 index 0000000..bfbbca3 --- /dev/null +++ b/src/assets/mousepath.py @@ -0,0 +1,8 @@ +import json +from pathlib import Path + + +now_file = Path(__file__) +data_file_path = now_file.parent / "mousepath.json" +with open(data_file_path, "r") as f: + mouse_path = json.loads(f.read()) diff --git a/src/assets/resnet18.onnx b/src/assets/resnet18.onnx new file mode 100644 index 0000000..4b60e9e Binary files /dev/null and b/src/assets/resnet18.onnx differ diff --git a/src/core/__init__.py b/src/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core/click_model.py b/src/core/click_model.py new file mode 100644 index 0000000..7560125 --- /dev/null +++ b/src/core/click_model.py @@ -0,0 +1,13 @@ +import bili_ticket_gt_python +from persica.factory.component import AsyncInitializingComponent + + +class ClickModel(AsyncInitializingComponent): + def __init__(self): + self.click = bili_ticket_gt_python.ClickPy() + + def predict(self, url: str): + key = self.click.calculate_key(url) + if key: + return key.split(",") + return [] diff --git a/src/core/resnet_model.py b/src/core/resnet_model.py new file mode 100644 index 0000000..cce10a1 --- /dev/null +++ b/src/core/resnet_model.py @@ -0,0 +1,97 @@ +from io import BytesIO +from typing import List, Tuple + +import onnxruntime +import numpy as np +from PIL import Image +from persica.factory.component import AsyncInitializingComponent +from pathlib import Path + +assets_path = Path("src") / "assets" +icon_path = assets_path / "icon" +model_path = assets_path / "resnet18.onnx" + + +class ResnetModel(AsyncInitializingComponent): + def __init__(self): + self.session = onnxruntime.InferenceSession(model_path) + self.input_name = self.session.get_inputs()[0].name + self.icon_list = self.read_icon() + + @staticmethod + def read_icon(): + icon_list = [] + for i in range(91): + file_path = icon_path / f"{i}.jpg" + icon = Image.open(file_path) + icon_list.append(np.array(icon)) + return icon_list + + def get_target_id(self, target_image: bytes): + target_array = np.array(target_image) + for i, icon_array in enumerate(self.icon_list): + err = np.sum((target_array.astype("float") - icon_array.astype("float")) ** 2) + err /= float(target_array.shape[0] * target_array.shape[1]) + if err < 1000: + return i + + @staticmethod + def crop_image(image_bytes: bytes, coordinates: List[Tuple[int, int]]): + cropped_images = [] + img = Image.open(BytesIO(image_bytes)) + width, height = img.size + + left = 0 + upper = width + right = height - width + lower = height + box = (left, upper, right, lower) + icon_img = img.crop(box) + + grid_edge_length = width // 3 + for coord in coordinates: + x, y = coord + left = (x - 1) * grid_edge_length + upper = (y - 1) * grid_edge_length + right = left + grid_edge_length + lower = upper + grid_edge_length + box = (left, upper, right, lower) + cropped_img = img.crop(box) + cropped_images.append(cropped_img) + return icon_img, cropped_images + + def predict(self, image_bytes: bytes): + coordinates = [ + (1, 1), + (1, 2), + (1, 3), + (2, 1), + (2, 2), + (2, 3), + (3, 1), + (3, 2), + (3, 3), + ] + + def data_transforms(image): + image = image.resize((224, 224)) + image_array = np.array(image) + image_array = image_array.astype(np.float32) / 255.0 + mean = np.array([0.485, 0.456, 0.406], dtype=np.float32) + std = np.array([0.229, 0.224, 0.225], dtype=np.float32) + image_array = (image_array - mean) / std + image_array = np.transpose(image_array, (2, 0, 1)) + # image_array = np.expand_dims(image_array, axis=0) + return image_array + + icon_image, cropped_image = self.crop_image(image_bytes, coordinates) + target_id = self.get_target_id(icon_image) + target_images = [data_transforms(i) for i in cropped_image] + outputs = self.session.run(None, {self.input_name: target_images})[0] + class_ids = np.argmax(outputs, axis=1).tolist() + + ans = [] + for i, id in enumerate(class_ids): + if id == target_id: + ans.append(coordinates[i]) + return ans diff --git a/src/core/web_app.py b/src/core/web_app.py new file mode 100644 index 0000000..9b8a995 --- /dev/null +++ b/src/core/web_app.py @@ -0,0 +1,59 @@ +import asyncio + +import uvicorn + +from fastapi import FastAPI +from persica.factory.component import AsyncInitializingComponent +from starlette.middleware.trustedhost import TrustedHostMiddleware + +from src.env import DOMAIN, DEBUG, PORT + + +class WebApp(AsyncInitializingComponent): + def __init__(self): + self.app = FastAPI() + self.web_server = None + self.web_server_task = None + + def init_web(self): + if not DEBUG: + self.app.add_middleware( + TrustedHostMiddleware, + allowed_hosts=[ + DOMAIN, + ], + ) + + async def start(self): + self.init_web() + self.web_server = uvicorn.Server( + config=uvicorn.Config(self.app, host="0.0.0.0", port=PORT) + ) + server_config = self.web_server.config + server_config.setup_event_loop() + if not server_config.loaded: + server_config.load() + self.web_server.lifespan = server_config.lifespan_class(server_config) + try: + await self.web_server.startup() + except OSError as e: + raise SystemExit from e + + if self.web_server.should_exit: + raise SystemExit from None + self.web_server_task = asyncio.create_task(self.web_server.main_loop()) + + def stop(self): + if self.web_server_task: + self.web_server_task.cancel() + + async def initialize(self): + await self.start() + + async def shutdown(self): + self.stop() + if self.web_server: + try: + await self.web_server.shutdown() + except AttributeError: + pass diff --git a/src/crack.py b/src/crack.py new file mode 100644 index 0000000..e82fdf0 --- /dev/null +++ b/src/crack.py @@ -0,0 +1,507 @@ +import hashlib +import json +import math +import random +import time + +import httpx +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.primitives import padding, serialization +from cryptography.hazmat.primitives.asymmetric.padding import PKCS1v15 + +from src.assets.mousepath import mouse_path + + +class GeetestInitError(Exception): + def __init__(self, msg: str): + self.msg = msg + + +class Crack: + def __init__(self, gt=None, challenge=None): + self.pic_path = None + self.s = None + self.c = None + self.session = httpx.Client() + self.session.headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" + } + # self.session.verify = False + self.gt = gt + self.challenge = challenge + self.aeskey = ''.join(f'{int((1 + random.random()) * 65536):04x}'[1:] for _ in range(4)) + public_key = '''-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDB45NNFhRGWzMFPn9I7k7IexS5 +XviJR3E9Je7L/350x5d9AtwdlFH3ndXRwQwprLaptNb7fQoCebZxnhdyVl8Jr2J3 +FZGSIa75GJnK4IwNaG10iyCjYDviMYymvCtZcGWSqSGdC/Bcn2UCOiHSMwgHJSrg +Bm1Zzu+l8nSOqAurgQIDAQAB +-----END PUBLIC KEY-----''' + self.public_key = serialization.load_pem_public_key(public_key.encode()) + self.enc_key = self.public_key.encrypt(self.aeskey.encode(), PKCS1v15()).hex() + self.mouse_path = mouse_path + + def get_type(self) -> dict: + url = f"https://api.geetest.com/gettype.php?gt={self.gt}" + res = self.session.get(url) + return json.loads(res.text[1:-1])["data"] + + @staticmethod + def encode(input_bytes: list): + def get_char_from_index(index): + char_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()" + return char_table[index] if 0 <= index < len(char_table) else "." + + def transform_value(value, bit_mask): + result = 0 + for r in range(23, -1, -1): + if (bit_mask >> r) & 1: + result = (result << 1) + ((value >> r) & 1) + return result + + encoded_string = "" + padding = "" + input_length = len(input_bytes) + for i in range(0, input_length, 3): + chunk_length = min(3, input_length - i) + chunk = input_bytes[i:i + chunk_length] + if chunk_length == 3: + value = (chunk[0] << 16) + (chunk[1] << 8) + chunk[2] + encoded_string += get_char_from_index(transform_value(value, 7274496)) + get_char_from_index( + transform_value(value, 9483264)) + get_char_from_index( + transform_value(value, 19220)) + get_char_from_index(transform_value(value, 235)) + elif chunk_length == 2: + value = (chunk[0] << 16) + (chunk[1] << 8) + encoded_string += get_char_from_index(transform_value(value, 7274496)) + get_char_from_index( + transform_value(value, 9483264)) + get_char_from_index(transform_value(value, 19220)) + padding = "." + elif chunk_length == 1: + value = chunk[0] << 16 + encoded_string += get_char_from_index(transform_value(value, 7274496)) + get_char_from_index( + transform_value(value, 9483264)) + padding = ".." + return encoded_string + padding + + @staticmethod + def MD5(text: str): + return hashlib.md5(text.encode()).hexdigest() + + @staticmethod + def encode_mouse_path(path: list, c: list, s: str): + def preprocess(path: list): + def BFIQ(e): + t = 32767 + if not isinstance(e, int): + return e + else: + if t < e: + e = t + elif e < -t: + e = -t + return round(e) + + def BGAB(e): + t = '' + n = 0 + len(e or []) + while n < len(e) and not t: + if e[n]: + t = e[n][4] + n += 1 + if not t: + return e + r = '' + i = ['mouse', 'touch', 'pointer', 'MSPointer'] + for s in range(len(i)): + if t.startswith(i[s]): + r = i[s] + _ = list(e) + for a in range(len(_) - 1, -1, -1): + c = _[a] + l = c[0] + if l in ['move', 'down', 'up']: + value = c[4] or '' + if not value.startswith(r): + _.pop(a) + return _ + + t = 0 + n = 0 + r = [] + s = 0 + if len(path) <= 0: + return [] + o = None + _ = None + a = BGAB(path) + c = len(a) + for l in range(0 if c < 300 else c - 300, c): + u = a[l] + h = u[0] + if h in ['down', 'move', 'up', 'scroll']: + if not o: + o = u + _ = u + r.append([h, [u[1] - t, u[2] - n], BFIQ(u[3] - s if s else s)]) + t = u[1] + n = u[2] + s = u[3] + elif h in ['blur', 'focus', 'unload']: + r.append([h, BFIQ(u[1] - s if s else s)]) + s = u[1] + return r + + def process(prepared_path: list): + h = { + 'move': 0, + 'down': 1, + 'up': 2, + 'scroll': 3, + 'focus': 4, + 'blur': 5, + 'unload': 6, + 'unknown': 7 + } + + def p(e, t): + n = bin(e)[2:] + r = '' + i = len(n) + 1 + while i <= t: + i += 1 + r += '0' + return r + n + + def d(e): + t = [] + n = len(e) + r = 0 + while r < n: + i = e[r] + s = 0 + while True: + if s >= 16: + break + o = r + s + 1 + if o >= n: + break + if e[o] != i: + break + s += 1 + r += 1 + s + _ = h[i] + if s != 0: + t.append(_ | 8) + t.append(s - 1) + else: + t.append(_) + a = p(n | 32768, 16) + c = '' + for l in range(len(t)): + c += p(t[l], 4) + return a + c + + def g(e, tt): + def temp1(e1): + n = len(e) + r = 0 + i = [] + while r < n: + s = 1 + o = e[r] + _ = abs(o) + while True: + if n <= r + s: + break + if e[r + s] != o: + break + if (_ >= 127) or (s >= 127): + break + s += 1 + if s > 1: + i.append((49152 if o < 0 else 32768) | s << 7 | _) + else: + i.append(o) + r += s + return i + + e = temp1(e) + + r = [] + i = [] + + def n(e, t): + return 0 if e == 0 else math.log(e) / math.log(t) + + for temp in e: + t = math.ceil(n(abs(temp) + 1, 16)) + if t == 0: + t = 1 + r.append(p(t - 1, 2)) + i.append(p(abs(temp), t * 4)) + + s = ''.join(r) + o = ''.join(i) + + def temp2(t): + return t != 0 and t >> 15 != 1 + + def temp3(e1): + n = [] + + def temp(e2): + if temp2(e2): + n.append(e2) + + for r in range(len(e1)): + temp(e1[r]) + return n + + def temp4(t): + if t < 0: + return '1' + else: + return '0' + + if tt: + n = [] + e1 = temp3(e) + for r in range(len(e1)): + n.append(temp4(e1[r])) + n = ''.join(n) + else: + n = '' + return p(len(e) | 32768, 16) + s + o + n + + def u(e): + t = '' + n = len(e) // 6 + for r in range(n): + t += '()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~'[ + int(e[6 * r: 6 * (r + 1)], 2)] + return t + + t = [] + n = [] + r = [] + i = [] + for a in range(len(prepared_path)): + _ = prepared_path[a] + a = len(_) + t.append(_[0]) + n.append(_[1] if a == 2 else _[2]) + if a == 3: + r.append(_[1][0]) + i.append(_[1][1]) + c = d(t) + g(n, False) + g(r, True) + g(i, True) + l = len(c) + if l % 6 != 0: + c += p(0, 6 - l % 6) + return u(c) + + def postprocess(e, t, n): + i = 0 + s = e + o = t[0] + _ = t[2] + a = t[4] + while True: + r = n[i:i + 2] + if not r: + break + i += 2 + c = int(r, 16) + l = chr(c) + u = (o * c * c + _ * c + a) % len(e) + s = s[:u] + l + s[u:] + return s + + return postprocess(process(preprocess(path)), c, s) + + def aes_encrypt(self, content: str): + cipher = Cipher(algorithms.AES(self.aeskey.encode()), modes.CBC(b"0000000000000000")) + encryptor = cipher.encryptor() + padder = padding.PKCS7(128).padder() + padded_data = padder.update(content.encode()) + padded_data += padder.finalize() + ct = encryptor.update(padded_data) + encryptor.finalize() + return ct + + def get_c_s(self): + o = { + "gt": self.gt, + "challenge": self.challenge, + "offline": False, + "new_captcha": True, + "product": "embed", + "width": "300px", + "https": True, + "protocol": "https://", + } + o.update(self.get_type()) + o.update({ + "cc": 16, + "ww": True, + "i": "-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1" + }) + o = json.dumps(o, separators=(',', ':')) + # print(o) + ct = self.aes_encrypt(o) + s = [] + for byte in ct: + s.append(byte) + i = self.encode(s) + r = self.enc_key + w = i + r + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "pt": 0, + "client_type": "web", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + "w": w + } + resp = self.session.get("https://api.geetest.com/get.php", params=params).text + # print(resp) + json_data = json.loads(resp[22:-1]) + if json_data["status"] == "error": + raise GeetestInitError(json_data["error"]) + data = json_data["data"] + self.c = data["c"] + self.s = data["s"] + return data["c"], data["s"] + + def gettype(self): + url = f"https://api.geetest.com/gettype.php?gt={self.gt}&callback=geetest_{str(int(round(time.time() * 1000)))}" + return self.session.get(url).text + + def ajax(self): + def transform(e, t, n): + if not t or not n: + return e + o = 0 + i = list(e) + s = t[0] + a = t[2] + b = t[4] + while o < len(n): + r = n[o:o + 2] + o += 2 + c = int(r, 16) + l = chr(c) + u = (s * c * c + a * c + b) % len(i) + i.insert(u, l) + return ''.join(i) + + mouse_path = [ + ["move", 385, 313, 1724572150164, "pointermove"], + ["move", 385, 315, 1724572150166, "pointermove"], + ["move", 386, 315, 1724572150174, "pointermove"], + ["move", 387, 315, 1724572150182, "pointermove"], + ["move", 387, 316, 1724572150188, "pointermove"], + ["move", 388, 316, 1724572150204, "pointermove"], + ["move", 388, 317, 1724572150218, "pointermove"], + ["down", 388, 317, 1724572150586, "pointerdown"], + ["focus", 1724572150587], + ["up", 388, 317, 1724572150632, "pointerup"] + ] + tt = transform(self.encode_mouse_path(mouse_path, self.c, self.s), self.c, self.s) + rp = self.MD5(self.gt + self.challenge + self.s) + temp1 = '''"lang":"zh-cn","type":"fullpage","tt":"%s","light":"DIV_0","s":"c7c3e21112fe4f741921cb3e4ff9f7cb","h":"321f9af1e098233dbd03f250fd2b5e21","hh":"39bd9cad9e425c3a8f51610fd506e3b3","hi":"09eb21b3ae9542a9bc1e8b63b3d9a467","vip_order":-1,"ct":-1,"ep":{"v":"9.1.9-dbjg5z","te":false,"me":true,"ven":"Google Inc. (Intel)","ren":"ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)","fp":["scroll",0,1602,1724571628498,null],"lp":["up",386,217,1724571629854,"pointerup"],"em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0},"tm":{"a":1724571567311,"b":1724571567549,"c":1724571567562,"d":0,"e":0,"f":1724571567312,"g":1724571567312,"h":1724571567312,"i":1724571567317,"j":1724571567423,"k":1724571567330,"l":1724571567423,"m":1724571567545,"n":1724571567547,"o":1724571567569,"p":1724571568259,"q":1724571568259,"r":1724571568261,"s":1724571570378,"t":1724571570378,"u":1724571570380},"dnf":"dnf","by":0},"passtime":1600,"rp":"%s",''' % ( + tt, rp) + r = "{" + temp1 + '"captcha_token":"1198034057","du6o":"eyjf7nne"}' + # print(r) + ct = self.aes_encrypt(r) + s = [byte for byte in ct] + w = self.encode(s) + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "pt": 0, + "client_type": "web", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + "w": w + } + resp = self.session.get("https://api.geetest.com/ajax.php", params=params).text + return json.loads(resp[22:-1])["data"] + + def get_pic(self): + params = { + "is_next": "true", + "type": "click", + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "https": "true", + "protocol": "https://", + "offline": "false", + "product": "float", + "api_server": "api.geevisit.com", + "isPC": True, + "autoReset": True, + "width": "100%", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + } + resp = self.session.get("https://api.geevisit.com/get.php", params=params).text + data = json.loads(resp[22:-1])["data"] + self.pic_path = data["pic"] + pic_url = "https://" + data["resource_servers"][0][:-1] + data["pic"] + return self.session.get(pic_url).content, pic_url, data["pic_type"] + + def verify(self, points: list): + u = self.enc_key + o = { + "lang": "zh-cn", + "passtime": 1600, + "a": ",".join(points), + "pic": self.pic_path, + "tt": self.encode_mouse_path(self.mouse_path, self.c, self.s), + "ep": { + "ca": [{"x": 524, "y": 209, "t": 0, "dt": 1819}, {"x": 558, "y": 299, "t": 0, "dt": 428}, + {"x": 563, "y": 95, "t": 0, "dt": 952}, {"x": 670, "y": 407, "t": 3, "dt": 892}], + "v": '3.1.0', + "$_FB": False, + "me": True, + "tm": {"a": 1724585496403, "b": 1724585496605, "c": 1724585496613, "d": 0, "e": 0, "f": 1724585496404, + "g": 1724585496404, "h": 1724585496404, "i": 1724585496404, "j": 1724585496404, "k": 0, + "l": 1724585496413, "m": 1724585496601, "n": 1724585496603, "o": 1724585496618, + "p": 1724585496749, "q": 1724585496749, "r": 1724585496751, "s": 1724585498068, + "t": 1724585498068, "u": 1724585498069} + }, + "h9s9": "1816378497", + } + o["rp"] = self.MD5(self.gt + self.challenge + str(o["passtime"])) + o = json.dumps(o, separators=(',', ':')) + # print(o) + ct = self.aes_encrypt(o) + s = [] + for byte in ct: + s.append(byte) + p = self.encode(s) + w = p + u + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "pt": 0, + "client_type": "web", + "w": w + } + resp = self.session.get("https://api.geevisit.com/ajax.php", params=params).text + return resp[1:-1] + + def refresh(self): + url = "http://api.geevisit.com/refresh.php" + params = { + "gt": self.gt, + "challenge": self.challenge, + "lang": "zh-cn", + "callback": "geetest_" + str(int(round(time.time() * 1000))), + } + resp = self.session.get(url, params=params).text + data = json.loads(resp[22:-1])["data"] + # print(data) + self.pic_path = data["pic"] + pic_url = "https://" + data["image_servers"][0][:-1] + data["pic"] + return self.session.get(pic_url).content, pic_url, data["pic_type"] diff --git a/src/env.py b/src/env.py new file mode 100644 index 0000000..b5ce842 --- /dev/null +++ b/src/env.py @@ -0,0 +1,10 @@ +import os + +from dotenv import load_dotenv + +load_dotenv() + +DEBUG = os.getenv("DEBUG", "True").lower() == "true" +DOMAIN = os.getenv("DOMAIN", "") +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 8888)) diff --git a/src/route/__init__.py b/src/route/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/route/predict.py b/src/route/predict.py new file mode 100644 index 0000000..812fff0 --- /dev/null +++ b/src/route/predict.py @@ -0,0 +1,105 @@ +import asyncio +import time +import traceback +import json +from concurrent.futures import ThreadPoolExecutor +from typing import Optional + +from PIL import UnidentifiedImageError +from persica.factory.component import AsyncInitializingComponent +from pydantic import BaseModel + +from src.core.click_model import ClickModel +from src.core.resnet_model import ResnetModel +from src.core.web_app import WebApp +from src.crack import Crack, GeetestInitError + + +class ResultData(BaseModel): + gt: str + challenge: str + validate: Optional[str] = None + + +class Result(BaseModel): + code: int + msg: str + + data: Optional[ResultData] = None + + +class PredictPlugin(AsyncInitializingComponent): + def __init__(self, web_app: WebApp, click_model: ClickModel, resnet_model: ResnetModel): + web_app.app.add_api_route("/predict", self.bypass_gt_challenge, methods=["GET", "POST"]) + self.default_result = Result(code=1, msg="识别时发生未知错误") + self.click_model = click_model + self.resnet_model = resnet_model + + def get_point_list(self, pic_content: bytes, pic_url: str, pic_type: str): + point_list = [] + if pic_type == "nine": + # 九宫格 + points = self.resnet_model.predict(pic_content) + for x, y in points: + point_list.append(f"{x}_{y}") + else: + # 滑动验证码 + key = self.click_model.predict(pic_url) + point_list = key + return point_list + + def vvv(self, crack: Crack, retry: int = 3): + if retry == 3: + pic_content, pic_url, pic_type = crack.get_pic() + else: + pic_content, pic_url, pic_type = crack.refresh() + print(f"尝试次数: {4 - retry}, 类型: {pic_type} gt: {crack.gt} challenge: {crack.challenge}") + point_list = self.get_point_list(pic_content, pic_url, pic_type) + if not point_list: + return self.default_result + time.sleep(2) + result = json.loads(crack.verify(point_list)) + # print(result) + if result["status"] == "success" and result["data"]["result"] == "success": + data = ResultData(gt=crack.gt, challenge=crack.challenge, validate=result["data"]["validate"]) + return Result(code=0, msg="成功", data=data) + return self.default_result + + def predict_file(self, gt: str, challenge: str): + try: + crack = Crack(gt, challenge) + crack.gettype() + try: + crack.get_c_s() + except Exception as e: + raise GeetestInitError("获取验证码失败,可能已过期或者网络异常") from e + crack.ajax() + for i in range(3, 0, -1): + result = self.vvv(crack, i) + if result.code == 0: + return result + return self.default_result + except GeetestInitError as e: + msg = e.msg + except UnidentifiedImageError: + msg = "不是有效的图片文件" + except FileNotFoundError: + msg = "未找到文件" + except Exception as e: + msg = str(e) + traceback.print_exc() + return Result(code=1, msg=msg, data=ResultData(gt=gt, challenge=challenge)) + + async def bypass_gt_challenge(self, gt: str, challenge: str) -> Result: + # 使用新线程进行遍历,避免堵塞主线程 + loop = asyncio.get_event_loop() + # 可以使用with语句来确保线程执行完成后及时被清理 + final_result: Result = self.default_result + start = time.time() + with ThreadPoolExecutor() as executor: + final_result = await loop.run_in_executor( + executor, self.predict_file, gt, challenge, + ) + end = time.time() + print(f"耗时: {end - start}") + return final_result diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..d5e0f45 --- /dev/null +++ b/uv.lock @@ -0,0 +1,558 @@ +version = 1 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version < '3.13'", + "python_full_version >= '3.13'", +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.6.2.post1" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9f/09/45b9b7a6d4e45c6bcb5bf61d19e3ab87df68e0601fa8c5293de3542546cc/anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c", size = 173422 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d", size = 90377 }, +] + +[[package]] +name = "bili-ticket-gt-python" +version = "0.2.7" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/41/21/2cba4545e796dd3f2544e36d2b84f1ba69e8b39d3a317e23677e51f4477e/bili_ticket_gt_python-0.2.7.tar.gz", hash = "sha256:f087bdfa18e971b1f7c8da26dacab2e69578293207a30da58f50f1ef3d5c9c7e", size = 261373 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e9/12/6a2df55e98f8ebf7f983a892f0083e90ab8f2b65640c9002e461067aa481/bili_ticket_gt_python-0.2.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:000198cc643b0a8358711006662d6207bfbe2a8b53a26bc61bfa51c7a8429576", size = 87622391 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ce/a0/8f531e5fcab92936f71cf1133e08aaaf3bd3fa8bb51409a6e4611bd0935c/bili_ticket_gt_python-0.2.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c17222e1b454e196c3a58795640b1d48519f65036780e5776221f0762902f49", size = 86557330 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7f/b5/03b7850c36b21c4161a4dd4cae2f22bb48f29596f9903ea0337b8e943edb/bili_ticket_gt_python-0.2.7-cp312-cp312-manylinux_2_35_x86_64.whl", hash = "sha256:638aff60325d5294d7ee375abf4f490b9c4492c5af27dab6954f00804ba7b614", size = 93546997 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/62/9d/5bfd2a1af11983f7c3ae99b2ff6cb2f2d8cb7df68c87ba9cdb55e5934841/bili_ticket_gt_python-0.2.7-cp312-none-win_amd64.whl", hash = "sha256:0a24bf2b567f5814eb8a699faf29a142a39c98f9078bfef11efd8a598b565b45", size = 85581487 }, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "coloredlogs" +version = "15.0.1" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "humanfriendly" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018 }, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1f/f3/01fdf26701a26f4b4dbc337a26883ad5bccaa6f1bbbdd29cd89e22f18a1c/cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", size = 6225303 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a3/01/4896f3d1b392025d4fcbecf40fdea92d3df8662123f6835d0af828d148fd/cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", size = 3760905 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0a/be/f9a1f673f0ed4b7f6c643164e513dbad28dd4f2dcdf5715004f172ef24b6/cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", size = 3977271 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4e/49/80c3a7b5514d1b416d7350830e8c422a4d667b6d9b16a9392ebfd4a5388a/cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", size = 3746606 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0e/16/a28ddf78ac6e7e3f25ebcef69ab15c2c6be5ff9743dd0709a69a4f968472/cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", size = 3986484 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/01/f5/69ae8da70c19864a32b0315049866c4d411cce423ec169993d0434218762/cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", size = 3852131 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fd/db/e74911d95c040f9afd3612b1f732e52b3e517cb80de8bf183be0b7d413c6/cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", size = 4075647 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/56/48/7b6b190f1462818b324e674fa20d1d5ef3e24f2328675b9b16189cbf0b3c/cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", size = 2623873 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/eb/b1/0ebff61a004f7f89e7b65ca95f2f2375679d43d0290672f7713ee3162aff/cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", size = 3068039 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/30/d5/c8b32c047e2e81dd172138f772e81d852c51f0f2ad2ae8a24f1122e9e9a7/cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", size = 6222984 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", size = 3762968 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", size = 3977754 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", size = 3749458 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", size = 3988220 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", size = 3853898 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", size = 4076592 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/81/1e/ffcc41b3cebd64ca90b28fd58141c5f68c83d48563c88333ab660e002cd3/cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", size = 2623145 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/87/5c/3dab83cc4aba1f4b0e733e3f0c3e7d4386440d660ba5b1e3ff995feb734d/cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", size = 3068026 }, +] + +[[package]] +name = "fastapi" +version = "0.115.4" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a9/db/5781f19bd30745885e0737ff3fdd4e63e7bc691710f9da691128bb0dc73b/fastapi-0.115.4.tar.gz", hash = "sha256:db653475586b091cb8b2fec2ac54a680ac6a158e07406e1abae31679e8826349", size = 300737 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/99/f6/af0d1f58f86002be0cf1e2665cdd6f7a4a71cdc8a7a9438cdc9e3b5375fe/fastapi-0.115.4-py3-none-any.whl", hash = "sha256:0b504a063ffb3cf96a5e27dc1bc32c80ca743a2528574f9cdc77daa2d31b4742", size = 94732 }, +] + +[[package]] +name = "flatbuffers" +version = "24.3.25" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a9/74/2df95ef84b214d2bee0886d572775a6f38793f5ca6d7630c3239c91104ac/flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4", size = 22139 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/41/f0/7e988a019bc54b2dbd0ad4182ef2d53488bb02e58694cd79d61369e85900/flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812", size = 26784 }, +] + +[[package]] +name = "geetestbypass" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "bili-ticket-gt-python" }, + { name = "cryptography" }, + { name = "fastapi" }, + { name = "httpx" }, + { name = "numpy" }, + { name = "onnxruntime" }, + { name = "persica" }, + { name = "pillow" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "python-multipart" }, + { name = "starlette" }, + { name = "uvicorn" }, +] + +[package.metadata] +requires-dist = [ + { name = "bili-ticket-gt-python", specifier = ">=0.2.7" }, + { name = "cryptography", specifier = ">=43.0.3" }, + { name = "fastapi", specifier = ">=0.115.4" }, + { name = "httpx", specifier = ">=0.27.2" }, + { name = "numpy", specifier = ">=2.1.3" }, + { name = "onnxruntime", specifier = ">=1.20.0" }, + { name = "persica", specifier = ">=0.1.0a4" }, + { name = "pillow", specifier = ">=11.0.0" }, + { name = "pydantic", specifier = ">=2.9.2" }, + { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "python-multipart", specifier = ">=0.0.16" }, + { name = "starlette", specifier = ">=0.41.2" }, + { name = "uvicorn", specifier = ">=0.32.0" }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.6" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b6/44/ed0fa6a17845fb033bd885c03e842f08c1b9406c86a2e60ac1ae1b9206a6/httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f", size = 85180 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f", size = 78011 }, +] + +[[package]] +name = "httpx" +version = "0.27.2" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/82/08f8c936781f67d9e6b9eeb8a0c8b4e406136ea4c3d1f89a5db71d42e0e6/httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2", size = 144189 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 }, +] + +[[package]] +name = "humanfriendly" +version = "10.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "pyreadline3", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, +] + +[[package]] +name = "numpy" +version = "2.1.3" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/25/ca/1166b75c21abd1da445b97bf1fa2f14f423c6cfb4fc7c4ef31dccf9f6a94/numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", size = 20166090 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8a/f0/385eb9970309643cbca4fc6eebc8bb16e560de129c91258dfaa18498da8b/numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", size = 20849658 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/54/4a/765b4607f0fecbb239638d610d04ec0a0ded9b4951c56dc68cef79026abf/numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", size = 13492258 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bd/a7/2332679479c70b68dccbf4a8eb9c9b5ee383164b161bee9284ac141fbd33/numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", size = 5090249 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c1/67/4aa00316b3b981a822c7a239d3a8135be2a6945d1fd11d0efb25d361711a/numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", size = 6621704 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5e/da/1a429ae58b3b6c364eeec93bf044c532f2ff7b48a52e41050896cf15d5b1/numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", size = 13606089 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9e/3e/3757f304c704f2f0294a6b8340fcf2be244038be07da4cccf390fa678a9f/numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", size = 16043185 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/43/97/75329c28fea3113d00c8d2daf9bc5828d58d78ed661d8e05e234f86f0f6d/numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", size = 16410751 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ad/7a/442965e98b34e0ae9da319f075b387bcb9a1e0658276cc63adb8c9686f7b/numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", size = 14082705 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ac/b6/26108cf2cfa5c7e03fb969b595c93131eab4a399762b51ce9ebec2332e80/numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", size = 6239077 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a6/84/fa11dad3404b7634aaab50733581ce11e5350383311ea7a7010f464c0170/numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", size = 12566858 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4d/0b/620591441457e25f3404c8057eb924d04f161244cb8a3680d529419aa86e/numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", size = 20836263 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/45/e1/210b2d8b31ce9119145433e6ea78046e30771de3fe353f313b2778142f34/numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", size = 13507771 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/55/44/aa9ee3caee02fa5a45f2c3b95cafe59c44e4b278fbbf895a93e88b308555/numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", size = 5075805 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/d6/61de6e7e31915ba4d87bbe1ae859e83e6582ea14c6add07c8f7eefd8488f/numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", size = 6608380 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/3e/46/48bdf9b7241e317e6cf94276fe11ba673c06d1fdf115d8b4ebf616affd1a/numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", size = 13602451 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/70/50/73f9a5aa0810cdccda9c1d20be3cbe4a4d6ea6bfd6931464a44c95eef731/numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", size = 16039822 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ad/cd/098bc1d5a5bc5307cfc65ee9369d0ca658ed88fbd7307b0d49fab6ca5fa5/numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", size = 16411822 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/83/a2/7d4467a2a6d984549053b37945620209e702cf96a8bc658bc04bba13c9e2/numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", size = 14079598 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e9/6a/d64514dcecb2ee70bfdfad10c42b76cab657e7ee31944ff7a600f141d9e9/numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", size = 6236021 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bb/f9/12297ed8d8301a401e7d8eb6b418d32547f1d700ed3c038d325a605421a4/numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", size = 12560405 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a7/45/7f9244cd792e163b334e3a7f02dff1239d2890b6f37ebf9e82cbe17debc0/numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", size = 20859062 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b1/b4/a084218e7e92b506d634105b13e27a3a6645312b93e1c699cc9025adb0e1/numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", size = 13515839 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/27/45/58ed3f88028dcf80e6ea580311dc3edefdd94248f5770deb980500ef85dd/numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", size = 5116031 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/37/a8/eb689432eb977d83229094b58b0f53249d2209742f7de529c49d61a124a0/numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", size = 6629977 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/42/a3/5355ad51ac73c23334c7caaed01adadfda49544f646fcbfbb4331deb267b/numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", size = 13575951 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c4/70/ea9646d203104e647988cb7d7279f135257a6b7e3354ea6c56f8bafdb095/numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", size = 16022655 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/14/ce/7fc0612903e91ff9d0b3f2eda4e18ef9904814afcae5b0f08edb7f637883/numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", size = 16399902 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ef/62/1d3204313357591c913c32132a28f09a26357e33ea3c4e2fe81269e0dca1/numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", size = 14067180 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/24/d7/78a40ed1d80e23a774cb8a34ae8a9493ba1b4271dde96e56ccdbab1620ef/numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", size = 6291907 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/86/09/a5ab407bd7f5f5599e6a9261f964ace03a73e7c6928de906981c31c38082/numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", size = 12644098 }, +] + +[[package]] +name = "onnxruntime" +version = "1.20.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "coloredlogs" }, + { name = "flatbuffers" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "sympy" }, +] +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/f8/49/9e3373f4e43c67041ada8da99acef92e075440a4bf1cb0e3b4bcb9c09458/onnxruntime-1.20.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:97c2b91bfea063f9c3457422d28a336bfd2859001cd880645adfa7184e29dd79", size = 30990476 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8d/bd/4b15cfc8242577376ed8eb8f10239422945cfa7e52b89db487ceea912c3b/onnxruntime-1.20.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51e7b34e398089c4ed8d0f50722d7a64a4d5f11b38c4a42576458a03c6dbc72e", size = 11942243 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ba/db/7e65fcf45f5485193158999c194470f40be4bb6c82ec7e70401f78220dec/onnxruntime-1.20.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e259378ff2843321e0bf4552adcbee48822c91d77d42dde78b87dcdf10ad01f", size = 13313619 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/75/c1/0a89acee34b78b01010d8d88ea1ff86579dea58354b0109e3240498078f2/onnxruntime-1.20.0-cp312-cp312-win32.whl", hash = "sha256:428abc1f7d8eb425887e2b7726044f2af7b5a098359455e7d2d92343f04ad0ff", size = 9805406 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bc/27/2601f0e2bd5c8ae8ff73daa47895a5d9f552971304b3f3ecf9167f466a95/onnxruntime-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:d5f23cbfeb546e16ffea81c28d2e796a53197fdc6c92540648e2aa53a7c7a637", size = 11322309 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4e/df/142ba2a6c840d315ff08122c52a0670e63ff07b48eb016ec6fc890ad5791/onnxruntime-1.20.0-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:95b91126bc3e1754868da1d3d2d08a7a10279b8ff5cea5e34e92fbe3fd691dcf", size = 30990500 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7e/ba/0a144e819d027726bc340e40d6073e01b36031d77721dc9800ce045d8ede/onnxruntime-1.20.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d57c10d7729347d6663f32b3f569f33d69a95e150d37ff6af4be9b9ab1ffdc25", size = 11942350 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/84/df/d62303a3657bec4d6fc817dd05428278c13daaad7d99e5f0f70b7c098d0e/onnxruntime-1.20.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9c38735dac127d0eeb957ec312c8f1ae90ecae2779a55b2fa279aa7bd116cbd", size = 13315947 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/96/00/1740c6d5a6fed87dfb69388ec88b77ff5e453b745be0e65db0371e10bc50/onnxruntime-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:25514cec4ea251d492aa1e38a7395d8801e64a4c940a154aef84cfad97ae4628", size = 11322362 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/11/15/099b97c6ecbd4aeb66fb5b18b379d67b4162698c0c286cc5d2928984fd59/onnxruntime-1.20.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:640ad9ea72d322f0325a51544eddb54f4fa843c4348573c88a9cb44f46678f3f", size = 11942537 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ca/4f/d1d7642706ddce8c253255b52cf8a6fdb6d4aca171a7a476188039816b79/onnxruntime-1.20.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc4e7c10c98c1f407835448c26a7e14ebff3234f131e1fbc53bd9500c828df89", size = 13319499 }, +] + +[[package]] +name = "packaging" +version = "24.1" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, +] + +[[package]] +name = "persica" +version = "0.1.0a4" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "networkx" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a1/9c/48111a0a1cb86394d797ee749e77eb8b848020e04995eeeba2a357f9c678/persica-0.1.0a4.tar.gz", hash = "sha256:242221627ac40477d63980fa720c4876618ddac9d63ce3f83993971630dc072e", size = 12063 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d2/7e/441056a888432735e2adf782e7922b6aad602b0c7126f3576e40d20c386e/persica-0.1.0a4-py3-none-any.whl", hash = "sha256:d9537aa20e1814a68cc0286222906810cc907b93868ab2bd3585da640654509b", size = 15614 }, +] + +[[package]] +name = "pillow" +version = "11.0.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a5/26/0d95c04c868f6bdb0c447e3ee2de5564411845e36a858cfd63766bc7b563/pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", size = 46737780 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1c/a3/26e606ff0b2daaf120543e537311fa3ae2eb6bf061490e4fea51771540be/pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", size = 3147642 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4f/d5/1caabedd8863526a6cfa44ee7a833bd97f945dc1d56824d6d76e11731939/pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", size = 2978999 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d9/ff/5a45000826a1aa1ac6874b3ec5a856474821a1b59d838c4f6ce2ee518fe9/pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", size = 4196794 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9d/21/84c9f287d17180f26263b5f5c8fb201de0f88b1afddf8a2597a5c9fe787f/pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", size = 4300762 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/84/39/63fb87cd07cc541438b448b1fed467c4d687ad18aa786a7f8e67b255d1aa/pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9", size = 4210468 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7f/42/6e0f2c2d5c60f499aa29be14f860dd4539de322cd8fb84ee01553493fb4d/pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", size = 4381824 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/31/69/1ef0fb9d2f8d2d114db982b78ca4eeb9db9a29f7477821e160b8c1253f67/pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", size = 4296436 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/44/ea/dad2818c675c44f6012289a7c4f46068c548768bc6c7f4e8c4ae5bbbc811/pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", size = 4429714 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/af/3a/da80224a6eb15bba7a0dcb2346e2b686bb9bf98378c0b4353cd88e62b171/pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", size = 2249631 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/57/97/73f756c338c1d86bb802ee88c3cab015ad7ce4b838f8a24f16b676b1ac7c/pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", size = 2567533 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0b/30/2b61876e2722374558b871dfbfcbe4e406626d63f4f6ed92e9c8e24cac37/pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", size = 2254890 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/63/24/e2e15e392d00fcf4215907465d8ec2a2f23bcec1481a8ebe4ae760459995/pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", size = 3147300 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/43/72/92ad4afaa2afc233dc44184adff289c2e77e8cd916b3ddb72ac69495bda3/pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", size = 2978742 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9e/da/c8d69c5bc85d72a8523fe862f05ababdc52c0a755cfe3d362656bb86552b/pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", size = 4194349 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/cd/e8/686d0caeed6b998351d57796496a70185376ed9c8ec7d99e1d19ad591fc6/pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", size = 4298714 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ec/da/430015cec620d622f06854be67fd2f6721f52fc17fca8ac34b32e2d60739/pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", size = 4208514 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/44/ae/7e4f6662a9b1cb5f92b9cc9cab8321c381ffbee309210940e57432a4063a/pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", size = 4380055 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/74/d5/1a807779ac8a0eeed57f2b92a3c32ea1b696e6140c15bd42eaf908a261cd/pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", size = 4296751 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/38/8c/5fa3385163ee7080bc13026d59656267daaaaf3c728c233d530e2c2757c8/pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", size = 4430378 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ca/1d/ad9c14811133977ff87035bf426875b93097fb50af747793f013979facdb/pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", size = 2249588 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fb/01/3755ba287dac715e6afdb333cb1f6d69740a7475220b4637b5ce3d78cec2/pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", size = 2567509 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c0/98/2c7d727079b6be1aba82d195767d35fcc2d32204c7a5820f822df5330152/pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", size = 2254791 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/eb/38/998b04cc6f474e78b563716b20eecf42a2fa16a84589d23c8898e64b0ffd/pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", size = 3150854 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/13/8e/be23a96292113c6cb26b2aa3c8b3681ec62b44ed5c2bd0b258bd59503d3c/pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", size = 2982369 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/97/8a/3db4eaabb7a2ae8203cd3a332a005e4aba00067fc514aaaf3e9721be31f1/pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", size = 4333703 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/28/ac/629ffc84ff67b9228fe87a97272ab125bbd4dc462745f35f192d37b822f1/pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", size = 4412550 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d6/07/a505921d36bb2df6868806eaf56ef58699c16c388e378b0dcdb6e5b2fb36/pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", size = 4461038 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d6/b9/fb620dd47fc7cc9678af8f8bd8c772034ca4977237049287e99dda360b66/pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", size = 2253197 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/df/86/25dde85c06c89d7fc5db17940f07aae0a56ac69aa9ccb5eb0f09798862a8/pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", size = 2572169 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/51/85/9c33f2517add612e17f3381aee7c4072779130c634921a756c97bc29fb49/pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", size = 2256828 }, +] + +[[package]] +name = "protobuf" +version = "5.28.3" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/74/6e/e69eb906fddcb38f8530a12f4b410699972ab7ced4e21524ece9d546ac27/protobuf-5.28.3.tar.gz", hash = "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b", size = 422479 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d1/c5/05163fad52d7c43e124a545f1372d18266db36036377ad29de4271134a6a/protobuf-5.28.3-cp310-abi3-win32.whl", hash = "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24", size = 419624 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/9c/4c/4563ebe001ff30dca9d7ed12e471fa098d9759712980cde1fd03a3a44fb7/protobuf-5.28.3-cp310-abi3-win_amd64.whl", hash = "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868", size = 431464 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1c/f2/baf397f3dd1d3e4af7e3f5a0382b868d25ac068eefe1ebde05132333436c/protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687", size = 414743 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/85/50/cd61a358ba1601f40e7d38bcfba22e053f40ef2c50d55b55926aecc8fec7/protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584", size = 316511 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5d/ae/3257b09328c0b4e59535e497b0c7537d4954038bdd53a2f0d2f49d15a7c4/protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135", size = 316624 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ad/c3/2377c159e28ea89a91cf1ca223f827ae8deccb2c9c401e5ca233cd73002f/protobuf-5.28.3-py3-none-any.whl", hash = "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed", size = 169511 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.9.2" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/df/e4/ba44652d562cbf0bf320e0f3810206149c8a4e99cdbf66da82e97ab53a15/pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12", size = 434928 }, +] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/74/7b/8e315f80666194b354966ec84b7d567da77ad927ed6323db4006cf915f3f/pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231", size = 1856459 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/14/de/866bdce10ed808323d437612aca1ec9971b981e1c52e5e42ad9b8e17a6f6/pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee", size = 1770007 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/dc/69/8edd5c3cd48bb833a3f7ef9b81d7666ccddd3c9a635225214e044b6e8281/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87", size = 1790245 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/80/33/9c24334e3af796ce80d2274940aae38dd4e5676298b4398eff103a79e02d/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8", size = 1801260 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a5/6f/e9567fd90104b79b101ca9d120219644d3314962caa7948dd8b965e9f83e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327", size = 1996872 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/2d/ad/b5f0fe9e6cfee915dd144edbd10b6e9c9c9c9d7a56b69256d124b8ac682e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2", size = 2661617 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/06/c8/7d4b708f8d05a5cbfda3243aad468052c6e99de7d0937c9146c24d9f12e9/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36", size = 2071831 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/89/4d/3079d00c47f22c9a9a8220db088b309ad6e600a73d7a69473e3a8e5e3ea3/pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126", size = 1917453 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e9/88/9df5b7ce880a4703fcc2d76c8c2d8eb9f861f79d0c56f4b8f5f2607ccec8/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e", size = 1968793 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e3/b9/41f7efe80f6ce2ed3ee3c2dcfe10ab7adc1172f778cc9659509a79518c43/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24", size = 2116872 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/63/08/b59b7a92e03dd25554b0436554bf23e7c29abae7cce4b1c459cd92746811/pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84", size = 1738535 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/88/8d/479293e4d39ab409747926eec4329de5b7129beaedc3786eca070605d07f/pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9", size = 1917992 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ad/ef/16ee2df472bf0e419b6bc68c05bf0145c49247a1095e85cee1463c6a44a1/pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc", size = 1856143 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/da/fa/bc3dbb83605669a34a93308e297ab22be82dfb9dcf88c6cf4b4f264e0a42/pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd", size = 1770063 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/4e/48/e813f3bbd257a712303ebdf55c8dc46f9589ec74b384c9f652597df3288d/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05", size = 1790013 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b4/e0/56eda3a37929a1d297fcab1966db8c339023bcca0b64c5a84896db3fcc5c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d", size = 1801077 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/04/be/5e49376769bfbf82486da6c5c1683b891809365c20d7c7e52792ce4c71f3/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510", size = 1996782 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bc/24/e3ee6c04f1d58cc15f37bcc62f32c7478ff55142b7b3e6d42ea374ea427c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6", size = 2661375 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/c1/f8/11a9006de4e89d016b8de74ebb1db727dc100608bb1e6bbe9d56a3cbbcce/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b", size = 2071635 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/7c/45/bdce5779b59f468bdf262a5bc9eecbae87f271c51aef628d8c073b4b4b4c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327", size = 1916994 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d8/fa/c648308fe711ee1f88192cad6026ab4f925396d1293e8356de7e55be89b5/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6", size = 1968877 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/16/16/b805c74b35607d24d37103007f899abc4880923b04929547ae68d478b7f4/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f", size = 2116814 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d1/58/5305e723d9fcdf1c5a655e6a4cc2a07128bf644ff4b1d98daf7a9dbf57da/pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769", size = 1738360 }, + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a5/ae/e14b0ff8b3f48e02394d8acd911376b7b66e164535687ef7dc24ea03072f/pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5", size = 1919411 }, +] + +[[package]] +name = "pyreadline3" +version = "3.5.4" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "python-multipart" +version = "0.0.17" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/40/22/edea41c2d4a22e666c0c7db7acdcbf7bc8c1c1f7d3b3ca246ec982fec612/python_multipart-0.0.17.tar.gz", hash = "sha256:41330d831cae6e2f22902704ead2826ea038d0419530eadff3ea80175aec5538", size = 36452 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/b4/fb/275137a799169392f1fa88fff2be92f16eee38e982720a8aaadefc4a36b2/python_multipart-0.0.17-py3-none-any.whl", hash = "sha256:15dc4f487e0a9476cc1201261188ee0940165cffc94429b6fc565c4d3045cb5d", size = 24453 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "starlette" +version = "0.41.2" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/3e/da/1fb4bdb72ae12b834becd7e1e7e47001d32f91ec0ce8d7bc1b618d9f0bd9/starlette-0.41.2.tar.gz", hash = "sha256:9834fd799d1a87fd346deb76158668cfa0b0d56f85caefe8268e2d97c3468b62", size = 2573867 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/54/43/f185bfd0ca1d213beb4293bed51d92254df23d8ceaf6c0e17146d508a776/starlette-0.41.2-py3-none-any.whl", hash = "sha256:fbc189474b4731cf30fcef52f18a8d070e3f3b46c6a04c97579e85e6ffca942d", size = 73259 }, +] + +[[package]] +name = "sympy" +version = "1.13.3" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/11/8a/5a7fd6284fa8caac23a26c9ddf9c30485a48169344b4bd3b0f02fef1890f/sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9", size = 7533196 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73", size = 6189483 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "uvicorn" +version = "0.32.0" +source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/e0/fc/1d785078eefd6945f3e5bab5c076e4230698046231eb0f3747bc5c8fa992/uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e", size = 77564 } +wheels = [ + { url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/eb/14/78bd0e95dd2444b6caacbca2b730671d4295ccb628ef58b81bee903629df/uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82", size = 63723 }, +]