From 242347489c07ec49ba72cdd496f4f9f63975469f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=9E=E5=BD=92=E5=A4=A9=E7=A9=BA?= Date: Sun, 24 Aug 2025 20:55:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=9F=BA=E4=BA=8EAstrBot?= =?UTF-8?q?=E7=9A=84=E6=99=BA=E8=83=BD=E7=BE=A4=E8=81=8A=E5=88=86=E6=9E=90?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=EF=BC=8C=E8=83=BD=E5=A4=9F=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=B2=BE=E7=BE=8E=E7=9A=84=E7=BE=A4=E8=81=8A=E6=97=A5=E5=B8=B8?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=8A=A5=E5=91=8A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 661 --------------- README.md | 128 ++- _conf_schema.json | 78 ++ config.json | 16 + demo.jpg | Bin 0 -> 179996 bytes main.py | 2007 ++++++++++++++++++++++++++++++++++++++++++++- metadata.yaml | 23 +- 7 files changed, 2223 insertions(+), 690 deletions(-) create mode 100644 _conf_schema.json create mode 100644 config.json create mode 100644 demo.jpg diff --git a/LICENSE b/LICENSE index 3423cec..e69de29 100644 --- a/LICENSE +++ b/LICENSE @@ -1,661 +0,0 @@ - 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) 2022-2099 AstrBot Plugin Authors - - 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 index ae9c1f0..27b1a48 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,127 @@ -# helloworld +
-AstrBot 插件模板 +# QQ群日常分析插件 -A template plugin for AstrBot plugin feature -# 支持 +[![Plugin Version](https://img.shields.io/badge/Latest_Version-1.1.0-blue.svg?style=for-the-badge&color=76bad9)](https://github.com/SXP-Simon/astrbot-qq-group-daily-analysis) +[![AstrBot](https://img.shields.io/badge/AstrBot-Plugin-ff69b4?style=for-the-badge)](https://github.com/AstrBotDevs/AstrBot) +[![License](https://img.shields.io/badge/License-AGPL3.0-green.svg?style=for-the-badge)](LICENSE) -[帮助文档](https://astrbot.app) +_✨ 一个基于AstrBot的智能群聊分析插件,能够生成精美的群聊日常分析报告。[灵感来源](https://github.com/LSTM-Kirigaya/openmcp-tutorial/tree/main/qq-group-summary)。 ✨_ + +count +
+ + +## 功能特色 + +### 🎯 智能分析 +- **话题分析**: 使用LLM智能提取群聊中的热门话题和讨论要点 +- **用户画像**: 基于聊天行为分析用户特征,分配个性化称号 +- **统计数据**: 全面的群聊活跃度和参与度统计 + +### 📊 可视化报告 +- **PDF报告**: 生成专业的PDF格式分析报告(推荐) +- **精美图片**: 生成美观的HTML+CSS可视化报告 +- **多种格式**: 支持图片和文本输出格式 +- **用户头像**: 自动获取QQ头像,让报告更加生动 +- **详细数据**: 包含消息统计、时间分布、关键词等 + +### 🛠️ 灵活配置 +- **群组管理**: 支持指定特定群组启用功能 +- **参数调节**: 可自定义分析天数、消息数量等参数 + +## 效果 +![效果图](./demo.jpg) + +## 使用方法 + +### 基础命令 + +#### 群分析 +``` +/群分析 [天数] +``` +- 分析群聊近期活动 +- 天数可选,默认为1天 +- 例如:`/群分析 3` 分析最近3天的群聊 + +#### 分析设置 +``` +/分析设置 [操作] +``` +- `enable`: 为当前群启用分析功能 +- `disable`: 为当前群禁用分析功能 +- `status`: 查看当前群的启用状态 +- 例如:`/分析设置 enable` + +### 配置选项 + +| 配置项 | 说明 | 默认值 | +|--------|------|--------| +| enabled_groups | 启用分析的QQ群列表 | [] (所有群) | +| max_messages | 最大分析消息数量 | 1000 | +| analysis_days | 默认分析天数 | 1 | +| output_format | 输出格式 (pdf/image/text) | pdf | +| require_admin | 仅管理员可用 | false | +| topic_analysis_enabled | 启用话题分析 | true | +| user_title_analysis_enabled | 启用用户称号分析 | true | + +## 分析内容 + +### 📊 基础统计 +- 消息总数 +- 参与人数 +- 总字符数 +- 表情数量 +- 最活跃时段 + +### 💬 话题分析 +- 自动提取3-5个主要话题 +- 识别话题参与者 +- 总结讨论要点和结论 + +### 🏆 用户称号 +基于用户行为特征分配称号: +- **水群小能手**: 发言频繁的活跃用户 +- **技术专家**: 经常讨论技术话题 +- **夜猫子**: 深夜活跃用户 +- **表情包批发商**: 经常发表情 +- **沉默终结者**: 经常开启话题 +- **剧作家**: 平均发言长度很长 +- **互动达人**: 经常回复他人 +- **KOL**: 群内意见领袖 + +### 🔥 数据洞察 +- 热门关键词统计 +- 用户活跃度排行 +- 时间分布分析 +- MBTI性格类型推测 + +## 安装要求 + +### 基础要求 +- 已配置LLM提供商(用于智能分析) +- QQ平台适配器 + + +## 注意事项 + +1. **性能考虑**: 大量消息分析可能消耗较多LLM tokens +2. **数据准确性**: 分析结果基于可获取的群聊记录,可能不完全准确 + +## 更新日志 + +### v1.0.0 +- 初始版本发布 +- 支持基础群聊分析功能 +- 智能话题和用户称号分析 +- 精美可视化报告生成 + +## 许可证 + +MIT License + +## 贡献 + +欢迎提交Issue和Pull Request来改进这个插件! diff --git a/_conf_schema.json b/_conf_schema.json new file mode 100644 index 0000000..602b04a --- /dev/null +++ b/_conf_schema.json @@ -0,0 +1,78 @@ +{ + "enabled_groups": { + "type": "list", + "description": "启用分析功能的QQ群列表", + "default": [], + "hint": "填入允许使用分析功能的QQ群号,为空则所有群都可使用", + "items": { + "type": "string" + } + }, + "max_messages": { + "type": "int", + "description": "最大分析消息数量", + "default": 1000, + "hint": "单次分析的最大消息条数,建议500-2000" + }, + "analysis_days": { + "type": "int", + "description": "默认分析天数", + "default": 1, + "hint": "默认分析最近几天的消息,建议1-7天" + }, + "auto_analysis_time": { + "type": "string", + "description": "自动分析时间", + "default": "22:00", + "hint": "每日自动分析的时间,格式HH:MM" + }, + "enable_auto_analysis": { + "type": "bool", + "description": "启用自动分析", + "default": false, + "hint": "是否在指定时间自动进行群聊分析,启用需要在群内手动触发一次分析 /分析设置 test ,否则获取不到实例,不会自动分析" + }, + "output_format": { + "type": "string", + "description": "输出格式", + "default": "image", + "hint": "分析报告的输出格式:image(图片)、text(文本)" + }, + + "min_messages_threshold": { + "type": "int", + "description": "最小消息数阈值", + "default": 50, + "hint": "进行分析所需的最小消息数量" + }, + "topic_analysis_enabled": { + "type": "bool", + "description": "启用话题分析", + "default": true, + "hint": "是否使用LLM进行智能话题分析" + }, + "user_title_analysis_enabled": { + "type": "bool", + "description": "启用用户称号分析", + "default": true, + "hint": "是否使用LLM进行用户称号分析" + }, + "max_topics": { + "type": "int", + "description": "最大话题数量", + "default": 5, + "hint": "分析报告中显示的最大话题数量" + }, + "max_user_titles": { + "type": "int", + "description": "最大用户称号数量", + "default": 8, + "hint": "分析报告中显示的最大用户称号数量" + }, + "max_query_rounds": { + "type": "int", + "description": "最大消息查询轮数", + "default": 35, + "hint": "⚠️ 警告:增加此值会导致大量Token消耗!默认值35轮(有一定消耗)。设置过高可能导致LLM费用激增" + } +} diff --git a/config.json b/config.json new file mode 100644 index 0000000..2297161 --- /dev/null +++ b/config.json @@ -0,0 +1,16 @@ +{ + "enabled_groups": [ + "936617127" + ], + "max_messages": 1000, + "analysis_days": 1, + "auto_analysis_time": "19:41", + "enable_auto_analysis": true, + "output_format": "image", + "min_messages_threshold": 50, + "topic_analysis_enabled": true, + "user_title_analysis_enabled": true, + "max_topics": 5, + "max_user_titles": 8, + "max_query_rounds": 50 +} \ No newline at end of file diff --git a/demo.jpg b/demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0580e294d028dd80161a2d4c4ec151322c3a83dd GIT binary patch literal 179996 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 bool: + """检查是否为管理员 - 已简化为允许所有用户""" + # 允许所有用户使用设置功能 + return True + + async def _fetch_group_messages_unified(self, client, group_id: str, days: int) -> List[Dict]: + """统一的群聊消息获取方法""" + try: + if not client or not group_id: + logger.error(f"群 {group_id} 无效的客户端或群组ID") + return [] + + # 计算时间范围 + end_time = datetime.now() + start_time = end_time - timedelta(days=days) + + messages = [] + message_seq = 0 + query_rounds = 0 + max_rounds = self.max_query_rounds # 从配置读取最大查询轮数 + consecutive_failures = 0 + max_failures = 3 # 最大连续失败次数 + + logger.info(f"开始获取群 {group_id} 近 {days} 天的消息记录") + logger.info(f"时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 到 {end_time.strftime('%Y-%m-%d %H:%M:%S')}") + + while len(messages) < self.max_messages and query_rounds < max_rounds: + try: + payloads = { + "group_id": group_id, + "message_seq": message_seq, + "count": 200, + "reverseOrder": True, + } + + result = await client.api.call_action("get_group_msg_history", **payloads) + + if not result or "messages" not in result: + logger.warning(f"群 {group_id} API返回无效结果: {result}") + consecutive_failures += 1 + if consecutive_failures >= max_failures: + break + continue + + round_messages = result.get("messages", []) + + if not round_messages: + logger.info(f"群 {group_id} 没有更多消息,结束获取") + break + + # 重置失败计数 + consecutive_failures = 0 + + # 过滤时间范围内的消息 + valid_messages_in_round = 0 + oldest_msg_time = None + + for msg in round_messages: + try: + msg_time = datetime.fromtimestamp(msg.get("time", 0)) + oldest_msg_time = msg_time # 记录最老的消息时间 + + # 过滤掉机器人自己的消息 + sender_id = str(msg.get("sender", {}).get("user_id", "")) + if self.bot_qq_id and sender_id == self.bot_qq_id: + continue + + if msg_time >= start_time and msg_time <= end_time: + messages.append(msg) + valid_messages_in_round += 1 + except Exception as msg_error: + logger.warning(f"群 {group_id} 处理单条消息失败: {msg_error}") + continue + + # 如果最老的消息时间已经超出范围,停止获取 + if oldest_msg_time and oldest_msg_time < start_time: + logger.info(f"群 {group_id} 已获取到时间范围外的消息,停止获取。共获取 {len(messages)} 条消息") + break + + if valid_messages_in_round == 0: + logger.warning(f"群 {group_id} 本轮未获取到有效消息") + break + + message_seq = round_messages[0]["message_id"] + query_rounds += 1 + + # 添加延迟避免请求过快 + if query_rounds % 5 == 0: + await asyncio.sleep(0.5) + + except Exception as e: + logger.error(f"群 {group_id} 获取消息失败 (第{query_rounds+1}轮): {e}") + consecutive_failures += 1 + if consecutive_failures >= max_failures: + logger.error(f"群 {group_id} 连续失败 {max_failures} 次,停止获取") + break + await asyncio.sleep(1) # 失败后等待1秒再重试 + + logger.info(f"群 {group_id} 消息获取完成,共获取 {len(messages)} 条消息,查询轮数: {query_rounds}") + return messages + + except Exception as e: + logger.error(f"群 {group_id} 获取群聊消息记录失败: {e}", exc_info=True) + return [] + + async def _fetch_group_messages(self, event: AiocqhttpMessageEvent, days: int) -> List[Dict]: + """获取群聊消息记录(手动分析)""" + return await self._fetch_group_messages_unified(event.bot, event.get_group_id(), days) + + async def _analyze_messages(self, messages: List[Dict], group_id: str) -> Dict: + """分析消息内容""" + # 基础统计 + stats = self._calculate_statistics(messages) + + # 用户活跃度分析 + user_analysis = self._analyze_users(messages) + + # 话题分析(根据配置决定是否启用) + topics = [] + if self.topic_analysis_enabled: + topics = await self._analyze_topics(messages) + + # 用户称号分析(根据配置决定是否启用) + user_titles = [] + if self.user_title_analysis_enabled: + user_titles = await self._analyze_user_titles(messages, user_analysis) + + # 群聊金句分析 + golden_quotes = await self._analyze_golden_quotes(messages) + stats.golden_quotes = golden_quotes + + return { + "group_id": group_id, + "analysis_time": datetime.now().isoformat(), + "statistics": stats, + "user_analysis": user_analysis, + "topics": topics, + "user_titles": user_titles, + "message_count": len(messages) + } + + def _calculate_statistics(self, messages: List[Dict]) -> GroupStatistics: + """计算基础统计数据""" + total_chars = 0 + participants = set() + hour_counts = defaultdict(int) + emoji_count = 0 + + for msg in messages: + sender_id = str(msg.get("sender", {}).get("user_id", "")) + participants.add(sender_id) + + # 统计时间分布 + msg_time = datetime.fromtimestamp(msg.get("time", 0)) + hour_counts[msg_time.hour] += 1 + + # 处理消息内容 + for content in msg.get("message", []): + if content.get("type") == "text": + text = content.get("data", {}).get("text", "") + total_chars += len(text) + elif content.get("type") == "face": + emoji_count += 1 + + # 找出最活跃时段 + most_active_hour = max(hour_counts.items(), key=lambda x: x[1])[0] if hour_counts else 0 + most_active_period = f"{most_active_hour:02d}:00-{(most_active_hour+1)%24:02d}:00" + + return GroupStatistics( + message_count=len(messages), + total_characters=total_chars, + participant_count=len(participants), + most_active_period=most_active_period, + golden_quotes=[], # 将在后续LLM分析中填充 + emoji_count=emoji_count + ) + + def _analyze_users(self, messages: List[Dict]) -> Dict[str, Dict]: + """分析用户活跃度""" + user_stats = defaultdict(lambda: { + "message_count": 0, + "char_count": 0, + "emoji_count": 0, + "nickname": "", + "hours": defaultdict(int), + "reply_count": 0 + }) + + for msg in messages: + sender = msg.get("sender", {}) + user_id = str(sender.get("user_id", "")) + nickname = sender.get("nickname", "") or sender.get("card", "") + + user_stats[user_id]["message_count"] += 1 + user_stats[user_id]["nickname"] = nickname + + # 统计时间分布 + msg_time = datetime.fromtimestamp(msg.get("time", 0)) + user_stats[user_id]["hours"][msg_time.hour] += 1 + + # 处理消息内容 + for content in msg.get("message", []): + if content.get("type") == "text": + text = content.get("data", {}).get("text", "") + user_stats[user_id]["char_count"] += len(text) + elif content.get("type") == "face": + user_stats[user_id]["emoji_count"] += 1 + elif content.get("type") == "reply": + user_stats[user_id]["reply_count"] += 1 + + return dict(user_stats) + + async def _get_user_avatar(self, user_id: str) -> Optional[str]: + """获取用户头像的base64编码""" + try: + avatar_url = f"https://q4.qlogo.cn/headimg_dl?dst_uin={user_id}&spec=640" + async with aiohttp.ClientSession() as client: + response = await client.get(avatar_url) + response.raise_for_status() + avatar_data = await response.read() + # 转换为base64编码 + avatar_base64 = base64.b64encode(avatar_data).decode('utf-8') + return f"data:image/jpeg;base64,{avatar_base64}" + except Exception as e: + logger.error(f"获取用户头像失败 {user_id}: {e}") + return None + + async def _analyze_topics(self, messages: List[Dict]) -> List[SummaryTopic]: + """使用LLM分析话题""" + try: + # 提取文本消息 + text_messages = [] + for msg in messages: + sender = msg.get("sender", {}) + nickname = sender.get("nickname", "") or sender.get("card", "") + msg_time = datetime.fromtimestamp(msg.get("time", 0)).strftime("%H:%M") + + for content in msg.get("message", []): + if content.get("type") == "text": + text = content.get("data", {}).get("text", "").strip() + if text and len(text) > 2: # 过滤太短的消息 + text_messages.append({ + "sender": nickname, + "time": msg_time, + "content": text + }) + + if not text_messages: + return [] + + # 限制消息数量以避免token过多 + if len(text_messages) > 100: + # 均匀采样 + step = len(text_messages) // 100 + text_messages = text_messages[::step] + + # 构建LLM提示词 + messages_text = "\n".join([ + f"[{msg['time']}] {msg['sender']}: {msg['content']}" + for msg in text_messages + ]) + + prompt = f""" +请分析以下群聊记录,提取出3-5个主要话题。对于每个话题,请提供: +1. 话题名称(简洁明了) +2. 主要参与者(最多3人) +3. 话题详细描述(包含关键信息和结论) + +群聊记录: +{messages_text} + +请以JSON格式返回,格式如下: +[ + {{ + "topic": "话题名称", + "contributors": ["参与者1", "参与者2"], + "detail": "详细描述话题内容、讨论要点和结论" + }} +] +""" + + # 调用LLM + provider = self.context.get_using_provider() + if not provider: + logger.warning("未配置LLM提供商,跳过话题分析") + return [] + + response = await provider.text_chat( + prompt=prompt, + max_tokens=2000, + temperature=0.3 + ) + + # 解析响应 + if hasattr(response, 'completion_text'): + result_text = response.completion_text + else: + result_text = str(response) + + # 尝试解析JSON + try: + import re + json_match = re.search(r'\[.*\]', result_text, re.DOTALL) + if json_match: + topics_data = json.loads(json_match.group()) + return [SummaryTopic(**topic) for topic in topics_data[:5]] + except: + pass + + return [] + + except Exception as e: + logger.error(f"话题分析失败: {e}") + return [] + + async def _analyze_user_titles(self, messages: List[Dict], user_analysis: Dict) -> List[UserTitle]: + """使用LLM分析用户称号""" + try: + # 准备用户数据 + user_summaries = [] + for user_id, stats in user_analysis.items(): + if stats["message_count"] < 5: # 过滤活跃度太低的用户 + continue + + # 分析用户特征 + night_messages = sum(stats["hours"][h] for h in range(0, 6)) + day_messages = stats["message_count"] - night_messages + avg_chars = stats["char_count"] / stats["message_count"] if stats["message_count"] > 0 else 0 + + user_summaries.append({ + "name": stats["nickname"], + "qq": int(user_id), + "message_count": stats["message_count"], + "avg_chars": round(avg_chars, 1), + "emoji_ratio": round(stats["emoji_count"] / stats["message_count"], 2), + "night_ratio": round(night_messages / stats["message_count"], 2), + "reply_ratio": round(stats["reply_count"] / stats["message_count"], 2) + }) + + if not user_summaries: + return [] + + # 按消息数量排序,取前8名 + user_summaries.sort(key=lambda x: x["message_count"], reverse=True) + user_summaries = user_summaries[:8] + + # 构建LLM提示词 + users_text = "\n".join([ + f"- {user['name']} (QQ:{user['qq']}): " + f"发言{user['message_count']}条, 平均{user['avg_chars']}字, " + f"表情比例{user['emoji_ratio']}, 夜间发言比例{user['night_ratio']}, " + f"回复比例{user['reply_ratio']}" + for user in user_summaries + ]) + + prompt = f""" +请为以下群友分配合适的称号和MBTI类型。每个人只能有一个称号,每个称号只能给一个人。 + +可选称号: +- 水群小能手: 发言频繁但内容轻松的人 +- 技术专家: 经常讨论技术话题的人 +- 夜猫子: 经常在深夜发言的人 +- 表情包批发商: 经常发表情的人 +- 沉默终结者: 经常开启话题的人 +- 剧作家: 平均发言长度很长的人 +- KOL: 在群里很有影响力的人 +- 互动达人: 经常回复别人的人 + +用户数据: +{users_text} + +请以JSON格式返回,格式如下: +[ + {{ + "name": "用户名", + "qq": 123456789, + "title": "称号", + "mbti": "MBTI类型", + "reason": "获得此称号的原因" + }} +] +""" + + # 调用LLM + provider = self.context.get_using_provider() + if not provider: + logger.warning("未配置LLM提供商,跳过用户称号分析") + return [] + + response = await provider.text_chat( + prompt=prompt, + max_tokens=1500, + temperature=0.5 + ) + + # 解析响应 + if hasattr(response, 'completion_text'): + result_text = response.completion_text + else: + result_text = str(response) + + # 尝试解析JSON + try: + import re + json_match = re.search(r'\[.*\]', result_text, re.DOTALL) + if json_match: + titles_data = json.loads(json_match.group()) + return [UserTitle(**title) for title in titles_data] + except: + pass + + return [] + + except Exception as e: + logger.error(f"用户称号分析失败: {e}") + return [] + + async def _analyze_golden_quotes(self, messages: List[Dict]) -> List[GoldenQuote]: + """使用LLM分析群聊金句""" + try: + # 提取有趣的文本消息 + interesting_messages = [] + for msg in messages: + sender = msg.get("sender", {}) + nickname = sender.get("nickname", "") or sender.get("card", "") + msg_time = datetime.fromtimestamp(msg.get("time", 0)).strftime("%H:%M") + + for content in msg.get("message", []): + if content.get("type") == "text": + text = content.get("data", {}).get("text", "").strip() + # 过滤长度适中、可能有趣的消息 + if 5 <= len(text) <= 100 and not text.startswith(("http", "www")): + interesting_messages.append({ + "sender": nickname, + "time": msg_time, + "content": text + }) + + if not interesting_messages: + return [] + + # 限制消息数量以避免token过多 + if len(interesting_messages) > 50: + # 均匀采样 + step = len(interesting_messages) // 50 + interesting_messages = interesting_messages[::step] + + # 构建LLM提示词 + messages_text = "\n".join([ + f"[{msg['time']}] {msg['sender']}: {msg['content']}" + for msg in interesting_messages + ]) + + prompt = f""" +请从以下群聊记录中挑选出3-5句最有趣、最有意思的"金句"。这些金句可以是: +- 幽默搞笑的发言 +- 富有哲理的话语 +- 意外的神回复 +- 有创意的表达 +- 让人印象深刻的句子 + +对于每个金句,请提供: +1. 原文内容 +2. 发言人昵称 +3. 选择理由(为什么觉得这句话有趣) + +群聊记录: +{messages_text} + +请以JSON格式返回,格式如下: +[ + {{ + "content": "金句原文", + "sender": "发言人昵称", + "reason": "选择这句话的理由" + }} +] +""" + + # 调用LLM + provider = self.context.get_using_provider() + if not provider: + logger.warning("未配置LLM提供商,跳过金句分析") + return [] + + response = await provider.text_chat( + prompt=prompt, + max_tokens=1500, + temperature=0.7 + ) + + # 解析响应 + if hasattr(response, 'completion_text'): + result_text = response.completion_text + else: + result_text = str(response) + + # 尝试解析JSON + try: + import re + json_match = re.search(r'\[.*\]', result_text, re.DOTALL) + if json_match: + quotes_data = json.loads(json_match.group()) + return [GoldenQuote(**quote) for quote in quotes_data[:5]] + except: + pass + + return [] + + except Exception as e: + logger.error(f"金句分析失败: {e}") + return [] + + async def _generate_image_report(self, analysis_result: Dict, group_id: str) -> Optional[str]: + """生成图片格式的分析报告""" + try: + # 准备渲染数据 + render_payload = await self._prepare_render_data(analysis_result) + + # 使用AstrBot内置的HTML渲染服务 + image_url = await self.html_render(self._get_html_template(), render_payload) + return image_url + + except Exception as e: + logger.error(f"生成图片报告失败: {e}") + return None + + + + async def _prepare_render_data(self, analysis_result: Dict) -> Dict: + """准备渲染数据""" + stats = analysis_result["statistics"] + topics = analysis_result["topics"] + user_titles = analysis_result["user_titles"] + + # 构建话题HTML + topics_html = "" + for i, topic in enumerate(topics[:self.max_topics], 1): + contributors_str = "、".join(topic.contributors) + topics_html += f""" +
+
+ {i} + {topic.topic} +
+
参与者: {contributors_str}
+
{topic.detail}
+
+ """ + + # 构建用户称号HTML(包含头像) + titles_html = "" + for title in user_titles[:self.max_user_titles]: + # 获取用户头像 + avatar_data = await self._get_user_avatar(str(title.qq)) + avatar_html = f'头像' if avatar_data else '
👤
' + + titles_html += f""" +
+ +
{title.reason}
+
+ """ + + # 构建金句HTML + quotes_html = "" + for quote in stats.golden_quotes[:5]: + quotes_html += f""" +
+
"{quote.content}"
+
—— {quote.sender}
+
{quote.reason}
+
+ """ + + # 返回扁平化的渲染数据 + return { + "current_date": datetime.now().strftime('%Y年%m月%d日'), + "current_datetime": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + "message_count": stats.message_count, + "participant_count": stats.participant_count, + "total_characters": stats.total_characters, + "emoji_count": stats.emoji_count, + "most_active_period": stats.most_active_period, + "topics_html": topics_html, + "titles_html": titles_html, + "quotes_html": quotes_html + } + + def _get_html_template(self) -> str: + """获取HTML模板""" + return """ + + + + + + 群聊日常分析报告 + + + + +
+
+

