From f29611f66c1292953b0887d3b57d73ef68ad981f Mon Sep 17 00:00:00 2001 From: flow2000 <1982989137@qq.com> Date: Sat, 24 Dec 2022 12:52:18 +0800 Subject: [PATCH] init --- .gitignore | 1 + Dockerfile | 9 + LICENSE | 674 +++++++++++++ README.md | 27 + api/FlowResponse.py | 17 + api/main.py | 127 +++ bili_api/bili_api.py | 29 + favicon.svg | 1 + index.html | 87 ++ index.js | 131 +++ news.css | 2129 ++++++++++++++++++++++++++++++++++++++++ requirements.txt | 5 + sixty_api/sixty_api.py | 42 + vercel.json | 30 + weibo_api/weibo_api.py | 51 + 15 files changed, 3360 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/FlowResponse.py create mode 100644 api/main.py create mode 100644 bili_api/bili_api.py create mode 100644 favicon.svg create mode 100644 index.html create mode 100644 index.js create mode 100644 news.css create mode 100644 requirements.txt create mode 100644 sixty_api/sixty_api.py create mode 100644 vercel.json create mode 100644 weibo_api/weibo_api.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..efb0618 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/__pycache__/* \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..81b6292 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.8.5 + +COPY . . + +RUN pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com + +EXPOSE 8888 + +CMD ["python", "api/main.py"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 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 General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + 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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + 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 GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7293496 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# 每日早报 + +![news](https://socialify.git.ci/flow2000/news/image?description=1&descriptionEditable=60%E7%A7%92%E8%AF%BB%E6%87%82%E4%B8%96%E7%95%8C%EF%BC%8C%E6%94%AF%E6%8C%81%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2%EF%BC%8C%E5%BF%AB%E9%80%9F%E7%94%9F%E6%88%90%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE&font=Inter&language=1&logo=https%3A%2F%2Fnews.panghai.top%2Ffavicon.svg&name=1&owner=1&pattern=Formal%20Invitation&stargazers=1&theme=Light) + +#### 简介 + +60秒读懂世界! + +#### Vercel 一键部署(推荐) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/flow2000/news) + +#### Docker 一键部署 + +```markdown +docker run -itd --name=news --restart=always -p 9134:8888 flow2000/news +``` + +#### API 说明 + +GET:`https://news.panghai.top/60s` + +##### 请求参数 + +| 参数名 | 位置 | 类型 | 必填 | 示例值 |说明 | +| :--------------- | :---- | :----- | :--: | :--------------------- | :--------------------- | +| `offset` | `query` | `int` | 否 | `0` |说明:`0` 为今天,`1` 为昨天,依次类推 | + diff --git a/api/FlowResponse.py b/api/FlowResponse.py new file mode 100644 index 0000000..fa052aa --- /dev/null +++ b/api/FlowResponse.py @@ -0,0 +1,17 @@ +from fastapi.responses import JSONResponse + +def success(msg="操作成功",data=None): + res_json = {} + res_json['code']=200 + res_json['msg']=msg + if data!=None: + res_json['data']=data + return JSONResponse(status_code=200, content=res_json) + +def error(msg="操作失败",data=None): + res_json = {} + res_json['code']=500 + res_json['msg']=msg + if data!=None: + res_json['data']=data + return JSONResponse(status_code=500, content=res_json) diff --git a/api/main.py b/api/main.py new file mode 100644 index 0000000..9b3e271 --- /dev/null +++ b/api/main.py @@ -0,0 +1,127 @@ +# -*- coding:utf-8 -*- +# @Author: flow2000 +import requests +import json +import random +import sys +import os +import time + +from fastapi import FastAPI,File, UploadFile, Header, Depends, HTTPException +from fastapi.responses import StreamingResponse +from fastapi.responses import RedirectResponse +from fastapi.responses import HTMLResponse +from fastapi.middleware.cors import CORSMiddleware +import uvicorn +from colorama import init +init(autoreset=True) + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append(BASE_DIR) + +from weibo_api import weibo_api +from bili_api import bili_api +from sixty_api import sixty_api +from api import FlowResponse + +VERSION="1.0.0" + +app = FastAPI() + +# 设置CORS +origins = [ + "*" +] +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +@app.get("/version",tags=["VERSION"], summary="获取版本信息") +async def index(): + ''' + 响应字段说明: + - code:状态码 + - msg:部署信息 + - current_version:当前版本 + - latest_version:最新版本 + ''' + latest_version="" + try: + latest_version=requests.get('https://static.panghai.top/txt/version/news.txt',timeout=3).text + except Exception as e: + print(e) + return FlowResponse.error(msg="NEWSAPI获取不到最新版本,但仍可使用,请联系:https://github.com/flow2000/news",data={"current_version":VERSION}) + data={ + "current_version":VERSION, + "latest_version":latest_version + } + return FlowResponse.success(msg="news部署成功,查看接口文档:https://news.panghai.top/docs",data=data) + +async def fetch(session, url): + async with session.get(url, verify_ssl=False) as response: + return await response.text() + +@app.get("/weibo",tags=["微博热搜API"], summary="获取热搜json数据") +async def weibo(): + ''' + 微博热搜API + ''' + res=weibo_api.get_topic() + if res!=None: + return FlowResponse.success(data=res) + else: + return FlowResponse.error('系统发生错误') + +@app.get("/bili",tags=["B站热搜API"], summary="获取热搜json数据") +async def bili(): + ''' + B站热搜API + ''' + res=bili_api.get_topic() + if res!=None: + return FlowResponse.success(data=res) + else: + return FlowResponse.error('系统发生错误') + +@app.get("/60s",tags=["60秒新闻API"], summary="获取今日新闻json数据") +async def sixty(offset: int = 0): + ''' + 请求字段说明: + - offset:偏移量(可选参数:0,1,2,3),默认0表示今天,1表示昨天,2表示前天,3表示大前天。 + ''' + res=sixty_api.get_topic(offset) + if res!=None: + return FlowResponse.success(data=res) + else: + return FlowResponse.error('系统发生错误') + +def iterfile(file_path): + with open(file_path, "r", encoding='utf-8') as file_like: + yield from file_like + +@app.get("/",tags=["静态资源"], summary="首页", response_class=HTMLResponse) +async def index(): + res='' + with open(os.getcwd()+'/index.html', "r", encoding='utf-8') as f: + res=f.read() + f.close() + return res + +@app.get("/index.js",tags=["静态资源"], summary="js") +async def js(): + return StreamingResponse(iterfile(os.getcwd()+'/index.js'), media_type="application/javascript") + +@app.get("/news.css",tags=["静态资源"], summary="css") +async def css(): + return StreamingResponse(iterfile(os.getcwd()+'/news.css'), media_type="text/css") + +@app.get("/favicon.svg",tags=["静态资源"], summary="图标") +async def favicon(): + return StreamingResponse(iterfile(os.getcwd()+'/favicon.svg'), media_type="image/svg+xml") + +if __name__ == "__main__": + uvicorn.run("main:app", host="0.0.0.0", port=8888) diff --git a/bili_api/bili_api.py b/bili_api/bili_api.py new file mode 100644 index 0000000..cec6e33 --- /dev/null +++ b/bili_api/bili_api.py @@ -0,0 +1,29 @@ +import requests +import json +import time +API='https://app.bilibili.com/x/v2/search/trending/ranking' +headers={ + 'Access-Control-Allow-Origin':'*', + 'Access-Control-Allow-Headers':'Content-Type', + 'Access-Control-Allow-Methods':'*', + 'Content-Type':'application/json;charset=utf-8' +} + +def get_topic(): + try: + dataList=[] + data=requests.get(API,headers=headers,timeout=8) + data=json.loads(data.text) + data_json=data['data']['list'] + for i in range(0,len(data_json)): + dic = { + 'title': data_json[i].get('show_name',''), + 'keyword': data_json[i].get('keyword',''), + 'url': 'https://search.bilibili.com/all?keyword=' + data_json[i].get('keyword',''), + 'icon': data_json[i].get('icon','') + } + dataList.append(dic) + return dataList + except Exception as e: + print(str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())),e) + return None \ No newline at end of file diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..00b6f4f --- /dev/null +++ b/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..fe68524 --- /dev/null +++ b/index.html @@ -0,0 +1,87 @@ + + + + + + + 每日60秒读懂世界! + + + + + + + + + + + + + +
+
+

+
每日早报
+

+
+
+
202X年X月X日 星期X 农历X月XX XXXX
+
+
+
+
    +
  1. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  2. +
  3. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  4. +
  5. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  6. +
  7. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  8. +
  9. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  10. +
  11. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  12. +
  13. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  14. +
  15. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  16. +
  17. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  18. +
  19. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  20. +
  21. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  22. +
  23. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  24. +
  25. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  26. +
  27. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  28. +
  29. 首都各界欢庆北京申办2008年奥运会成功,北京喜获2008年奥运会主办权,谱写奥运史上最壮丽的篇章。
  30. +
+
+ +
自强 民主 文明 和谐
+
+
+
+ + + + + + + + + +
+
+
+
+
+ +

Made by 心流 ✨.

+
+
+
+
+ + + + + \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..437375e --- /dev/null +++ b/index.js @@ -0,0 +1,131 @@ +//时间位移,0表示今天,1表示昨天,以此类推 +let offset = 0 +//获取新闻API,可根据部署域名更换 +let NEWS_API = "https://news.panghai.top/60s" + +//js入口 +get_day_news(offset); + +//获取新闻 +function get_day_news(offset) { + NProgress.start(); + axios.get(`${NEWS_API}?offset=${offset}`) + .then(function (response) { + load_day_news(response.data) + }) + .catch(function (error) { + Notiflix.Notify.failure(`当天新闻获取失败,尝试获取前一天 \uD83D\uDE1E`); + NProgress.done() + console.log(error); + }); +} + +//加载新闻 +function load_day_news(data) { + try { + NProgress.done(); + if (data['data']) { + data = data['data']; + // 加载标题 + if (data['time'].includes('月')) { + document.getElementById('date').innerHTML = data['time']; + } else { + document.getElementById('date').innerHTML = '暂无数据'; + } + // 显示通知 + try { + const date_now = str_to_date(data['time']); + Notiflix.Notify.success(`${date_now} 更新成功`, { + showOnlyTheLastOne: false, + }); + } catch (error) { + Notiflix.Notify.success(`更新失败`, { + showOnlyTheLastOne: false, + }); + } + // 加载weiyu + if (data['weiyu'].includes('【微语】')) { + document.getElementById('weiyu').innerHTML = data['weiyu'].replace("【微语】", ''); + } else { + load_yiyan() + } + // 清空原有的新闻 + document.getElementById('news').innerHTML = ''; + for (let i = 0; i < data['news'].length; i++) { + // 将其变成 li 并插入ol + const li = document.createElement('li'); + var n = data['news'][i]; + if (n[1] === '、') { + n = n.substring(2); + } else if (n[2] === '、') { + n = n.substring(3); + } + li.innerHTML = n; + // 插入新的 li + document.getElementById('news').appendChild(li); + } + } else { + Notiflix.Notify.failure(`加载新闻失败 \uD83D\uDE1E`); + } + } + catch (error) { + Notiflix.Notify.failure(`加载新闻失败 \uD83D\uDE1E`); + } +} + +// 打开新窗口 +function bing_click() { + window.open(document.getElementById('bing').src.split('_1920x1080.jpg')[0] + '_UHD.jpg'); +} + +//后一天 +function after() { + if (offset === 0) { + Notiflix.Notify.success('当前已经是最新的了'); + } else { + offset -= 1; + direction = 'before'; + get_day_news(offset); + } +} + +//前一天 +function before() { + if (offset === 4) { + Notiflix.Notify.warning('之后没有了'); + } else { + offset += 1; + direction = 'after'; + get_day_news(offset); + } +} + +//加载一言 +function load_yiyan() { + axios.get('https://v1.hitokoto.cn/?c=k') + .then(function (response) { + data = response.data + document.getElementById('weiyu').innerHTML = response.data['hitokoto']; + }) + .catch(function (error) { + Notiflix.Notify.failure(`获取一言失败 \uD83D\uDE1E`); + console.log(error); + }); +} + +//字符串格式的日期格式化'yyyy-mm-dd'或者'mm-dd' +function str_to_date(str) { + const dateRegex = /(\d{4})年?(\d{1,2})月(\d{1,2})日?/; + const matches = str.match(dateRegex); + if (matches) { + return `${matches[1]}-${matches[2]}-${matches[3]}`; + } else { + // 如果没有年份,则默认为今年 + const year = new Date().getFullYear(); + const matches = str.match(/(\d{1,2})月(\d{1,2})日?/); + if (matches) { + return `${year}-${matches[1]}-${matches[2]}`; + } + } + return str; +} \ No newline at end of file diff --git a/news.css b/news.css new file mode 100644 index 0000000..1b7089b --- /dev/null +++ b/news.css @@ -0,0 +1,2129 @@ +html { + overflow-x: initial !important; +} +:root { + --bg-color: #ffffff; + --text-color: #333333; + --select-text-bg-color: #b5d6fc; + --select-text-font-color: auto; + --monospace: "Lucida Console", Consolas, "Courier", monospace; + --title-bar-height: 20px; +} +html { + font-size: 14px; + background-color: var(--bg-color); + color: var(--text-color); + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; +} +body { + margin: 0px; + padding: 0px; + height: auto; + inset: 0px; + font-size: 1rem; + line-height: 1.42857; + overflow-x: hidden; + background: inherit; + tab-size: 4; +} +a.url { + word-break: break-all; +} +a:active, +a:hover { + outline: 0px; +} +.in-text-selection, +::selection { + text-shadow: none; + background: var(--select-text-bg-color); + color: var(--select-text-font-color); +} +#write { + margin: 0px auto; + height: auto; + width: inherit; + word-break: normal; + overflow-wrap: break-word; + position: relative; + white-space: normal; + overflow-x: visible; + padding-top: 36px; +} +#write.first-line-indent p { + text-indent: 2em; +} +#write.first-line-indent li p, +#write.first-line-indent p * { + text-indent: 0px; +} +#write.first-line-indent li { + margin-left: 2em; +} +.for-image #write { + padding-left: 8px; + padding-right: 8px; +} +body.typora-export { + padding-left: 30px; + padding-right: 30px; +} +.typora-export .footnote-line, +.typora-export li, +.typora-export p { + white-space: pre-wrap; +} +.typora-export .task-list-item input { + pointer-events: none; +} +@media screen and (max-width: 500px) { + body { + margin: 0rem auto !important; + } + #write { + margin: 0rem auto !important; + } + + body.typora-export { + padding-left: 0px; + padding-right: 0px; + } + #write { + padding-left: 20px; + padding-right: 20px; + } + .CodeMirror-sizer { + margin-left: 0px !important; + } + .CodeMirror-gutters { + display: none !important; + } +} +#write li > figure:last-child { + margin-bottom: 0.5rem; +} +#write ol, +#write ul { + position: relative; +} +img { + max-width: 100%; + vertical-align: middle; + image-orientation: from-image; +} +button, +input, +select, +textarea { + color: inherit; + font: inherit; +} +input[type="checkbox"], +input[type="radio"] { + line-height: normal; + padding: 0px; +} +*, +::after, +::before { + box-sizing: border-box; +} +#write h1, +#write h3, +#write h4, +#write h5, +#write h6, +#write p, +#write pre { + width: inherit; +} +#write h1, +#write p { + position: relative; +} +p { + line-height: inherit; +} +h1{ + break-after: avoid-page; + break-inside: avoid; + orphans: 4; +} +p { + orphans: 4; +} +h1 { + font-size: 2rem; +} +.md-math-block, +.md-rawblock, +h1, +p { + margin-top: 1rem; + margin-bottom: 1rem; +} +.hidden { + display: none; +} +.md-blockmeta { + color: rgb(204, 204, 204); + font-weight: 700; + font-style: italic; +} +a { + cursor: pointer; +} +sup.md-footnote { + padding: 2px 4px; + background-color: rgba(238, 238, 238, 0.7); + color: rgb(85, 85, 85); + border-radius: 4px; + cursor: pointer; +} +sup.md-footnote a, +sup.md-footnote a:hover { + color: inherit; + text-transform: inherit; + text-decoration: inherit; +} +#write input[type="checkbox"] { + cursor: pointer; + width: inherit; + height: inherit; +} +figure { + overflow-x: auto; + margin: 1.2em 0px; + max-width: calc(100% + 16px); + padding: 0px; +} +figure > table { + margin: 0px; +} +tr { + break-inside: avoid; + break-after: auto; +} +thead { + display: table-header-group; +} +table { + border-collapse: collapse; + border-spacing: 0px; + width: 100%; + overflow: auto; + break-inside: auto; + text-align: left; +} +table.md-table td { + min-width: 32px; +} +.CodeMirror-gutters { + border-right: 0px; + background-color: inherit; +} +.CodeMirror-linenumber { + user-select: none; +} +.CodeMirror { + text-align: left; +} +.CodeMirror-placeholder { + opacity: 0.3; +} +.CodeMirror pre { + padding: 0px 4px; +} +.CodeMirror-lines { + padding: 0px; +} +div.hr:focus { + cursor: none; +} +#write pre { + white-space: pre-wrap; +} +#write.fences-no-line-wrapping pre { + white-space: pre; +} +#write pre.ty-contain-cm { + white-space: normal; +} +li div { + padding-top: 0px; +} +blockquote { + margin: 1rem 0px; +} +li .mathjax-block, +li p { + margin: 0.5rem 0px; +} +li blockquote { + margin: 1rem 0px; +} +li { + margin: 0px; + position: relative; +} +blockquote > :last-child { + margin-bottom: 0px; +} +blockquote > :first-child, +li > :first-child { + margin-top: 0px; +} +.footnotes-area { + color: rgb(136, 136, 136); + margin-top: 0.714rem; + padding-bottom: 0.143rem; + white-space: normal; +} +#write .footnote-line { + white-space: pre-wrap; +} +@media print { + body, + html { + border: 1px solid transparent; + height: 99%; + break-after: avoid; + break-before: avoid; + font-variant-ligatures: no-common-ligatures; + } + #write { + margin-top: 0px; + padding-top: 0px; + border-color: transparent !important; + } + .typora-export * { + -webkit-print-color-adjust: exact; + } + .typora-export #write { + break-after: avoid; + } + .typora-export #write::after { + height: 0px; + } + .is-mac table { + break-inside: avoid; + } + .typora-export-show-outline .typora-export-sidebar { + display: none; + } +} +.footnote-line { + margin-top: 0.714em; + font-size: 0.7em; +} +pre.md-meta-block { + font-size: 0.8rem; + min-height: 0.8rem; + white-space: pre-wrap; + background: rgb(204, 204, 204); + display: block; + overflow-x: hidden; +} +p > .md-image:only-child:not(.md-img-error) img, +p > img:only-child { + display: block; + margin: auto; +} +#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { + left: -2em; + position: relative; +} +p > .md-image:only-child { + display: inline-block; + width: 100%; +} +#write .MathJax_Display { + margin: 0.8em 0px 0px; +} +.md-math-block { + width: 100%; +} +.md-math-block:not(:empty)::after { + display: none; +} +.MathJax_ref { + fill: currentcolor; +} +[contenteditable="true"]:active, +[contenteditable="true"]:focus, +[contenteditable="false"]:active, +[contenteditable="false"]:focus { + outline: 0px; + box-shadow: none; +} +.md-task-list-item { + position: relative; + list-style-type: none; +} +.task-list-item.md-task-list-item { + padding-left: 0px; +} +.md-task-list-item > input { + position: absolute; + top: 0px; + left: 0px; + margin-left: -1.2em; + margin-top: calc(1em - 10px); + border: none; +} +.math { + font-size: 1rem; +} +.md-toc { + min-height: 3.58rem; + position: relative; + font-size: 0.9rem; + border-radius: 10px; +} +.md-toc-content { + position: relative; + margin-left: 0px; +} +.md-toc-content::after, +.md-toc::after { + display: none; +} +.md-toc-item { + display: block; + color: rgb(65, 131, 196); +} +.md-toc-item a { + text-decoration: none; +} +.md-toc-inner:hover { + text-decoration: underline; +} +.md-toc-inner { + display: inline-block; + cursor: pointer; +} +.md-toc-h1 .md-toc-inner { + margin-left: 0px; + font-weight: 700; +} +@media screen and (max-width: 48em) { + .md-toc-h3 .md-toc-inner { + margin-left: 3.5em; + } + .md-toc-h4 .md-toc-inner { + margin-left: 5em; + } + .md-toc-h5 .md-toc-inner { + margin-left: 6.5em; + } + .md-toc-h6 .md-toc-inner { + margin-left: 8em; + } +} +a.md-toc-inner { + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; +} +.footnote-line a:not(.reversefootnote) { + color: inherit; +} +.md-attr { + display: none; +} +.md-fn-count::after { + content: "."; +} +code, +pre, +samp, +tt { + font-family: var(--monospace); +} +.md-comment { + color: rgb(162, 127, 3); + opacity: 0.6; + font-family: var(--monospace); +} +.os-windows.monocolor-emoji .md-emoji { + font-family: "Segoe UI Symbol", sans-serif; +} +.md-diagram-panel > svg { + max-width: 100%; +} +.highlight td, +.highlight tr { + border: 0px; +} +@media screen and (max-width: 1024px) { + .typora-export-sidebar, + .typora-export-sidebar .outline-content { + width: 240px; + } +} +@media screen and (max-width: 800px) { + .typora-export-sidebar { + display: none; + } +} + +/* 防止用户自定义背景颜色对网页的影响,添加让用户可以自定义字体 */ +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-rendering: optimizelegibility; + -webkit-font-smoothing: initial; +} + +/* 如果你的项目仅支持 IE9+ | Chrome | Firefox 等,推荐在 中添加 .borderbox 这个 class */ +html.borderbox *, +html.borderbox *:before, +html.borderbox *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +/* 内外边距通常让各个浏览器样式的表现位置不同 */ +body, +dl, +dt, +dd, +li, +h1, +pre, +code, +form, +fieldset, +legend, +input, +textarea, +p, +blockquote, +th, +td, +hr, +button, +article, +aside, +details, +figcaption, +figure, +footer, +header, +menu, +nav, +section { + margin: 0; + padding: 0; +} + +/* 重设 HTML5 标签, IE 需要在 js 中 createElement(TAG) */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +menu, +nav, +section { + display: block; +} + +/* HTML5 媒体文件跟 img 保持一致 */ +audio, +canvas, +video { + display: inline-block; +} + +/* 要注意表单元素并不继承父级 font 的问题 */ +body, +button, +input, +select, +textarea { + font: 300 1em/1.8 PingFang SC, Lantinghei SC, Microsoft Yahei, + Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans-serif; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +/* 去掉各Table cell 的边距并让其边重合 */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* 去除默认边框 */ +fieldset, +img { + border: 0; +} + +/* 块/段落引用 */ +blockquote { + position: relative; + font-weight: 400; + padding-left: 1em; + margin: 1em 3em 1em 2em; +} + +@media only screen and (max-width: 640px) { + blockquote { + margin: 1em 0; + } +} + +/* Firefox 以外,元素没有下划线,需添加 */ +acronym, +abbr { + border-bottom: 1px dotted; + font-variant: normal; + text-decoration: none; +} + +/* 添加鼠标问号,进一步确保应用的语义是正确的(要知道,交互他们也有洁癖,如果你不去掉,那得多花点口舌) */ +abbr { + cursor: help; +} + +/* 一致的 del 样式 */ +del { + text-decoration: line-through; +} + +address, +caption, +cite, +code, +dfn, +em, +th, +var { + font-style: normal; + font-weight: 400; +} + +/* 对齐是排版最重要的因素, 别让什么都居中 */ +caption, +th { + text-align: left; +} + +q:before, +q:after { + content: ""; +} + +/* 统一上标和下标 */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; +} + +:root sub, +:root sup { + vertical-align: baseline; + /* for ie9 and other modern browsers */ +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* 让链接在 hover 状态下显示下划线 */ +a { + color: #1abc9c; +} + +a:hover { + text-decoration: underline; +} + +/* 默认不显示下划线,保持页面简洁 */ +ins, +a { + text-decoration: none; +} + +/* 专名号:虽然 u 已经重回 html5 Draft,但在所有浏览器中都是可以使用的, + * 要做到更好,向后兼容的话,添加 class="typo-u" 来显示专名号 + * 关于 标签:http:https://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-u-element + * 被放弃的是 4,之前一直搞错 http:https://www.w3.org/TR/html401/appendix/changes.html#idx-deprecated + * 一篇关于 标签的很好文章:http:https://html5doctor.com/u-element/ + */ +u, +.typo-u { + text-decoration: underline; +} + +/* 标记,类似于手写的荧光笔的作用 */ +mark { + background: #fffdd1; + padding: 2px; + margin: 0 5px; +} + +/* 代码片断 */ +pre, +code, +pre tt { + font-family: Courier, "Courier New", monospace; +} + +pre { + background: #f8f8f8; + border: 1px solid #ddd; + padding: 1em 1.5em; + display: block; + -webkit-overflow-scrolling: touch; +} + +/* 一致化 horizontal rule */ +hr { + border: none; + border-bottom: 1px solid #cfcfcf; + margin-bottom: 0.8em; + height: 10px; +} + +/* 底部印刷体、版本等标记 */ +small, +.typo-small, +/* 图片说明 */ +figcaption { + font-size: 0.9em; + color: #888; +} + +strong, +b { + font-weight: bold; +} + +/* 可拖动文件添加拖动手势 */ +[draggable] { + cursor: move; +} + +h1{ + font-family: PingFang SC, Verdana, Helvetica Neue, Microsoft Yahei, + Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans-serif; + font-weight: 100; + line-height: 1.35; +} + +/* Responsive images */ +img { + max-width: 100%; +} + +/* 防止用户自定义背景颜色对网页的影响,添加让用户可以自定义字体 */ +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-rendering: optimizelegibility; + -webkit-font-smoothing: initial; +} + +/* 如果你的项目仅支持 IE9+ | Chrome | Firefox 等,推荐在 中添加 .borderbox 这个 class */ +html.borderbox *, +html.borderbox *:before, +html.borderbox *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +/* 内外边距通常让各个浏览器样式的表现位置不同 */ +body, +dl, +dt, +dd, +li, +h1, +pre, +code, +form, +fieldset, +legend, +input, +textarea, +p, +blockquote, +th, +td, +hr, +button, +article, +aside, +details, +figcaption, +figure, +footer, +header, +menu, +nav, +section { + margin: 0; + padding: 0; +} + +/* 重设 HTML5 标签, IE 需要在 js 中 createElement(TAG) */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +menu, +nav, +section { + display: block; +} + +/* HTML5 媒体文件跟 img 保持一致 */ +audio, +canvas, +video { + display: inline-block; +} + +/* 要注意表单元素并不继承父级 font 的问题 */ +body, +button, +input, +select, +textarea { + font: 300 1em/1.8 PingFang SC, Lantinghei SC, Microsoft Yahei, + Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans-serif; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +/* 去掉各Table cell 的边距并让其边重合 */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* 去除默认边框 */ +fieldset, +img { + border: 0; +} + +/* 块/段落引用 */ +blockquote { + position: relative; + font-weight: 400; + padding-left: 1em; + margin: 1em 3em 1em 2em; +} + +@media only screen and (max-width: 640px) { + blockquote { + margin: 1em 0; + } +} + +/* Firefox 以外,元素没有下划线,需添加 */ +acronym, +abbr { + border-bottom: 1px dotted; + font-variant: normal; + text-decoration: none; +} + +/* 添加鼠标问号,进一步确保应用的语义是正确的(要知道,交互他们也有洁癖,如果你不去掉,那得多花点口舌) */ +abbr { + cursor: help; +} + +/* 一致的 del 样式 */ +del { + text-decoration: line-through; +} + +address, +caption, +cite, +code, +dfn, +em, +th, +var { + font-style: normal; + font-weight: 400; +} + +/* 对齐是排版最重要的因素, 别让什么都居中 */ +caption, +th { + text-align: left; +} + +q:before, +q:after { + content: ""; +} + +/* 统一上标和下标 */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; +} + +:root sub, +:root sup { + vertical-align: baseline; + /* for ie9 and other modern browsers */ +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* 让链接在 hover 状态下显示下划线 */ +a { + color: #1abc9c; +} + +a:hover { + text-decoration: underline; +} + +/* 默认不显示下划线,保持页面简洁 */ +ins, +a { + text-decoration: none; +} + +/* 专名号:虽然 u 已经重回 html5 Draft,但在所有浏览器中都是可以使用的, + * 要做到更好,向后兼容的话,添加 class="typo-u" 来显示专名号 + * 关于 标签:http:https://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-u-element + * 被放弃的是 4,之前一直搞错 http:https://www.w3.org/TR/html401/appendix/changes.html#idx-deprecated + * 一篇关于 标签的很好文章:http:https://html5doctor.com/u-element/ + */ +u, +.typo-u { + text-decoration: underline; +} + +/* 标记,类似于手写的荧光笔的作用 */ +mark { + background: #fffdd1; + padding: 2px; + margin: 0 5px; +} + +pre { + background: #f8f8f8; + border: 1px solid #ddd; + padding: 1em 1.5em; + display: block; + -webkit-overflow-scrolling: touch; +} + +/* 一致化 horizontal rule */ +hr { + border: none; + border-bottom: 1px solid #cfcfcf; + margin-bottom: 0.8em; + height: 10px; +} + +/* 底部印刷体、版本等标记 */ +small, +.typo-small, +/* 图片说明 */ +figcaption { + font-size: 0.9em; + color: #888; +} + +strong, +b { + font-weight: bold; +} + +/* 可拖动文件添加拖动手势 */ +[draggable] { + cursor: move; +} + +h1{ + font-family: PingFang SC, Verdana, Helvetica Neue, Microsoft Yahei, + Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans-serif; + font-weight: 100; + line-height: 1.35; +} + +/* Responsive images */ +img { + max-width: 100%; +} +.active-tab-files .info-panel-tab, +.active-tab-outline .info-panel-tab { + color: var(--active-file-text-color); +} + +.file-list-item:hover { + background: var(--item-hover-bg-color); + color: var(--item-hover-text-color); +} + +.file-node-content:hover { + background: var(--active-file-bg-color); + color: var(--active-file-text-color); +} + +.ty-search-item-line { + font-family: var(--font-family); +} + +.ty-file-search-match-text { + background: var(--bg-code-block); +} + +/*搜索*/ +#file-library-search-input { + padding-left: 0.4em; +} + +.dropdown-menu, +.context-menu.dropdown-menu > li > a:focus { + background-color: var(--active-bg); +} + +.context-menu.dropdown-menu > .active > a, +.context-menu.dropdown-menu > li > a:hover, +.menu-style-btn.active { + color: var(--primary-color); +} + +/* 源代码模式 */ +#typora-source { + background: var(--bg-color); + color: var(--color-code); + line-height: 1.5rem; +} + +/* notification */ +.ty-show-notification content, +.ty-show-notification content #typora-source { + top: 0px; +} + +#md-notification { + border-radius: 5px; + background: transparent !important; +} + +#md-notification::after { + content: ""; + display: block; + position: absolute; + left: 0; + z-index: -111; + backdrop-filter: blur(5px); + top: 0; + width: 100%; + min-height: 5rem; + -webkit-font-smoothing: antialiased; + transition: opacity 1.2s cubic-bezier(0.77, 0, 0.175, 1); +} + +#write .md-rawblock-on-edit { + box-shadow: var(--shadow); +} + +@media screen and (max-width: 600px) { + #write { + line-height: 1.5rem; + } + + #write p + p { + margin: 1rem auto; + } + + #write pre.md-fences { + padding: 1rem; + box-shadow: none; + } + + #write blockquote { + background: var(--bg-quote); + padding: 1rem; + border-radius: 0; + box-shadow: none; + } + + #write blockquote blockquote { + padding-left: 1rem; + margin: 1rem auto; + } + + #write blockquote em, + #write blockquote strong, + #write blockquote mark { + font-family: var(--font-quota); + } + + #write blockquote h6:first-child:before { + left: -1rem; + } + + #write blockquote h6:first-child span:first-child:before { + left: -30px; + } +} + +@media screen and (max-width: 800px) { + .md-toc { + padding: 0; + margin: 0 !important; + max-width: 100%; + } + + .md-toc::before { + display: block; + position: relative; + left: 0 !important; + margin-top: 4rem; + margin-bottom: 0; + padding: 0; + background: none; + } + + .md-toc .md-toc-content { + top: 0; + left: 0; + } + + .md-toc .md-toc-content .md-toc-h1 { + margin-top: 2rem; + } +} + +@media screen and (max-width: 1000px) { + #write { + margin: 0rem auto !important; + } + body { + margin: 0rem auto !important; + } + + footer.ty-footer { + background: var(--color-bg); + border-top: 1px solid var(--color-bg); + } +} + +@media screen and (min-width: 1300px) { + #write { + box-shadow: var(--base-shadow); + border-radius: 5px; + border: 1px solid rgba(0, 0, 0, 0.2); + } +} + +@media print { + html { + margin: 0; + padding: 1cm; + } + + #write { + margin: 0; + padding: 0; + } + + #write * { + -webkit-text-stroke: 0px; + } +} +@media print { + html, + body, + content, + #write { + margin: 0; + padding: 0; + } + + #write * { + -webkit-text-stroke: 0px; + } +} +:root { + --mermaid-sequence-numbers: on; + -–mermaid-flowchart-curve: basis; + --panel-border-color: var(--theme-color-weak) !important; + --mermaid-font-family: var(--font-mono) !important; +} + +.md-diagram-panel-preview * { + font-family: var(--font-mono) !important; +} + +/* 箭头 */ +.arrowheadPath, +.marker { + fill: var(--theme-color-weak) !important; +} + +.edgePath .path, +.marker.cross, +line, +.flowchart-link { + stroke: var(--theme-color-weak) !important; +} + +/* 文本 */ +.label, +.cluster-label { + color: var(--color-text) !important; +} +@import url(); + +#write { + background: var(--bg-write); + max-width: 914px; + /* min-width: 400px; */ + -webkit-font-smoothing: antialiased; + min-height: calc(100vh - 6em); + margin: 2rem auto; + padding: 2rem; +} + +#write h1 *{ + color: var(--color-title) !important; + text-decoration: none !important; + border-bottom: none !important; +} + +#write h1{ + text-transform: uppercase; +} + +#write h1 { + background: var(--bg-title-h1); + color: var(--color-title-h1); + font: var(--font-title-h1); + /* margin: var(--margin-h1); */ +} + +#write h1::after { + content: ""; + display: block; + border-bottom: 1px solid var(--theme-color-weak); + position: relative; + top: 1rem; + width: 100%; +} + +p + p { + margin: var(--margin-text); + line-height: var(--line-height); +} + +ul, +ol { + margin: var(--base-margin); + padding-left: 2rem; +} + +/* blockquote setting */ + +blockquote { + background: var(--bg-quote); + font: var(--font-quote); + color: var(--color-quote); + font-size: 1.2rem; + box-shadow: var(--block-shadow); + border: none; +} + +blockquote blockquote { + padding: 0; + padding-left: 1rem; + border-left: var(--base-borderl); + border-radius: 0; + box-shadow: none; +} + +blockquote pre.md-fences { + box-shadow: none; +} + +blockquote p { + font: var(--font-quote); + color: var(--color-quote); + line-height: var(--line-height); +} + +blockquote h6 { + padding-left: 1rem; + margin: 1rem auto !important; +} + +blockquote h6:before { + top: -15px; + content: "" !important; + position: absolute; + width: 4px; + height: 60px; + background: var(--theme-color); + left: -15px; +} + +blockquote h6 span:first-child:before { + content: "!"; + position: absolute; + left: -25px; + top: 2px; + width: 25px; + height: 25px; + border-radius: 25px; + background: var(--theme-color); + display: block; + text-align: center; + font-family: Poppins, sans-serif; + color: white; + font-size: large; + font-weight: 600; +} + +blockquote h6 span[md-inline="strong"]:first-child:before { + content: "i"; + z-index: 1; + background: var(--opt-theme-color); +} + +/* list setting */ + +ul li::marker, +ol li::marker { + color: var(--theme-color); +} + +ul { + list-style: disc; +} + +ul ul { + list-style: circle; +} + +ol { + list-style: decimal-leading-zero; +} + +ol ol { + list-style: lower-roman; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-top: 0.5rem; +} + +#write img { + padding: 0; + box-shadow: var(--img-shadow); +} + +img[alt|="no-shadow"] { + box-shadow: none !important; +} + +img[alt|="normal"] { + margin: 0 !important; + box-shadow: none !important; +} + +hr { + border: none; + border-bottom: var(--base-border); + margin: 3rem auto; + height: 1px; + width: 50%; +} + +hr .pb { + page-break-after: always; + border-bottom: none; +} + +/* table setting */ + +figure.md-table-fig { + margin-top: 28px; +} + +figure > table { + width: 98%; +} + +table th, +table td { + padding: 0.5rem 1rem; +} + +table thead tr { + background: var(--bg-thead) !important; +} + +table th { + font-weight: 800; +} + +table thead tr:hover { + background: var(--bg-thead-hover) !important; + color: var(--color-thead-hover); +} + +table caption { + border-bottom: none; +} + +table tr { + background: var(--bg-tbody); + color: var(--tbody-color); + border: 1px solid var(--bg-thead); +} + +table tr:nth-child(2n) { + background: var(--bg-tbody-opt); + color: var(--tbody-color-opt); +} + +table tr:hover { + background: var(--bg-tbody-hover); + color: var(--color-tbody-hover); +} + +table tr, +#write table td, +#write table th { + border: 1px solid var(--theme-color-weak); +} + +/*表格大小设置输入框(数字居中)*/ +#write .md-grid-board-wrap input { + text-align: center !important; +} + +/*表格大小设置面板中的方框*/ +#write .md-grid-board.md-reset > tbody > tr > td > a { + border: 1px solid; + margin: 0px; +} + +sup.md-footnote { + padding: var(--base-padding); + color: var(--color-footnote); + cursor: pointer; + font-size: 0.75rem; +} + +:root { + --theme-color: #965221; + --theme-color-weak: #1dbbc9; + --color-text: #000; + --text-color: var(--color-text); + --color-em: #000; + --color-strong: #000; + --color-weak: #111; + --color-weakest: #333; + --color-title: var(--color-em); + --color-title-h1: var(--color-em); + --color-quote: var(--color-weak); + --color-code: var(--color-weak); + --color-link: var(--color-weak); + --color-italic: var(--color-em); + --color-strong: var(--color-strong); + --color-highlight: var(--color-text); + --color-strike: var(--color-weakest); + --color-footnote: var(--color-weakest); + --thead-color: var(--color-em); + --tbody-color-opt: var(--color-text); + --tbody-color: var(--color-text); + --color-thead-hover: var(--theme-color); + --color-tbody-hover: var(--theme-color); + --link-hover-color: #cc853d; + --link-hover-bg: none; + /* background setting */ + --bg-contents: #fff; + --bg-write: #fff; + --bg-color: var(--bg-contents); + --bg-title: none; + --bg-title-h1: none; + --bg-quote: #fff; + --bg-code: #fff; + --bg-code-block: #fff; + --bg-link: none; + --bg-italic: none; + --bg-strong: none; + --bg-highlight: #f2ff80; + --bg-strike: none; + --bg-footnote: none; + --bg-thead: #fff; + --bg-tbody-opt: #f6f7fa; + --bg-tbody: #fff; + --bg-thead-hover: var(--bg-contents); + --bg-tbody-hover: var(--bg-contents); + --focus-cont-bg: hsl(0, 0%, 95%); + --focus-para-bg: hsl(0, 0%, 100%); + --window-border: 1px solid #333; + --base-border: 1px solid #333; + --base-borderl: 4px solid var(--theme-color); + --base-borderb: 1px dashed var(--theme-color); + --opt-borderb: 1px dashed var(--theme-color); + /* box-shadow */ + --text-shadow: none; + --block-shadow: none; + --img-shadow: none; + --block-shadow-opt: var(--block-shadow); + --block-shadow-weak: none; + --block-shadow-strong: none; + /* margin setting:top;right;bottom;left */ + --margin-h1: 2rem auto 1rem; + --margin-text: 0.5rem 0rem; + --margin-block: 1rem auto; + /* padding-setting */ + --padding-text: 0px; + --padding-block: 0.5rem; + --base-margin: 0.5rem auto; + --base-padding: 0px; + --opt-padding: 0.5rem; + --font-weight: 400; + --font-size: 0.95rem; + --kai-size: 1.05rem; + --ol-size: 0.95rem; + --line-height: 2rem; + --font-title-h1: 900 2.2rem/3.6rem "HarmonyOS_Regular"; + --font-quote: 400 1.05rem/2.1rem var(--font-quota-cn); + --font-code: 400 0.95rem var(--font-mono); + --font-footnote: 400 0.875rem/1.75rem var(--font-kai-cn); + --font-title-cn: var(--font-song-cn); + --font-title-jp: var(--font-song-jp); + --text-font-cn: var(--font-song-cn); + --text-font-jp: var(--font-song-jp); + --ol-font-cn: var(--font-song-cn); + --ol-font-jp: var(--font-song-jp); + --ul-font-cn: var(--font-song-cn); + --ul-font-jp: var(--font-song-jp); + --font-quota-cn: var(--font-kai-cn); + --font-quota-jp: var(--font-kai-jp); + --font-hei-cn: "Poppins", "Noto Sans CJK SC", sans-serif; + --font-hei-jp: "Poppins", "Noto Sans CJK JP", sans-serif; + --font-song-cn: "方正仿宋_GBK", , serif; + --font-song-jp: "Sabon Next LT Pro", "Yu Mincho", serif; + --font-kai-cn: "HarmonyOS_Regular", "TW-Kai", serif; + --font-kai-jp: "HarmonyOS_Regular", "EPSON 教科書体M", "TW-Kai", "kaiti", + serif; + --font-mono: "Ubuntu", "975 朦胧黑体", sans-serif; + --font-fangsong: "Courier New", "方正仿宋_GBK", "仿宋"; + --bookmark: url("data:image/svg+xml;utf8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20xmlns%3D%22http%3Ahttps://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d%3D%22M4%204.5C4%203.11929%205.11929%202%206.5%202H13.5C14.8807%202%2016%203.11929%2016%204.5V17.5C16%2017.6881%2015.8945%2017.8602%2015.7269%2017.9456C15.5593%2018.0309%2015.358%2018.015%2015.2059%2017.9044L10%2014.1183L4.79409%2017.9044C4.64199%2018.015%204.4407%2018.0309%204.27311%2017.9456C4.10553%2017.8602%204%2017.6881%204%2017.5V4.5Z%22%20fill%3D%22%23311b92%22/%3E%0A%3C/svg%3E%0A"); + --light-bulb: url("data:image/svg+xml;utf8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20xmlns%3D%22http%3Ahttps://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d%3D%22M13.073%2015L12.6891%2016.6051C12.5048%2017.3763%2011.8236%2017.935%2011.0181%2017.9947L10.8748%2018H9.12546C8.30655%2018%207.59%2017.4839%207.34866%2016.7385L7.31108%2016.6047L6.928%2015H13.073Z%22%20fill%3D%22%23b0791b%22/%3E%0A%3Cpath%20d%3D%22M10%202C13.3137%202%2016%204.59693%2016%207.80041C16%209.47737%2015.2546%2011.0164%2013.7961%2012.3942C13.7324%2012.4544%2013.6831%2012.5269%2013.6512%2012.6065L13.6251%2012.6883L13.311%2014H10.5002V9.49707C10.5002%209.22093%2010.2764%208.99707%2010.0002%208.99707C9.7241%208.99707%209.50024%209.22093%209.50024%209.49707V14H6.689L6.37626%2012.6886C6.34955%2012.5766%206.29016%2012.4745%206.20516%2012.3942C4.8153%2011.0819%204.07265%209.62354%204.00507%208.03903L4%207.80041L4.00321%207.60894C4.1077%204.49409%206.75257%202%2010%202ZM9.5%206.50238V7.50391C9.5%207.78005%209.72386%208.00391%2010%208.00391C10.2761%208.00391%2010.5%207.78005%2010.5%207.50391V6.50238C10.5%206.22624%2010.2761%206.00238%2010%206.00238C9.72386%206.00238%209.5%206.22624%209.5%206.50238ZM12.8506%207.44332C12.6553%207.24806%2012.3388%207.24806%2012.1435%207.44332L11.4353%208.15151C11.2401%208.34677%2011.2401%208.66335%2011.4353%208.85861C11.6306%209.05388%2011.9472%209.05388%2012.1424%208.85861L12.8506%208.15043C13.0459%207.95517%2013.0459%207.63858%2012.8506%207.44332ZM7.8521%207.44332C7.65684%207.24806%207.34026%207.24806%207.145%207.44332C6.94973%207.63858%206.94973%207.95517%207.145%208.15043L7.85318%208.85861C8.04844%209.05388%208.36503%209.05388%208.56029%208.85861C8.75555%208.66335%208.75555%208.34677%208.56029%208.15151L7.8521%207.44332Z%22%20fill%3D%22%23b0791b%22/%3E%0A%3C/svg%3E%0A"); + --star: url("data:image/svg+xml;utf8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20xmlns%3D%22http%3Ahttps://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d%3D%22M9.10433%202.89874C9.47114%202.15549%2010.531%202.1555%2010.8978%202.89874L12.8282%206.81024L17.1448%207.43748C17.9651%207.55666%2018.2926%208.56464%2017.699%209.14317L14.5755%2012.1878L15.3129%2016.487C15.453%2017.3039%2014.5956%2017.9269%2013.8619%2017.5412L10.0011%2015.5114L6.14018%2017.5412C5.40655%2017.9269%204.54913%2017.3039%204.68924%2016.487L5.4266%2012.1878L2.30308%209.14317C1.70956%208.56463%202.03708%207.55666%202.8573%207.43748L7.17389%206.81024L9.10433%202.89874Z%22%20fill%3D%22%23044289%22/%3E%0A%3C/svg%3E%0A"); + --warn: url("data:image/svg+xml;utf8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20xmlns%3D%22http%3Ahttps://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d%3D%22M8.68569%202.85232L2.12696%2014.7773C1.57714%2015.777%202.30038%2017.0002%203.44129%2017.0002H16.5587C17.6996%2017.0002%2018.4229%2015.777%2017.8731%2014.7773L11.3143%202.85232C10.7444%201.81615%209.25558%201.81616%208.68569%202.85232ZM10%206.75016C10.4142%206.75016%2010.75%207.08595%2010.75%207.50016V11.5002C10.75%2011.9144%2010.4142%2012.2502%2010%2012.2502C9.58579%2012.2502%209.25%2011.9144%209.25%2011.5002V7.50016C9.25%207.08595%209.58579%206.75016%2010%206.75016ZM10.75%2013.7502C10.75%2014.1644%2010.4142%2014.5002%2010%2014.5002C9.58579%2014.5002%209.25%2014.1644%209.25%2013.7502C9.25%2013.3359%209.58579%2013.0002%2010%2013.0002C10.4142%2013.0002%2010.75%2013.3359%2010.75%2013.7502Z%22%20fill%3D%22%238a2a0d%22/%3E%0A%3C/svg%3E%0A"); + --note: url("data:image/svg+xml;utf8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20xmlns%3D%22http%3Ahttps://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d%3D%22M14%203C15.5977%203%2016.9037%204.24892%2016.9949%205.82373L17%206V10H13L12.8237%2010.0051C11.3072%2010.093%2010.093%2011.3072%2010.0051%2012.8237L10%2013V17H6C4.40232%2017%203.09634%2015.7511%203.00509%2014.1763L3%2014V6C3%204.40232%204.24892%203.09634%205.82373%203.00509L6%203H14ZM16.9007%2011.001C16.8232%2011.2376%2016.7018%2011.459%2016.5416%2011.6528L16.4142%2011.7929L11.7929%2016.4142C11.5687%2016.6384%2011.2968%2016.8039%2011.001%2016.9007L11%2013L11.0055%2012.8507C11.078%2011.8676%2011.8612%2011.0821%2012.8433%2011.006L13%2011L16.9007%2011.001Z%22%20fill%3D%22%23004d40%22/%3E%0A%3C/svg%3E%0A"); +} + +* { + -webkit-font-smoothing: "auto"; + -webkit-text-stroke-width: calc(calc(40px - 1em) / 170); +} + +html, +body { + font-size: var(--font-size); + font-weight: var(--font-weight); + font-family: var(--text-font-cn); + line-height: var(--line-height); + background: var(--bg-contents); + color: var(--color-text); +} + +body { + background: var(--bg-write); + -webkit-font-smoothing: antialiased; + margin: 2rem auto; + /* padding: 2rem; */ +} + +h1 *{ + color: var(--color-title) !important; + text-decoration: none !important; + border-bottom: none !important; +} + +h1 { + background: var(--bg-title-h1); + color: var(--color-title-h1); + font: var(--font-title-h1); + margin: var(--margin-h1); + text-transform: capitalize; +} + +h1::after { + content: ""; + display: block; + border-bottom: 1px solid var(--theme-color); + position: relative; + top: 1rem; + width: 50%; +} +blockquote, +pre, +table, +img { + margin: var(--margin-block); + padding: var(--padding-block); + border-radius: 5px; +} + +p { + margin: var(--margin-text); + line-height: var(--line-height); +} + +/* p:not(li p) { + text-indent: 2rem; +} */ + +blockquote { + background: var(--bg-quote); + font: var(--font-quote); + font-size: var(--kai-size); + color: var(--color-quote); + box-shadow: var(--block-shadow); + border: var(--opt-borderb); + counter-reset: section; +} + +blockquote blockquote { + padding: 0; + border: none; + padding-left: 1rem; + border-left: var(--base-borderl); + border-radius: 0; + box-shadow: none; +} + +blockquote p { + margin: 0.5rem 0; +} + +blockquote ul { + font-size: 1rem; +} + +blockquote li { + font-size: var(--text-font-size); +} + +blockquote em { + font-family: var(--font-kai-jp); +} + +blockquote h1{ + background: var(--bg-title-h6); + color: var(--color-title-h6); + font: var(--font-title-h6); + font-family: var(--font-hei-cn); + font-weight: bold; + margin: var(--margin-h6); + text-align: center; + margin: 0.5rem auto !important; + color: var(--theme-color); + border: none; +} + +blockquote h1::after { + border-bottom: none; +} + +ul li::marker, +ol li::marker { + font-variant-numeric: tabular-nums; + font-variant-numeric: slashed-zero; + color: var(--theme-color); +} + +ul { + list-style: disc; +} + +ul li { + font-family: var(--ul-font-cn); +} + +ul li::marker { + font-family: Arial, Helvetica, sans-serif; + font-size: 14pt; +} + +ul em { + font-family: var(--text-font-jp); +} + +ul img { + padding: 0; + box-shadow: var(--img-shadow); +} + +ul ul { + list-style: square; +} + +ul ul ul { + list-style: circle; +} + +ol { + list-style: decimal-leading-zero; +} + +ol em { + font-family: var(--ol-font-jp); +} + +ol ol { + list-style: lower-latin; +} + +ol ol ol { + list-style: lower-roman; +} + +ol li, +ul ol li { + font-family: var(--ol-font-cn); + font-size: var(--ol-size); +} + +img { + margin: 0.5rem auto; +} + +p img { + margin-left: -2rem; +} + +img[alt~="no-shadow"] { + box-shadow: none !important; +} + +img[alt~="normal"] { + margin: 0 !important; + box-shadow: none !important; +} + +img[alt~="25%"] { + height: 25%; + width: 25%; +} + +img[alt~="50%"] { + height: 50%; + width: 50%; +} + +img[alt~="75%"] { + height: 75%; + width: 75%; +} + +img[alt~="85%"] { + height: 85%; + width: 85%; +} + +img[alt~="95%"] { + height: 95%; + width: 95%; +} + +figure { + text-align: center; +} + +body { + counter-reset: section; +} + +figcaption { + font-family: var(--font-fangsong); + text-align: center; + counter-increment: subsection; +} + +figcaption:before { + content: "Section " counter(section) "." counter(subsection) " "; +} + +hr { + border: none; + border-bottom: var(--base-border); + margin: 3rem auto; + height: 1px; + width: 50%; +} + +hr.pb { + border-bottom: none; + page-break-after: always; +} + +code, +mark, +kbd, +samp, +tt, +var, +a, +strong, +em { + padding: var(--padding-text); +} + +#write a { + background: var(--bg-link); + color: var(--color-link); + text-decoration: none; + border-bottom: var(--base-borderb); +} + +#write a:hover { + border-bottom-color: var(--color-link); + color: var(--link-hover-color); + text-decoration: none; +} + +a[href^="http:https://"]:after +{ + content: " (" attr(href) ") "; +} + +strong { + background: var(--bg-strong); + color: var(--color-strong); +} + +em { + background: var(--bg-italic); + color: var(--color-italic); + font-style: normal; + font-family: var(--text-font-jp); +} + +strong, +em strong, +strong em { + font-weight: 800 !important; + font-style: normal; + font-family: inherit; +} + +del, +s { + color: var(--color-strike); + background: var(--bg-strike); + display: none; +} + +mark { + font: var(--font-highlight); + background: var(--bg-highlight); + color: var(--color-highlight); +} + +samp { + font-family: var(--font-fangsong); +} + +ins, +div.kpt, +div.practice { + display: block; + border-left: 4px solid red; + margin: 1rem auto; + padding: 0.5rem; + text-decoration: none; +} + +ins { + background: hsl(0, 100%, 95%); +} + +div.kpt { + background: #f6f7fa; +} + +div.practice { + background: none; + padding-left: 1rem; + font-size: 1.1rem; + font-weight: 600; +} + +code, +tt, +kbd, +var { + font: var(--font-code); + background: var(--bg-code); + color: var(--color-code); + border-radius: 5px; +} + +tt { + color: var(--theme-color); +} + +var { + background-color: hsl(222, 100%, 70%); + padding: 4px; + border-radius: 0; +} + +code { + background-color: var(--bg-code); + color: var(--color-code) !important; +} + +details { + -webkit-box-shadow: 5px 5px 5px 0px #ffe5e5; + box-shadow: 5px 5px 5px 0px #ffe5e5; + transition: all 0.2s ease; + border: 1px solid transparent; + border-radius: 4px; + padding: 1rem; + margin: 1.5rem auto; + background: var(--bg-quote); +} + +div.intro { + font-family: var(--font-kai-cn); +} + +div.intro em { + font-family: var(--font-kai-jp) !important; +} + +div.intro p { + font-size: large; +} + +ruby { + font-family: var(--font-kai-cn) !important; + font-size: large; +} + +em ruby, +em rt { + font-family: var(--font-kai-jp) !important; +} + +div.ptb tr { + border: 1px solid #fff; +} + +div.ptb tr:nth-child(2n) { + background: #fff; +} + +div.ptb tr, +div.ptb td, +div.ptb th { + border: 1px solid #fff; +} + +table { + width: 100%; + border-collapse: collapse; +} + +table caption { + border-bottom: none; +} + +table th { + font-weight: 800; +} + +table th, +table td { + padding: 0.5rem 1rem; + background: transparent; +} + +table td { + white-space: nowrap; +} + +table tr, +table td, +table th { + border-left: 1px solid var(--theme-color-weak); +} + +table thead tr { + text-align: left; + background: var(--bg-thead); +} + +table thead tr:hover { + background: var(--bg-thead-hover); + color: var(--color-thead-hover); +} + +table tr { + background: var(--bg-tbody); + color: var(--tbody-color); + border: 1px solid var(--theme-color-weak); +} + +table tr:nth-child(2n) { + background: var(--bg-tbody-opt); + color: var(--tbody-color-opt); +} + +table tr:hover { + background: var(--bg-tbody-hover); + color: var(--color-tbody-hover); +} + +@media print { + html, + body { + margin: 0; + padding: 0; + } + + @page { + size: A4; + margin-top: 20mm; + margin-bottom: 20mm; + margin-right: 30mm; + } + + * { + -webkit-text-stroke: 0px; + } + + :root { + --font-size: 11pt; + --kai-size: 12pt; + --line-height: 24pt; + --font-title-h1: 900 2.2rem/3.6rem var(--font-title-cn); + --font-quote: 400 12pt/26pt var(--font-quota-cn); + --font-code: 400 11pt var(--font-mono); + --font-footnote: 400 10.5pt/21pt var(--font-kai-cn); + } +} + +/* + */ + +/* CSS */ +/* + */ + +/* CSS */ +.button { + appearance: none; + background-color: #ffffff; + border-width: 0; + box-sizing: border-box; + color: #000000; + cursor: pointer; + display: inline-block; + font-family: "HarmonyOS_Regular", Helvetica, sans-serif; + font-size: 15px; + width: 100%; + font-weight: 500; + letter-spacing: 0; + line-height: 3em; + margin: 0; + opacity: 1; + outline: 0; + position: relative; + text-align: center; + text-decoration: none; + text-rendering: geometricprecision; + text-transform: uppercase; + transition: opacity 300ms cubic-bezier(0.694, 0, 0.335, 1), + background-color 100ms cubic-bezier(0.694, 0, 0.335, 1), + color 100ms cubic-bezier(0.694, 0, 0.335, 1); + user-select: none; + -webkit-user-select: none; + touch-action: manipulation; + vertical-align: baseline; + white-space: nowrap; +} + +.button:before { + animation: opacityFallbackOut 0.5s step-end forwards; + backface-visibility: hidden; + background-color: #ebebeb; + clip-path: polygon(-1% 0, 0 0, -25% 100%, -1% 100%); + content: ""; + height: 100%; + left: 0; + position: absolute; + top: 0; + transform: translateZ(0); + transition: clip-path 0.5s cubic-bezier(0.165, 0.84, 0.44, 1), + -webkit-clip-path 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); + width: 100%; +} + +.button:hover:before { + animation: opacityFallbackIn 0s step-start forwards; + clip-path: polygon(0 0, 101% 0, 101% 101%, 0 101%); +} + +.button:after { + background-color: #ffffff; +} + +.button span { + z-index: 1; + position: relative; +} +.weiyu { + pointer-events: target; +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..056e7c8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +fastapi==0.68.0 +uvicorn==0.14.0 +requests==2.28.1 +colorama==0.4.6 +beautifulsoup4==4.10.0 \ No newline at end of file diff --git a/sixty_api/sixty_api.py b/sixty_api/sixty_api.py new file mode 100644 index 0000000..aabe27e --- /dev/null +++ b/sixty_api/sixty_api.py @@ -0,0 +1,42 @@ +import requests +from bs4 import BeautifulSoup +import json +import time + + +API='https://www.zhihu.com/api/v4/columns/c_1261258401923026944/items?limit=1&offset=' +headers={ + 'Access-Control-Allow-Origin':'*', + 'Access-Control-Allow-Headers':'Content-Type', + 'Access-Control-Allow-Methods':'*', + 'Content-Type':'application/json;charset=utf-8' +} + + +def get_topic(offset=0): + res={} + new_list=[] + try: + data=(requests.get(API+str(offset), headers=headers,timeout=5).json()) + html = data['data'][0]['content'] + soup = BeautifulSoup(html, 'html.parser') + day_news = soup.find_all('p') + for i in range(len(day_news)): + text=day_news[i].get_text() + if i == 0: + continue + if i == 1: + res['time']=text + continue + if i == 2: + res['topic']=text + continue + if i == len(day_news)-1: + res['weiyu']=text + continue + new_list.append(text) + res['news']=new_list + except Exception as e: + print(str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())),e) + return None + return res \ No newline at end of file diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..1e4b1bf --- /dev/null +++ b/vercel.json @@ -0,0 +1,30 @@ +{ + "version": 2, + "public": true, + "routes": [ + { + "src": "/version", + "dest": "api/main.py" + }, + { + "src": "/60s", + "dest": "api/main.py" + }, + { + "src": "/weibo", + "dest": "api/main.py" + }, + { + "src": "/bili", + "dest": "api/main.py" + }, + { + "src": "/docs", + "dest": "api/main.py" + }, + { + "src": "/openapi.json", + "dest": "api/main.py" + } + ] +} \ No newline at end of file diff --git a/weibo_api/weibo_api.py b/weibo_api/weibo_api.py new file mode 100644 index 0000000..effa18e --- /dev/null +++ b/weibo_api/weibo_api.py @@ -0,0 +1,51 @@ +import requests +import json +import time + +API='https://weibo.com/ajax/side/hotSearch' +headers={ + 'Access-Control-Allow-Origin':'*', + 'Access-Control-Allow-Headers':'Content-Type', + 'Access-Control-Allow-Methods':'*', + 'Content-Type':'application/json;charset=utf-8' +} + + +def get_topic(): + try: + dataList=[] + data=requests.get(API,headers=headers,timeout=5) + data=json.loads(data.text) + data_json=data['data']['realtime'] + jyzy = { + '电影': '影', + '剧集': '剧', + '综艺': '综', + '音乐': '音', + '盛典': '盛', + } + for i in range(0,len(data_json)): + hot = '' + if 'is_ad' in data_json[i]: + continue; + if 'flag_desc' in data_json[i]: + hot = jyzy.get(data_json[i]['flag_desc'],'') + if 'is_boom' in data_json[i]: + hot = '爆' + if 'is_hot' in data_json[i]: + hot = '热' + if 'is_fei' in data_json[i]: + hot = '沸' + if 'is_new' in data_json[i]: + hot = '新' + dic = { + 'title': data_json[i].get('note',''), + 'url': 'https://s.weibo.com/weibo?q=%23' + data_json[i].get('word','') + '%23', + 'num': data_json[i].get('num',''), + 'hot': hot + } + dataList.append(dic) + return dataList + except Exception as e: + print(str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())),e) + return None \ No newline at end of file