📊 群聊日常分析报告

+
{{ current_date }}
+
+ +
+
+

📈 基础统计

+
+
+
{{ message_count }}
+
消息总数
+
+
+
{{ participant_count }}
+
参与人数
+
+
+
{{ total_characters }}
+
总字符数
+
+
+
{{ emoji_count }}
+
表情数量
+
+
+ +
+
{{ most_active_period }}
+
最活跃时段
+
+
+ +
+

💬 热门话题

+ {{ topics_html | safe }} +
+ +
+

🏆 群友称号

+ {{ titles_html | safe }} +
+ +
+

💬 群聊金句

+ {{ quotes_html | safe }} +
+
+ + +
+ + + """ + + async def _create_html_report(self, analysis_result: Dict) -> str: + """创建HTML报告内容""" + stats = analysis_result["statistics"] + topics = analysis_result["topics"] + user_titles = analysis_result["user_titles"] + + # 构建话题HTML + topics_html = "" + for i, topic in enumerate(topics[:self.max_topics], 1): + contributors_str = "、".join(topic.contributors) + topics_html += f""" +
+
+ {i} + {topic.topic} +
+
参与者: {contributors_str}
+
{topic.detail}
+
+ """ + + # 构建用户称号HTML + titles_html = "" + for title in user_titles[:self.max_user_titles]: + titles_html += f""" +
+ +
{title.reason}
+
+ """ + + # 构建金句HTML + quotes_html = "" + for i, quote in enumerate(stats.golden_quotes[:5], 1): + quotes_html += f""" +
+
"{quote.content}"
+
—— {quote.sender}
+
{quote.reason}
+
+ """ + + # HTML模板 + html_template = f""" + + + + + + 群聊日常分析报告 + + + +
+
+

🎯 群聊日常分析报告

+
{datetime.now().strftime('%Y年%m月%d日')}
+
+ +
+
+

📊 基础统计

+
+
+
{stats.message_count}
+
消息总数
+
+
+
{stats.participant_count}
+
参与人数
+
+
+
{stats.total_characters}
+
总字符数
+
+
+
{stats.emoji_count}
+
表情数量
+
+
+
+
+
{stats.most_active_period}
+
最活跃时段
+
+
+
+ +
+

💬 热门话题

+ {topics_html} +
+ +
+

🏆 群友称号

+ {titles_html} +
+ +
+

💬 群聊金句

+ {quotes_html} +
+
+
+ + + """ + + return html_template + + async def _generate_text_report(self, analysis_result: Dict) -> str: + """生成文本格式的分析报告""" + stats = analysis_result["statistics"] + topics = analysis_result["topics"] + user_titles = analysis_result["user_titles"] + + report = f""" +🎯 群聊日常分析报告 +📅 {datetime.now().strftime('%Y年%m月%d日')} + +📊 基础统计 +• 消息总数: {stats.message_count} +• 参与人数: {stats.participant_count} +• 总字符数: {stats.total_characters} +• 表情数量: {stats.emoji_count} +• 最活跃时段: {stats.most_active_period} + +💬 热门话题 +""" + + for i, topic in enumerate(topics[:self.max_topics], 1): + contributors_str = "、".join(topic.contributors) + report += f"{i}. {topic.topic}\n" + report += f" 参与者: {contributors_str}\n" + report += f" {topic.detail}\n\n" + + report += "🏆 群友称号\n" + for title in user_titles[:self.max_user_titles]: + report += f"• {title.name} - {title.title} ({title.mbti})\n" + report += f" {title.reason}\n\n" + + report += "💬 群聊金句\n" + for i, quote in enumerate(stats.golden_quotes[:5], 1): + report += f"{i}. \"{quote.content}\" —— {quote.sender}\n" + report += f" {quote.reason}\n\n" + + return report + + + + async def _save_config(self): + """保存配置到文件""" + try: + config_file = Path("data/plugins/astrbot-qq-group-daily-analysis/config.json") + config_file.parent.mkdir(parents=True, exist_ok=True) + + config_data = { + "enabled_groups": self.enabled_groups, + "max_messages": self.max_messages, + "analysis_days": self.analysis_days, + "auto_analysis_time": self.auto_analysis_time, + "enable_auto_analysis": self.enable_auto_analysis, + "output_format": self.output_format, + + "min_messages_threshold": self.min_messages_threshold, + "topic_analysis_enabled": self.topic_analysis_enabled, + "user_title_analysis_enabled": self.user_title_analysis_enabled, + "max_topics": self.max_topics, + "max_user_titles": self.max_user_titles, + "max_query_rounds": self.max_query_rounds + } + + with open(config_file, 'w', encoding='utf-8') as f: + json.dump(config_data, f, ensure_ascii=False, indent=2) + + except Exception as e: + logger.error(f"保存配置失败: {e}") + + def _load_config_from_file(self): + """从配置文件加载配置""" + try: + config_file = Path("data/plugins/astrbot-qq-group-daily-analysis/config.json") + if config_file.exists(): + with open(config_file, 'r', encoding='utf-8') as f: + file_config = json.load(f) + + # 设置默认值 + self.enabled_groups = file_config.get("enabled_groups", []) + self.max_messages = file_config.get("max_messages", 1000) + self.analysis_days = file_config.get("analysis_days", 1) + self.auto_analysis_time = file_config.get("auto_analysis_time", "09:00") + self.enable_auto_analysis = file_config.get("enable_auto_analysis", False) + self.output_format = file_config.get("output_format", "image") + + self.min_messages_threshold = file_config.get("min_messages_threshold", 50) + self.topic_analysis_enabled = file_config.get("topic_analysis_enabled", True) + self.user_title_analysis_enabled = file_config.get("user_title_analysis_enabled", True) + self.max_topics = file_config.get("max_topics", 5) + self.max_user_titles = file_config.get("max_user_titles", 8) + self.max_query_rounds = file_config.get("max_query_rounds", 35) + + logger.info(f"从配置文件加载配置成功,自动分析: {self.enable_auto_analysis}, 时间: {self.auto_analysis_time}") + else: + # 设置默认值 + self.enabled_groups = [] + self.max_messages = 1000 + self.analysis_days = 1 + self.auto_analysis_time = "09:00" + self.enable_auto_analysis = False + self.output_format = "image" + + self.min_messages_threshold = 50 + self.topic_analysis_enabled = True + self.user_title_analysis_enabled = True + self.max_topics = 5 + self.max_user_titles = 8 + self.max_query_rounds = 35 + + except Exception as e: + logger.error(f"加载配置文件失败: {e}") + # 设置默认值 + self.enabled_groups = [] + self.max_messages = 1000 + self.analysis_days = 1 + self.auto_analysis_time = "09:00" + self.enable_auto_analysis = False + self.output_format = "image" + + self.min_messages_threshold = 50 + self.topic_analysis_enabled = True + self.user_title_analysis_enabled = True + self.max_topics = 5 + self.max_user_titles = 8 + self.max_query_rounds = 35 + + async def _reload_config_and_restart_scheduler(self): + """重新加载配置并重启调度器""" + try: + # 重新加载配置 + self._load_config_from_file() + logger.info(f"重新加载配置: 自动分析={self.enable_auto_analysis}") + + # 停止现有的调度器 + if hasattr(self, 'scheduler_task') and self.scheduler_task and not self.scheduler_task.done(): + self.scheduler_task.cancel() + logger.info("已停止现有的定时任务") + + # 如果启用了自动分析,启动新的调度器 + if self.enable_auto_analysis: + self.scheduler_task = asyncio.create_task(self._start_scheduler()) + logger.info("已启动新的定时任务") + + except Exception as e: + logger.error(f"重新加载配置失败: {e}") + + async def _start_scheduler(self): + """启动定时任务调度器""" + logger.info(f"启动定时任务调度器,自动分析时间: {self.auto_analysis_time}") + + while True: + try: + now = datetime.now() + target_time = datetime.strptime(self.auto_analysis_time, "%H:%M").replace( + year=now.year, month=now.month, day=now.day + ) + + # 如果今天的目标时间已过,设置为明天 + if now >= target_time: + target_time += timedelta(days=1) + + # 计算等待时间 + wait_seconds = (target_time - now).total_seconds() + logger.info(f"定时分析将在 {target_time.strftime('%Y-%m-%d %H:%M:%S')} 执行,等待 {wait_seconds:.0f} 秒") + + # 等待到目标时间 + await asyncio.sleep(wait_seconds) + + # 执行自动分析 + if self.enable_auto_analysis: + logger.info("开始执行定时分析") + await self._run_auto_analysis() + else: + logger.info("自动分析已禁用,跳过执行") + break + + except Exception as e: + logger.error(f"定时任务调度器错误: {e}") + # 等待5分钟后重试 + await asyncio.sleep(300) + + async def _run_auto_analysis(self): + """执行自动分析""" + try: + logger.info("开始执行自动群聊分析") + + # 为每个启用的群执行分析 + for group_id in self.enabled_groups: + try: + logger.info(f"为群 {group_id} 执行自动分析") + + # 这里需要模拟一个事件对象来调用分析功能 + # 由于自动分析没有真实的用户事件,我们直接调用内部方法 + await self._perform_auto_analysis_for_group(group_id) + + except Exception as e: + logger.error(f"群 {group_id} 自动分析失败: {e}") + + except Exception as e: + logger.error(f"自动分析执行失败: {e}") + + async def _perform_auto_analysis_for_group(self, group_id: str): + """为指定群执行自动分析""" + try: + # 尝试获取bot实例 + if not self.bot_instance: + self.bot_instance = await self._get_bot_instance() + + if not self.bot_instance: + logger.warning(f"群 {group_id} 自动分析跳过:未获取到bot实例,请先手动触发一次分析") + return + + # 确保有机器人QQ号 + if not self.bot_qq_id: + await self._get_bot_qq_id() + + logger.info(f"开始为群 {group_id} 执行自动分析") + + # 获取群聊消息 + messages = await self._fetch_group_messages_for_auto(group_id) + if not messages: + logger.warning(f"群 {group_id} 未获取到足够的消息记录") + return + + # 检查消息数量 + if len(messages) < self.min_messages_threshold: + logger.warning(f"群 {group_id} 消息数量不足({len(messages)}条),跳过分析") + return + + logger.info(f"群 {group_id} 获取到 {len(messages)} 条消息,开始分析") + + # 进行分析 + analysis_result = await self._analyze_messages(messages, group_id) + if not analysis_result: + logger.error(f"群 {group_id} 分析失败") + return + + # 生成报告 + if self.output_format == "image": + image_url = await self._generate_image_report(analysis_result, group_id) + if image_url: + # 发送分析报告到群 + await self._send_auto_analysis_result(group_id, image_url) + logger.info(f"群 {group_id} 自动分析完成,已发送图片报告") + else: + logger.error(f"群 {group_id} 图片报告生成失败") + else: + text_report = await self._generate_text_report(analysis_result) + await self._send_auto_analysis_text(group_id, text_report) + logger.info(f"群 {group_id} 自动分析完成,已发送文本报告") + + except Exception as e: + logger.error(f"群 {group_id} 自动分析执行失败: {e}", exc_info=True) + + async def _fetch_group_messages_for_auto(self, group_id: str) -> List[Dict]: + """为自动分析获取群聊消息(使用统一方法)""" + if not self.bot_instance: + logger.error(f"群 {group_id} 获取消息失败:缺少bot实例") + return [] + + return await self._fetch_group_messages_unified(self.bot_instance, group_id, self.analysis_days) + + async def _send_auto_analysis_result(self, group_id: str, image_url: str): + """发送自动分析的图片结果到群""" + try: + if not self.bot_instance: + return + + # 发送图片消息到群 + await self.bot_instance.api.call_action( + "send_group_msg", + group_id=group_id, + message=[{ + "type": "text", + "data": {"text": "📊 每日群聊分析报告已生成:"} + }, { + "type": "image", + "data": {"url": image_url} + }] + ) + + except Exception as e: + logger.error(f"发送自动分析结果到群 {group_id} 失败: {e}") + + async def _send_auto_analysis_text(self, group_id: str, text_report: str): + """发送自动分析的文本结果到群""" + try: + if not self.bot_instance: + return + + # 发送文本消息到群 + await self.bot_instance.api.call_action( + "send_group_msg", + group_id=group_id, + message=f"📊 每日群聊分析报告:\n\n{text_report}" + ) + + except Exception as e: + logger.error(f"发送自动分析文本到群 {group_id} 失败: {e}") + + async def _get_bot_instance(self): + """从Context获取bot实例""" + try: + # 如果已经有保存的实例,直接返回 + if self.bot_instance: + return self.bot_instance + + logger.info("尝试获取bot实例...") + + # 简化的获取逻辑,尝试常见的几种方式 + if hasattr(self.context, 'get_platforms') and callable(self.context.get_platforms): + platforms = self.context.get_platforms() + for platform in platforms: + if hasattr(platform, 'bot') and platform.bot: + logger.info(f"从平台获取到bot实例") + return platform.bot + + # 尝试从context的platforms属性获取 + if hasattr(self.context, 'platforms') and self.context.platforms: + for platform in self.context.platforms: + if hasattr(platform, 'bot') and platform.bot: + logger.info(f"从平台列表获取到bot实例") + return platform.bot + + logger.info("暂时无法获取bot实例,等待用户手动触发分析") + return None + + except Exception as e: + logger.error(f"获取bot实例失败: {e}") + return None + + async def _delayed_start_scheduler(self): + """延迟启动调度器,给系统时间初始化""" + try: + # 等待10秒让系统完全初始化 + await asyncio.sleep(10) + + # 尝试获取bot实例 + self.bot_instance = await self._get_bot_instance() + + if self.bot_instance: + logger.info("成功获取bot实例,启动定时任务") + # 获取机器人QQ号 + await self._get_bot_qq_id() + else: + logger.info("暂时未获取到bot实例,定时任务仍会启动。首次手动触发分析后将自动获取bot实例") + + # 启动调度器 + self.scheduler_task = asyncio.create_task(self._start_scheduler()) + + except Exception as e: + logger.error(f"延迟启动调度器失败: {e}") diff --git a/metadata.yaml b/metadata.yaml index c8d3f94..bbd461d 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -1,5 +1,18 @@ -name: helloworld # 这是你的插件的唯一识别名。 -desc: 这是 AstrBot 的默认插件,支持关键词回复。 # 插件简短描述 -version: v1.3 # 插件版本号。格式:v1.1.1 或者 v1.1 -author: Soulter # 作者 -repo: https://github.com/Soulter/helloworld # 插件的仓库地址 +name: astrbot_qq_group_daily_analysis # 这是你的插件的唯一识别名。 +desc: QQ群日常分析插件 - 生成精美的群聊分析报告,支持话题分析、用户称号、群聊金句等功能 # 插件简短描述 +help: | # 插件的帮助信息 + 智能分析群聊活动,生成精美的日常分析报告 + + 主要功能: + - 话题分析和总结 + - 用户称号分配 + - 群聊金句识别 + - 可视化报告 + - 定时自动分析 + + 命令: + /群分析 [天数] - 分析群聊活动 + /分析设置 [操作] - 管理设置(enable/disable/status/test) +version: v1.0.0 # 插件版本号。格式:v1.1.1 或者 v1.1 +author: SXP-Simon # 作者 +repo: https://github.com/SXP-Simon/astrbot-qq-group-daily-analysis # 插件的仓库地址 \ No newline at end of file