├── .env ├── .env.prod ├── .github ├── dependabot.yml └── workflows │ └── black.yml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── bot.py ├── poetry.lock ├── pyproject.toml ├── shigure ├── .gitignore ├── donate │ ├── afdian.jpeg │ └── direct.png ├── hitokoto.json ├── jikipedia.json ├── join_leave_tip.json ├── keyword_replies.json ├── poke_images │ ├── _action │ │ ├── 23a8019175950694.jpg │ │ └── 5dd708a47331affa.jpg │ ├── action │ │ ├── -729616374e1c6c9f.gif │ │ ├── QQ图片20221102000851.jpg │ │ └── QQ图片20221102000919.jpg │ ├── no_action - 副本 │ │ ├── -1339923085674f1f.jpg │ │ ├── -3d50919ed531568d.jpg │ │ ├── -49b52270e0ff31e3.jpg │ │ ├── -4cde827f9fb2161e.jpg │ │ ├── -56487bd7f738f542.jpg │ │ ├── -7b4a916daa5a37d0.jpg │ │ ├── 1.gif │ │ ├── 120eabe3735541cd.jpg │ │ ├── 1bd2970db1a51aa1.jpg │ │ ├── 2157d20474c51f46.jpg │ │ ├── 2661a4c965b14f52.jpg │ │ ├── 34b9d66549796791.jpg │ │ ├── 35018f0febe49085.gif │ │ ├── 478fbac2d3ec4e35.jpg │ │ ├── 4ae4ec2236b16fb4.jpg │ │ ├── 51f8faf4043c50aa.gif │ │ ├── 671de691f50beb9b.jpg │ │ ├── 7194e2897b5e72d5.jpg │ │ ├── QQ图片20220128205650.jpg │ │ ├── QQ图片20220128205704.jpg │ │ ├── QQ图片20220128205715.jpg │ │ ├── QQ图片20220128205726.jpg │ │ ├── QQ图片20220128205753.jpg │ │ ├── QQ图片20220128205805.jpg │ │ ├── QQ图片20220128205833.jpg │ │ ├── illust_93027173_20220209_014417.png │ │ ├── illust_93027173_20220209_014424.png │ │ ├── illust_93027173_20220209_014510.png │ │ ├── illust_94173467_20220209_015035.jpg │ │ ├── illust_94212270_20220209_015040.jpg │ │ └── illust_95831885_20220209_014808.jpg │ └── no_action │ │ ├── -3d50919ed531568d.jpg │ │ ├── -4cde827f9fb2161e.jpg │ │ ├── -56487bd7f738f542.jpg │ │ ├── -7b4a916daa5a37d0.jpg │ │ ├── 1.gif │ │ ├── 120eabe3735541cd.jpg │ │ ├── 1bd2970db1a51aa1.jpg │ │ ├── 2157d20474c51f46.jpg │ │ ├── 2661a4c965b14f52.jpg │ │ ├── 34b9d66549796791.jpg │ │ ├── 35018f0febe49085.gif │ │ ├── 478fbac2d3ec4e35.jpg │ │ ├── 4ae4ec2236b16fb4.jpg │ │ ├── 51f8faf4043c50aa.gif │ │ ├── 671de691f50beb9b.jpg │ │ ├── 7194e2897b5e72d5.jpg │ │ ├── IB`{FE29W2A9Z_G]4HQGRWX.jpg │ │ ├── QQ图片20220128205650.jpg │ │ ├── QQ图片20220128205704.jpg │ │ ├── QQ图片20220128205715.jpg │ │ ├── QQ图片20220128205726.jpg │ │ ├── QQ图片20220128205805.jpg │ │ ├── QQ图片20220128205833.jpg │ │ ├── QQ图片20221102000831.jpg │ │ ├── QQ图片20221102000855.jpg │ │ ├── QQ图片20221102000857.gif │ │ ├── QQ图片20221102000900.gif │ │ ├── QQ图片20221102000903.jpg │ │ ├── QQ图片20221102000907.jpg │ │ ├── QQ图片20221102000928.jpg │ │ ├── QQ图片20221102000930.jpg │ │ ├── QQ图片20221102000935.jpg │ │ ├── illust_93027173_20220209_014417.png │ │ ├── illust_93027173_20220209_014424.png │ │ ├── illust_93027173_20220209_014510.png │ │ ├── illust_94173467_20220209_015035.jpg │ │ ├── illust_94212270_20220209_015040.jpg │ │ └── illust_95831885_20220209_014808.jpg ├── poke_replies - 副本.json ├── poke_replies.json ├── req_foward.json ├── sexpic.json └── website_capture.json └── src └── plugins └── shigure_bot ├── __init__.py └── plugins ├── _cache ├── __init__.py ├── __main__.py └── util.py ├── _config ├── README.md ├── __init__.py ├── __main__.py └── config.py ├── api_tester ├── README.md ├── README │ ├── 1.png │ └── 2.png ├── __init__.py └── __main__.py ├── blackbe ├── __init__.py ├── __main__.py ├── config.py ├── datatypes.py ├── detect.py ├── get_data.py └── get_msg.py ├── hitokoto ├── __init__.py ├── __main__.py └── config.py ├── jikipedia ├── __init__.py ├── __main__.py ├── config.py ├── data_source.py └── data_types.py ├── join_leave_tip ├── __init__.py ├── __main__.py └── config.py ├── keyword_reply ├── __init__.py ├── __main__.py └── config.py ├── mc_svr_stat ├── __init__.py ├── __main__.py └── get_stat.py ├── netease_music ├── __init__.py ├── __main__.py ├── config.py ├── data_source.py └── util.py ├── poison_soup ├── __init__.py ├── __main__.py ├── data_source.py └── soup.txt ├── poke_reply ├── __init__.py ├── __main__.py └── config.py ├── req_to_group ├── __init__.py └── __main__.py ├── site_tool ├── __init__.py └── __main__.py ├── socialify ├── __init__.py ├── __main__.py └── data_source.py ├── tg_sync ├── __init__.py ├── __main__.py └── config.py ├── website_capture ├── __init__.py ├── __main__.py ├── capture.py └── config.py └── yinglish_tr ├── __init__.py └── __main__.py /.env: -------------------------------------------------------------------------------- 1 | ENVIRONMENT=dev 2 | -------------------------------------------------------------------------------- /.env.prod: -------------------------------------------------------------------------------- 1 | HOST=127.0.0.1 2 | PORT=8080 3 | SUPERUSERS=[""] 4 | NICKNAME=["shigure","Shigure","时雨"] 5 | COMMAND_START=[""] 6 | COMMAND_SEP=[" "] 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "poetry" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.github/workflows/black.yml: -------------------------------------------------------------------------------- 1 | name: Black 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | python-version: ["3.10"] 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Set up Python ${{ matrix.python-version }} 14 | uses: actions/setup-python@v3 15 | with: 16 | python-version: ${{ matrix.python-version }} 17 | - name: Install dependencies 18 | run: | 19 | python -m pip install --upgrade pip 20 | pip install black 21 | - name: Run 22 | run: | 23 | black $(git ls-files '*.py') 24 | - name: Push 25 | run: | 26 | git config --global user.email ${{ secrets.EMAIL }} 27 | git config --global user.name ${{ secrets.NAME }} 28 | git add . 29 | git commit -m "Use Black to Format Code" 30 | git push 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/python 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 4 | 5 | ### Python ### 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | pip-wheel-metadata/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .nox/ 49 | .coverage 50 | .coverage.* 51 | .cache 52 | nosetests.xml 53 | coverage.xml 54 | *.cover 55 | *.py,cover 56 | .hypothesis/ 57 | .pytest_cache/ 58 | pytestdebug.log 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | db.sqlite3 68 | db.sqlite3-journal 69 | 70 | # Flask stuff: 71 | instance/ 72 | .webassets-cache 73 | 74 | # Scrapy stuff: 75 | .scrapy 76 | 77 | # Sphinx documentation 78 | docs/_build/ 79 | doc/_build/ 80 | 81 | # PyBuilder 82 | target/ 83 | 84 | # Jupyter Notebook 85 | .ipynb_checkpoints 86 | 87 | # IPython 88 | profile_default/ 89 | ipython_config.py 90 | 91 | # pyenv 92 | .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 102 | __pypackages__/ 103 | 104 | # Celery stuff 105 | celerybeat-schedule 106 | celerybeat.pid 107 | 108 | # SageMath parsed files 109 | *.sage.py 110 | 111 | # Environments 112 | # .env 113 | .venv 114 | env/ 115 | venv/ 116 | ENV/ 117 | env.bak/ 118 | venv.bak/ 119 | 120 | # Spyder project settings 121 | .spyderproject 122 | .spyproject 123 | 124 | # Rope project settings 125 | .ropeproject 126 | 127 | # mkdocs documentation 128 | /site 129 | 130 | # mypy 131 | .mypy_cache/ 132 | .dmypy.json 133 | dmypy.json 134 | 135 | # Pyre type checker 136 | .pyre/ 137 | 138 | # pytype static type analyzer 139 | .pytype/ 140 | 141 | # End of https://www.toptal.com/developers/gitignore/api/python 142 | 143 | .env.dev 144 | # /shigure/ 145 | /shigure/blackbe_tmp/ 146 | /src/plugins/shigure_bot/plugins/test_plugin/ 147 | /tests/ 148 | /#start.txt 149 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "LLScriptHelper.isrunning": false 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | [This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.] 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | 474 | Copyright (C) 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 489 | USA 490 | 491 | Also add information on how to contact you by electronic and paper mail. 492 | 493 | You should also get your employer (if you work as a programmer) or your 494 | school, if any, to sign a "copyright disclaimer" for the library, if 495 | necessary. Here is a sample; alter the names: 496 | 497 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 498 | library `Frob' (a library for tweaking knobs) written by James Random 499 | Hacker. 500 | 501 | , 1 April 1990 502 | Ty Coon, President of Vice 503 | 504 | That's all there is to it! -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ShigureBot 2 | 3 | [![wakatime](https://wakatime.com/badge/user/b61b0f9a-f40b-4c82-bc51-0a75c67bfccf/project/c1344e53-6345-4e5f-9adc-7332f74bff44.svg)](https://wakatime.com/badge/user/b61b0f9a-f40b-4c82-bc51-0a75c67bfccf/project/c1344e53-6345-4e5f-9adc-7332f74bff44) 4 | [![CodeFactor](https://www.codefactor.io/repository/github/lgc2333/shigurebot/badge)](https://www.codefactor.io/repository/github/lgc2333/shigurebot) 5 | 6 | 为自己 Bot 写的插件集 7 | 8 | ## 依赖 9 | 10 | - 需求 11 | - Python `>=3.10` 12 | (由于使用了 python 新版本特性,python 版本低于 3.10 将无法正常使用本项目) 13 | - nonebot2 `>=2.0.0b1` 14 | - More...(在`pyproject.toml`) 15 | - 安装 16 | - 项目使用`poetry`安装依赖,如果没有安装,请使用下面的命令安装 17 | 18 | ```sh 19 | pip install poetry 20 | ``` 21 | 22 | 在本项目`pyproject.toml`同目录下执行下面的命令 23 | 24 | ```sh 25 | poetry install 26 | ``` 27 | 28 | ## 使用 29 | 30 | ### 整个项目 31 | 32 | #### 使用项目`bot.py`启动 33 | 34 | 请先按照下面的方法修改项目`.env`文件 35 | 36 | ```diff 37 | -ENVIRONMENT=dev 38 | +ENVIRONMENT=prod 39 | ``` 40 | 41 | - 通过脚手架启动(推荐) 42 | 43 | 本项目依赖项内**不**包含脚手架,如果你没有安装,请使用下面的命令安装 44 | 45 | ```sh 46 | pip install nb-cli 47 | ``` 48 | 49 | 在`bot.py`所在文件夹下,执行下面的命令通过脚手架启动项目 50 | 51 | ```sh 52 | nb run 53 | ``` 54 | 55 | - 直接使用`bot.py`启动 56 | 57 | 在`bot.py`所在目录下,执行下面的命令启动项目 58 | 59 | ```sh 60 | python bot.py 61 | ``` 62 | 63 | #### 使用现有`nonebot`项目启动 64 | 65 | 将`src/plugins/shigure_bot`目录放在你现有项目的插件文件夹下(可能为`src/plugins`或`{项目名}/plugins`文件夹)后安装依赖即可使用 66 | 67 | ### 单个插件 68 | 69 | 本项目所有单个插件放置在`src/plugins/shigure_bot/plugins`目录下。由于本项目所有带配置的插件均使用项目自有的配置文件系统,如果想要单独使用,请先尝试下面的方法 70 | 71 | - 对单个插件`config.py`进行修改 (详细方法请自行看插件源码摸索,或者参考我的单品插件(以后会有)) 72 | - 将项目`_config`插件放置于本项目单品插件同级目录下加载 73 | - 使用我的单品插件(以后可能会有) 74 | 75 | ## 单品插件列表 76 | 77 | 请查看`src/plugins/shigure_bot/plugins`目录,每个插件我都会写单独的`README.md` 78 | ,也可以参考[这里](https://shigure.lgc2333.top/#/?id=%e8%87%aa%e5%b7%b1%e5%86%99%e7%9a%84-nonebot2-%e6%8f%92%e4%bb%b6) 79 | 80 | ## 联系我/赞助 81 | 82 | 如果项目使用过程中有任何问题,欢迎联系我 83 | [个人资料](https://github.com/lgc2333/) 84 | -------------------------------------------------------------------------------- /bot.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import nonebot 5 | from nonebot.adapters.onebot.v11 import Adapter as V11Adapter 6 | 7 | # Custom your logger 8 | # 9 | # from nonebot.log import logger, default_format 10 | # logger.add("error.log", 11 | # rotation="00:00", 12 | # diagnose=False, 13 | # level="ERROR", 14 | # format=default_format) 15 | 16 | # You can pass some keyword args config to init function 17 | nonebot.init() 18 | app = nonebot.get_asgi() 19 | 20 | driver = nonebot.get_driver() 21 | driver.register_adapter(V11Adapter) 22 | 23 | # Please DO NOT modify this file unless you know what you are doing! 24 | # As an alternative, you should use command `nb` or modify pyproject.toml` to load plugins 25 | nonebot.load_from_toml("pyproject.toml") 26 | 27 | # Modify some config / config depends on loaded configs 28 | # 29 | # config = driver.config 30 | # do something... 31 | 32 | 33 | if __name__ == "__main__": 34 | nonebot.logger.warning( 35 | "Always use `nb run` to start the bot instead of manually running!" 36 | ) 37 | nonebot.run(app="__mp_main__:app") 38 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "ShigureBot" 3 | version = "0.5.2" 4 | description = "Kawaii no Shigure Bot~" 5 | authors = ["student_2333 "] 6 | license = "LGPL-2.1" 7 | readme = "README.md" 8 | 9 | [tool.poetry.dependencies] 10 | python = ">=3.10.0,<4.0.0" 11 | nonebot2 = "^2.0.0b2" 12 | aiohttp = ">=3.7.4" 13 | aiofiles = "^0.8.0" 14 | mcstatus = "^9.0.3" 15 | pydantic = "^1.9.0" 16 | nonebot-plugin-htmlrender = "^0.0.4.5" 17 | nonebot-plugin-apscheduler = "^0.1.2" 18 | nonebot-adapter-onebot = "^2.0.0-beta.1" 19 | jieba = "^0.42.1" 20 | yinglish = "^1.0.1" 21 | pathlib = "^1.0.1" 22 | pyncm = "^1.6.7" 23 | awaits = "^0.0.1" 24 | httpx = "^0.23.0" 25 | aiogram = "^2.22.2" 26 | 27 | [tool.poetry.dev-dependencies] 28 | nb-cli = "^0.6.6" 29 | pylint = "^2.13.8" 30 | black = "^22.10.0" 31 | 32 | [tool.nonebot] 33 | plugins = [] 34 | plugin_dirs = ["src/plugins"] 35 | 36 | [build-system] 37 | requires = ["poetry_core>=1.0.0"] 38 | build-backend = "poetry.core.masonry.api" 39 | 40 | [[tool.poetry.source]] 41 | name = "tsinghua" 42 | url = "https://pypi.tuna.tsinghua.edu.cn/simple" 43 | default = true -------------------------------------------------------------------------------- /shigure/.gitignore: -------------------------------------------------------------------------------- 1 | blackbe.json 2 | netease_music.json 3 | pic_search.json 4 | tg_sync.json 5 | -------------------------------------------------------------------------------- /shigure/donate/afdian.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/donate/afdian.jpeg -------------------------------------------------------------------------------- /shigure/donate/direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/donate/direct.png -------------------------------------------------------------------------------- /shigure/hitokoto.json: -------------------------------------------------------------------------------- 1 | { 2 | "send_link": false 3 | } -------------------------------------------------------------------------------- /shigure/jikipedia.json: -------------------------------------------------------------------------------- 1 | { 2 | "send_suggestion": true, 3 | "suggestion_num": 3 4 | } -------------------------------------------------------------------------------- /shigure/join_leave_tip.json: -------------------------------------------------------------------------------- 1 | { 2 | "join_message": "{at} 欢迎新入群的rbq~", 3 | "leave_message": "{nick}({qq})默默地离开了我们……", 4 | "kick_message": "{nick}({qq})被至高无上的管理员{admin}制裁了!!(躲", 5 | "except_groups": [ 6 | 887921071 7 | ] 8 | } -------------------------------------------------------------------------------- /shigure/keyword_replies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "full", 4 | "to_me": true, 5 | "keywords": [ 6 | "" 7 | ], 8 | "replies": [ 9 | "在哦~", 10 | "嘿嘿~找我干嘛?", 11 | "锵锵!时雨闪亮登场~", 12 | "请问有什么需要吗?", 13 | "来喽~" 14 | ] 15 | }, 16 | { 17 | "type": "full", 18 | "to_me": false, 19 | "keywords": [ 20 | "功能", 21 | "菜单", 22 | "帮助" 23 | ], 24 | "replies": [ 25 | "把Bot菜单迁移到了Github Pages,来看看吧~\n如果无法打开下面的链接,尝试科学上网\nhttps://shigure.lgc2333.top/" 26 | ] 27 | }, 28 | { 29 | "type": "regex", 30 | "to_me": false, 31 | "keywords": [ 32 | "赞助(作者|主人)?" 33 | ], 34 | "replies": [ 35 | [ 36 | { 37 | "type": "var", 38 | "data": "at" 39 | }, 40 | { 41 | "type": "text", 42 | "data": { 43 | "text": "\n支持一下可怜的孩子吧(\n可以在备注里写上你的留言,会加到Bot功能页的赞助列表~\n爱发电:" 44 | } 45 | }, 46 | { 47 | "type": "image", 48 | "data": { 49 | "file": "file:///C:\\Users\\Administrator\\Desktop\\python\\ShigureBot\\nb2\\shigure\\donate\\afdian.jpeg" 50 | } 51 | }, 52 | { 53 | "type": "text", 54 | "data": { 55 | "text": "也可以直接赞助:" 56 | } 57 | }, 58 | { 59 | "type": "image", 60 | "data": { 61 | "file": "file:///C:\\Users\\Administrator\\Desktop\\python\\ShigureBot\\nb2\\shigure\\donate\\direct.png" 62 | } 63 | }, 64 | { 65 | "type": "text", 66 | "data": { 67 | "text": "感谢各位大佬的赞助!!" 68 | } 69 | } 70 | ] 71 | ] 72 | } 73 | ] -------------------------------------------------------------------------------- /shigure/poke_images/_action/23a8019175950694.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/_action/23a8019175950694.jpg -------------------------------------------------------------------------------- /shigure/poke_images/_action/5dd708a47331affa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/_action/5dd708a47331affa.jpg -------------------------------------------------------------------------------- /shigure/poke_images/action/-729616374e1c6c9f.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/action/-729616374e1c6c9f.gif -------------------------------------------------------------------------------- /shigure/poke_images/action/QQ图片20221102000851.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/action/QQ图片20221102000851.jpg -------------------------------------------------------------------------------- /shigure/poke_images/action/QQ图片20221102000919.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/action/QQ图片20221102000919.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/-1339923085674f1f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/-1339923085674f1f.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/-3d50919ed531568d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/-3d50919ed531568d.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/-49b52270e0ff31e3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/-49b52270e0ff31e3.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/-4cde827f9fb2161e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/-4cde827f9fb2161e.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/-56487bd7f738f542.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/-56487bd7f738f542.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/-7b4a916daa5a37d0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/-7b4a916daa5a37d0.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/1.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/120eabe3735541cd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/120eabe3735541cd.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/1bd2970db1a51aa1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/1bd2970db1a51aa1.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/2157d20474c51f46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/2157d20474c51f46.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/2661a4c965b14f52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/2661a4c965b14f52.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/34b9d66549796791.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/34b9d66549796791.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/35018f0febe49085.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/35018f0febe49085.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/478fbac2d3ec4e35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/478fbac2d3ec4e35.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/4ae4ec2236b16fb4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/4ae4ec2236b16fb4.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/51f8faf4043c50aa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/51f8faf4043c50aa.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/671de691f50beb9b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/671de691f50beb9b.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/7194e2897b5e72d5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/7194e2897b5e72d5.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205650.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205650.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205704.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205704.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205715.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205715.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205726.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205726.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205753.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205753.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205805.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205805.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/QQ图片20220128205833.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/QQ图片20220128205833.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/illust_93027173_20220209_014417.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/illust_93027173_20220209_014417.png -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/illust_93027173_20220209_014424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/illust_93027173_20220209_014424.png -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/illust_93027173_20220209_014510.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/illust_93027173_20220209_014510.png -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/illust_94173467_20220209_015035.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/illust_94173467_20220209_015035.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/illust_94212270_20220209_015040.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/illust_94212270_20220209_015040.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action - 副本/illust_95831885_20220209_014808.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action - 副本/illust_95831885_20220209_014808.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/-3d50919ed531568d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/-3d50919ed531568d.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/-4cde827f9fb2161e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/-4cde827f9fb2161e.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/-56487bd7f738f542.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/-56487bd7f738f542.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/-7b4a916daa5a37d0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/-7b4a916daa5a37d0.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/1.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action/120eabe3735541cd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/120eabe3735541cd.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/1bd2970db1a51aa1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/1bd2970db1a51aa1.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/2157d20474c51f46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/2157d20474c51f46.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/2661a4c965b14f52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/2661a4c965b14f52.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/34b9d66549796791.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/34b9d66549796791.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/35018f0febe49085.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/35018f0febe49085.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action/478fbac2d3ec4e35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/478fbac2d3ec4e35.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/4ae4ec2236b16fb4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/4ae4ec2236b16fb4.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/51f8faf4043c50aa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/51f8faf4043c50aa.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action/671de691f50beb9b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/671de691f50beb9b.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/7194e2897b5e72d5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/7194e2897b5e72d5.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/IB`{FE29W2A9Z_G]4HQGRWX.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/IB`{FE29W2A9Z_G]4HQGRWX.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20220128205650.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20220128205650.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20220128205704.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20220128205704.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20220128205715.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20220128205715.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20220128205726.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20220128205726.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20220128205805.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20220128205805.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20220128205833.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20220128205833.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000831.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000831.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000855.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000855.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000857.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000857.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000900.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000900.gif -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000903.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000903.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000907.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000907.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000928.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000928.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000930.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000930.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/QQ图片20221102000935.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/QQ图片20221102000935.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/illust_93027173_20220209_014417.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/illust_93027173_20220209_014417.png -------------------------------------------------------------------------------- /shigure/poke_images/no_action/illust_93027173_20220209_014424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/illust_93027173_20220209_014424.png -------------------------------------------------------------------------------- /shigure/poke_images/no_action/illust_93027173_20220209_014510.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/illust_93027173_20220209_014510.png -------------------------------------------------------------------------------- /shigure/poke_images/no_action/illust_94173467_20220209_015035.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/illust_94173467_20220209_015035.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/illust_94212270_20220209_015040.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/illust_94212270_20220209_015040.jpg -------------------------------------------------------------------------------- /shigure/poke_images/no_action/illust_95831885_20220209_014808.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/shigure/poke_images/no_action/illust_95831885_20220209_014808.jpg -------------------------------------------------------------------------------- /shigure/poke_replies - 副本.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "texts", 4 | "content": [ 5 | "发送“菜单”即可查看Shigure的全部功能哦~", 6 | "emmmm你到底有什么企图(盯——", 7 | "快看这里有个死变态!", 8 | "再戳,再戳……我就把你吃掉!", 9 | "要来一棒子吗?", 10 | "要……要变得奇怪起来了……(脸红)", 11 | "放手啦,不给戳!QAQ", 12 | "你在戳哪里啊!死变态!!", 13 | "讨厌…只能一下…", 14 | "你讨厌!又戳咱的脸…", 15 | "变态!不许乱戳啦!", 16 | "那……请你,温柔点哦~(////////)", 17 | "不要啦ヽ(≧Д≦)ノ", 18 | "咿呀……不要……", 19 | "呀...欧,欧尼酱...请轻点", 20 | "诶?!不...不可以哦!很...很害羞的!", 21 | "请不要这样先生,你想剁手吗?", 22 | "是要直接戳还是伸进里面戳戳呀w咱今天没穿,伸进里面会...>////<", 23 | "你是满脑子都是H的淫兽吗?", 24 | "下流!", 25 | "八嘎!hentai!无路赛!", 26 | "诶?!不...不可以哦!很...很害羞的!", 27 | "请把脑袋伸过来,咱给你看个宝贝", 28 | "咿呀~好奇怪的感觉(>_<)", 29 | "咿呀~快…快停下来…咱…不行了!", 30 | "嗯……不可以……啦……不要乱戳", 31 | "(按住你的头)好痒呀,不要啦——", 32 | "(害羞)", 33 | "不要在公共场合这样啦~", 34 | "把你噶咯", 35 | "再戳,就把你变成女孩子(拿刀)", 36 | "唔....?诶诶诶诶?//////", 37 | "哎呀啊啊啊啊啊!不要...不要戳!好疼!", 38 | "今天……没有穿", 39 | "你是想对咱做什么吗...(后退)", 40 | "呀!...呜...,不要...不要这样啦...呜...", 41 | "你戳nm呢", 42 | "再戳我头给你戳掉", 43 | "呼喵?", 44 | "啊——那里……不行!", 45 | "呜咿……!♡", 46 | "啊呜——!戳到敏感的地方了♡(//////)", 47 | "啊!你绝对是故意的吧!!", 48 | "建议迟早剁了", 49 | "你!干!嘛——!", 50 | "喂?110吗?这里有个变态骚扰狂!!" 51 | ] 52 | }, 53 | { 54 | "type": "texts", 55 | "content": [ 56 | "戳回去", 57 | "哼,戳你牛子", 58 | "戳戳戳,就知道戳,我戳死你——", 59 | "我戳戳戳戳戳戳戳戳戳戳戳戳", 60 | "呀~既然你戳了咱,那咱也戳戳你~", 61 | "戳戳" 62 | ], 63 | "action": true 64 | }, 65 | { 66 | "type": "image_folder", 67 | "content": "./shigure/poke_images/no_action" 68 | }, 69 | { 70 | "type": "image_folder", 71 | "content": "./shigure/poke_images/action", 72 | "action": true 73 | } 74 | ] -------------------------------------------------------------------------------- /shigure/poke_replies.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "type": "texts", 4 | "content": [ 5 | "发送“菜单”即可查看Shigure的全部功能哦~", 6 | "emmmm你到底有什么企图(盯——", 7 | "再戳,再戳……我就把你吃掉!", 8 | "要来一棒子吗?", 9 | "放手啦,不给戳!QAQ", 10 | "讨厌…只能一下…", 11 | "你讨厌!又戳咱的脸…", 12 | "变态!不许乱戳啦!", 13 | "不要啦ヽ(≧Д≦)ノ", 14 | "咿呀……不要……", 15 | "诶?!不...不可以哦!很...很害羞的!", 16 | "请不要这样先生,你想剁手吗?", 17 | "八嘎!hentai!无路赛!", 18 | "请把脑袋伸过来,咱给你看个宝贝", 19 | "咿呀~好奇怪的感觉(>_<)", 20 | "(按住你的头)好痒呀,不要啦——", 21 | "(害羞)", 22 | "不要在公共场合这样啦~", 23 | "把你噶咯", 24 | "再戳,就把你变成女孩子(拿刀)", 25 | "哎呀啊啊啊啊啊!不要...不要戳!好疼!", 26 | "你是想对咱做什么吗...(后退)", 27 | "你戳nm呢", 28 | "再戳我头给你戳掉", 29 | "呼喵?", 30 | "啊!你绝对是故意的吧!!", 31 | "建议迟早剁了", 32 | "你!干!嘛——!", 33 | "喂?110吗?这里有个变态骚扰狂!!" 34 | ] 35 | }, 36 | { 37 | "type": "texts", 38 | "content": [ 39 | "戳回去", 40 | "戳戳戳,就知道戳,我戳死你——", 41 | "我戳戳戳戳戳戳戳戳戳戳戳戳", 42 | "呀~既然你戳了咱,那咱也戳戳你~", 43 | "戳戳" 44 | ], 45 | "action": true 46 | }, 47 | { 48 | "type": "image_folder", 49 | "content": "./shigure/poke_images/no_action" 50 | }, 51 | { 52 | "type": "image_folder", 53 | "content": "./shigure/poke_images/action", 54 | "action": true 55 | } 56 | ] -------------------------------------------------------------------------------- /shigure/req_foward.json: -------------------------------------------------------------------------------- 1 | { 2 | "auto_allow_superusers": true, 3 | "forward_friend_req": false, 4 | "forward_group_invite": false, 5 | "auto_allow_anyone": true, 6 | "send_addition_notice": false, 7 | "send_leave_notice": false 8 | } -------------------------------------------------------------------------------- /shigure/sexpic.json: -------------------------------------------------------------------------------- 1 | { 2 | "only_private": false, 3 | "trigger_words": [ 4 | "色色", 5 | "涩涩", 6 | "瑟瑟", 7 | "色图", 8 | "涩图", 9 | "瑟图", 10 | "二次元", 11 | "二刺猿", 12 | "二刺螈" 13 | ], 14 | "delay": 30, 15 | "proxy": "http://127.0.0.1:10809", 16 | "withdraw_delay": 60, 17 | "send_details": true, 18 | "can_filter_by_tag": false 19 | } -------------------------------------------------------------------------------- /shigure/website_capture.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore_sites": [ 3 | "xvideos.com", 4 | "pornhub.com" 5 | ] 6 | } -------------------------------------------------------------------------------- /src/plugins/shigure_bot/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from nonebot import load_plugins 4 | 5 | path = str((Path(__file__).parent / "plugins").resolve()) 6 | # sys.path.append(path) 7 | 8 | _sub = set() 9 | _sub |= load_plugins(path) 10 | 11 | __version__ = "0.5.1" 12 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_cache/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | 缓存管理 3 | """ 4 | from .__main__ import * 5 | 6 | __version__ = "0.1.1" 7 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_cache/__main__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from .util import async_wrapper 4 | 5 | 6 | class PluginCache: 7 | def __init__(self, name): 8 | real_path = Path(__file__).parent.parent.parent / "cache" 9 | if not real_path.exists(): 10 | real_path.mkdir(parents=True) 11 | 12 | self.path: Path = real_path / name 13 | if not self.path.exists(): 14 | self.path.write_bytes(b"") 15 | 16 | async def get_text(self): 17 | await async_wrapper(self.path.read_text, encoding="utf-8") 18 | 19 | async def get_bytes(self): 20 | await async_wrapper(self.path.read_bytes) 21 | 22 | async def set_text(self, data): 23 | await async_wrapper(self.path.write_text, data, encoding="utf-8") 24 | 25 | async def set_bytes(self, data): 26 | await async_wrapper(self.path.write_bytes, data) 27 | 28 | def get_abspath(self): 29 | return self.path.resolve() 30 | 31 | def get_path(self): 32 | return str(self.path) 33 | 34 | def __del__(self): 35 | self.path.unlink() 36 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_cache/util.py: -------------------------------------------------------------------------------- 1 | from awaits.awaitable import awaitable 2 | 3 | 4 | async def async_wrapper(origin_func, *args, **kwargs): 5 | """异步调用包装""" 6 | 7 | @awaitable 8 | def wrapper_(): 9 | return origin_func(*args, **kwargs) 10 | 11 | return await wrapper_() 12 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_config/README.md: -------------------------------------------------------------------------------- 1 | # \_config 2 | 3 | ## 简介 4 | 5 | 此插件用于统一管理以及动态重载项目中所有插件的配置 6 | 7 | ## 指令 8 | 9 | - `重载配置` 10 | 11 | **该指令只有`SUPERUSER`能触发** 12 | 立即重载本项目插件的所有配置文件 13 | 14 | ## 配置 15 | 16 | 无 17 | 18 | ## 更新日志 19 | 20 | - 0.2.1: rename to `_config` 21 | - 0.2.0: support save (maybe) 22 | - 0.1.0: initial 23 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_config/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.2.1" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_config/__main__.py: -------------------------------------------------------------------------------- 1 | from nonebot import on_regex 2 | from nonebot.matcher import Matcher 3 | from nonebot.permission import SUPERUSER 4 | 5 | from .config import * 6 | 7 | 8 | @on_regex("^重载配置$", permission=SUPERUSER).handle() 9 | async def _(matcher: Matcher): 10 | await matcher.send("请稍候") 11 | try: 12 | await reload() 13 | except: 14 | logger.exception("配置重载失败") 15 | await matcher.finish("操作失败,请检查后台输出") 16 | else: 17 | await matcher.finish("操作完毕") 18 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/_config/config.py: -------------------------------------------------------------------------------- 1 | """这配置文件系统就一屎山……为了动态统一重载配置,能跑就行""" 2 | import json 3 | import os.path 4 | from typing import Callable 5 | 6 | import aiofiles 7 | import pydantic 8 | from nonebot import logger 9 | from pydantic import BaseModel 10 | 11 | _tmp = [] 12 | 13 | 14 | def _model_to_object(model): 15 | if isinstance(model, BaseModel): 16 | return model.dict() 17 | elif isinstance(model, (list, tuple, set)): 18 | return [(x.dict() if isinstance(x, BaseModel) else x) for x in model] 19 | return model 20 | 21 | 22 | class BaseConfig: 23 | """屎山类""" 24 | 25 | def __init__(self, filename, model=None, default_conf=None): 26 | self._filename = filename 27 | self._model = model 28 | self._default_conf = default_conf 29 | self._tmp = None 30 | self._path = self._get_path() 31 | 32 | async def get(self): 33 | if not self._tmp: 34 | try: 35 | cf = await self.load() 36 | if self._model: 37 | if isinstance(cf, dict): 38 | self._tmp = self._model(**cf) 39 | elif isinstance(cf, list): 40 | self._tmp = [self._model(**x) for x in cf] 41 | else: 42 | raise TypeError("Type not supported") 43 | else: 44 | self._tmp = cf 45 | except (pydantic.ValidationError, json.JSONDecodeError) as e: 46 | logger.exception("配置文件格式错误") 47 | raise e 48 | 49 | return self._tmp 50 | 51 | async def load(self): 52 | if not os.path.exists(self._path): 53 | conf = self._default_conf 54 | else: 55 | async with aiofiles.open(self._path, encoding="utf-8") as f: 56 | conf = json.loads(await f.read()) 57 | 58 | if isinstance(conf, dict) and isinstance(self._default_conf, dict): 59 | # 将未配置的配置项配置为默认 60 | for k, v in self._default_conf.items(): 61 | if k not in conf: 62 | conf[k] = v 63 | 64 | await self.save(conf) # format / write default 65 | logger.debug(f'Loaded config "{self._filename}": {conf}') 66 | return conf 67 | 68 | async def save(self, custom_conf=None): 69 | async with aiofiles.open(self._path, "w", encoding="utf-8") as f: 70 | await f.write( 71 | json.dumps( 72 | _model_to_object(custom_conf or self._tmp), 73 | indent=2, 74 | ensure_ascii=False, 75 | ) 76 | ) 77 | 78 | def clear_tmp(self): 79 | self._tmp = None 80 | 81 | def _get_path(self): 82 | fpath = os.path.join("shigure", f"{self._filename}.json") 83 | dir_name = os.path.dirname(fpath) 84 | if not os.path.exists(dir_name): 85 | os.makedirs(dir_name) 86 | return fpath 87 | 88 | def _check_tmp_is_list(self): 89 | if not isinstance(self._tmp, list): 90 | raise TypeError("Operation does not correspond to type") 91 | 92 | def _check_tmp_is_model(self): 93 | if not isinstance(self._tmp, BaseModel): 94 | raise TypeError("Operation does not correspond to type") 95 | 96 | def __getattr__(self, item): 97 | if isinstance(item, str) and item.startswith("_"): 98 | return self.__dict__[item] 99 | else: 100 | return getattr(self._tmp, item) 101 | 102 | def __setattr__(self, key, value): 103 | if isinstance(key, str) and key.startswith("_"): 104 | self.__dict__[key] = value 105 | else: 106 | self._check_tmp_is_model() 107 | setattr(self._tmp, key, value) 108 | 109 | def __getitem__(self, item): 110 | try: 111 | return self.__getattr__(item) 112 | except TypeError: 113 | self._check_tmp_is_list() 114 | return self._tmp.__getitem__(item) 115 | 116 | def __setitem__(self, key, value): 117 | try: 118 | self.__setattr__(key, value) 119 | except TypeError: 120 | self._check_tmp_is_list() 121 | self._tmp.__setitem__(key, value) 122 | 123 | def __len__(self): 124 | self._check_tmp_is_list() 125 | return len(self._tmp) 126 | 127 | def __iter__(self): 128 | self._check_tmp_is_list() 129 | yield from self._tmp 130 | 131 | 132 | async def init( 133 | filename: str, 134 | model: Callable[[...], BaseModel] = None, 135 | default_conf: dict | list = None, 136 | cls: Callable[..., BaseConfig] = None, 137 | ): 138 | if cls: 139 | conf = cls(filename, model, default_conf) 140 | else: 141 | conf = BaseConfig(filename, model, default_conf) 142 | _tmp.append(conf) 143 | await conf.get() 144 | return conf 145 | 146 | 147 | async def reload(): 148 | for cf in _tmp: 149 | cf.clear_tmp() 150 | await cf.get() 151 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/api_tester/README.md: -------------------------------------------------------------------------------- 1 | # api_tester 2 | 3 | ## 简介 4 | 5 | 此插件用于快捷获取 API 返回值或者返回图片 6 | 7 | ## 指令 8 | 9 | - `$访问 ` 10 | 11 | **该指令只有`SUPERUSER`能触发** 12 | 获取指定 URL 返回的内容 13 | 14 | - 示例 15 | ![1](README/1.png) 16 | 17 | - `$img ` 18 | 19 | **该指令只有`SUPERUSER`能触发** 20 | 获取指定 URL 返回的图片 21 | 22 | - 示例 23 | ![2](README/2.png) 24 | 25 | ## 配置 26 | 27 | 无 28 | 29 | ## 更新日志 30 | 31 | - 0.1.0: initial 32 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/api_tester/README/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/src/plugins/shigure_bot/plugins/api_tester/README/1.png -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/api_tester/README/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/ShigureBot/215edad5a4eaf8fe9e83dc38400e9c79268f5850/src/plugins/shigure_bot/plugins/api_tester/README/2.png -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/api_tester/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/api_tester/__main__.py: -------------------------------------------------------------------------------- 1 | import aiohttp 2 | from nonebot import on_command 3 | from nonebot.adapters.onebot.v11.message import Message, MessageSegment 4 | from nonebot.adapters.onebot.v11.utils import unescape 5 | from nonebot.matcher import Matcher 6 | from nonebot.params import CommandArg 7 | from nonebot.permission import SUPERUSER 8 | 9 | 10 | @on_command("$访问", permission=SUPERUSER).handle() 11 | async def _(matcher: Matcher, args: Message = CommandArg()): 12 | url = str(args).strip() 13 | if not url: 14 | await matcher.finish("请输入要访问的URL", at_sender=True) 15 | return 16 | if not url.startswith(("http://", "https://")): 17 | url = f"http://{unescape(url)}" 18 | try: 19 | async with aiohttp.ClientSession() as session: 20 | async with session.get(url) as response: 21 | ret = await response.text() 22 | except Exception as e: 23 | await matcher.finish(f"URL访问失败:\n{e!r}", at_sender=True) 24 | else: 25 | await matcher.finish(f"URL返回内容:\n{ret}", at_sender=True) 26 | 27 | 28 | @on_command("$img", permission=SUPERUSER).handle() 29 | async def _(matcher: Matcher, args: Message = CommandArg()): 30 | url = str(args).strip() 31 | if not url: 32 | await matcher.finish("请输入要访问的URL", at_sender=True) 33 | return 34 | if not url.startswith(("http://", "https://")): 35 | url = f"http://{unescape(url)}" 36 | try: 37 | async with aiohttp.ClientSession() as session: 38 | async with session.get(url) as response: 39 | ret = await response.read() 40 | except Exception as e: 41 | await matcher.finish(f"URL访问失败:\n{e!r}", at_sender=True) 42 | else: 43 | await matcher.finish(MessageSegment.image(ret), at_sender=True) 44 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "1.3.4" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/__main__.py: -------------------------------------------------------------------------------- 1 | from nonebot import logger, on_command, on_message, require 2 | from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent 3 | from nonebot.matcher import Matcher 4 | from nonebot.params import CommandArg 5 | from nonebot.permission import SUPERUSER 6 | 7 | from .config import config as conf 8 | from .detect import BlackBEDetect 9 | from .get_msg import send_info_msg 10 | 11 | detect = BlackBEDetect() 12 | scheduler = require("nonebot_plugin_apscheduler").scheduler 13 | 14 | 15 | @scheduler.scheduled_job("cron", minute="*/10") 16 | async def _schedule_clear_noticed(): 17 | detect.tmp_noticed.clear() 18 | 19 | 20 | @scheduler.scheduled_job("cron", hour="*/12") 21 | async def _schedule_clear_tmp(): 22 | detect.tmp_black.clear() 23 | 24 | 25 | def list_has_same_item(list1, list2): 26 | return any(i in list2 for i in list1) 27 | 28 | 29 | @on_command("查云黑").handle() 30 | async def _( 31 | bot: Bot, event: MessageEvent, matcher: Matcher, args: Message = CommandArg() 32 | ): 33 | if at := args["at"]: 34 | await send_info_msg(bot, event, qq=at[0].data["qq"]) 35 | elif msg := args.extract_plain_text().strip(): 36 | await send_info_msg(bot, event, name=msg, qq=msg, xuid=msg) 37 | 38 | else: 39 | await matcher.finish("\n指令格式:查云黑", at_sender=True) 40 | 41 | 42 | @on_command("清除云黑缓存", permission=SUPERUSER).handle() 43 | async def _(matcher: Matcher): 44 | detect.tmp_noticed.clear() 45 | detect.tmp_black.clear() 46 | await matcher.send("清除成功") 47 | 48 | 49 | @on_message(block=False).handle() 50 | async def _(event: GroupMessageEvent, matcher: Matcher): 51 | if not detect.has_noticed(event.group_id, event.user_id): 52 | ret = await detect.detect(event.user_id) 53 | if ret and ret.data: 54 | if ret.data.exist and not list_has_same_item( 55 | conf.ignore_repos, [x.uuid for x in ret.data.info] 56 | ): 57 | await matcher.send( 58 | f"在BlackBE存在违规记录!\n" f"使用 查云黑{event.user_id} 查询详细信息", 59 | at_sender=True, 60 | ) 61 | detect.set_notice_stat(event.group_id, event.user_id, True) 62 | else: 63 | logger.exception(f"BlackBE检测失败!返回值不正常:{ret}") 64 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from pydantic import BaseModel 4 | 5 | from .._config import init 6 | 7 | config = None 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | token: str 12 | ignore_repos: list[str] 13 | use_group_forward_msg: bool 14 | 15 | 16 | async def update_conf(): 17 | global config 18 | config = await init( 19 | "blackbe", 20 | ConfigModel, 21 | {"token": "", "ignore_repos": [], "use_group_forward_msg": True}, 22 | ) 23 | 24 | 25 | asyncio.run(update_conf()) 26 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/datatypes.py: -------------------------------------------------------------------------------- 1 | from typing import List, Optional 2 | 3 | from nonebot.adapters.onebot.v11 import Message, MessageSegment 4 | from pydantic import BaseModel 5 | 6 | 7 | class BlackBEReturnDataFullInfo(BaseModel): 8 | area_code: str 9 | black_id: str 10 | info: str 11 | is_user: bool 12 | level: int 13 | name: str 14 | phone: str 15 | photos: List[str] 16 | qq: int 17 | server: str 18 | time: str 19 | uuid: str 20 | xuid: str 21 | 22 | 23 | class BlackBEReturnDataInfo(BaseModel): 24 | uuid: str 25 | name: str 26 | black_id: Optional[str] 27 | xuid: str 28 | info: str 29 | server: Optional[str] 30 | time: Optional[str] 31 | level: int 32 | qq: int 33 | area_code: Optional[str] 34 | phone: Optional[int] 35 | photos: Optional[List[Optional[str]]] 36 | 37 | 38 | class BlackBEReturnData(BaseModel): 39 | repo_success: Optional[bool] 40 | repo_uuid: Optional[str] 41 | exist: bool 42 | info: List[Optional[BlackBEReturnDataInfo]] 43 | 44 | 45 | class BlackBEReturnRepo(BaseModel): 46 | uuid: str 47 | name: str 48 | type: int 49 | list_num: int 50 | server: str 51 | server_type: str 52 | 53 | 54 | class BlackBEReturnRepoList(BaseModel): 55 | repositories_num: int 56 | repositories_list: List[Optional[BlackBEReturnRepo]] 57 | 58 | 59 | class BlackBEReturn(BaseModel): 60 | success: bool 61 | status: int 62 | message: str 63 | version: str 64 | codename: str 65 | time: str 66 | data: ( 67 | BlackBEReturnData 68 | | List[BlackBEReturnData] 69 | | BlackBEReturnRepoList 70 | | BlackBEReturnDataFullInfo 71 | | List[None] 72 | ) 73 | 74 | 75 | class ForwardMsg(list[Message]): 76 | def append(self, obj): 77 | super(ForwardMsg, self).append( 78 | Message(MessageSegment.text(obj) if isinstance(obj, str) else obj) 79 | ) 80 | 81 | def extend(self, iterable): 82 | for i in iterable: 83 | self.append(i) 84 | 85 | def get_msg(self, sender_name, sender_uin): 86 | return [ 87 | { 88 | "type": "node", 89 | "data": { 90 | "name": sender_name, 91 | "uin": sender_uin, 92 | "content": [{"type": y.type, "data": y.data} for y in x], 93 | }, 94 | } 95 | for x in self 96 | ] 97 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/detect.py: -------------------------------------------------------------------------------- 1 | from nonebot import logger 2 | 3 | from .config import config as conf 4 | from .datatypes import BlackBEReturn 5 | from .get_data import get_simple_info 6 | 7 | _ret_template = BlackBEReturn( 8 | **{ 9 | "success": True, 10 | "status": 2001, 11 | "message": "用户不存在于黑名单中哦", 12 | "version": "v3", 13 | "codename": "Moriya Suwako", 14 | "time": 0, 15 | "data": {"exist": False, "info": []}, 16 | } 17 | ) 18 | 19 | 20 | class BlackBEDetect: 21 | tmp_black: dict = {} 22 | tmp_noticed: dict = {} 23 | 24 | def __init__(self): 25 | pass 26 | 27 | def set_notice_object(self, group): 28 | if not self.tmp_noticed.get(group): 29 | self.tmp_noticed[group] = {} 30 | 31 | def has_noticed(self, group, qq): 32 | self.set_notice_object(group) 33 | return self.tmp_noticed[group].get(qq) == True 34 | 35 | def set_notice_stat(self, group, qq, stat): 36 | self.set_notice_object(group) 37 | self.tmp_noticed[group][qq] = stat 38 | 39 | async def detect(self, qq): 40 | if (ret := self.tmp_black.get(qq)) is None: 41 | self.tmp_black[qq] = _ret_template # 避免同时间多次访问 42 | ret = await get_simple_info(token=conf.token, qq=qq) 43 | if isinstance(ret, Exception): 44 | logger.opt(exception=ret).exception("查询云黑记录失败") 45 | ret = None 46 | self.tmp_black[qq] = ret 47 | return ret 48 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/get_data.py: -------------------------------------------------------------------------------- 1 | import aiohttp 2 | import nonebot 3 | 4 | from .datatypes import BlackBEReturn 5 | 6 | tmp_repos = {} 7 | 8 | 9 | async def get_simple_info(token="", **kwargs): 10 | try: 11 | async with aiohttp.ClientSession() as s: 12 | async with s.get( 13 | "https://api.blackbe.xyz/openapi/v3/check", 14 | params=kwargs, 15 | headers={"Authorization": f"Bearer {token}"} if token else None, 16 | ) as raw: 17 | ret = await raw.json() 18 | return BlackBEReturn(**ret) 19 | except Exception as e: 20 | nonebot.logger.opt().error("查询失败") 21 | return e 22 | 23 | 24 | async def get_private_repo_info(token, ignore_repos=None, **kwargs): 25 | try: 26 | repos = await get_repos(token) 27 | repos = [x.uuid for x in repos.data.repositories_list] 28 | if ignore_repos: 29 | for i in ignore_repos: 30 | try: 31 | repos.remove(i) 32 | except: 33 | pass 34 | 35 | async with aiohttp.ClientSession() as s: 36 | async with s.post( 37 | "https://api.blackbe.xyz/openapi/v3/check/private", 38 | params=kwargs, 39 | headers={"Authorization": f"Bearer {token}"}, 40 | json={"repositories_uuid": repos}, 41 | ) as raw: 42 | ret = await raw.json() 43 | return BlackBEReturn(**ret) 44 | except Exception as e: 45 | nonebot.logger.opt().error("查询失败") 46 | return e 47 | 48 | 49 | async def get_repos(token): 50 | if token: 51 | global tmp_repos 52 | async with aiohttp.ClientSession() as s: 53 | async with s.get( 54 | "https://api.blackbe.xyz/openapi/v3/private/repositories/list", 55 | headers={"Authorization": f"Bearer {token}"}, 56 | ) as raw: 57 | repos = await raw.json() 58 | repos = BlackBEReturn(**repos) 59 | tmp_repos = {x.uuid: x for x in repos.data.repositories_list} 60 | return repos 61 | 62 | 63 | async def get_repo_detail(uuid, token): 64 | ret = tmp_repos.get(uuid) 65 | if not ret: 66 | await get_repos(token) 67 | ret = tmp_repos.get(uuid) 68 | return ret 69 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/blackbe/get_msg.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import os.path 3 | 4 | import aiofiles 5 | from nonebot import logger 6 | from nonebot.adapters.onebot.v11 import ( 7 | Bot, 8 | GroupMessageEvent, 9 | MessageEvent, 10 | MessageSegment, 11 | ) 12 | from nonebot_plugin_htmlrender import md_to_pic 13 | 14 | from .config import config as conf 15 | from .datatypes import BlackBEReturnDataInfo, ForwardMsg 16 | from .get_data import * 17 | 18 | 19 | def parse_lvl(lvl: int): 20 | if lvl == 1: 21 | msg = "有作弊行为,但未对其他玩家造成实质上损害" 22 | elif lvl == 2: 23 | msg = "有作弊行为,且对玩家造成一定的损害" 24 | elif lvl == 3: 25 | msg = "严重破坏服务器,对玩家和服务器造成较大的损害" 26 | else: 27 | msg = "未知" 28 | return f"等级{lvl}({msg})" 29 | 30 | 31 | async def get_repo_name(_uuid): 32 | if _uuid == "1": 33 | return "公有库(1)" 34 | n = await get_repo_detail(_uuid, conf.token) 35 | return f'{n.name if n else "未知"}({_uuid})' 36 | 37 | 38 | async def open_file_b(f_name): 39 | async with aiofiles.open(f_name, "rb") as f: 40 | return await f.read() 41 | 42 | 43 | async def parse_info_md(info: BlackBEReturnDataInfo, uuid=""): 44 | black_id = info.black_id or uuid 45 | repo_name = await get_repo_name(black_id) 46 | 47 | im = [f"- 玩家ID:{info.name}", f"- 危险等级:{parse_lvl(info.level)}"] 48 | im.append(f"- 记录原因:{info.info}") 49 | if info.server: 50 | im.append(f"- 违规服务器:{info.server}") 51 | im.append(f"- XUID:{info.xuid}") 52 | im.append(f"- 玩家QQ:{info.qq}") 53 | if info.phone: 54 | im.append(f"- 玩家电话:+{info.area_code} {info.phone}") 55 | im.append(f"- 库来源:{repo_name}") 56 | if info.time: 57 | im.append(f"- 记录时间:{info.time}") 58 | im.append(f"- 记录UUID:{info.uuid}") 59 | im.extend(await get_img_msgs(info.photos, True)) 60 | return "\n".join(im) 61 | 62 | 63 | async def parse_info_group_forward(info: BlackBEReturnDataInfo, uuid=""): 64 | black_id = info.black_id or uuid 65 | repo_name = await get_repo_name(black_id) 66 | 67 | im = ForwardMsg() 68 | im.append(f"玩家ID:{info.name}") 69 | im.append(f"危险等级:{parse_lvl(info.level)}") 70 | im.append(f"记录原因:{info.info}") 71 | if info.server: 72 | im.append(f"违规服务器:{info.server}") 73 | im.append(f"XUID:{info.xuid}") 74 | im.append(f"玩家QQ:{info.qq}") 75 | if info.phone: 76 | im.append(f"玩家电话:+{info.area_code} {info.phone}") 77 | im.append(f"库来源:{repo_name}") 78 | if info.time: 79 | im.append(f"记录时间:{info.time}") 80 | im.append(f"记录UUID:{info.uuid}") 81 | if pics := (await get_img_msgs(info.photos)): 82 | im.append("以下是证据截图:") 83 | im.extend(pics) 84 | return im 85 | 86 | 87 | async def get_img_msgs(info_photos, markdown=False): 88 | async def get_img_msg(photo): 89 | e = False 90 | pic_path = os.path.join(path, photo[photo.rfind("/") + 1 :]) 91 | if not os.path.exists(pic_path): 92 | if not photo.startswith("http://") or photo.startswith("https://"): 93 | photo = f"http://{photo}" 94 | try: 95 | async with aiohttp.ClientSession() as s: 96 | async with s.get(photo) as raw: 97 | p = await raw.read() 98 | async with aiofiles.open(pic_path, "wb") as f: 99 | await f.write(p) 100 | except: 101 | e = True 102 | logger.exception("获取图片失败") 103 | 104 | if e: 105 | return f"获取图片失败({photo})" 106 | abs_path = os.path.abspath(pic_path) 107 | if markdown: 108 | return f"![]({abs_path})" 109 | return MessageSegment.image(await open_file_b(abs_path)) 110 | 111 | path = "./shigure/blackbe_tmp" 112 | if not os.path.exists(path): 113 | os.makedirs(path) 114 | 115 | pics = [] 116 | if info_photos: 117 | img_msg = await asyncio.gather( 118 | *[asyncio.create_task(get_img_msg(i)) for i in info_photos] 119 | ) 120 | if markdown: 121 | pics.append("- 证据图片: ") 122 | for pic in img_msg: 123 | pics.append(f" {pic} " if markdown else pic) 124 | return pics 125 | 126 | 127 | async def send_info_msg(bot: Bot, ev: GroupMessageEvent | MessageEvent, **kwargs): 128 | group_forward = conf.use_group_forward_msg and isinstance(ev, GroupMessageEvent) 129 | 130 | async def get_msg(im: ForwardMsg): 131 | return im.get_msg((await bot.get_login_info())["nickname"], bot.self_id) 132 | 133 | async def parse_info(*args, **kws): 134 | return ( 135 | (await get_msg(await parse_info_group_forward(*args, **kws))) 136 | if group_forward 137 | else (await parse_info_md(*args, **kws)) 138 | ) 139 | 140 | ret_simple = await get_simple_info(**kwargs) 141 | ret_repo = None 142 | if conf.token: 143 | ret_repo = await get_private_repo_info(conf.token, conf.ignore_repos, **kwargs) 144 | info = [] 145 | tip_success = [] 146 | tip_fail = [] 147 | 148 | async def send_info_pic(): 149 | msg = [ 150 | ( 151 | "" 155 | ), 156 | f"# 关于 {list(kwargs.values())[0]} 的查询结果:", 157 | ] 158 | if tip_success: 159 | msg.append(f'查询到{",".join(tip_success)}') 160 | 161 | if tip_fail: 162 | msg.extend(tip_fail) 163 | 164 | if not tip_success and not tip_fail: 165 | msg.append("没有查询到任何记录") 166 | 167 | for ii in info: 168 | msg.append("----") 169 | msg.append(ii) 170 | 171 | img = await md_to_pic("\n\n".join(msg), width=1500) 172 | await bot.send(ev, MessageSegment.at(ev.user_id) + MessageSegment.image(img)) 173 | 174 | async def send_info_forward(): 175 | msg = [f"关于 {list(kwargs.values())[0]} 的查询结果:"] 176 | if tip_success: 177 | msg.append(f'查询到{",".join(tip_success)}') 178 | 179 | if tip_fail: 180 | msg.extend(tip_fail) 181 | 182 | if not tip_success and not tip_fail: 183 | msg.append("没有查询到任何记录捏~") 184 | else: 185 | msg.append("关于各条目详细信息请查看下方的转发消息~") 186 | 187 | await bot.send(ev, "\n".join(msg)) 188 | for ii in info: 189 | await bot.send_group_forward_msg(group_id=ev.group_id, messages=ii) 190 | 191 | async def parse_ret(): 192 | if isinstance(ret_simple, BlackBEReturn): 193 | if ret_simple.success: 194 | if ret_simple.data.exist: 195 | tip_success.append(f" {len(ret_simple.data.info)} 条公有库记录") 196 | for i in ret_simple.data.info: 197 | t = await parse_info(i) 198 | info.append(t) 199 | else: 200 | tip_fail.append(f"查询公有库记录失败:[{ret_simple.status}] {ret_simple.message}") 201 | else: 202 | tip_fail.append(f"查询公有库记录失败:{ret_simple!r}") 203 | 204 | if ret_repo: 205 | if isinstance(ret_repo, BlackBEReturn): 206 | if ret_repo.success: 207 | count = 0 208 | for i in ret_repo.data: 209 | for n in i.info: 210 | t = await parse_info(n, i.repo_uuid) 211 | info.append(t) 212 | count += 1 213 | if count: 214 | tip_success.append( 215 | f" {len(ret_repo.data)} 个私有库的 {count} 条私有库记录" 216 | ) 217 | else: 218 | tip_fail.append(f"查询私有库记录失败:[{ret_repo.status}] {ret_repo.message}") 219 | else: 220 | tip_fail.append(f"查询私有库记录失败:{ret_repo!r}") 221 | 222 | await parse_ret() 223 | 224 | if group_forward: 225 | try: 226 | await send_info_forward() 227 | except: 228 | logger.exception("发送合并转发消息失败") 229 | await bot.send(ev, "合并转发发送失败,尝试发送markdown图片") 230 | group_forward = False 231 | info.clear() 232 | tip_success.clear() 233 | tip_fail.clear() 234 | await parse_ret() 235 | await send_info_pic() 236 | else: 237 | await send_info_pic() 238 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/hitokoto/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.1" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/hitokoto/__main__.py: -------------------------------------------------------------------------------- 1 | import aiohttp 2 | from nonebot import logger, on_command 3 | from nonebot.adapters.onebot.v11 import Message 4 | from nonebot.matcher import Matcher 5 | from nonebot.params import CommandArg 6 | 7 | from .config import config 8 | 9 | hito_types = { 10 | "动画": "a", 11 | "漫画": "b", 12 | "游戏": "c", 13 | "文学": "d", 14 | "原创": "e", 15 | "来自网络": "f", 16 | "其他": "g", 17 | "影视": "h", 18 | "诗词": "i", 19 | "网易云": "j", 20 | "哲学": "k", 21 | "抖机灵": "l", 22 | } 23 | 24 | 25 | async def aiohttp_get(*args, **kwargs): 26 | async with aiohttp.ClientSession() as s: 27 | async with s.get(*args, **kwargs) as resp: 28 | return await resp.json() 29 | 30 | 31 | @on_command("一言").handle() 32 | async def _(matcher: Matcher, args: Message = CommandArg()): 33 | args = args.extract_plain_text().strip() 34 | params = "" 35 | if args: 36 | args = [x.strip() for x in args.split(" ")] 37 | params = [] 38 | for i in args: 39 | hito_type = hito_types.get(i) 40 | if not hito_type: 41 | await matcher.finish( 42 | f'不支持的句子类型“{i}”,可用类型:{"/".join(hito_types.keys())},多个类型用空格分隔' 43 | ) 44 | params.append(hito_type) 45 | params = f'?c={"&c=".join(params)}' 46 | 47 | try: 48 | ret = await aiohttp_get(f"https://v1.hitokoto.cn{params}") 49 | except: 50 | logger.exception("获取一言失败") 51 | await matcher.finish("获取句子失败,请检查后台输出") 52 | else: 53 | who = ret["from_who"] 54 | await matcher.finish( 55 | ( 56 | f'『{ret["hitokoto"]}』\n—— {who or ""}「{ret["from"]}」' 57 | + ( 58 | f'\n(https://hitokoto.cn?uuid={ret["uuid"]})' 59 | if config.send_link 60 | else "" 61 | ) 62 | ) 63 | ) 64 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/hitokoto/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from pydantic import BaseModel 4 | 5 | from .._config import init 6 | 7 | config = None 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | send_link: bool 12 | 13 | 14 | async def update_conf(): 15 | global config 16 | config = await init("hitokoto", ConfigModel, {"send_link": True}) 17 | 18 | 19 | asyncio.run(update_conf()) 20 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/jikipedia/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.3.1" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/jikipedia/__main__.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | 3 | from nonebot import logger, on_command, on_regex 4 | from nonebot.adapters.onebot.v11 import MessageEvent 5 | from nonebot.internal.params import ArgPlainText 6 | from nonebot.matcher import Matcher 7 | from nonebot.params import CommandArg, RegexGroup 8 | from nonebot.typing import T_State 9 | 10 | from .config import config 11 | from .data_source import * 12 | 13 | matcher_command = on_command("梗百科") 14 | matcher_regex = on_regex("([\s\S]+)是什么梗") 15 | 16 | 17 | @matcher_regex.handle() 18 | async def _(matcher: Matcher, state: T_State, args: tuple[Any, ...] = RegexGroup()): 19 | arg = args[0].strip() 20 | await get_geng(matcher, arg, state) 21 | 22 | 23 | @matcher_command.handle() 24 | async def _(state: T_State, event: MessageEvent, args: Message = CommandArg()): 25 | if event.reply and (reply := event.reply.message).extract_plain_text().strip(): 26 | state["phrase"] = reply 27 | elif args.extract_plain_text().strip(): 28 | state["phrase"] = args 29 | 30 | 31 | @matcher_command.got("phrase", "请问你想要了解一下什么梗呢?") 32 | async def _(m: Matcher, state: T_State, phrase: str = ArgPlainText("phrase")): 33 | if not (phrase := phrase.strip()): 34 | await m.reject("这条消息没有文本,无法查询……你到底想了解什么梗呢?请再发一遍") 35 | 36 | await get_geng(m, phrase, state) 37 | 38 | 39 | @matcher_command.handle() 40 | @matcher_regex.handle() 41 | async def _(m: Matcher, state: T_State, event: MessageEvent): 42 | msg = event.get_plaintext() 43 | more = state.get("more", {}) 44 | if item := more.get(msg): 45 | await m.reject( 46 | "\n" + (await format_definition(item)) + "\n\nTip:继续发送候选项可以接着查询~", 47 | at_sender=True, 48 | ) 49 | await m.finish() 50 | 51 | 52 | def get_numbered_name(names, name): 53 | count = 0 54 | numbered_name = name 55 | while numbered_name in names: 56 | count += 1 57 | numbered_name = f"{name}{count}" 58 | return numbered_name 59 | 60 | 61 | async def get_geng(m: Matcher, phrase: str, state: T_State): 62 | try: 63 | ret = await get_geng_ret(phrase) 64 | except: 65 | logger.exception("获取梗失败") 66 | await m.finish("抱歉,我还没Get到这个梗……(请求接口失败/返回值解析失败)") 67 | else: 68 | if not ret.data: 69 | await m.finish( 70 | f"抱歉,我还没Get到这个梗……({ret.message.title}:{ret.message.content})" 71 | ) 72 | 73 | if definitions := filter_definitions(ret): 74 | await m.send( 75 | "\n" + (await format_definition(definitions[0])), at_sender=True 76 | ) 77 | if len(definitions) > 1 and config.send_suggestion: 78 | cut = definitions[1 : config.suggestion_num + 1] # 排除第一个 79 | more = {get_numbered_name(more.keys(), i.term.title): i for i in cut} 80 | state["more"] = more 81 | 82 | await m.send( 83 | ( 84 | (("你是否还想找这些:\n" + "\n".join(f"【{x}】" for x in more)) + "\n") 85 | + "发送对应梗名字即可继续查询,想重新查询请先发送一条其他消息再发送查询指令~" 86 | ) 87 | ) 88 | 89 | await m.pause() 90 | else: 91 | await m.finish("抱歉,我还没Get到这个梗……(未找到词条)") 92 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/jikipedia/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from pydantic import BaseModel 4 | 5 | from .._config import init 6 | 7 | config = None 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | send_suggestion: bool 12 | suggestion_num: int 13 | 14 | 15 | async def update_conf(): 16 | global config 17 | config = await init( 18 | "jikipedia", ConfigModel, {"send_suggestion": True, "suggestion_num": 3} 19 | ) 20 | 21 | 22 | asyncio.run(update_conf()) 23 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/jikipedia/data_source.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | import aiohttp 4 | from nonebot.adapters.onebot.v11 import Message, MessageSegment 5 | 6 | from .data_types import JikiResponse 7 | 8 | SEARCH_URL = "https://api.jikipedia.com/go/search_entities" 9 | HEADERS = { 10 | "Accept": "application/json, text/plain, */*", 11 | "Accept-Encoding": "gzip, deflate, br", 12 | "Accept-Language": "zh-CN,zh-TW;q=0.9,zh;q=0.8", 13 | "Client": "web", 14 | "Client-Version": "2.7.2g", 15 | "Connection": "keep-alive", 16 | # 'Content-Length' : '38', 17 | # 'Content-Type' : 'application/json;charset=UTF-8', 18 | "Host": "api.jikipedia.com", 19 | "Origin": "https://jikipedia.com", 20 | "Referer": "https://jikipedia.com/", 21 | "Sec-Fetch-Dest": "empty", 22 | "Sec-Fetch-Mode": "cors", 23 | "Sec-Fetch-Site": "same-site", 24 | "Token": "", 25 | "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36", 26 | # todo: 逆向xid生成方式 27 | "XID": "uNo5bL1nyNCp/Gm7lJAHQ91220HLbMT8jqk9IJYhtHA4ofP+zgxwM6lSDIKiYoppP2k1IW/1Vxc2vOVGxOOVReebsLmWPHhTs7NCRygfDkE=", 28 | "sec-ch-ua": '" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"', 29 | "sec-ch-ua-mobile": "?1", 30 | "sec-ch-ua-platform": '"Android"', 31 | } 32 | 33 | 34 | async def get_img_msg(url): 35 | try: 36 | async with aiohttp.ClientSession() as s: 37 | async with s.get(url) as r: 38 | return MessageSegment.image(await r.read()) 39 | except: 40 | return MessageSegment.text(f"获取图片失败({url})") 41 | 42 | 43 | async def get_geng_ret(name): 44 | async with aiohttp.ClientSession() as s: 45 | async with s.post( 46 | SEARCH_URL, headers=HEADERS, json={"phrase": name, "page": 1, "size": 60} 47 | ) as r: 48 | rj = await r.json() 49 | # logger.debug(f'\n{json.dumps(rj, ensure_ascii=False, indent=2)}') 50 | return JikiResponse(**rj) 51 | 52 | 53 | def filter_definitions(data): 54 | tmp = [] 55 | for da in data.data: 56 | tmp.extend(da.definitions) 57 | return tmp 58 | 59 | 60 | async def format_definition(item): 61 | img = ( 62 | await asyncio.gather( 63 | *[ 64 | asyncio.create_task(get_img_msg(i)) 65 | for i in [n.full.path for n in item.images] 66 | ] 67 | ) 68 | if item.images 69 | else None 70 | ) 71 | text = item.plaintext.replace("\u200b", "").replace("\u200c", "") 72 | tags = ( 73 | " ".join([f"#{x}" for x in [y.name for y in item.tags]]) 74 | if item.tags 75 | else "该词条还没有Tag哦~" 76 | ) 77 | 78 | im = Message() 79 | im += f"词条【{item.term.title}】:\n" 80 | im += f"{text}\n" 81 | if img: 82 | im.extend(img) 83 | im += "\n" 84 | im += f"Tags:{tags}\n" 85 | im += f"原文:https://jikipedia.com/definition/{item.id}" 86 | return im 87 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/jikipedia/data_types.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | 3 | from pydantic import BaseModel 4 | 5 | 6 | class DefinitionImages(BaseModel): 7 | class Full(BaseModel): 8 | path: str 9 | # more... 10 | 11 | full: Full 12 | # more... 13 | 14 | 15 | class DefinitionTerm(BaseModel): 16 | title: str 17 | # more... 18 | 19 | 20 | class DefinitionTag(BaseModel): 21 | name: str 22 | # more... 23 | 24 | 25 | class Definition(BaseModel): 26 | id: int 27 | images: list[DefinitionImages] 28 | term: DefinitionTerm 29 | content: str 30 | plaintext: str 31 | tags: list[DefinitionTag] 32 | # more... 33 | 34 | 35 | class JikiResponseData(BaseModel): 36 | definitions: list[Definition] 37 | # more... 38 | 39 | 40 | class ErrMessage(BaseModel): 41 | title: str 42 | content: str 43 | 44 | 45 | class JikiResponse(BaseModel): 46 | data: Optional[list[JikiResponseData]] 47 | 48 | # err 49 | message: Optional[str | ErrMessage] 50 | category: Optional[str] 51 | information: Optional[str] 52 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/join_leave_tip/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "1.0.2" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/join_leave_tip/__main__.py: -------------------------------------------------------------------------------- 1 | from nonebot import on_notice 2 | from nonebot.adapters.onebot.v11 import ( 3 | Bot, 4 | GroupDecreaseNoticeEvent, 5 | GroupIncreaseNoticeEvent, 6 | Message, 7 | MessageSegment, 8 | ) 9 | from nonebot.matcher import Matcher 10 | 11 | from .config import config 12 | 13 | 14 | async def parse_reply( 15 | reply: str, event: GroupIncreaseNoticeEvent | GroupDecreaseNoticeEvent, bot: Bot 16 | ): 17 | return Message( 18 | reply.format( 19 | at=MessageSegment.at(event.user_id), 20 | qq=event.user_id, 21 | nick=(await bot.get_stranger_info(user_id=event.user_id))["nickname"], 22 | admin=MessageSegment.at(event.operator_id), 23 | ) 24 | ) 25 | 26 | 27 | @on_notice(block=False).handle() 28 | async def _(bot: Bot, matcher: Matcher, event: GroupIncreaseNoticeEvent): 29 | if not event.is_tome() or event.group_id in config.except_groups: 30 | await matcher.finish(await parse_reply(config.join_message, event, bot)) 31 | 32 | 33 | @on_notice(block=False).handle() 34 | async def _(bot: Bot, matcher: Matcher, event: GroupDecreaseNoticeEvent): 35 | if not event.is_tome() or event.group_id in config.except_groups: 36 | match event.sub_type: 37 | case "leave": 38 | await matcher.finish( 39 | await parse_reply(config.leave_message, event, bot) 40 | ) 41 | case "kick": 42 | await matcher.finish(await parse_reply(config.kick_message, event, bot)) 43 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/join_leave_tip/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from pydantic import BaseModel 4 | 5 | from .._config import init 6 | 7 | config = None 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | join_message: str 12 | leave_message: str 13 | kick_message: str 14 | except_groups: list[int] 15 | 16 | 17 | async def update_conf(): 18 | global config 19 | config = await init( 20 | "join_leave_tip", 21 | ConfigModel, 22 | { 23 | "join_message": "{at} 欢迎新入群的rbq~", 24 | "leave_message": "{nick}({qq})默默地离开了我们……", 25 | "kick_message": "{nick}({qq})被至高无上的管理员{admin}制裁了!!(躲", 26 | "except_groups": [], 27 | }, 28 | ) 29 | 30 | 31 | asyncio.run(update_conf()) 32 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/keyword_reply/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.2.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/keyword_reply/__main__.py: -------------------------------------------------------------------------------- 1 | import random 2 | import re 3 | 4 | from nonebot import on_message 5 | from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, MessageSegment 6 | from nonebot.matcher import Matcher 7 | 8 | from .config import config as conf 9 | 10 | 11 | async def parse_reply(reply: str | list[dict], event: MessageEvent, bot: Bot): 12 | at = MessageSegment.at(event.user_id) 13 | qq = event.user_id 14 | nick = (await bot.get_stranger_info(user_id=event.user_id))["nickname"] 15 | 16 | if isinstance(reply, str): 17 | return Message(reply.format(at=at, qq=qq, nick=nick)) 18 | 19 | msg = Message() 20 | for seg in reply: 21 | seg_type = seg["type"] 22 | seg_data = seg["data"] 23 | if seg_type == "var": 24 | match seg_data: 25 | case "at": 26 | msg.append(at) 27 | case "qq": 28 | msg += str(qq) 29 | case "nick": 30 | msg += nick 31 | continue 32 | msg.append(MessageSegment(seg_type, seg_data)) 33 | return msg 34 | 35 | 36 | @on_message(priority=99).handle() 37 | async def _(bot: Bot, event: MessageEvent, matcher: Matcher): 38 | for reply in conf: 39 | if reply.to_me and (not event.is_tome()): 40 | continue # not to me直接pass 41 | 42 | if reply.type == "full": 43 | match = lambda m, kw: m == kw 44 | elif reply.type == "fuzzy": 45 | match = lambda m, kw: m.find(kw) != -1 46 | elif reply.type == "regex": 47 | match = lambda m, kw: re.fullmatch(kw, m) is not None 48 | else: 49 | match = lambda _, __: False 50 | 51 | for kwd in reply.keywords: 52 | msg = str(event.get_message()) 53 | if reply.ignore_case: 54 | msg = msg.lower() 55 | kwd = kwd.lower() 56 | if match(msg, kwd): 57 | await matcher.finish( 58 | await parse_reply(random.choice(reply.replies), event, bot) 59 | ) 60 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/keyword_reply/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | from typing import Literal, Optional 3 | 4 | from pydantic import BaseModel 5 | 6 | from .._config import init 7 | 8 | config = None 9 | 10 | 11 | class ConfigModel(BaseModel): 12 | type: Literal["full", "fuzzy", "regex"] 13 | to_me: Optional[bool] = False 14 | keywords: list[str] 15 | replies: list[str | list[dict]] 16 | ignore_case: Optional[bool] = True 17 | 18 | 19 | async def update_conf(): 20 | global config 21 | config = await init("keyword_replies", ConfigModel, []) 22 | 23 | 24 | asyncio.run(update_conf()) 25 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/mc_svr_stat/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.2" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/mc_svr_stat/__main__.py: -------------------------------------------------------------------------------- 1 | from nonebot import on_command 2 | from nonebot.adapters.onebot.v11 import Message 3 | from nonebot.matcher import Matcher 4 | from nonebot.params import CommandArg 5 | 6 | from .get_stat import motd as get_motd, motdpe as get_motdpe 7 | 8 | 9 | @on_command("!motd", aliases={"!motdje", "!motd", "!motdje"}, priority=2).handle() 10 | async def _(matcher: Matcher, args: Message = CommandArg()): 11 | ret = await get_motd(str(args).strip()) 12 | await matcher.finish(ret, at_sender=True) 13 | 14 | 15 | @on_command("!motdfull", aliases={"!motdfull"}).handle() 16 | async def _(matcher: Matcher, args: Message = CommandArg()): 17 | ret = await get_motd(str(args).strip(), full=True) 18 | await matcher.finish(ret, at_sender=True) 19 | 20 | 21 | @on_command("!motdpe", aliases={"!motdbe", "!motdpe", "!motdbe"}).handle() 22 | async def _(matcher: Matcher, args: Message = CommandArg()): 23 | ret = await get_motdpe(str(args).strip()) 24 | await matcher.finish(ret, at_sender=True) 25 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/mc_svr_stat/get_stat.py: -------------------------------------------------------------------------------- 1 | import nonebot 2 | from mcstatus import BedrockServer, JavaServer 3 | from nonebot.adapters.onebot.v11 import MessageSegment 4 | 5 | 6 | def del_escape(string: str): 7 | # 48-57(0-9),65-90(A-Z),97-122(a-z) 8 | for i in range(48, 57 + 1): 9 | string = string.replace(f"§{chr(i)}", "") 10 | for i in range(65, 90 + 1): 11 | string = string.replace(f"§{chr(i)}", "") 12 | for i in range(97, 122 + 1): 13 | string = string.replace(f"§{chr(i)}", "") 14 | return string 15 | 16 | 17 | async def motd(address: str, full=False): 18 | address = address.strip().replace(":", ":") 19 | if not address: 20 | if full: 21 | return MessageSegment.text( 22 | "[MCJE服务器信息]\n" 23 | "正确用法:\n" 24 | "!motdfull <服务器IP> (电脑版)\n" 25 | "!motdpe <服务器IP> (手机版)" 26 | ) 27 | else: 28 | return MessageSegment.text( 29 | "[MCJE服务器信息]\n" 30 | "正确用法:\n" 31 | "!motd <服务器IP> (电脑版)\n" 32 | "!motdpe <服务器IP> (手机版)" 33 | ) 34 | if address.rfind(":") == -1: 35 | address += ":25565" 36 | 37 | try: 38 | ret = JavaServer.lookup(address) 39 | ret = await ret.async_status() 40 | latency = ret.latency 41 | desc = ret.description 42 | ret_raw = ret.raw 43 | except Exception as e: 44 | nonebot.logger.opt(colors=True, exception=e).error("") 45 | return MessageSegment.text(f"[MCJE服务器信息]\n操作失败:{e!r}") 46 | 47 | pic_text = "" 48 | if ret.favicon: 49 | pic_b64: str = ret.favicon 50 | pos = pic_b64.find("base64,") 51 | if pos != -1: 52 | pic_b64 = pic_b64[pos + 7 :] 53 | pic_text = "显示图标:" + MessageSegment.image(f"base64://{pic_b64}") + "\n" 54 | 55 | players = "" 56 | if ret.players.sample: 57 | player_list = [del_escape(x.name) for x in ret.players.sample] 58 | player_list = [x for x in player_list if x] 59 | if full: 60 | players = f'玩家列表:{", ".join(player_list)}\n' 61 | else: 62 | players = f'玩家列表(最多显示十个):{", ".join(player_list[:10])}\n' 63 | 64 | mod_info = "" 65 | if "modinfo" in ret_raw: 66 | if ret_raw["modinfo"]["modList"]: 67 | mod_list = "\n".join( 68 | [f'{x["modid"]} - {x["version"]}' for x in ret["modinfo"]["modList"]][ 69 | :10 70 | ] 71 | ) 72 | if full: 73 | mod_info = f"Mod列表:{mod_list[:10]}" 74 | else: 75 | mod_info = f"Mod列表(最多显示十个):{mod_list[:10]}" 76 | else: 77 | mod_info = "Mod列表:无" 78 | mod_info = f'\nMod端类型:{ret["modinfo"]["type"]}\n{mod_info}' 79 | 80 | players_online = ret.players.online 81 | players_max = ret.players.max 82 | online_percent = round(players_online / players_max * 100, 2) 83 | 84 | full_tip = "" if full else f"\n注:使用 !motdfull 查看全部玩家列表及mod列表" 85 | 86 | return ( 87 | MessageSegment.text(f"[MCJE服务器信息]\n") 88 | + pic_text 89 | + MessageSegment.text( 90 | f"服务端名:{ret.version.name}\n" 91 | f"协议版本:{ret.version.protocol}\n" 92 | f"当前人数:{players_online}/{players_max}({online_percent}%)\n" 93 | f"{players}" 94 | f"描述文本:\n{del_escape(desc)}\n" 95 | f"游戏延迟:{latency:.2f}ms" 96 | f"{mod_info}" 97 | f"{full_tip}" 98 | ) 99 | ) 100 | 101 | 102 | async def motdpe(address: str): 103 | address = address.strip().replace(":", ":") 104 | if not address: 105 | return MessageSegment.text( 106 | "[MCBE服务器信息]\n" "正确用法:\n" "!motd <服务器IP> (电脑版)\n" "!motdpe <服务器IP> (手机版)" 107 | ) 108 | if address.rfind(":") == -1: 109 | address += ":19132" 110 | 111 | try: 112 | ret = BedrockServer.lookup(address) 113 | ret = await ret.async_status() 114 | except Exception as e: 115 | nonebot.logger.opt(colors=True, exception=e).error("") 116 | return MessageSegment.text(f"[MCBE服务器信息]\n操作失败:{e!r}") 117 | 118 | map_name = f"存档名称:{del_escape(ret.map)}\n" if ret.map else "" 119 | game_mode = f"游戏模式:{ret.gamemode}\n" if ret.gamemode else "" 120 | online_percent = round(int(ret.players_online) / int(ret.players_max) * 100, 2) 121 | 122 | return MessageSegment.text( 123 | "[MCBE服务器信息]\n" 124 | f"协议版本:{ret.version.protocol}\n" 125 | f"游戏版本:{ret.version.version}\n" 126 | f"描述文本:{del_escape(ret.motd)}\n" 127 | f"在线人数:{ret.players_online}/{ret.players_max}({online_percent}%)\n" 128 | f"{map_name}" 129 | f"{game_mode}" 130 | f"游戏延迟:{ret.latency * 1000:.2f}ms" 131 | ) 132 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/netease_music/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/netease_music/__main__.py: -------------------------------------------------------------------------------- 1 | from nonebot import logger, on_command 2 | from nonebot.adapters.onebot.v11 import Message, MessageSegment 3 | from nonebot.internal.params import Arg, ArgPlainText 4 | from nonebot.matcher import Matcher 5 | from nonebot.params import CommandArg 6 | from nonebot.permission import SUPERUSER 7 | from nonebot.typing import T_State 8 | 9 | from .data_source import get_track_audio, login, search, search_dj 10 | 11 | pick_matcher = on_command("点歌", aliases={"网易云点歌", "网易点歌", "wyy", "netease", "ncm"}) 12 | 13 | 14 | def format_song_name(song): 15 | alia = f'({"、".join(song["alia"])})' if song["alia"] else "" 16 | return f'{song["name"]}{alia}' 17 | 18 | 19 | def format_song_ars(song): 20 | return "、".join([x["name"] for x in song["ar"]]) 21 | 22 | 23 | @pick_matcher.handle() 24 | async def _(state: T_State, args: Message = CommandArg()): 25 | if args.extract_plain_text().strip(): 26 | state["song"] = args 27 | 28 | 29 | @pick_matcher.got("song", "请发送你要点播的歌曲名称") 30 | async def _(m: Matcher, state: T_State, name: str = ArgPlainText("song")): 31 | dj = False 32 | if name.lower().startswith("dj") or name.startswith("电台"): 33 | state["dj"] = (dj := True) 34 | 35 | removed = name.removeprefix("dj") 36 | if removed == name: 37 | removed = removed.removeprefix("电台") 38 | name = removed 39 | 40 | name = name.strip() 41 | if not name: 42 | await m.reject("此消息不包含文本,请重新发送你要点播的歌曲名称") 43 | 44 | try: 45 | if dj: 46 | ret = await search_dj(name) 47 | else: 48 | ret = await search(name) 49 | except: 50 | logger.exception("网易云搜索失败") 51 | return await m.finish("搜索歌曲失败,请检查后台输出") 52 | 53 | if ret["code"] != 200: 54 | return await m.finish(f'未知错误({ret["code"]})') 55 | 56 | ret = ret["data" if dj else "result"] 57 | if not ret.get("resources" if dj else "songs"): 58 | return await m.finish("未搜索到歌曲") 59 | 60 | state["ret"] = ret 61 | 62 | if dj: 63 | tmp = [ 64 | ( 65 | f"{i + 1}. {song['baseInfo']['name']} - " 66 | f"{song['baseInfo']['radio']['name']}" 67 | ) 68 | for i, song in enumerate(ret["resources"]) 69 | ] 70 | else: 71 | tmp = [ 72 | f"{i + 1}. {format_song_name(song)} - {format_song_ars(song)}" 73 | for i, song in enumerate(ret["songs"]) 74 | ] 75 | 76 | song_li = "\n".join(tmp) 77 | await m.send(f"【{name}】的搜索结果:\n\n{song_li}\n\n" f"Tip:直接发送歌曲序号即可选择,发送0取消") 78 | 79 | 80 | @pick_matcher.got("index") 81 | async def _( 82 | m: Matcher, 83 | state: T_State, 84 | ret: dict = Arg("ret"), 85 | index: str = ArgPlainText("index"), 86 | ): 87 | index = index.strip() 88 | if not index.isdigit(): 89 | await m.reject("选项只能为整数,请重新选择") 90 | 91 | index = int(index) 92 | if index == 0: 93 | return await m.finish("已取消选择") 94 | 95 | song_li = ret["resources" if (dj := state.get("dj")) else "songs"] 96 | 97 | list_len = len(song_li) 98 | if not 1 <= index <= list_len: 99 | await m.reject(f"选项只能为1~{list_len},请重选") 100 | 101 | song = song_li[index - 1] 102 | if dj: 103 | song = song["baseInfo"] 104 | song_id = song["mainSong"]["id"] if dj else song["id"] 105 | try: 106 | ret_down = (await get_track_audio([song_id]))["data"] 107 | except: 108 | logger.exception("获取歌曲播放链接失败") 109 | return await m.finish("获取歌曲播放链接失败,请重试") 110 | 111 | if (not ret_down) or (not ret_down[0].get("url")): 112 | return await m.finish("未找到歌曲/歌曲没有下载链接") 113 | ret_down = ret_down[0] 114 | audio_url = ret_down["url"] 115 | 116 | if dj: 117 | title = song["name"] 118 | ars = song["radio"]["name"] 119 | img = song["coverUrl"] 120 | tip = ( 121 | f"为您送上电台节目 {title} ~\n" 122 | f"电台名称:{ars}\n" 123 | f"电台主:{song['dj']['nickname']} | " 124 | f"类别:{song['radio']['category']} - {song['radio']['secondCategory']}\n" 125 | f"播放:{song['listenerCount']} | " 126 | f"点赞:{song['likedCount']} | " 127 | f"评论:{song['commentCount']}" 128 | ) 129 | else: 130 | title = format_song_name(song) 131 | ars = format_song_ars(song) 132 | img = song["al"]["picUrl"] 133 | tip = f"为您送上 {ars} 的歌曲 {title} ~" 134 | 135 | mb_size = round(ret_down["size"] / 1024 / 1024, 2) 136 | data_tip = "\n!! 请注意流量消耗 !!" if mb_size >= 20 else "" 137 | await m.send( 138 | f"{tip}\n\n" 139 | f'该歌曲音质为 {ret_down["level"] or "未知"}\n' 140 | f"文件大小为 {mb_size} MB" 141 | f"{data_tip}" 142 | ) 143 | await m.send( 144 | MessageSegment( 145 | "music", 146 | { 147 | "type": "custom", 148 | "subtype": "163", 149 | "url": audio_url, 150 | "audio": audio_url, 151 | "title": title, 152 | "content": ars, 153 | "image": img, 154 | }, 155 | ) 156 | ) 157 | 158 | 159 | @on_command("网易云重登", permission=SUPERUSER).handle() 160 | async def _(m: Matcher): 161 | ret = await login() 162 | if isinstance(ret, Exception): 163 | return await m.finish(f"登录失败\n{ret!r}") 164 | await m.finish("登录成功") 165 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/netease_music/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | from typing import Optional 3 | 4 | from pydantic import BaseModel 5 | 6 | from .._config import init 7 | 8 | config = None 9 | 10 | 11 | class ConfigModel(BaseModel): 12 | login: bool 13 | ct_code: str 14 | phone: str 15 | pwd: str 16 | fake_ip: Optional[str] 17 | list_limit: int 18 | 19 | 20 | async def update_conf(): 21 | global config 22 | config = await init( 23 | "netease_music", 24 | ConfigModel, 25 | { 26 | "login": False, 27 | "ct_code": "86", 28 | "phone": "", 29 | "pwd": "", 30 | "fake_ip": None, 31 | "list_limit": 10, 32 | }, 33 | ) 34 | 35 | 36 | asyncio.run(update_conf()) 37 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/netease_music/data_source.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from nonebot import logger 4 | from pyncm import GetCurrentSession 5 | from pyncm.apis import WeapiCryptoRequest 6 | from pyncm.apis.cloudsearch import GetSearchResult, SONG 7 | from pyncm.apis.login import LoginViaCellphone 8 | from pyncm.apis.track import GetTrackAudio, GetTrackDetail 9 | 10 | from .config import config 11 | from .util import async_wrapper as wrapper 12 | 13 | if config.fake_ip: 14 | GetCurrentSession().headers["X-Real-IP"] = config.fake_ip 15 | 16 | 17 | async def login(): 18 | if not config.login: 19 | return ValueError("配置文件中 netease_login 不为真") 20 | logger.info("开始登录网易云音乐") 21 | try: 22 | ret = await wrapper( 23 | LoginViaCellphone, 24 | phone=config.phone, 25 | password=config.pwd, 26 | ctcode=config.ct_code, 27 | ) 28 | nick = ret["result"]["content"]["profile"]["nickname"] 29 | except Exception as e: 30 | logger.opt(exception=e).exception("登录失败,功能将会受到限制") 31 | return e 32 | logger.info(f"欢迎您,{nick}") 33 | 34 | 35 | asyncio.run(login()) 36 | 37 | 38 | async def search(name, limit=config.list_limit, page=1, stype=SONG): 39 | offset = limit * (page - 1) 40 | res = await wrapper(GetSearchResult, name, stype=stype, limit=limit, offset=offset) 41 | logger.debug(f"GetSearchResult - {res}") 42 | return res 43 | 44 | 45 | async def search_dj(name, limit=config.list_limit, page=1): 46 | offset = limit * (page - 1) 47 | 48 | @WeapiCryptoRequest # type:ignore 49 | def get(): 50 | return "/api/search/voice/get", { 51 | "keyword": name, 52 | "scene": "normal", 53 | "limit": limit or 30, 54 | "offset": offset or 0, 55 | } 56 | 57 | res = await wrapper(get) 58 | logger.debug(f"GetVoice - {res}") 59 | return res 60 | 61 | 62 | async def get_track_info(ids: list): 63 | res = await wrapper(GetTrackDetail, ids) 64 | logger.debug(f"GetTrackDetail - {res}") 65 | return res 66 | 67 | 68 | async def get_track_audio(song_ids: list, bit_rate=999999, encode_type="aac"): 69 | res = await wrapper( 70 | GetTrackAudio, song_ids, bitrate=bit_rate, encodeType=encode_type 71 | ) 72 | logger.debug(f"GetTrackAudio - {res}") 73 | return res 74 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/netease_music/util.py: -------------------------------------------------------------------------------- 1 | from awaits.awaitable import awaitable 2 | 3 | 4 | async def async_wrapper(origin_func, *args, **kwargs): 5 | """异步调用包装""" 6 | 7 | @awaitable 8 | def wrapper_(): 9 | return origin_func(*args, **kwargs) 10 | 11 | return await wrapper_() 12 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poison_soup/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poison_soup/__main__.py: -------------------------------------------------------------------------------- 1 | from nonebot import on_command 2 | from nonebot.matcher import Matcher 3 | 4 | from .data_source import get_soup 5 | 6 | 7 | @on_command("毒鸡汤").handle() 8 | async def _(matcher: Matcher): 9 | await matcher.send(get_soup()) 10 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poison_soup/data_source.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import os 3 | import random 4 | 5 | import aiofiles 6 | 7 | soup = [] 8 | 9 | 10 | def get_soup(): 11 | return random.choice(soup) 12 | 13 | 14 | async def load_soup(): 15 | global soup 16 | async with aiofiles.open( 17 | os.path.join(os.path.dirname(__file__), "soup.txt"), encoding="utf-8" 18 | ) as f: 19 | soup = [x.strip() for x in await f.readlines()] 20 | 21 | 22 | asyncio.run(load_soup()) 23 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poison_soup/soup.txt: -------------------------------------------------------------------------------- 1 | 时间不能冲淡一切,比如痘印。 2 | 别来无恙的意思,就是你别来,我无恙。 3 | 想结婚就去结婚,想单身就维持单身,反正到最后你们都要后悔! 4 | 相遇是猝不及防,而离别是蓄谋已久。 5 | 都说在喜欢的人面前会变笨,难道我喜欢上作业了? 6 | 累死你的不是工作,而是工作中遇到的人! 7 | 我嘴里的舌头,可不是一般的舌头,是贪吃舌。 8 | 伤你最深的人,一定是最了解你的人,毕竟曾经你们无话不说。 9 | 玩笑嘛,不是在自黑,就是在黑别人。 10 | 很喜欢秋天,跟恋爱一样,早晚都凉。 11 | 明知山有虎,那就不要去明知山。 12 | 熬夜可以防止老年痴呆,因为它让你,活不到老年。 13 | 消极的人才会起床抱怨上班,积极的人早就请假继续躺了。 14 | 你不是脾气好,是气到内出血又不敢刚。 15 | 表面孤獨的人不是真的孤獨,內心強大的人,才是真的孤獨。 16 | 每个人都有幸福的权力,却只有少数人,有幸福的能力。 17 | 查完支付宝中的余额,我这颗悬着的心,终于不跳了。 18 | 我怕死,但我真的不是贪生。 19 | 公主才有公主病,你那是,野鸡情绪失控综合症。 20 | 有些人的存在,就是为了证明,祸害遗千年这句话有多对。 21 | 万死不辞的最新解释是,被气死一万次也不舍得辞职。 22 | 世界上唯一一件公平的事,就是我们早晚都会死。 23 | 为了你好,是多么可怕的道德绑架啊。 24 | 发现新世界的人,刚开始都是走错了路。 25 | 富的人各有各的幸福,穷的人各有各的不幸。 26 | 祝您踏入婚姻的坟墓后,身旁人不要诈尸,身后人不要翘坟。 27 | 所谓白领,就是那点工资,领了也是白领。 28 | 自从傻B这个词出现后,傻瓜笨蛋这些词,就被划分到了情话行列。 29 | 牙签放在脚指甲盖,向墙猛的踢过去,你看吧文字也能让人疼痛。 30 | 如果年少轻狂不自卑,前任肯定一大堆。 31 | 你不丑,是镜子难看。 32 | 我不说话,不是我高冷,而是怕显露我的傻逼气息。 33 | 觉得你暗恋的人也在暗恋你,你知道这叫什么吗?这叫想象力。 34 | 当金钱站起来说话时,所有真理都沉默了。 35 | 月考时我不给你们露两手,你们都不知道我,国庆玩的有多开心。 36 | 枕头要经常晒,因为里面装满了,心酸的累和发霉的梦。 37 | 前程似锦什么的太虚假了,就祝你穷困潦倒吧。 38 | 一个合格的前任,应该跟死了一样。 39 | 雾水的量词,竟是头。 40 | 男人总以为挣很多钱,就可以留住女人,其实事实就是这样。 41 | 白天关注健康新闻贪生怕死,晚上熬夜游戏追剧视死如归。 42 | 我不是没脾气,是不敢有脾气,因为没人哄会很尴尬。 43 | 一个女孩有纹身说明什么,性格开朗还是有故事?说明你有偏见。 44 | 我这不是胖,是美丽在膨胀。 45 | 所谓土味情话,长的好看说的都是情话,长的丑说的都是土味。 46 | 有时候,想想开心的往事,也是一种难过。 47 | 为什么国庆节大家都高兴?祖国母亲富强了,我就是富二代了。 48 | 想找另一半共度风雨,找到后你会发现,大部分风雨是另一半带来的。 49 | 有时候你不跟别人聊一下天,都不知道自己有多讨人厌。 50 | 不告白不是怕你拒绝,而是怕你拒绝之后,跟别人一起嘲笑我。 51 | 国庆节,别人是外国七日游,我是卧室深度游。 52 | 富有的人,并没有我们想象中的快乐,而是我们想象不到的快乐。 53 | 站着说话,腰真的不疼。 54 | 小时候哭着哭着就笑了,长大后笑着笑着就哭了。 55 | 那些说要陪你一辈子的人,现在应该,都不在你身边了吧。 56 | 没有什么过不去,只是再也回不去。 57 | 我现在无心学习,一心只想为祖国庆生。 58 | 世界上最大的谎言,我已阅读并同意此条款。 59 | 在现在这个社会,想让别人记住你,只有欠钱不还。 60 | 当我看你搂着她,我却没有任何感觉的时候,我就知道我的快乐回来了。 61 | 穷人的绅士一文不值,富人的流氓异常迷人。 62 | 如果婚姻是爱情的坟墓,那么相亲是,为坟墓看风水! 63 | 很多父母不让娶的最终没娶,很多父母不让嫁的,最终都嫁了。 64 | 本就没有感同身受,只有身受了才能感同。 65 | 别人骂你的时候,不要理他,反正你又骂不过他。 66 | 如果夜里不能吃东西,那冰箱里,为什么会有灯呢? 67 | 爱情最大的悲哀就是,玩着爱自己的人,爱着玩自己的人。 68 | 我有很多好朋友,但这些好朋友,都有比我更好的朋友。 69 | 随缘是因为没人喜欢,将就只是不想孤单。 70 | 书籍是进步的阶梯,手机是近视的电梯。 71 | 遇见你,花光了我所有的运气,所以我每天都特别倒霉。 72 | 人生本来就苦短,你却还想着走捷径。 73 | 我做错了什么,为什么考不上好学校?做错了题。 74 | 她只是看了你一眼,你却在心里,演了场电影。 75 | 大人只分利弊,小孩才分对错。 76 | 撞衫不可怕,可怕的是你穿着,比她丑多了。 77 | 我对你要求不高,能跟我其他对象,和睦相处就好咯。 78 | 从小听到最多的, 是「你要懂事」,可却很少听到「你要开心」。 79 | 懒惰久了,稍微努力一下,就以为自己在拼命。 80 | 说好了要一起翘课,最后却只有我挂科。 81 | 世界上本没有路痴,建的路多了,就有了路痴。 82 | 心甘情愿四个字,真是卑微又勇敢。 83 | 可别把伤口揭开给别人看,世界上多的不是医师,而是撒盐的人。 84 | 健身卡办了半年都没瘦,我要不要亲自去一趟? 85 | 我忘记了你,但是输入法却还记得。 86 | 肚子上的赘肉,是你向生活妥协的痕迹。 87 | 全班其他同学都交了作业,就你没交,这大概是做过最孤独的事。 88 | 有时候不逼自己父母一把,永远不知道他们多有钱。 89 | 岁月静好,秃如其来。 90 | 我就像趴在玻璃上的苍蝇,前面一片光明,却找不到出路。 91 | 你化成灰我都认得,但是化了妆就不一定了。 92 | 夜太美,尽管再危险,总有人黑着眼眶修着仙。 93 | 你看自由这个词,长得就像条条框框。 94 | 我们不合适,你适合更好的,而不是我这种最好的。 95 | 对于没有希望的人来说,得过且过,也许也是一种选择。 96 | 床上说过的话都不能信,比如,我再睡五分钟。 97 | 我有十块我会给你花九块,如果我有十万,我那十块都给你。 98 | 对生活抱有三分热情,当它泼你冷水的时候,才不至于那么冷。 99 | 每天道晚安之后,她其实在切换账号。 100 | 别总是对我忽冷忽热,不然我会感冒的。 101 | 自己都是一个失败的人,还想教出成功的孩子吗? 102 | 在知识的海洋里,你竟然是一条淡水鱼。 103 | 家家都有本难念的经,而上天还给了我梵文版。 104 | 媽媽今天跟我說選對象,不能只看別人的外表,也要看看自己的外表。 105 | 我以为我的人生,活成了故事,目前看来全是段子。 106 | 老乡骗老乡,两眼泪汪汪。 107 | 你的脖子真可爱,顶着一个猪脑袋。 108 | 別人前途無量,我前途無亮。 109 | 快乐分享错了人就成了显摆,难过分享错了人就成了矫情。 110 | 人生就像一杯水,孤独 孤独 孤独,一辈子就完了。 111 | 不要怪别人以貌取人,毕竟心太远,脸就在眼前。 112 | 上班如上坟,别侮辱坟,上坟还有思念和敬畏之情呢。 113 | 都说时间是一把杀猪刀,在你这儿,时间就是猪饲料。 114 | 人与人之间,除了生离与死别,并无第三种结局。 115 | 你看天上那朵云,像不像你,欠我的100块钱? 116 | 在孤独这件事上,我并不孤独。 117 | 要不是猪不会说话,不然你都没有,存在的价值。 118 | 一出门,千山鸟飞绝,万径人踪灭。 119 | 每天最顺心的事,恐怕就是早上起床,手机满电了吧。 120 | 只有拥有找男女朋友的能力,和很多备胎,才能真正享受单身生活。 121 | 时间不会解决任何问题,只会解决我们。 122 | 今天真是幸运的一天,终于实现了身价翻倍,因为猪价又翻了番。 123 | 快乐分享给朋友快乐会加倍,痛苦分享给朋友,朋友会减半。 124 | 创业只要你坚持,总有一天,会亏完的。 125 | 我的主要成分,1%的沙雕+99%的穷。 126 | 麻烦学妹行李箱少装点,毕竟学长只是想认识你,不想把命搭楼梯上。 127 | 只要跑的快,爱情就追不上你。 128 | 减肥不为美,只为走路不磨腿。 129 | 长得帅的叫海王,长得丑的那叫水鬼。 130 | 找不到人表白,祖国我爱你。 131 | 我真的想重来,这样我就可以再一次,在幼儿园里称王称霸! 132 | 人家解衣服,那叫轻解罗裳,而你是给猪松绑。 133 | 异地恋要对彼此信任,这样对四人都好。 134 | 誓言两个字都有口,偏偏有口无心。 135 | 不要觉得,自己每天都没有进步,你不是越来越懒了吗? 136 | 如果爸妈把逼我的劲头,用在他们自己身上,我早就是富二代了。 137 | 世界上最赚钱的方法,都写在《刑法》里了。 138 | 收到情书时要望着对方,才好听清,她要你转交的人。 139 | 长得好看还能吃的叫吃货,长得不好看还能吃的叫饭桶。 140 | 每天早起,可以做很多事情,比如再睡一会。 141 | 治疗脱发,最好的办法,剃光头。 142 | 多少年过去了,唯一不变的,还是那颗想发财的心。 143 | 我努力规划着我们的未来,而你却默默的策划着离开。 144 | 我感觉我长一颗脑袋,纯粹是让自己,看起来高一点。 145 | 学校就是连续签到五天,送你作业大礼包一份。 146 | 别总问我,不谈恋爱是因为挑吗?你不上清华是因为不喜欢吗? 147 | 我真是个败家子,上亿的家产,一觉醒来就没了。 148 | 你说我会遇到更好的人,其实是,你遇到了比我更好的人。 149 | 丑,不是你的本意,那是天意。 150 | 不要试图鹤立鸡群,请离开那群鸡。 151 | 别人涨粉丝,我却长粉刺。 152 | 长大这两个字,连偏旁部首都没有,一看就很孤独。 ​​​ 153 | 都说穷不过三代,我想你不会,因为到你这一代就结束了。 154 | 打败我的,不是天真,而是天真热。 155 | 如果每个人都能理解你,那你得普通成什么样子。 156 | 承蒙你出现,够我心烦好多年。 157 | 不要再减肥了,苦了自己,又苦了体重秤。 158 | 有的人就是不知足,都已经有了双下巴了,还想要双眼皮。 159 | 有人说我帅,我站在阳台上想了一个晚上,究竟是谁走漏的风声。 160 | 一直把心事憋在心里,我大概是想,把胸憋大。 161 | 十八岁生日,爸爸送了我一辆车,可惜被别人扫码骑走了。 162 | 穷是病,可是我没钱医病。 163 | 一切都会变好的,比如你已经从胖,变成了好胖。 164 | 女孩子千万不要夜跑,太危险了,要是遇到烧烤摊就完了。 165 | 既然解决不了问题,就解决提问的人。 166 | 别人有对象,我有对象腿。 167 | 回想这辈子,当过最大的官,也就是QQ群管理员了。 168 | 早上班一小时没人记得,早下班一分钟就被人惦记。 169 | 只要对象换的快,没有悲伤只有爱。 170 | 要不是生活所迫,谁愿意把自己,弄得一身才华。 171 | 运动是一种享受,因为我不贪图享受,所以我不爱运动。 172 | 晚上睡不着,白天睡不醒。 173 | 为什么要晒这么黑?因为我不想白活一生。 174 | 别人的穷只是表象,你的穷表里如一。 175 | 我军训过了,请不要再叫我单身狗,以后请叫我军犬。 176 | 每天叫醒我的不是闹钟,而是膀胱。 177 | 现在不努力,以后别人壁咚的墙,都是你搬的砖。 178 | 大概我们最默契的时候,就是我不去找你,你也不会来找我。 179 | 人丑就要多读书,因为只有书中,才可以体会美好的爱情。 180 | 努力赚钱不是因为钱重要,而是为了让钱变得不重要。 181 | 如果我老了怎么办?那些广场舞都好难。 182 | 自从实行垃圾分类后,尸体和棺材都得分开处理。 183 | 都说陪伴是最长情的告白,其实长得好看的是陪伴,长得丑的是纠缠。 184 | 别人是吃几口就饱了,你是吃饱了还能再吃几口。 185 | 暑假前制定了一个plan,半个暑假结束了,完成了个p因为lan。 186 | 明天估计会有人,手捧玫瑰花和我说,麻烦让一下。 187 | 只有体育老师会和你说,别走好吗?他让你跑! 188 | 你我本无缘,全靠我花钱。 189 | 如果大海能够,带走我的矮丑,我就剩下黑穷两样了。 190 | 我最擅长地就是虚度光阴,这个现在已经在表演了。 191 | 我们走路需要一步一个脚印,这样才能给后人指出,通往失败的路。 192 | 不是说好一起到白头,你却半路秃了瓢。 193 | 一路陪我走过来的,不是什么善良正直正能量,而是虚荣嫉妒和不甘心。 194 | 自控力是很重要的品质,突然想去学习,还好我自控力强--忍住了。 195 | 也许你的爱情迟到了,但更有可能的是,出车祸了。 196 | 当你停下来休息时,不要忘记别人还在奔跑,所以请拌倒他。 197 | 虽说爱情不能用金钱来衡量,但足以打动你未来的丈母娘。 198 | 今天我被邻居投诉噪音扰民,因为我穷得叮当响。 ​ 199 | 风光的背后,不是沧桑,就是肮脏。 200 | 所谓成长,就是在听到波涛汹涌四个字,再也联想不到大海了。 201 | 一些年轻人,通过高端消费来营造自己高端收入的形象。 202 | 一个姑娘的介绍:思想上的女流氓,生活中的好姑娘。 然而给我的感觉是:心思活络的丑逼。 203 | 谢谢你,在我每次需要你的时候都掉链子 204 | 先生,你这张卡上的钱也不够…… 205 | 喜欢就去表白,不然你不会知道自己长得多丑。 206 | 所有抱怨社会不公和制度的人翻译过来只有一句话:请给我金钱,女人和社会地位。 207 | 虽然我学得慢,但是我放弃的快啊! 208 | 死并不可怕,怕的是再也不能活了。 209 | 谁说我不会乐器?我退堂鼓打的可好了。 210 | 世界这么大,我想去看看,什么地方要饭比较方便! 211 | 世界上本没有鸡汤,鸡死了,便做成了鸡汤。 212 | 诗和远方越远越脏 以梦为马越骑越傻! 213 | 生活不止眼前的苟且,还有读不懂的诗和到不了的远方。 214 | 上帝为你关上一道防盗门,还会顺手给你上了一把钛合金锁。 215 | 如果所有人都理解你,那你得普通成什么样! 216 | 如果十年之后你未娶,我未嫁,那真是太惨了! 217 | 人生不如意,十之有十! 218 | 人人都想拯救世界,却没人帮妈妈洗碗。 219 | 其实只要不要脸,很多人生难题都能迎刃而解。 220 | 女人假装高潮来维持恋爱,而男人假装恋爱以获得高潮。 221 | 你每天都那么努力,忍受了那么多的寂寞和痛苦。可我也没见你有多优秀! 222 | 你多努力一点,获得的打击就多一点。 223 | 那些年立下的FLAG自己删了吧,反正也没人记得。 224 | 没有什么事情能把人一次击倒,只要足够坚强,它会持续的把你击倒! 225 | 没有人能让那你放弃减肥,你自己想想就会放弃了。 226 | 厉害的不是你有多少后台,而是你能成为多少人的后台! 227 | 就算睡得晚,不会找你的人还是不会找你! 228 | 今天的事不用放在今天做,万一明天死了呢,就可以不用做了。 229 | 很多时候,乐观的态度和好听的话帮不了你。 230 | 狗是人类最好的朋友。 然而狗最好的朋友是「屎」。 231 | 给你的梦想插上翅膀,虽然不一定飞得很远,但肯定摔的很重! 232 | 当你觉得生活对你不公时,秤秤体重,照照镜子,你会觉得一切又合乎情理。 233 | 打趴下就不要爬起来了,反正还是会被打到趴下! 234 | 曾经我也是打算靠脸吃饭的,后来差点饿死才放弃的。 235 | 不要以为世界抛弃了你,世界根本没空搭理你! 236 | 别总骂恨铁不成钢,是你自己忘了,铁本来就不能成钢的啊。 237 | 别人问你有谈恋爱吗?就说现在没有。可以机智地掩盖过去也没有的事实。 238 | 别看我平时对你漠不关心,其实私下里我每天都盼着你出事! 239 | 抱怨不会改变生活,但是钱可以! 240 | 白天嘈杂得不愿意醒,夜晚安静得舍不得睡。 241 | 做政治试卷,是我这辈子,说谎最多的时候。 242 | 做一天的好人并不难,难的是做一辈子有钱人。 243 | 做题前,先想想出题者的用意,我觉得他想我死。 244 | 做事一定要考虑别人的感受,千万不能让他们太开心了。 245 | 做任何事情一定要坚持下去,总会让你看到,失败的那一天。 246 | 做人要谦虚,多听听他人的意见,然后认真记下他们的名字。 247 | 做人要安安稳稳本本分分,因为,你也根本搞不出什么幺蛾子。 248 | 做人如果没点追求,那么,该多轻松啊… 249 | 做梦梦到自己在考试,然后被吓醒,发现自己真的在考试。 250 | 做了一个风险非常大的投资,要是成功一下就能挣几个亿,要失败我这两块就打水漂了。 251 | 做好万全的准备,就是为了当机会来临时,你可以巧妙地避开它。 252 | 做好人没希望,做坏人不擅长。 253 | 作为失败的典型,你实在是太成功了。 254 | 昨天遇见小学同班同学,没想到他混的这么差,只往我碗里放了一块钱。 255 | 昨天一个小偷,来我家偷钱,我们一起找了一晚上。 256 | 最怕你一生碌碌无为,还安慰自己说平凡可贵。 257 | 最近一个月,总有那么三十天很不顺。 258 | 最近改掉了熬夜的壞習慣,改通宵了。 259 | 纵然人生坎坷,但我从不向命运屈服!我通常都是直接屈膝Orz。 260 | 總以為退一步海闊天空,沒想到腳下落空。 261 | 总是在重复,尤其是错误! 262 | 总是在凌晨想通很多事情,又在天亮之后,忘得一干二净。 263 | 总结一下你的2018,留下你的不开心,让大家开心开心。 264 | 自由从来不是什么理所当然的东西,而是一项需要极高成本的特权。 265 | 自古情深留不住,总是套路得人心。 266 | 装逼只是瞬间,不要脸那才是永恒。 267 | 赚钱就像便秘 — 老难了,花钱就像拉稀 — 憋不住。 268 | 转角一般不会遇到爱,只会遇到乞丐。 269 | 注重细节,从小事做起,因为你根本做不了大事。 270 | 众里寻她千百度,蓦然回首,那人依旧对我不屑一顾。 271 | 终于中了500万,兑奖的时候,笑醒了。 272 | 至少在夏天,富得流油你已经做到了一半。 273 | 知识给你力量,无知会给你更强大无畏,且无法预测的力量。 274 | 知道为什么天妒英才吗? 因为没人去管笨蛋活了多久。 275 | 知道为何自古红颜多薄命吗?因为没人在意丑的人活多久。 276 | 只有在车站大排长龙时,才能真正意识到,自己是龙的传人。 277 | 只有在,请假扣工资时,才觉得自己工资高。 278 | 只有努力过了才知道,智商上的差距是不可逾越的。 279 | 只有努力过了才知道,智商上的差距,是不可逾越的。 280 | 只有努力过的人才知道,背景是多么重要! 281 | 只有多替领导背锅,领导才会把你,当成傻子啊。 282 | 只要有快递还在路上,就感觉这生活,还算有点希望。 283 | 只要选对了人生的方向,很容易就成功了,让我们恭喜只要和很容易。 284 | 只要我肯努力,没什么事情是我搞不砸的。 285 | 只要我吃的夠快,体重绝对追不上我! 286 | 只要是石头,到哪里都不会发光。 287 | 只要努力的时间足够长,搞不好,你还可以失败的更彻底。 288 | 只要你每天坚持学习,最终胜利肯定是属于,在考场上发挥好的人。 289 | 只要你肯吃苦,肯努力,肯放下身段,去要饭,总会有人赶的 290 | 只要能用钱解决的事情,我一件都解决不了。 291 | 只要坚持不懈,嘲笑你的人,迟早会被你笑死。 292 | 只要功夫深铁杵磨成针,但真把铁杵磨成针的,绝对是大傻瓜。 293 | 只要锄头挥得好,没有墙角挖不倒。 294 | 只是因为在人群中,多看了你一眼,你就以为我要坐你的摩的。 295 | 挣钱是一种能力,花钱是一种技术,我能力有限技术却很高。 296 | 正在输入…,给了多少人希望,又给了多少人失望。 297 | 正月初五迎财神,那都是有钱人的事,你就洗洗睡吧。 298 | 真正努力过的人才知道,智商上的差距是不可逾越的。 299 | 真正努力过的人,就会明白,天赋是有多么重要。 300 | 真正的勇士,敢于直面银行卡上的余额,敢于正视磅秤上的数字。 301 | 真正的吃货,是可以把月供看成月饼的。 302 | 真希望有一天我的钱包,可以和我的脸皮一样厚。 303 | 这一秒不放弃,下一秒,就更绝望了。 304 | 这世上如果有什么真理,那就是活该! 305 | 这世上没谁离不开谁,就算是一条鱼离开水,也能烤着吃。 306 | 这年头有些人靠脸吃饭,而有些人,靠不要脸吃饭。 307 | 这年头放个假真不容易,连放假都要沾老祖宗的光。 308 | 这年头,哪有不分手的恋爱,只有不伤手的立白。遇事得看开一点。 309 | 这么多年没掉入桃色陷阱,靠的就是两个字,没钱。 310 | 这两天雨水多,下雨记得打伞,否则脑袋容易进水。 311 | 这孩子不是笨,就是学习方法不对。学习方法都找不对还不是笨啊? 312 | 这个年纪会在你耳边唱歌,喜欢你的肉体还会送你包的,只剩下蚊子了。 313 | 这次期末考,我会用实力告诉你,我们年级共有多少人。 314 | 这辈子最灿烂的笑容,大概都奉献给,我的手机屏幕了。 315 | 这辈子这么苦,别太拼,下辈子还会更苦的。 316 | 找对象还是眼光高点好,你总得为,没有人喜欢你找个借口吧。 317 | 找对象的时候,不要光看对方外表,得先看看自己外表! 318 | 仗义每从屠狗辈,负心多是读书人。 319 | 长的美与不美不重要,想的美才是真的美! 320 | 长的好看的才能叫吃货,长的不好看的只能叫饭桶。 321 | 长的丑不是我的错,只是我在落地时太匆忙了,来不急打扮。 322 | 长得帅的踢键子都帅,长得丑的,打高尔夫都像在铲屎。 323 | 长得好看的才叫吃货,长得不好看的那叫饭桶! 324 | 长得丑怎么了?我自己又看不到,恶心的是你们! 325 | 债主,就是那个你破了产,也不会抛弃你的人。 326 | 扎心?不存在的!心都没有扎哪里? 327 | 早睡早起身体好,可是晚睡晚起真的心情好。 328 | 早上醒来,我以为自己长大了,原来是被子盖横了~ 329 | 早起的鸟儿有虫吃,可惜你是那条虫。 330 | 早点睡吧,因为你喜欢的人,早就跟别人睡着了。 331 | 早晨起来照镜子,安慰自己说没事,还有比我更丑的。 332 | 糟糕的从来都不只是今天,还有你的以后。 333 | 攒了一年头皮屑,只为给你下场雪。 334 | 在最美的年纪遇见你,我想说,真是倒了血霉了! 335 | 在你最需要帮助的时候,只有鬼才来帮你。 336 | 在出租车内疯狂放臭屁,可以极大的降低,司机带你绕路的概率。 337 | 再也沒有任何事情,比晚睡更快樂了,除了晚起。 338 | 再努力一点,你就能走向,人生癫疯。 339 | 再苦不能苦孩子,再穷也得穷得瑟。 340 | 再不疯狂就老了,疯狂过后发现老的更快。 341 | 运动一周瘦不下来不要紧,因为运动十周也瘦不下来的。 342 | 运动后,你会惊喜地发现,自己只是从肥胖变成壮。 343 | 月亮代表我的心,坑坑洼洼冷冰冰。 344 | 月老麻烦下次为我牵红线,能换成钢丝吗?红线老TM断。 345 | 愿你以后,有酒有肉有姑娘,姑娘丑的不像样。 346 | 愿你的烦恼,像你的头发一样,越来越少。 347 | 愿得一人心,免得老相亲。 348 | 远方的路,除了未知,还有绝望。 349 | 遇到喜欢的人就勇敢追求,这样你才能知道,拒绝你的人远不止一个。 350 | 遇到喜欢的女生要勇敢表白,只有你主动了,才知道她名花有主。 351 | 遇到闪电记得要微笑,因为那是天空在给你拍照。 352 | 遇到你之前,我的世界是黑白的,遇见你之后 哇靠 全黑了。 353 | 遇到困难的时候暂时放一放,第二天的时候,就再也想不起来了。 354 | 遇到困难的三个步骤,面对它 处理它,放弃它。 355 | 愚人节表白算什么,清明节表白才是王道,失败了还可以说是鬼附身了! 356 | 愚人节,只是给说谎的人,一个说真话的机会。 357 | 鱼与熊掌不可兼得,但穷和丑可以啊。 358 | 鱼和熊掌不可兼得,但单身和穷可以! 359 | 余生不想请你指教了,领教够了 360 | 又一天过去了,怎么样,是不是梦想更遥远了? 361 | 又到了一切矛盾,都能用「大过年的」四个字,解决的时候了。 362 | 有缘千里来相会,无缘倒也省话费。 363 | 有一天你会遇到一个妹子,她不要你的房也不要你的车,她也不要你。 364 | 有一段情,叫自作多情。 365 | 有些事情还是要坚持的,比如睡觉,特别是闹钟响起的那一刻。 366 | 有些事或人,不是你有钱就可以搞定的,你得有很多钱。 367 | 有些事不是我不在意,而是我在意了,又能怎样? 368 | 有些事,不说是个结,说了是个疤。 369 | 有些人一旦错过了,真特么谢天谢地。 370 | 有些人是好看的,有些人是难看的,而你是好难看的。 371 | 有些人努力了一辈子,就是从社会的四流,挤入了三流。 372 | 有些人就是四,除了二,还是二。 373 | 有些人出现在你的生活里,是想告诉你,你真好骗啊! 374 | 有些人表面光鲜亮丽,实际上,船袜已经滑到了脚底板。 375 | 有时你会觉得自己就是个SB,别灰心,至少感觉是对的。 376 | 有时候别人对你很冷淡,可能并不是你的问题。他也许只是不喜欢丑的而已。 377 | 有时候,只要你下定决心做某件事,全世界都会拖你后腿。 378 | 有什么不开心就睡一觉,没什么是睡一觉不能解决的,如果有那就再睡个回笼觉。 379 | 有人一笑就很好看,你是一看就挺好笑。 380 | 有人考试靠实力,有人考试靠视力,尼玛我考试靠想象力! 381 | 有人存你号码是为了打给你,我不一样,我是为了不接。 382 | 有钱人终成眷属,没钱人只能吃土。 383 | 有钱人终成眷属,没钱人亲眼目睹。 384 | 有钱人离我好近,有钱离我好远! 385 | 有钱人可以选择低调,而你,却只能低调。 386 | 有钱能买来幸福吗?不能,有钱本身就是幸福! 387 | 有钱了不起啊?有钱,真的了不起。 388 | 有朋自远方来,虽远必诛。 389 | 有困难要帮,没有困难,制造困难也要帮。 390 | 有很多时候,面子不是别人给的,是自己凑上来丢的。 391 | 有股强烈的学习欲望,幸好我自制力强,压下去了。 392 | 有个姑娘问我借钱去整容,整的挺成功,我再没认出是谁问我借的钱。 393 | 友谊是什么?你智障多年,我不离不弃。 394 | 友情越来越少,礼尚往来越来越多。 395 | 由于性格太内向,一直做不出,抢着结账这种事。 396 | 用钱当然买不到快乐,只是有钱,别人会想办法让你快乐。 397 | 用美颜手机自拍多了,越来越不知道,自己有多丑了。 398 | 用扯淡的态度,面对操蛋的人生。 399 | 用2B形容你,人家铅笔不乐意。 400 | 勇敢面对磨难,那些杀不死你的顶多是让你,留下残疾。 401 | 永远不要自暴自弃,一旦开始放弃,你就会发现非常开心 402 | 英雄一怒为红颜,红颜一怒,得花钱。 403 | 因为穷我连关心你都不敢,就怕你说嘘寒问暖,不如打笔巨款。 404 | 以我的资历和文凭,将来这个城市的大街,都归我扫。 405 | 以前我每天都会买彩票,终于有一天,我连彩票都买不起了。 406 | 以前虽然穷但是很开心。现在不同往日了,不止穷还不开心。 407 | 以前上学是拿钱混日子,现在工作了,是在拿日子混钱。 408 | 以前觉得靠关系的人,一定很无能,接触后发现人家样样比我强。 409 | 以前过年就图个热闹,现在就想图个清静。 410 | 以前除了读书什么都不懂,现在除了读书什么都懂。 411 | 以后要对女朋友好一点,毕竟她已经瞎了,不能再受伤害了。 412 | 以后没钱了先找我借,我不想做最后一个,让你失望的人。 413 | 一想到你,我的丑脸,就泛起微笑。 414 | 一无所有到,没有什么可以放弃时,别忘了你还能放弃治疗。 415 | 一天不玩手机,人是不会死的,命还在但是魂丢啦! 416 | 一路上有你,苦一点也愿意,苦很多免谈。 417 | 一懒众衫小,薪尽自然凉。 418 | 一见钟情就是好看,深思熟虑就是没钱。 419 | 一个人最长的恋爱史,大概就是自恋了。 420 | 一个成年人是不会挑食的,他们会说,我对这个过敏。 421 | 一顿操作猛如虎,一看工资二千五。 422 | 夜撩了酒,酒撩了你 你撩了我,穷困潦倒了我们。 423 | 也许睡眠,才是人类真正的活动形态,难怪我总是睡不醒。 424 | 也许命运扼住你的咽喉,只是让你少吃两口。 425 | 要笑着走下去吧,反正来到这个世界上,谁也没打算活着回去。 426 | 要相信自己,别人能做到的,你也做不到。 427 | 要感谢那些把你打倒的人,因为你会发现躺倒真的很舒服 428 | 腰缠万贯,全是脂肪。 429 | 眼睛千万不要对着手机太久,专家说了,那样手机会没电。 430 | 研究证明常年抽烟喝酒的人,患老年痴呆的概率较低,因为早死的概率较高。 431 | 学校教学楼放镜子,是为了让你知道,人丑就要多读书。 432 | 学习使人快乐,不学习使人,更快乐。 433 | 学海无涯,回头是岸。 434 | 学过很多技能,到头来才发现,最有用的技能是——想开点! 435 | 学而不思则罔,思而不学则殆。不思不学成网贷。 436 | 选择比努力更重要,所以我选择不努力 437 | 秀恩爱的最好在中午秀,因为,早晚都会有报应。 438 | 胸怀鸿鹄之志,手无缚鸡之力。 439 | 兄弟听我一句劝,游戏没了还能重玩,媳妇没了游戏就能一直玩了。 440 | 幸亏你去年没洗头,要不然你今年,炒菜连油都没有。 441 | 醒醒,你这不是丧而是,没有钱和性生活的正常表现。 442 | 信就信,不信就不信,还TM整个微信。 443 | 心是伟大的诗人,而嘴是蹩脚的编辑。 444 | 心软不是病,回头才致命。 445 | 心灵鸡汤是给吃惯了鲍参翅肚的人做的换口味小菜,屌丝以为喝一碗鸡汤就营养全面提升了? 446 | 心比天高,命比纸薄。 447 | 卸妆对你来说,又叫洗钱。 448 | 小学的英语水平支撑到现在,越来越力不从心了。 449 | 小时候做过的最蠢的事,可能是盼着长大吧。 450 | 小时候最讨厌吃饭和睡觉,现在想想真贱。 451 | 小时候最怕梦到自己找厕所,最最可怕的是,人没醒来厕所却找到了。 452 | 小时候我们都很快乐,因为那个时候我们,丑和穷都还不是那么明显。 453 | 小时候我常想,长大了是上北大还是清华,现在想想原来是我想多了。 454 | 小时候的梦想是当一个英雄,没想到手机里就能轻松实现,而且选择还挺多的呢。 455 | 小时候不爱吃饭,导致现在个矮。现在爱吃饭了导致又胖又矮。 456 | 小三是个好东西,她带走了不爱你的狗东西。 457 | 小明长期被爸妈蒙在鼓里,导致窒息而死。 458 | 像你这样的人,哪怕把土豪两个字贴在脸上,别人也会反过来读。 459 | 想做你的太阳,高兴的时候温暖你,不高兴的时候晒死你。 460 | 想要打起精神,却一不小心把他打死了。 461 | 想要逼死一个强迫症,那实在是太简了。 462 | 想买一辆保时捷卡宴,请问买过的朋友,你们的钱都是从哪里来的! 463 | 想和男朋友去看电影,有什么好看的,男朋友介绍吗? 464 | 想好了的是假象,认真的做了也没前途。 465 | 想奋斗?手机能从你的手上拿下来,就算是拼搏了。 466 | 想变美就多睡觉,睡懵了就觉得自己美了。 467 | 相信你一定不会被生活打倒,因为你的体重,超过了生活的预料。 468 | 相亲最大的好处是,如果以后婚姻出问题,你可以把责任推给媒人。 469 | 乡愁是一张小小的车票,我在这头,黄牛在那头。 470 | 現在矮矬窮不要緊,要相信將來有一天,你會變成矮矬窮老… 471 | 现在流的泪,都是当初脑子进的水。 472 | 现在苦点没关系,人只要活着就一定会有好事,发生在别人身上。 473 | 现在的时代,不是属于00后的,是属于厚脸皮的! 474 | 现在的女生太不像话了,领口开这么低,还看不到事业线 475 | 现在的女孩子如果不努力,是会被抓去结婚的,并且还要生二胎。 476 | 现在的年轻人,除了睡觉时间不想睡,其它时间都想睡觉。 477 | 现实就是,你这个前浪还没开始浪,就已经被拍死在沙滩上了。 478 | 咸鱼翻身是为了晒得透彻,你翻身是因为手被压麻了。 479 | 咸鱼翻了身,也还是咸鱼。 480 | 喜欢一个人是藏不住的,就算躲在衣柜里,还是会被她老公发现。 481 | 喜欢一个人就去表白,万一,成备胎了呢? 482 | 喜欢就要表白,这样才能知道你是几号备胎。 483 | 希望有些事情可以自己解决,不是我自己,是事情自己。 484 | 希望无时无刻不在,而你,每时每刻都错过。 485 | 希望是火,失望是烟,人生就是一边生火一边冒烟。 486 | 西游记告诉我们,有个猪一样的队友,能让团队上西天。 487 | 物以类聚人以穷分,有钱人终成眷属。 488 | 武则天证明了,成功和性别没关系,你证明了成功和你没关系。 489 | 吾日三省吾身,吾没钱 吾没车 吾没房。 490 | 无论最后我们疏远成什么样,一个红包,就能回到当初。 491 | 无论遇到任何事情,在哪里跌倒,就在那多躺一会吧。 492 | 无论你二或不二,二就在那里,不三不四。 493 | 无毒的身躯扛下有毒的疫苗,你是教育我从小就要坚强! 494 | 我最大的缺点,就是缺点钱。 495 | 我知道虚度年华不对,但是这样,真的好过瘾啊。 496 | 我知道岁月会磨平我的棱角,但没想到,是把我按在地上摩擦。 497 | 我只想和你叙叙旧,你却问我要不要代购。 498 | 我真的挺羡慕你的皮肤,你说你是怎么能,把它保养的那么厚呢? 499 | 我这人从来不记仇,一般有仇当场就报了。 500 | 我这人不太懂音乐,所以时而不靠谱,时而不着调。 501 | 我这人吧,永远不要挑战我的底线,否则我又得修改底线。 502 | 我这辈子没求过谁,只求过阴影部分面积。 503 | 我有一颗早起的心,可我的被子和床不同意。 504 | 我有一个梦想,只是有一个梦想。 505 | 我有个朋友停止了抱怨,开始努力奋斗,几年过去了还是这个鸟样。 506 | 我因为穷,所以国庆在家,躲过了一节。 507 | 我以为我们能一起走到最后,谁知道,你走了两步就要打车。 508 | 我以为明天会更好,后来我天天盼着明天。 509 | 我已经到了法定结婚年龄,请问去民政局领证的时候,老婆是自己带还是等他们发? 510 | 我已经不是那个花五十块钱,也要考虑很久的小孩了,现在五块钱都要深思熟虑。 511 | 我一般说话都会给人留面子,万一我怼你了,没错我就是故意的。 512 | 我也想做一个优雅的淑女,是生活把老娘逼成了泼妇。 513 | 我也曾青春逼人,可惜现在青春没了,就剩这么个逼人了。 514 | 我要没点自我安慰的本事,还真活不到现在。 515 | 我想重新认识你,从你叫什么名字开始。你叫什么来着? 516 | 我想早恋,但是已经晚了… 517 | 我想要住进你心里,才发现是个小区,还有许多邻居。 518 | 我躺在床上看天花板,想着我工作的天花板,只是别人的地板。 519 | 我虽然不能来一场,说走就走的旅行,但我有一个说胖就胖的体质。 520 | 我说哪句话让你伤心流泪了,请告诉我,我再说一遍。 521 | 我是一条酸菜鱼,又酸又菜,还多余。 522 | 我是深知欲速则不达,心急吃不了热豆腐的,你怎么能说我有拖延症? 523 | 我试过销声匿迹,最终也无人问及。 524 | 我生气的时候你一定要哄我,买吃的给我。等老子吃饱了打死你。 525 | 我生平最讨厌一个字,略!尤其是题不会做时。 526 | 我上班就是为了赚钱,别和我谈理想,我的理想是不上班。 527 | 我擅长做空A股,只要我一买,立刻跌。 528 | 我亲眼看着你走上台,不知道你是将要献丑,还是出丑。 529 | 我能想到最浪漫的事,就是看你一人慢慢变老。 530 | 我能想到最浪漫的事,就是和你一起吃吃吃,然后你付钱。 531 | 我能想到,对自己最准确的形容词只有:肥美。 532 | 我们是好朋友,你摔倒了我会把你扶起来,不过要等我笑完。 533 | 我们非常努力,才能活得像个普通人 534 | 我们都史无前例的有默契,突然你不理我我也不理你。 535 | 我每天拼了命努力就是为了,向那些看不起我的人证明,他们是对的。 536 | 我没有去过你的城市,但我刷过你那的题。 537 | 我连穷和丑都不怕,还怕单身? 538 | 我连名牌都不认识几个,有时候,别人在炫富我都不知道。 539 | 我可以划船没有桨,我可以扬帆没有方向,因为我这一生全靠浪。 540 | 我觉得一定有很多人暗恋我,因为这么多年了,也没有人跟我表白! 541 | 我觉得失恋不可怕,眼瞎才可怕。 542 | 我交朋友,从不在乎他有没有钱,反正都没有我穷。 543 | 我捡了个神灯,许愿我死前能找到女朋友,结果我获得了永生! 544 | 我好想你,第一句是假的,第二句也是假的。 545 | 我鼓足勇气去面对现实,却发现勇气,真的只是气而已。 546 | 我发现我挺能哄女孩睡觉的,只要我一发信息,女孩就说我要睡觉了。 547 | 我对生活充满向往,生活对我虽远必诛。 548 | 我的原则,只有三个字,看心情。 549 | 我的意中人是个盖世英雄,总有一天他会,踩着七色彩云去娶别人。 550 | 我的眼里只有你,因为你的大脸,让我看不到别人。 551 | 我的兴趣爱好分动态和静态,动态就是翻身,静态就是睡觉。 552 | 我的未来就是个梦,更遗憾的是,这会儿还失眠。 553 | 我的社交恐惧症,主要来自于,收入低。 554 | 我的钱虽然不是大风刮来的,但像被大风刮走的。 555 | 我的脑袋不是空的。我是要大作为的人,只是混沌初开。 556 | 我的目标是三十岁有套房子,现在实现一半,已经三十岁了。 557 | 我到底是活了16年,还是活了1天,重复了16年? 558 | 我从你眼里看到了两样东西,一样是真诚,而另一样是眼屎。 559 | 我从来不会脑残地,在网上晒自己买的名牌,因为我买不起。 560 | 我从曾经的一无所有,到现在的身无分文。 561 | 我从不以强凌弱,我欺负他之前,真不晓得他比我弱。 562 | 我从不去想何时能成功,既然选择了远方,那就还远着呢。 563 | 我丑,是为了降低画质提高性能,为什么我的人生还那么卡呢? 564 | 我超级超级喜欢小动物,怎么说呢,就是顿顿都有吧。 565 | 我尝试着做一个有趣的人,后来却跑偏了,成了一个逗逼。 566 | 我曾经得过精神分裂症,但现在我们已经康复了。 567 | 我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。 568 | 我不是诸葛亮,也没有草船,但为何你的贱一直往我这放? 569 | 我不是那种,落井下石的人,我是直接把井封了。 570 | 我不是矮,我只是离天空比较远。 571 | 我不怕变成自己厌恶的人,我怕过得还不如他们。 572 | 我不骂人,那是因为我,动手能力比较强。 573 | 我不会两面三刀,可我经常被两面插三刀。 574 | 我本想享受生活,结果发现活下来都很困难。 575 | 我把她从女孩变成了女人,她把我从男孩变成了,穷人。 576 | 问世间钱为何物,只叫人生死相许。 577 | 问渠那得清如许,唯有毒汤活水来! 578 | 问君能有几多愁,恰似一群太监上青楼。 579 | 唯一比孤独更可怕的,是被人知道你孤独。 580 | 为什么总是天妒英才呢?因为没人管笨蛋活多久。 581 | 为什么中国人结婚,都非要选个好日子呢?因为结完婚就没好日子过了! 582 | 为什么在学校,一上课就想睡觉?因为学校是梦开始的地方。 583 | 为什么要吵架呢?就不能心平气和的坐下来,打对方几巴掌吗? 584 | 为什么你能像智障一样活着,而我却不可以。 585 | 为什么家长只看分数?废话!难道他们看得懂题目? 586 | 为了防止我这个月又乱花钱,我提前把钱,都花完了。 587 | 为了变漂亮,你坚持了哪些好习惯?坚持开美颜。 588 | 望穿秋水之寒,无论如何也比不了,忘穿秋裤之冷。 589 | 忘记以前的不开心,因为以后会更不开心。 590 | 往往那些不起眼的小餐馆,才能吃到真正的美味,而那些大酒店的我吃不起。 591 | 往事不堪回首,是因为,你根本没有可以回首的往事。 592 | 王子拿着留下的43码水晶鞋陷入沉思 593 | 玩手机时间长要让眼睛休息,把视线投向窗外,想一想为什么自己这么穷。 594 | 外貌不重要,爱情看的是感觉,可是人家对丑的没感觉。 595 | 脱了衣服我是禽兽,穿上衣服,我是衣冠禽兽。 596 | 脱发怎么办?要健康饮食保持良好心态,这样就能接受这个事实了。 597 | 突然发现,起床第一件事是摸手机,睡前最后一件事是放下手机。 598 | 突破瓶颈之后,发现还有瓶盖。 599 | 投对了简历找到一份好工作,投对了胎,可以不用找工作。 600 | 偷一个人的主意是剽窃,偷很多人的主意是研究。 601 | 同样是出卖自己,有的人成了大姐,有的人成了小姐。 602 | 同样都是咸鱼,为什么别人可以翻身,而你却粘锅了? 603 | 同甘共苦你不陪,荣华富贵你是谁? 604 | 聽說七月鬼門快開了,你總算不是孤家寡人了。 605 | 听说自从你得了神经病,整个人都精神多了。 606 | 听说你过的没我好,那我就放心了。 607 | 听说你过的不好,我蹲在门口,笑了一整天。 608 | 听说你的城市下雨了,不知道你带伞没有,如果带了这雨就白下了。 609 | 听君一席话,浪费十分钟。 610 | 听成绩的时候要用右耳听,因为左耳靠近心脏,可能会猝死。 611 | 铁打的身子,磁铁打的床。 612 | 铁杵能磨成针,但木杵只能磨成牙签。材料不对再努力也没用。 613 | 条条大路通罗马,每条都有收费站。 614 | 条条大路通罗马,可是有人就出生在罗马 615 | 条条大路通罗马,而有些人,就生在罗马。 616 | 天涯何處無芳草,全都長在別人家。 617 | 天生我才必有用,前提是,你得是天生的。 618 | 天没降什么大任于我,照样苦我心智,劳我筋骨。 619 | 天空没有翅膀的痕迹,除非你飞的时候会掉毛 620 | 天将降大任于斯人也,必先苦其心志劳其筋骨,后来天改主意了。 621 | 特别能吃苦这五个字,我想了想,我只能做到前四个。 622 | 逃避是解决不了问题的,不逃你也解决不了啊。 623 | 倘若互不相欠,怎会再次相见。 624 | 谈钱伤感情,谈感情伤钱。 625 | 摊煎饼的大妈说,她月入三万,不差你一个鸡蛋。 626 | 贪图小利,难成大事,要贪就贪大的。 627 | 他喜欢你素颜,必须是素颜好看。 628 | 他们笑我长的丑,我笑他们讲的对。 629 | 他们说网络很假,我笑了,好像现实很真一样。 630 | 所有的故事都会有结局,只有生活跟你没完。 631 | 所谓婚姻,就是两个家庭的,资产重组。 632 | 所谓复习就是,把不会的东西再确认一遍,你确实不会。 633 | 岁月是把杀猪刀可他拿丑的人一点办法都没有 634 | 岁月是把杀猪刀,可是他拿丑的人,一点办法都没有。 635 | 岁月让我知道,除了快递,我谁都不必等。 636 | 随风奔跑自由是方向,无奈忘了腿短没力量。 637 | 虽然我长得丑,但是买了漂亮衣服,我就可以丑的漂亮。 638 | 虽然你长的丑,但是你想得美啊。 639 | 虽然你长得矮,但你发际线高啊。 640 | 虽然你已无法再长高了,但是你可以继续长胖啊。 641 | 虽然你学的慢,但是你,放弃的快呀。 642 | 虽然你单身,但是你胖若两人。 643 | 虽然你搬砖的样子很累,但是,你充钱的样子真的很帅。 644 | 虽然脑子和肠子长得很像,但你也不能老是用来装屎啊! 645 | 俗话说人无远虑,必定很有钱。 646 | 俗话说祸不单行,可见连祸都是有伴儿的,你再看看你。 647 | 送你喜欢的女生一支口红吧,至少她亲别人的时候,有你的参与感。 648 | 思想给了我们太多的自由,而我们拖累了思想! 649 | 说好我们一起到白头,你却偷偷焗了油。 650 | 说错话不要紧,你还会继续说错的。 651 | 顺其自然只是无能为力的另一种说法 652 | 睡觉睡到手抽筋,数钱数到自然醒。 653 | 谁说我不会乐器?我退堂鼓打的可好了。 654 | 谁说我不会乐器,我打退堂鼓可好了! 655 | 谁说你没有真爱,烦恼与你同在。 656 | 谁说你没有毅力的,单身这件事,你不就坚持了好几十年吗? 657 | 谁说你不爱运动?你不仅会踢皮球,而且踢的可好了。 658 | 谁说金钱买不到时间,网管再续两个小时。 659 | 双十一过后,我从一个光棍,变成了一个负债累累的光棍。 660 | 熟练地运用,关我屁事和关你屁事,可以节省人生80%的时间。 661 | 书山有路勤为径,怪你没有富贵命。 662 | 瘦的人能把衣服穿出故事,胖的人只能穿成事故。 663 | 手机摔了这么多次都没事,想想还是我的身高救了它。 664 | 手机的寿命是人类的1/20,请放下身边的杂事,好好陪陪它! 665 | 是金子总会发光,但你只是块肥肉。 666 | 是好久不见,还是,视而不见。 667 | 试着去了解那些你讨厌的人,你会发现,真是越看越讨厌。 668 | 事情多不可怕,可怕的是你没能力解决。 669 | 世上只有骗子是真心的,因为他是真心地在骗你。 670 | 世上无难事只怕有钱人,物以类聚人以穷分。 671 | 世上无难事,只要肯放弃! 672 | 世上什么事逼急了,都能做出来,除了数学题。 673 | 世上没有钱解决不了的事,如果有,那就是你的钱不够。 674 | 世上会有很多出人意料的事,比如,你以为我会举个例子。 675 | 世上99%的事情,都能用钱解决,剩下的1%则需要更多的钱。 676 | 世人笑我太疯癫,我笑世人这么快就看出来了。 677 | 世界这么大,我想去看看,看看有没有塑料瓶。 678 | 世界这么大 我想去看看。钱包那么小 你能走多远? 679 | 世界上最宽广的是海洋,比海洋更宽广的是天空,比天空更宽广的是考试范围。 680 | 世界上最动听的话,不是我爱你,而是你的肿瘤是良性的! 681 | 世界上有两种人最傻B,一种是你这样的,另一种是像你这样的。 682 | 世界上唯一一件公平的事就是我们都会死。 683 | 世界上如果有钱办不到的事情,加钱一定可以办到。 684 | 世界上脑残那么多,你却成了佼佼者。 685 | 世界上没有无缘无故的爱,也没有无缘无故的恨,却TM偏偏有无缘无故的胖! 686 | 世界上本没有路,走的人多了,老师就开始点名了。 687 | 世界那么大,能认识你,我觉得好不幸。 688 | 世界离了你不会不转,只会越转越快,毕竟轻了很多。 689 | 世界很公平,比你忙的人赚的比你多,比你闲的人你赚的比他少。 690 | 世间很多事随着时间流逝,终究会变好的,比如你的胖终会变成好胖。 691 | 时间是最好的老师,但遗憾的是,最后它把所有学生都弄死了。 692 | 时间就像胸,挤挤就有了,躺下就没了。 693 | 时间就是金钱,我在浪费时间?不~我只是在炫富! 694 | 时间会帮你攒够失望,并告诉你不用谢。 695 | 失眠睡不着,可能是因为,你手机还有电。 696 | 失恋之后快打起精神,毕竟,还有下一个渣男在等着你。 697 | 失败也是成功的一部分,在哪里跌倒,就在哪里讹人。 698 | 失败是成功之母,可惜成功六亲不认。 699 | 失败乃成功之母,可是我TM失败的次数太多,都不知道谁是亲妈。 700 | 失败乃成功之母,可失败连男朋友都没有。 701 | 失败乃成功之母,但往往失败都是,不孕不育。 702 | 失败的尽头是绝望,努力的终点是过劳。 703 | 失败不可怕,可怕的是,你还相信这句话。 704 | 失败并不可怕,可怕的是你还相信这句话。\\n 705 | 生平最讨厌溜须拍马的人,和他们在一起,显得老子很不会做人。 706 | 生命中必然要放弃某些人,不是你不在乎,是他们不在乎。 707 | 生活中很多人喜欢小题大作,其实真的没有必要,要想想大题怎么办。 708 | 生活磨光你的棱角,是为了让你,滚的更远。 709 | 生活没有翻不过去的坎,只有翻不完的坎。 710 | 生活就像海绵里的水,只要你不愿意挤,总有一天会蒸发完的。 711 | 生活会让你苦上一阵子,等你适应以后,再让你苦上一辈子。 712 | 生活还是有意思的,毕竟每天都因为不同的原因想死。 713 | 生活费就像大姨妈,一个月来一次,几天就没了。 714 | 生活不止眼前的压力,还有背后的灾难。 715 | 生活不止眼前的苟且,还有一辈子的苟且。 716 | 生活不止眼前的苟且,还有前任的喜帖,所以拉黑很重要。 717 | 生活不是这样就是那样,总之,不会是你想的那样。 718 | 生活不仅有眼前的苟且,还有远方的枸杞。 719 | 生活不会放弃你,但也不会放过你。 720 | 生活,开始对我这种小鸡爪子,放泡椒了! 721 | 什么事情可以让你,放下尊严低声下气?抄作业。 722 | 什么时候,能把我脑子里的钱,提现就好了。 723 | 什么都在涨价,就是人越来越贱。 724 | 身在福中不知福是什么?就是发福快发成猪了,还觉得自己身材蛮OK。 725 | 少小离家老大回,骚话学了一大堆。 726 | 少年加油吧!只要你努力工作,你的老板一定会成功的。 727 | 上帝向人间洒满智慧,唯独你打了把伞。 728 | 上帝为什么给你关上一扇门,还不是因为你见不得人。 729 | 上帝为你关上一扇门的时候还会顺手帮你把窗户也关上。 730 | 上帝为你关上一道门的同时,还会顺带夹你的脑子。 731 | 上帝为你关上了一扇门,然后就去洗洗睡了。 732 | 上帝为你关上了一扇门,还会给它加上防盗锁,大插销。 733 | 上帝不会亏待痴情的人,他都是往死里整。 734 | 傻人有傻福,傻B没有。 735 | 三观没用,你得靠五官! 736 | 三分天注定,七分靠打拼,还有90分看脸。 737 | 三百六十行,行行出BUG。 738 | 若你的朋友每天生活都这么幸福,也就不会拍成照片发到朋友圈了。 739 | 如果再见不用红着脸,是否还能借点钱。 740 | 如果有一天我消失了,即使我的朋友恋人不会找我,银行也会疯狂找我。 741 | 如果有天发现你一夜暴富了,给自己一巴掌,快醒来别上班迟到了。 742 | 如果有钱也是一种错,那我情愿,一错再错。 743 | 如果一个人秒回了你,那只能说明,他刚好在玩手机。 744 | 如果我有什么,让你不喜欢的地方,麻烦你自己克服一下。 745 | 如果我的人生是一部电影,那你就是一个弹出来的广告。 746 | 如果时间可以倒流,那一定是,你在做梦。 747 | 如果生活欺骗了你,不要着急 — 拿出美颜相机,去欺骗生活。 748 | 如果人生是一部电影,那你就是,中间弹出来的广告。 749 | 如果全世界都不要你了,你要记得还有我,我也不要你。 750 | 如果全世界都不要你了,记得要来找我,我认识好几个人贩子。 751 | 如果你真的想要做好一件事,全世界都会为你挡路。 752 | 如果你愿意,一层一层一层地剥开我的心,你会发现我缺心眼。 753 | 如果你有什么事,一定要告诉我,反正我也解决不了。 754 | 如果你喜欢一个女孩,就好好努力多挣钱,到时候多随点份子钱。 755 | 如果你特别迷恋一个人,那么你一定配不上他! 756 | 如果你容不下我,说明不是你的心胸太狭窄,就是我的人格太伟大。 757 | 如果你去抢银行,不论成功还是失败,未来十年内你都不用再上班。 758 | 如果你面前有一大笔钱,和一个万人迷,那么这和你有什么关系呢? 759 | 如果你觉得每天都忙成狗,那一定是你的错觉。狗一定没你忙。 760 | 如果你觉得,围着你的都是苍蝇,那可能你自己是坨屎。 761 | 如果你花钱都不开心,那么是你花钱方式不对。 762 | 如果你还在坚持,说明你还不够绝望。 763 | 如果你放弃了今天的自己,你就战胜了明天的你。 764 | 如果你跌倒了,那就,找个舒服的姿势趴着吧。 765 | 如果你的前半生过得很坎坷,也不必太担心,下半生你就会适应的。 766 | 如果你的男朋友对你百依百顺,从不拈花惹草。可能是因为他钱不够。 767 | 如果你吃了亏,千万不要喝水,不然你会变污的。 768 | 如果你不珍惜我,那么过了这个村,我在下一个村等你。 769 | 如果你变成了备胎,请忘记你也是千斤顶。 770 | 如果婚姻是爱情的坟墓,一年一次的结婚周年庆祝,便是在扫墓 了。 771 | 如果过年你看到我脸色不好,别想太多,就是你忘给红包了。 772 | 如果多年以后你未嫁我未娶,那么咱俩,也真够完犊子的了。 773 | 如果吃鱼可以补脑,你这智商,至少要吃一条鲸鱼。 774 | 如果吃亏是福的话,那我可能早就福如东海了。 775 | 如果不能一夜暴富,两夜也可以,三晚我也不嫌多。 776 | 如果不能美得惊人,那就丑得销魂吧! 777 | 任何时候都要记得微笑,这会让你看起来,像个不能随便惹的神经病。 778 | 认识陌生人其实很麻烦,许多谎话又得重新说起。 779 | 忍无可忍,就重新再忍。 780 | 人总有一死,不是穷死就是心死。 781 | 人终有一死,或轻于鸿毛,或重于鸿毛。 782 | 人一辈子都在寻找成功,但更多时候,找到的都是成功他妈! 783 | 人要是决定自暴自弃了,就会活得特别开心。 784 | 人要是行,干一行行一行一行行行行行,行行行干哪行都行。 785 | 人心不足蛇吞象,没有实力别硬上! 786 | 人为什么叫人类,因为人活着就是累。 787 | 人生最大的耻辱是什么,考试作弊了还不及格。 788 | 人生有两大悲剧,一个是得不到想要的东西,另一个是得到不想要的东西。 789 | 人生如梦我失眠,人生如戏我穿帮,人生如歌我跑调。 790 | 人生没有过不去的坎,只有一坎接一坎。 791 | 人生没有过不去的坎,过不去,只是因为你腿短。 792 | 人生嘛,就是起起落落落落落落。到底了自然就会蹦跶两下。 793 | 人生苦短,我又他妈懒 794 | 人生就像一个茶几,上面摆满了杯具。 795 | 人生就像打电话,不是你先挂就是我先挂。 796 | 人生就是六个大字,怎么着都不行。 797 | 人生和骑自行车不同,就算走下坡路,也不会轻松。 798 | 人生第一次说谎,大多数都是,从写作文开始。 799 | 人生的痛苦,不是因为没钱而痛苦,而是因为别人有钱你痛苦。 800 | 人生不如意之事十有八九,剩下的十之一二,超级不如意 801 | 人生不如意十有八九,从来没碰见过一二。 802 | 人生不如意何止八九,可与人言者何至二三。 803 | 人生不如意的事十有八九,剩下的一二更加不如意! 804 | 人如果没有梦想,那跟无忧无虑有什么分别? 805 | 人人都想上天堂,却没有人想死。 806 | 人们常说,不要让青春留白,所以我把它抹黑了! 807 | 人家谈恋爱,靠长相靠浪漫靠烧钱,而你靠对方眼瞎。 808 | 人家呢只是胖着玩玩,而你是丑的认真。 809 | 人家不是无趣,而是,懒得对你有趣。 810 | 人和猪的区别就是,猪一直是猪,而人有时却不是人。 811 | 人还是要有梦想的,即使是咸鱼,也要做最咸的那一条。 812 | 人还是要有梦想的,即使是咸鱼, 也要做最咸的那一条。 813 | 人都需要努力的,努力过后你就会发现,你还真的是很普通。 814 | 人的一生,三分天注定七分靠打拼,剩下的九十分靠父母。 815 | 人丑就要多健身,这样就能在别人说你丑时,你可以揍他。 816 | 人丑就要多读书,这样以后,才能有钱整容。 817 | 人丑就要多读书,书并不能使你变得好看,却能让你更容易接受现实。 818 | 人丑就要多读书,反正,其他什么事也与你无关。 819 | 人不能低下高贵的头,但捡钱时例外。 820 | 让刻苦成为习惯,用汗水浇灌未来,然后脱水而死。 821 | 群发的祝福和个位数的红包,都是没有灵魂的。 822 | 去年定了一个目标存款三万,今年掐指一算,还差五万。 823 | 去看精神科时医生说,你没啥抑郁症,你是真的惨。 824 | 秋天是收获的季节。别人的收获是成功与快乐,你的收获是认识到并不是每个人都会成功与快乐。 825 | 窮一點不要緊,要緊的是不只一點。 826 | 穷只是暂时的,只要你努力,你会发现你慢慢就习惯了。 827 | 穷你就努力啊!不努力折腾,你怎么负债百万。 828 | 穷不要紧,抬头挺胸让大家看看,你不仅穷还丑还矮。 829 | 穷不可怕,可怕的是,最穷的人是我。 830 | 穷,不是一种状态,而是一种常态。 831 | 请珍惜那些伤害过你的人,毕竟其他人都懒得害你。 832 | 请珍惜对你好的人,否则错过了就不知道何时,才能再遇到另一个瞎了眼的。 833 | 请相信我,我所说的每句话,都是废话! 834 | 请问在三伏天,有什么消暑良方吗?薪尽自然凉。 835 | 请不要叫我宅女,请叫我居里夫人。 836 | 情商最低的一句话,你踢我干啥? 837 | 情人节不出意外的话,一个人过,出意外的话在医院过。 838 | 清明节,应该回你的学校扫扫墓,因为那里埋葬了你的青春。 839 | 悄悄地我吃了,正如我悄悄地胖。 840 | 强扭的瓜甜不甜不重要,只要能解渴就行了。 841 | 强扭的瓜不甜,但是解渴啊! 842 | 钱虽然难赚,但是容易花啊。 843 | 钱买不来快乐,那一定是,你的钱太少了! 844 | 钱买不来爱情,但是可以买走爱情。 845 | 钱对你真的就那么重要吗?讲了3个多小时了,一分钱都不降。 846 | 钱不是万能的,但有钱真的可以为所欲为。 847 | 钱包里放老婆的照片,是为了提醒自己记住,钱包里的钱是怎么没的。 848 | 前世五百次的回眸,却换来今世的一句,流氓。 849 | 千万别把事情拖到明天,后天大后天都是好日子啊。 850 | 掐指一算,你俩要散。 851 | 骑电动车请戴好头盔,否则,开奔驰的同学会认出你。 852 | 骑白马的不一定是王子,也可能会是是唐僧! 853 | 其实人生,在某个节点后就结束了,大家只是在等彩蛋。 854 | 其实你也有超能力,怎么减都不瘦的能力。 855 | 其实你也不是一无是处,至少在夏天,你还能喂蚊子。 856 | 其实你讨厌的并不是广场舞,而是广场舞大妈。 857 | 其实你不丑,只是,你美得不明显。 858 | 其实命运,真不是喜欢和你开玩笑,它是很认真的想弄死你。 859 | 其实表白未必是件好事,因为那样显得手黑。 860 | 其实,电脑游戏从小就训练你,把Boss当作自己最大的敌人。 861 | 破罐子不能破摔,得使劲摔! 862 | 平时骂你就算了,非要等我打你,才知道我文武双全。 863 | 贫穷限制了我那么多,为什么没有限制我的体重? 864 | 贫贱不能移的意思就是,穷就好好在家呆着,哪儿也别去。 865 | 朋友说借二十块钱回头给你,借完钱之后我才知道,有些人一转身就是一辈子。 866 | 胖子是不会饿死的,饿死了也是死胖子 。 867 | 怕鬼真的太幼稚了,我带你看看人心。 868 | 偶尔还是要出去走一走,才知道躺床上多么舒服。 869 | 女为悦己者容,男为悦己者穷! 870 | 女生之间的友谊啊,就像塑料花,虽然假但永不凋零。 871 | 女生何必勾心斗角互相攀比,反正几十年后,都要一起跳广场舞的。 872 | 女人用丝袜征服了男人,男人用丝袜征服了银行。 873 | 女票突然变瘦了,多半是漏气了。 874 | 努力了这么久,但凡有点儿天赋,也该有些成功的迹象了。 875 | 努力加油,每一个困难,都会克服我。 876 | 努力过失败过,没关系,重新努力会失败得更好。 877 | 宁愿不说话看起来像个傻子,也不要,开口证明自己的确如此。 878 | 宁可美的千篇一律 ,也不要丑的各有千秋。 879 | 念念不忘,可有回响? 880 | 年轻时我以为钱就是一切,现在老了才知道,确实如此。 881 | 年轻人嘛,现在没钱算什么,以后没钱的日子还多着呢。 882 | 年轻人不要老想着走捷径,父母强才是硬道理。 883 | 年龄不是问题,身高不是距离,没钱谁喜欢你? 884 | 你坐过最挤的公交车是什么?只是路过,却被挤上了车。 885 | 你最想从母校带走的是什么?最想从母校带走的,是我的学费。 886 | 你走了真好。不然总担心你要留下来吃饭 887 | 你走了真好,不然我总当心,你会留下来吃饭。\\n\\n 888 | 你知道投资和投机的区别吗?一个是普通话,一个是广东话。 889 | 你只要不抬杠,钱真的是万能的。 890 | 你只需看着别人精彩,老天对你另有安排。 891 | 你这么擅长安慰他人,一定度过了许多,自己安慰自己的日子吧。 892 | 你这两天早点回家,最近偷猪的多,我怕你出事。 893 | 你长得很有创意,活得很有勇气。 894 | 你怎么长得跟个二维码似的,不扫一下,都不知道你是什么东西! 895 | 你在我心里,就像天上的星星,多一颗少一颗都无所谓。 896 | 你愿意做我的太阳吗?那么请与我,保持92955886公里。 897 | 你有什么擅长的运动吗?「逃避现实」。 898 | 你永远不会知道,你的哪个好友,会成为下一个微商。 899 | 你以为自己什么也做不好?你错了,你还可以做好一个废物。 900 | 你以为有钱人很快乐吗?他们的快乐,你根本想象不到。 901 | 你以为向生活低头就好了?生活是想让你跪下。 902 | 你以为他给你点赞,是喜欢你?只是手滑罢了。 903 | 你以为你是一只虫子,能化茧成蝶,其实你只是一只蛆。 904 | 你以为你是灰姑娘吗?拜托别做梦了,她可是伯爵的女儿。 905 | 你以为男朋友是取款机,结果是十台机器,有九台半是存款机。 906 | 你以为浪子回头金不换,其实浪子可能只是,上岸缓一缓。 907 | 你以为今天是最糟的一天么,明天会让你改变这个看法的。 908 | 你一无是处,但有件事做得特别好,就是做白日梦。 909 | 你一定要笑,不然不会知道,自己有多少鱼尾纹。 910 | 你要站在别人角度上去思考,总有一天你会发现,你丢失了自己。 911 | 你要相信明天,一定会更好的,更好的把你虐成狗。 912 | 你要是喜欢一个女生,就好好学习找个好工作努力挣好多好多钱,等她结婚的时候你多出点份子钱 913 | 你要是和自拍长得一样,怎么会没有男朋友。 914 | 你要是过得好,我怎么能睡得着。 915 | 你要努力的去生活,因为你只有努力了,才知道自己真的不行。 916 | 你要么非常努力,要么非常聪明,才能勉强过上平庸的生活。 917 | 你想有钱?想想就可以了。 918 | 你想瘦成一道闪电么,闪电平均宽度是五米。 919 | 你现在所拥有的,都不曾是你的,因为未来你都会失去。 920 | 你现在的生活,也许不是你想要的,但绝对是你自找的。 921 | 你喜欢我哪一点啊?我喜欢你离我远一点。 922 | 你无法用钱买来幸福,因为你根本没钱。 923 | 你无法叫醒一个,不回你消息的人,但是红包能。 924 | 你踢球受过最重的伤,是女友到球场给对手喂水! 925 | 你所有的忧伤,都来自于你的余额。 926 | 你虽然没有出过国,但是你每天都在倒时差。 927 | 你说自己很丑,我觉得你不仅丑,还净说实话。 928 | 你说冰是睡着的水,我只记得屁是屎的叹息。 929 | 你是最棒的!不,是最胖的! 930 | 你是转角遇到爱,可你想过对方吗?他是转角遇到鬼呀。 931 | 你是我的小苹果,哎呀讨厌!我是说我TM真想削你。 932 | 你是谁不重要,重要的是,你闯进我生活想干啥? 933 | 你是个做事认真的人,认认真真地帮别人,试了所有的错。 934 | 你若不离不弃,我特么必死无疑。 935 | 你若帮了一急需用钱的朋友,他一定会记得你,在他下次急需用钱的时候。 936 | 你若安好,那还得了~ 937 | 你认真的样子,就像天桥上贴膜的。 938 | 你人人称道的美丽,里面都有PS的痕迹。 939 | 你全力做到的最好,还不如别人随便搞搞。 940 | 你前世一定是塑料袋,除了会装还是会装。 941 | 你努力找他说话的样子,像极了商场里的导购。 942 | 你能接受恋爱年龄差多大?只要长得好看,上下五千年都行。 943 | 你们之所以喝鸡汤,是因为肉呢被别人吃光了。 944 | 你们的对象叫你们什么?我的对象叫我滚. 945 | 你妹是个好姑娘,替你妈分担了很多。 946 | 你每天都很困,因为你被生活所困。 947 | 你俩看起来真般配,月老的垃圾分类,做的还挺到位。 948 | 你连自己都睡不好,还想去睡别人? 949 | 你连世界都没观过,哪来的世界观? 950 | 你老是这么抠门,门都被你,抠坏了好几扇。 951 | 你可以像只猪一样懒,却无法像只猪一样,懒得心安理得。 952 | 你就一甘蔗男,刚开始可甜了,到后面全成渣。 953 | 你就像我的阳光,看着就刺眼。 954 | 你就像是蓝天上的太阳,让人无法直视。 955 | 你就算失败了99次,也要再努力一次,凑个整数。 956 | 你就是个土豆丝,又土又逗,又屌丝。 957 | 你就是个黄焖鸡,又黄又闷又垃圾。 958 | 你就两点不行,这也不行,那也不行。 959 | 你敬人一寸,他将得寸进尺。 960 | 你觉得很孤独,没关系,你还有手机。 961 | 你家住海边吗?这么浪。 962 | 你获得了很多金钱,但同时也失去了很多东西,比如烦恼。 963 | 你和学霸的区别就是,你所有的灵光一闪,都是他的基本题型。 964 | 你害怕穿的不好看被嘲笑?别担心,穿的好看也一样。 965 | 你还是别把我放在心里了,我不喜欢人多的地方。 966 | 你还不算惨,惨的人,都没手机用。 967 | 你过的好不好别人不知道,别人只能看到矮胖穷。 968 | 你过得好我替你高兴,你过得不好,我替全世界高兴。 969 | 你给小草一点爱,小草还你一片绿! 970 | 你复杂的五官,掩饰不了,你朴素的智商。 971 | 你多努力一点,获得的打击就多一点。 972 | 你的意中人是个盖世英雄,他每天会骑着七彩祥云,去网吧吃鸡。 973 | 你的眼界,不止局限于你的生活环境,还局限于你的视力范围。 974 | 你的戏,可以像你的钱一样,少一点吗? 975 | 你的晚安,只是想让我闭嘴。 976 | 你的人生跟你的发际线一样,后退的特别快。 977 | 你的美别人看不到,你的丑一目了然。 978 | 你的脸,犹如你的人生,一样坎坷。 979 | 你的脸,一分天注定,九分看滤镜。 980 | 你的计划,就像零食,吃到肚子里之后就是个屁。 981 | 你的臭脚被毒蛇咬了,抢救了6个小时,毒蛇终于救了过来。 982 | 你的爸爸必须十分努力,才能让你看起来毫不费力。 983 | 你得好好努力,才能配得上,被人利用。 984 | 你倒下了,能顶替你的人千千万 985 | 你打起精神,3分钟就能做完的事情,打起精神就要花上3小时。 986 | 你从来就没成功过,还怕什么失败? 987 | 你从来不孤独,因为,孤独都不想跟你交朋友。 988 | 你曾是我的太阳,是我的整个世界,现在想想也就是个球。 989 | 你不是走在牛B的道路上,而是仍在,装逼的道路上溜达。 990 | 你不是一无所有,你还有病! 991 | 你不是选择困难症,你只是穷。 992 | 你不能总看那些你没有的,多看看你拥有的。算了你把眼睛闭上吧。 993 | 你不能因为你胖,就忽略了你的丑。 994 | 你不奋斗一下?怎么知道自己有多无能。 995 | 你不懂得安排自己的人生,会有很多人帮你安排,他们需要你做的事。 996 | 你并没那么缺少安全感,因为没钱是最安全的。 997 | 你并非什么事情都不做准备,起码你已经,准备好了要失败的嘛。 998 | 你并不是一无所有,你还有病。 999 | 你并不是无能,你只是没有选择的权力。 1000 | 你别看我平时对你,一副漠不关心的样子,其实背地里说了你很多坏话。 1001 | 你必须敢爱敢恨,才会发现你的爱恨,别人真的不在乎。 1002 | 你抱什么不好,非要抱病在床! 1003 | 你把所有不一定,都变成了一定不。 1004 | 你把钱借给了你的朋友,那么他一定会记得你,在他下一次缺钱时。 1005 | 你爱不爱你的工作,工作都会在那等你,不离不弃。 1006 | 能用钱解决的都不是问题,但如何有钱,才是你最大的问题。 1007 | 能从上到下摸遍你全身的,也就只有,车站安检员了。 1008 | 能不生气就不要生气,能不骂人就不要骂人,能动手就直接动手。 1009 | 能不能对我真心一点?当然可以!我是真心不喜欢你。 1010 | 闹钟的作用对我来说,就是让我,换个姿势睡觉。 1011 | 腦子有病得治,像你多好,沒有腦子。 1012 | 脑子是个很棒的东西,希望你有。 1013 | 难受的时候摸摸自己的胸,告诉自己是汉子,要坚强。 1014 | 男人单身叫单身狗,女的单身叫狗不理。 1015 | 男女之间一定有纯友谊,每一个我认识的女生,都说最多只能跟我当朋友。 1016 | 那些人人羡慕的社会精英,其实过得不如你想象那样好。但肯定比你强得多的多。 1017 | 哪有什么直男,只要你够好看,都能变成弯的。 1018 | 哪有什么优柔寡断,还不是因为怂。 1019 | 哪有什么来日方长,挥手便是人走茶凉。 1020 | 哪有什么感同身受的心,全是站着说话不腰疼的嘴。 1021 | 目前最靠谱的发财方法,就是,你家拆迁了。 1022 | 命只有一条,但要命的事,可不止一件。 1023 | 明天就要见对方家长了,好忐忑啊,毕竟是我先打的他们家小孩。 1024 | 明日复明日 明日何其多!既然这么多,不妨再拖拖。 1025 | 明明可以靠脸吃饭,你却靠才华,这就是你跟明明的差距。 1026 | 面试的时候,他们叫你去聊聊,真的只是去聊聊。 1027 | 面对困难,再坚持一会儿,就会习惯的。 1028 | 梦想还是要有的,万一下辈子实现了呢? 1029 | 梦想还是要有的,万一见鬼了呢? 1030 | 梦想还是要有的,不然哪天喝多了,你跟人聊啥? 1031 | 猛的一看你不怎么样,仔细一看,还不如猛的一看。 1032 | 妹妹你坐船头,哥哥我在岸上走。看这句的99%都是唱出来的。 1033 | 美貌会消逝,但蠢是永恒的~ 1034 | 每一个抖腿的人,心里都有一台缝纫机。 1035 | 每天叫醒我的不是理想,是楼下广场舞的音乐。 1036 | 每天对着镜子说一句你很棒,不久后,那镜子就会成为很棒的镜子。 1037 | 每天都在勤勤恳恳地,思考一个问题,如何才能不劳而获? 1038 | 每天都要有新的期待,这样才能有新的失望。 1039 | 每个女人都在寻找一个爷们,最后发现,最爷们的原来是自己。 1040 | 每当我找到成功的钥匙,就发现有人把锁芯给换了… 1041 | 每当我勇敢地走出一步,上帝就会及时慷慨地为我,铺好下一步下坡路。 1042 | 每次想省钱的时候,就是你智商到达顶峰之时! 1043 | 每次临时抱佛脚的时候,佛总是给我一脚。 1044 | 每次看穷游日志的感受都是,那么穷就别TM出去浪了。 1045 | 每次看你穿丝袜的时候,我都有一种无法言喻的感觉,那就是萝卜还包保鲜膜咧。 1046 | 每次花钱都说钱包在滴血,可殊不知你的钱包,已经失血过多而死了。 1047 | 没有什么永垂不朽,但你可以。 1048 | 没有什么可以将你打败,因为你从未成功过。 1049 | 没有人瞧不起你,因为根本就没有人瞧你。 1050 | 没有人能够让你放弃梦想,你自己试试,就会放弃了。 1051 | 没有人关心你飞得多高,倒是有一群人,等着看你摔得多惨。 1052 | 没有钱的时候,听到别人说恭祝长命百岁,都觉得是一种诅咒。 1053 | 没有你想不到,只有你做不到…… 1054 | 没有看不到的消息,只有不想回的人。 1055 | 没有解决不了的问题,但是有解决不完的问题。 1056 | 没有,过不去的坎,只有过不完的坎。 1057 | 没人牵手,我就揣兜。 1058 | 没人嘲笑你的梦想,他们只是,嘲笑你的实力。 1059 | 没钱用的时候跟我说,让我知道不止我一个人,没钱用。 1060 | 没钱了来找我,让我告诉你没钱的日子,怎么过。 1061 | 没钱才上班还是上班才没钱,我不明白哪个环节出了问题,难道有中间商赚差价? 1062 | 没对象怕什么,我有对象,我下棋也没赢过啊。 1063 | 没吃饱只有一种烦恼,吃饱了有无数的烦恼。 1064 | 买房的钱还没攒完,就要开始攒买坟的钱了。 1065 | 马云成功跟长相没关系,姜尚成功跟年龄没关系,而成功跟你没关系。 1066 | 马不停的是蹄,你不停的是嘴。 1067 | 路遥知马力不足,日久见人心叵测。 1068 | 路漫漫其修远兮,吾将上下而求人。 1069 | 领导说努力工作会更快成熟,所以,我现在看上去比他们都老。 1070 | 领导开会的时候,我们应该保持肃静,打扰别人睡觉是很不礼貌的。 1071 | 两个人吵架,打他是解决不了问题的,但是解气啊。 1072 | 恋爱时会觉得像吸毒一样,分手了又会像戒毒一样。 1073 | 离远一看长发飘飘,走近一看虎背熊腰,转身一看卧槽黑山老妖。 1074 | 离家不需要太大的勇气,回家才需要。 1075 | 老一辈的人常告诉我们,年轻的时候多吃点苦,这样老了才能习惯啊! 1076 | 老天是公平的,他给了你张丑脸,肯定还会给你个穷家。 1077 | 老师不用给我换座位,反正我坐哪,都聊得开。 1078 | 老婆饼里没有老婆,棉花糖里没有棉花,所以钱包里也没有钱。 1079 | 老板用你的时候你就是人才,不用你的时候就变成裁人! 1080 | 老板说只要我们努力工作,明年他就可以换玛莎拉蒂了。 1081 | 懒又有目标,才是真的惨。 1082 | 懒是一个很好的托辞,说的好像你勤奋了就能干成大事一样。 1083 | 垃圾还有大爷大妈捡走,你呢? 1084 | 困难也许会迟到,但绝不缺席。 1085 | 困难像弹簧,你弱它就强,你强它更强。 1086 | 快去努力吧,以证明自己,智商低。 1087 | 可以做牛,可以做马,但是千万别做乙方。 1088 | 可以不劳而获的,只有年纪和脂肪。 1089 | 可怕的不是,别人在今天忽悠你,而是忘了你这个人。 1090 | 靠父母你是公主,靠男人你是王妃,靠自己你是乞丐。 1091 | 考试最崩溃的是看到一道题,模糊的记得老师讲过,但清晰的记得我没听。 1092 | 考试真是so easy,哪里不会考哪里! 1093 | 看著面善的,不一定是好人,還有可能是詐騙集團。 1094 | 看着溅我一身水远去的大奔,劳资心想等我有钱了,一定买一套雨衣。 1095 | 看时间不是为了起床,而是看还能睡多久。 1096 | 看见一个算命大师,我刚坐下他就问我,你算什么东西? 1097 | 看见别人走在成功的路上,你问问自己难道不想成为,他成功路上的绊脚石吗? 1098 | 看背影迷倒千军万马,转过头吓退百万雄师。 1099 | 开车我最讨厌两种人,一种是喜欢加塞的人,另一种是不让我加塞的人。 1100 | 绝望不在某时某刻,而在每时每刻。 1101 | 距离产生的不是美,而是第三者。 1102 | 据说到2020年,要消灭贫困人口,我还不想死。 1103 | 据分析,造成婚外恋的根本原因,是结婚。 1104 | 就算是咸鱼,你也不是最咸的那条。 1105 | 就算是Believe,中间也藏着一个lie。 1106 | 就算你充电两小时,也不会有人和你通话五分钟。 1107 | 就算大雨颠覆全城,公司照样算你迟到。 1108 | 九年义务教育应该开腹语课,毕竟长大后会有太多话,难以启齿。 1109 | 静若瘫痪,动若癫痫。 1110 | 精神濒临崩溃的症状之一,就是相信自己的工作非常重要。 1111 | 经历过一番苦难之后,别人是苦尽甘来,而你是苦竟刚来。 1112 | 经过十年不断的努力和奋斗,我终于从懵懂无知的少年,变成了懵懂无知的青年。 1113 | 经过九年的打拼,我终于凑齐了,当年卖掉的那套房子的首付。 1114 | 经过多年的打拼,虽然没有什么收获,但你有债呀! 1115 | 经过大家的耐心劝导,我终于接受了,自己是傻逼这个事实。 1116 | 进入长辈朋友圈,了解最新谣言。 1117 | 尽量撮合身边的同学,这样可以,少出一笔份子钱。 1118 | 今晚吃鱼吧,我看你挺会挑刺的。 1119 | 今天天气很好,在房间里宅久了,准备去客厅散散心。 1120 | 今天所有的一切,不过是过眼云烟。从明天开始你会一无是处。 1121 | 今天是除夕夜,来来来,给你夹块你最爱吃的天鹅肉。 1122 | 今年是过去十年最差的一年,好消息是,今年是之后十年最好的一年。 1123 | 浆糊不在办公桌上,在你脑子里。 1124 | 将薪比薪的想了想,算了,不想活了。 1125 | 见到长辈时,不是我们不想叫他,而是压根就不知道叫他什么。 1126 | 減肥是一件大事,先讓我吃飽了,再來好好計畫計畫。 1127 | 减肥这件事情吧,减的快反弹的快,减的慢放弃的快。 1128 | 减肥就是要向妈妈证明,不光胖找不到对象,瘦也找不到! 1129 | 减肥,你想要坚持,但坚持不想要你。 1130 | 间歇性洗心革面,持续性混吃等死。 1131 | 间歇性踌躇满志,持续性混吃等死。 1132 | 假如生活欺骗了你,你就打开美颜相机,欺骗所有的人。 1133 | 假如生活欺骗了你,不要灰心,因为明天也一样 1134 | 假如生活欺骗了你,不要悲伤不要心急,生活还将继续欺骗你。 1135 | 假如生活出卖了你,希望是论斤卖,毕竟你比较肥。 1136 | 假期定了个Plan,半个暑假结束了只完成了P,因为lan。 1137 | 加我回来吧,我给你发我的婚礼请柬。 1138 | 既已背影倾天下,何必转身乱芳华。 1139 | 既没有让人一见钟情的颜,还缺少让人日久生情的钱。 1140 | 机会是留给有准备的人,没机会的人,就别瞎准备了。 1141 | 机会,永远留给,有胸有颜的人。 1142 | 活了这么多年发现,唯一坚持下去的,就是每天给手机充电。 1143 | 活了这么多年,一直搞不明白一件事,拉钩为什么要上吊? 1144 | 混到现在,拿得起放得下的,只有筷子。 1145 | 会有天使替我爱你,那我就去爱别人了。 1146 | 毁灭友情的方式有许多,最彻底的一种是,借钱不还。 1147 | 回首过去,我居然没有,走过一次直路。 1148 | 灰姑娘的鞋若是合脚当初就不会掉,王子若是真的爱灰姑娘就不会连和自己跳了一晚上的舞的女孩都不认识。 1149 | 欢迎来到2019,恭喜你进入了新的,扎心的一年。 1150 | 化再好的妆,也盖不住你,卸妆后的丑。 1151 | 胡思乱想能瘦身的话,我现在可能已经,只剩下灵魂了。 1152 | 很久不开QQ,登录后才发现,原来只有腾讯新闻在乎你。 1153 | 很多时候你不逼自己一把,你都不知道,你还有能把事情搞砸的本事! 1154 | 很多人觉得自己活得太累,实际上,他们可能只是睡得太晚。 1155 | 很多次我都觉得坚持不住了,然后我就放弃了。 1156 | 黑夜给你黑色的眼睛,你却用它来翻白眼。 1157 | 黑夜从来不会亏待晚睡的人,它会赐予你黑眼圈,和即将猝死的身体。 1158 | 和对象吵架,先不要追究吵架原因,要弄明白他胆子怎么肥了。 1159 | 何以解忧,唯有暴富。 1160 | 好运一定会降临,只是会降临在别人头上。 1161 | 好想把房子卖了,去环游世界,可惜房东不同意。 1162 | 好人成佛,需要九九八十一难,坏人只需放下屠刀。 1163 | 好看的锁骨千篇一律,有趣的肚腩弹来弹去。 1164 | 好看的皮囊与你无关,有趣的灵魂你又没有。 1165 | 好看的皮囊现实劈腿,有趣的灵魂精神出轨。 1166 | 好看的皮囊三千一晚,有趣的灵魂要车要房。 1167 | 好看的皮囊千篇一律,有趣的灵魂两百多斤。 1168 | 好看的皮囊你养不起,有趣的灵魂看不上你 1169 | 好好过日子吧,每天都会有新打击。 1170 | 好不容易习惯了自己的长相,理了个发,又换了一种丑法。 1171 | 海底捞的服务是真心好,上次我吃饭没带钱,还是服务员帮我报的警。 1172 | 还想过五四青年节,六一儿童节?属于你的只剩下三八节了。 1173 | 还没有对象?要不要给你介绍,一款不错的狗粮。 1174 | 还没来得及去沾花惹草,就被人拔光了。 1175 | 过年哪个亲戚问我成绩,我就问他年终奖金。 1176 | 过年不吃胖,怎么对得起,死去的鸡鸭鱼猪? 1177 | 过马路不要带耳机,万一要是被车撞上,耳机不就坏了么? 1178 | 国庆去哪看风景最好?答案是,朋友圈。 1179 | 国庆你堵在哪呢? 1180 | 贵不是iPhone的缺陷,穷是你的缺陷。 1181 | 恭喜你又熬过一天,还中奖了,再来一天。 1182 | 工作爱情生活不顺?多照照镜子,很多事情你就明白了。 1183 | 跟最好的朋友好到什么程度?他进传销,发展的第一个下线就是我。 1184 | 跟我比懒,你输定了,因为我都懒得跟你比。 1185 | 跟你谈钱的老板才是好人,跟你谈理想的,都TM不想给你钱! 1186 | 跟丑这个缺点比,穷根本不值得一提。 1187 | 根本没有什么高冷的人,人家暖的不是你而已! 1188 | 给你的梦想插上翅膀,虽然不一定飞得很远,但肯定摔得很重。 1189 | 给你的梦想插上翅膀,你也飞不到哪里去。 1190 | 高考失败不要紧,以后还有更多失败等着你。 1191 | 感谢前行路上击倒我的人,因为,躺着真的好舒服。 1192 | 感情是可以磨合的,前提是,看脸。 1193 | 感觉这辈子,最深情绵长的注视,都给了手机。 1194 | 该失望的事从没辜负过我,每次都认认真真的让我失望。 1195 | 富人的丁克叫丁克,穷人的丁克叫断子绝孙。 1196 | 富豪们都在担心税太多,而你只会觉得睡不够! 1197 | 付出就会有回报,比如一倍的奢望,换两倍的失望。 1198 | 风水轮流转确实不假,但你在轴心上,这就很尴尬了。 1199 | 放心吧,只要你持续走下坡路,就永远不会处在人生最低谷。 1200 | 放心吧 有钱人运气都不会太差的。 1201 | 放下手机出去走走,最后你会发现,还是手机有意思。 1202 | 放弃这个字,说起来简单,做起来就更简单了。 1203 | 放假买个地球仪吧,世界那么大你不但可以看看,还可以转转。 1204 | 凡是不赚钱的,都说自己在创业。 1205 | 发丝千万条 睡眠第一条,熬夜不休息 脱发两行泪。 1206 | 二十年前吃小浣熊,集不齐卡的傻孩子们,依然集不齐五福。 1207 | 俄罗斯方块教会我们:如果你合群,就会消失。 1208 | 俄罗斯方块教会了我们,如果你合群,就会消失。 1209 | 多照照镜子,很多事情你就明白原因了。 1210 | 蹲下来摸摸自己的影子,对不起,跟着我让你受委屈了。 1211 | 对于穷人,生活不累的话,那就不叫生活! 1212 | 对于丑的人来说,细看都是一种残忍。 1213 | 对象抢不过别人就算了,抢购也抢不过别人,这个光棍节你可咋办。 1214 | 对女人强吻表白一般会有两种结果,一种是啪,一种是啪啪啪。这就是屌丝和高富帅的差距。 1215 | 对你竖大拇指的人,不一定是在夸你,也可能是用炮在瞄你。 1216 | 对你别有用心的人,毕竟也是用心了。 1217 | 都说谈恋爱会影响学习,难道学习,就不影响谈恋爱吗? 1218 | 都说钱是王八蛋,可长得真好看。 1219 | 都说男人有钱就变坏,TMD我都当了,三十多年的好人了! 1220 | 都说累成狗,其实狗没你那么累。 1221 | 都说姐漂亮,其实都是妆出来的 1222 | 冬天就是好,穷的时候,还有西北风喝。 1223 | 冬天床以外的地方都是远方,手够不到的地方都是他乡,上个厕所都是出差。 1224 | 等你以后老了走不动了,我每天用轮椅推你去广场上,让你看着我和别的老头跳舞。 1225 | 等到历史考试的时候,历史将会被我改写! 1226 | 到不了的都叫做远方,回不去的名字叫家乡。 1227 | 当幸福来敲门的时候,我怕我不在家,所以一直都很宅。 1228 | 当咸鱼拥有了梦想,它就会成为,一只拥有梦想的咸鱼。 1229 | 当失去工作动力的时候,就看看银行卡余额吧。之后你就会发现:工作根本没卵用。c 1230 | 当生活压得你喘不过气,一定要挺直腰杆,这样被压死时才不难看。 1231 | 当年我背井离乡,乡里人从此再也没有,喝上一口井水。 1232 | 当你知道自己要去哪里的时候,全世界都在为你添堵。 1233 | 当你瘦下来之后,你会发现原来你的丑,跟减肥并没有关系。 1234 | 当你觉得自己不行的时候,就走马路上走走,这样你就是一个行人了。 1235 | 当你觉得又丑又穷的时候,不要悲伤,至少你的判断还是正确的。 1236 | 当你怀疑人生的时候,其实这就是你的人生。 1237 | 当你变得足够优秀的时候,你才发现原来她只是,单纯的不喜欢你。 1238 | 当初有多感天动地,以后就有多万劫不复。 1239 | 当别人和你说忙,是TA要留时间,给更重要的人。 1240 | 单身至今的原因是,熟人不好下手,生人不好开口。 1241 | 单身脱发又没钱,跑步进入中老年。 1242 | 单身没有关系,以后单身的日子,还长着呢。 1243 | 带翅膀的不一定是天使,有可能是雷震子。 1244 | 大学生啊你要知道,学习不一定能收获,但剁手一定能收货。 1245 | 大老远看到我一直盯着你时,不要觉得我对你有意思,我真得看不清你是谁。 1246 | 大家喜欢和你一起,是为了,显示他们的好看。 1247 | 大家都以为我没有朋友,事实上,我还真没有朋友。 1248 | 大家都夸我贤惠,闲的什么都不会。 1249 | 大多数时候,消耗能量的都不是工作,而是工作中遇到的人。 1250 | 打麻将三缺一,斗地主二缺一,我谈个恋爱咋还一缺一? 1251 | 打工钱少就出来创业吧,保证能让你,赔个精光。 1252 | 存款是负的房子是租的,有辆自行车,还是共享的。 1253 | 从小就喜欢自立,比如靠自己本事单的身。 1254 | 从小就被教育不要乱花钱,长大后我才发现,根本没钱怎么乱花? 1255 | 从小到大,唯一不变的,就是一颗不想念书的心。 1256 | 从今天开始,接受来自三大姑八大姨,灵魂的拷问。 1257 | 蠢也没那么可怕,毕竟水母没有脑子,也活了6亿年。 1258 | 蠢萌的前提是萌,不是蠢。 1259 | 春节你要小心了,毕竟过年,都是要杀猪的。 1260 | 春节假期要结束了,该收收心,准备过五一了。 1261 | 春节假期,从跳过早午餐开始。 1262 | 创业嘛就要有个平常心,因为它总是起起落落落落落落的。 1263 | 传统文化丢失严重啊,古代女子个个能呤诗作对,现代女子不行了 只会作对。 1264 | 穿白色衣服上班,并不代表你可以不背黑锅。 1265 | 除了是处,一无是处。 1266 | 出身好的努力是为了成功,而你是为了活下去。 1267 | 出卖自己的灵魂和原则并不丢人,丢人的是没能卖一个好价钱。 1268 | 出卖灵魂并不丢人,丢人的是,没能卖一个好价钱。 1269 | 出来混,迟早是要胖的。 1270 | 丑小鸭能变天鹅,不是因为它多努力,是因为它爸妈本来就是天鹅。 1271 | 吃完苦中苦,我终于成为了人下人。 1272 | 吃土的时候,觉得乞丐都比我幸福。 1273 | 吃货一般都比较善良,因为每天都只想着吃,没有时间去算计别人。 1274 | 吃货的思路是,好吃你就多吃点,不好吃多少也要吃点。 1275 | 吃的苦中苦,才知白辛苦。 1276 | 吃得苦中苦,才知道没有最苦,只有更苦。 1277 | 承诺就像放屁,当时惊天动地,过后苍白无力。 1278 | 成长就是将你哭声调成静音的过程。 1279 | 成年人的世界,除了长胖,其他什么都不容易。 1280 | 成名就像放的一个屁,响了一声还不够,还要臭段时间。 1281 | 成功是可以复制的,而对于你,此处禁止粘贴。 1282 | 成功就像鬼一样,只有别人遇到过。 1283 | 趁着年轻多出来走走,不然你不会知道,呆在家里有多爽。 1284 | 趁好看的时候多照照镜子,毕竟,这种错觉不是每天都有的。 1285 | 车到山前必有雾,船到桥头自然沉。 1286 | 曾梦想仗剑走天涯,因太胖取消原计划。 1287 | 曾经我也是靠脸吃饭的,后来差点饿死了… 1288 | 曾经我想做个特别的人,现在我成功了,我现在特别难过又无助。 1289 | 曾经是梦想家,现在没了梦,只剩下想家。 1290 | 曾经给我泼凉水的人,没关系的,我烧开了还会还给你的。 1291 | 曾经的海枯石烂,抵不过好聚好散。 1292 | 不知道你越过多少峰才成功,反正你逃不过早晚两个高峰。 1293 | 不知道,是别人的爱情来的太容易,还是自己的八字太硬。 1294 | 不用在意别人怎么看你,你在意了,别人也看不上你。 1295 | 不要总是那么自恋,美女多看了你一眼,只是因为你丑得比较独特。 1296 | 不要总对人掏心掏肺,有的人不吃内脏。 1297 | 不要在意现在的低谷,未来还有很长的下坡路要走。 1298 | 不要再抑郁下去了孩子,你要像一个,神经病一样活泼开朗。 1299 | 不要再说自己是一条单身狗,其实,你可能比不上狗… 1300 | 不要再说被骗色了,到你这个年纪来的都是客。 1301 | 不要以为自己坚持不来,你一定会坚持熬夜玩手机。 1302 | 不要以为世界抛弃了你,世界根本没空搭理你 1303 | 不要以为老天在折磨你,而事实上,老天根本就不在意你。 1304 | 不要太在乎别人的目光,因为没人会注意你。 1305 | 不要说别人脑子有病,脑子有病的前提是,必须有个脑子。 1306 | 不要认为你被世界丢弃,只是世界没空搭理你。 1307 | 不要轻易向命运低头,因为,一低头就会看到赘肉。 1308 | 不要轻易看不起谁,就算是杀马特,发量都比你多。 1309 | 不要期待明天,因为明天也不会好过。 1310 | 不要年纪轻轻,就觉得你已经到了低谷,你还有很大的下降空间。 1311 | 不要埋怨现在的经历凄惨,跟未来比,还差的远呢。 1312 | 不要老覺得自己孤單,看看肚子上那圈肥肉,不是從來沒有離開過嘛? 1313 | 不要放弃你的梦,继续睡! 1314 | 不要等明天交不上差,再找借口,今天就要找好。 1315 | 不要担心,一切都是最烂的安排。 1316 | 不要把自己放的太高了,不然你会不下来的。 1317 | 不要把银行卡密码,设成女朋友的生日,不然总要换多麻烦。 1318 | 不笑运气差,一笑脸就大! 1319 | 不想养狗不想养猫,只想养你,毕竟养猪能致富。 1320 | 不想谈恋爱是假的,没人要是真的。 1321 | 不想结婚生子,是我作为穷人的自觉。 1322 | 不为无益之事,何以遣有涯之生? 1323 | 不说没人陪你勇闯天涯,你能找到人陪你喝雪花吗? 1324 | 不是因为看到了希望才坚持,而是因为坚持了,才知道没希望。 1325 | 不是路不平,而是你不行。 1326 | 不是大家拿你开玩笑,而是,你就是玩笑本身! 1327 | 不是吃燕窝的人皮肤好,是吃得起燕窝的人皮肤好。 1328 | 不是别人瞧不起你,只是别人瞧不见你。 1329 | 不能老盯着手机屏幕,要不时地抬起头,看看老板的位置。 1330 | 不明白你们遇到好事,为什么要掐腿揉眼睛,真醒了怎么办? 1331 | 不就是钱嘛,说得谁不缺似的。 1332 | 不经历风雨,怎么迎接暴风雨。 1333 | 不回你消息,不是因为我高冷,而是因为我手冷。 1334 | 不管是白帽子,还是黑帽子,会变绿的都不是好帽子。 1335 | 不当家不知柴米贵,不拍照不知自己肥。 1336 | 不尝试问一次,你怎么知道,你不是爸妈避孕失败的结果? 1337 | 不逼自己一把,你都不知道,什么叫绝望。 1338 | 冰冻三尺非一日之寒,小腹三层非一日之馋。 1339 | 冰冻三尺非一日之寒,掏空钱包却一点不难。 1340 | 别总自称单身狗了,按年龄你是单身鳖,按智商你是单身傻狍子。 1341 | 别总是骂别人猪狗,你过的还不如它们。 1342 | 别再说自己是单身狗了,你这个年纪狗都死了。 1343 | 别以为世界没了你,没什么区别,没了你地球转得更快。 1344 | 别以为你一无所有,至少你还有丑! 1345 | 别一天到晚想着减肥,你的嘴同意你这样想了吗? 1346 | 别问我有啥,先说你要啥,再说你凭啥。 1347 | 别问我失败了怎么办,说得好像你成功过一样。 1348 | 别太自信,你可能信错了人。 1349 | 别太晚睡,熬夜很伤手机的。 1350 | 别说自己是单身狗,狗还可以三妻四妾。 1351 | 别说什么一见钟情,不过就是见色起意。 1352 | 别说你一无所长,熬夜玩手机你可是一把好手。 1353 | 别说你一无所有,你还有一身债。 1354 | 别人一看你就说你是学生,不是因为你看着年轻,而是因为穿的土! 1355 | 别人下班泡妞,你下班泡面。 1356 | 别人问你有谈恋爱吗?只要说现在没有,就能掩盖过去也没有的事实。 1357 | 别人是金子总会发光的,而你,总会花光的。 1358 | 别人努力会成功,你努力会有饭吃。 1359 | 别人没回复,继续等,你会等到她的朋友圈。 1360 | 别人露腿那叫美,你露腿就想让人怼。 1361 | 别人关心你飞得高不高,飞得累不累,而我只关心你翅膀好吃吗? 1362 | 别人复习看书,都是看着看着就看懂了,我是看着看着就看开了。 1363 | 别人都有背景,而我只有背影。 1364 | 别人都用名牌包包,而你,只能用用表情包。 1365 | 别人都说我烂泥扶不上墙,可是我为什么要上墙,躺地上不舒服吗? 1366 | 别人都是为怎么挣钱而发愁,我却是为怎么花钱而发愁,二十块怎么能花到下月十号? 1367 | 别人都散发着恋爱的酸臭味,只有我,散发着单身狗独有的清香。 1368 | 别人的身体里都是才华,你的身体里都是珍珠奶茶。 1369 | 别人的人生有的是故事,而我,有的是事故。 1370 | 别人的钱财,乃我的身外之物。 1371 | 别人的起点,是你遥不可及的终点。 1372 | 别人的女朋友都会生气了,而你的女朋友还在充气。 1373 | 别人存你的号是为了跟你联系,我就不一样,我存你的号就是为了不接 1374 | 别人比你有钱还比你努力,但你更厉害,靠自己的想象就拥有一切。 1375 | 别人扮猪吃老虎,你只能扮猪。 1376 | 别去打扰那些,每次很久都不回你消息的人,删除好友就行。 1377 | 别怕眼睛近视,因为在你的面前,除了失败什么也没有。 1378 | 别埋怨手机没怎么用就没电,你还不是一样,没干啥就累了。 1379 | 别看我挣的少,但是我省的多,昨天法拉利又省下两百多万。 1380 | 别看我平时对你漠不关心,其实背后有说你好多坏话的。 1381 | 别看那些有钱人表面上风光,其实他们私底下更风光。 1382 | 别看别人表面上一帆风顺,实际上他们背地里,也是一帆风顺。 1383 | 别看别人表面上事事如意,其实他们背地里,也顺风顺水。 1384 | 别觉得身边的人都在针对你,仔细想想其实,整个世界的人都在针对你。 1385 | 别减肥了,你丑不仅是因为胖。 1386 | 别灰心,漂亮姑娘和天上星星一样多,只是你看得见摸不着罢了。 1387 | 别慌去接受失败,要慢慢去感受。 1388 | 别和我说对不起,因为我既不能原谅你,也无法捅死你。 1389 | 别动不动说把一切交给时间,时间才懒得收拾你的烂摊子。 1390 | 别低头绿帽会掉,别流泪老王会笑。 1391 | 别低头,双下巴会露。 1392 | 比一个人吃火锅更寂寞的是,一个人,没钱吃火锅。 1393 | 比你优秀的人还在努力,你努力有什么用呢? 1394 | 比尔盖茨休学创业,成为世界首富,可是人家休得是哈佛大学。 1395 | 本以为牵了小姐姐的手,可以得到她,没想到小姐姐是千手观音。 1396 | 饱汉不知饿汉饥,饿汉不知饱汉虚。 1397 | 半夜给你留灯的,只有自动售货机。 1398 | 白雪公主诠释了,七个小屌丝对她再好,也不及高富帅的一个吻。 1399 | 白天嘈杂得不愿意醒,夜晚安静得舍不得睡。 1400 | 把秋衣塞进秋裤,把秋裤塞进棉袜里,是对冬天最起码的尊重。 1401 | 把女孩子弄哭是很没种的事情,把男孩子弄哭是一件叼爆的事啊。 1402 | 熬夜对身体不好,建议通宵。 1403 | 暗恋就是你在心里,为他盖了一座城堡,他却连门都不想进。 1404 | 暗恋的人没有,想暗杀的倒有一堆。 1405 | 安慰别人的时候一套一套的,安慰自己的时候,只想找根绳子一套。 1406 | 爱真的需要勇气,来接受,一次次的没人爱。 1407 | 爱一个人一定要告诉她,那样你才会知道,她有多讨厌你。 1408 | 爱笑的女孩运气不会太差,但是运气差的女孩,还能笑得出来吗? 1409 | 爱笑的姑娘,总是比别人,长更多的鱼尾纹。 1410 | 爱是一道光,绿到你发慌。 1411 | 爱情是把双刃剑,一边把你割得很疼,另一边也把你割得很疼。 1412 | 爱你不是两三天,而是,一天都没有爱过 1413 | 爱迪生千百次寻觅灯丝,就是为让你,当上耐用的电灯泡。 1414 | 矮是什么感觉?明明想瞪人的,硬生生成了卖萌。 1415 | Follow your heart,翻译成中文就一个字,怂。 1416 | 56个民族,55个加分。 1417 | 38岁以前我穷,但是以后,我会习惯的! 1418 | 2019年第一天,说出你的新年愿望,那就一定不会实现。 1419 | 2018年,88喽。 1420 | 18岁什么化妆品都不用,28岁什么化妆品都没用。 1421 | 你妹是个好姑娘,替你妈分担了很多。 1422 | 你以为有钱人很快乐吗?他们的快乐你根本想象不到! 1423 | 时间真的能改变一个人,比如你以前丑,现在更丑。 1424 | 条条大路通罗马,而有些人就住在罗马。 1425 | 你只看到别人在表面上活得春风得意,却不知道人家在背后也过得也风生水起。 1426 | 人生就像一杯水,孤独,孤独,孤独,一辈子就完了。 1427 | 别灰心, 人生就是这样起起落落落落落落落落落落落的。 1428 | 长得丑就是病,不然为什么整形医院叫医院。 1429 | 熟练的用运“关我屁事”“关你屁事”,可以节省80%的时间。 1430 | 别人骂你你要听,别人夸你你别信。 1431 | 千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。 1432 | 不要把别人想的太坏,也不要把别人想的太好,都是凡人。 1433 | 漂亮的女人像是放在展柜里的工艺品,欣赏的人很多,但买下的人只能一个人。 1434 | 童话里的灰姑娘虽然穷,但都很漂亮,你漂亮吗? 1435 | 不爱你的人,比你想象中的还不爱你。 1436 | 失败是成功之母,可惜成功六亲不认。 1437 | 丑小鸭能变成白天鹅,不是因为它有多努力,而是它的父母都是白天鹅! 1438 | 你全心全意的付出,还不如别人的随便搞搞! -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poke_reply/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.2.2" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poke_reply/__main__.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | import aiofiles 4 | from nonebot import on_notice 5 | from nonebot.adapters.onebot.v11 import Event, MessageSegment, PokeNotifyEvent 6 | from nonebot.matcher import Matcher 7 | from nonebot.rule import to_me 8 | 9 | from .config import config as conf 10 | 11 | 12 | async def read_file(file_name): 13 | async with aiofiles.open(file_name, "rb") as f: 14 | ret = await f.read() 15 | return ret 16 | 17 | 18 | async def get_msg(): 19 | reply = random.choice(conf) 20 | msg = None 21 | if reply.type == "image": 22 | msg = MessageSegment.image(await read_file(reply.content)) 23 | elif reply.type == "text": 24 | msg = reply.content 25 | return msg, reply.action 26 | 27 | 28 | @on_notice(rule=to_me()).handle() 29 | async def _(event: Event, matcher: Matcher, _: PokeNotifyEvent): 30 | reply, action = await get_msg() 31 | if reply: 32 | await matcher.send(reply) 33 | if action: 34 | await matcher.send(MessageSegment("poke", {"qq": event.user_id})) 35 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/poke_reply/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import os 3 | from typing import Literal, Optional 4 | 5 | from nonebot import logger 6 | from pydantic import BaseModel 7 | 8 | from .._config import BaseConfig, init 9 | 10 | config = None 11 | 12 | 13 | class Config(BaseConfig): 14 | async def get(self): 15 | if not self._tmp: 16 | tmp = await super(Config, self).get() 17 | for i in tmp.copy(): 18 | if i.type == "image_folder": 19 | tmp.remove(i) 20 | for n in find_all_file(i.content): 21 | tmp.append( 22 | ConfigModel(type="image", content=n, action=i.action) 23 | ) 24 | elif i.type == "texts": 25 | tmp.remove(i) 26 | for n in i.content: 27 | tmp.append(ConfigModel(type="text", content=n, action=i.action)) 28 | logger.debug(f"Parsed config: {tmp}") 29 | self._tmp = tmp 30 | return self._tmp 31 | 32 | 33 | class ConfigModel(BaseModel): 34 | type: Literal["text", "image", "texts", "image_folder"] 35 | content: str | list[str] 36 | action: Optional[bool] 37 | 38 | 39 | def find_all_file(base): 40 | li = [] 41 | for root, ds, fs in os.walk(base): 42 | for f in fs: 43 | fullname = os.path.join(root, f) 44 | li.append(fullname) 45 | return li 46 | 47 | 48 | async def update_conf(): 49 | global config 50 | config = await init("poke_replies", ConfigModel, [], cls=Config) 51 | 52 | 53 | asyncio.run(update_conf()) 54 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/req_to_group/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/req_to_group/__main__.py: -------------------------------------------------------------------------------- 1 | import random 2 | import string 3 | 4 | from nonebot import logger, on_command, on_request 5 | from nonebot.adapters.onebot.v11 import ( 6 | ActionFailed, 7 | Bot, 8 | GroupMessageEvent, 9 | GroupRequestEvent, 10 | Message, 11 | MessageSegment, 12 | ) 13 | from nonebot.matcher import Matcher 14 | from nonebot.params import CommandArg 15 | 16 | fwd_group_id = 1105946125 17 | tmp = {} 18 | 19 | 20 | def get_random_str(length: int = 6): 21 | return "".join(random.sample(f"{string.ascii_letters}{string.digits}", length)) 22 | 23 | 24 | async def get_stranger_name(bot: Bot, qq): 25 | try: 26 | return (await bot.get_stranger_info(user_id=qq))["nickname"] 27 | except ActionFailed: 28 | return "未知" 29 | 30 | 31 | async def get_group_name(bot: Bot, group_id): 32 | try: 33 | return (await bot.get_group_info(group_id=group_id))["group_name"] 34 | except ActionFailed: 35 | return "未知" 36 | 37 | 38 | def group_invite_rule(event: GroupRequestEvent): 39 | return event.sub_type == "invite" 40 | 41 | 42 | @on_request(rule=group_invite_rule).handle() 43 | async def _(bot: Bot, event: GroupRequestEvent): 44 | username = await get_stranger_name(bot, event.user_id) 45 | group_name = await get_group_name(bot, event.group_id) 46 | tmp[rdm := get_random_str()] = event 47 | await bot.send_group_msg( 48 | group_id=fwd_group_id, 49 | message=MessageSegment.at(event.user_id) 50 | + ( 51 | f"\n" 52 | f"{username}({event.user_id}) 邀请我进群 {group_name}({event.group_id})\n" 53 | f"请您在本群发送 同意请求{rdm} 以自动同意该邀请进群请求" 54 | ), 55 | ) 56 | 57 | 58 | def group_rule(event: GroupMessageEvent): 59 | return event.group_id == fwd_group_id 60 | 61 | 62 | @on_command("同意请求", rule=group_rule).handle() 63 | async def _( 64 | bot: Bot, event: GroupMessageEvent, matcher: Matcher, args: Message = CommandArg() 65 | ): 66 | rdm = args.extract_plain_text().strip() 67 | if req := tmp.get(rdm): 68 | if req.user_id == event.user_id: 69 | try: 70 | await req.approve(bot) 71 | except Exception as e: 72 | logger.opt(exception=e).exception("同意请求失败") 73 | await matcher.finish(f'同意请求失败,请重试\n{";".join(e.args)}') 74 | else: 75 | await matcher.finish("同意请求成功!") 76 | 77 | del tmp[rdm] 78 | else: 79 | await matcher.finish("该请求不是你发起的!") 80 | 81 | await matcher.send("未找到请求") 82 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/site_tool/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.2" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/site_tool/__main__.py: -------------------------------------------------------------------------------- 1 | import json 2 | from datetime import datetime 3 | from functools import wraps 4 | 5 | import aiohttp 6 | from nonebot import logger, on_command 7 | from nonebot.adapters.onebot.v11 import ActionFailed, MessageEvent 8 | from nonebot.adapters.onebot.v11.message import Message, MessageSegment 9 | from nonebot.exception import FinishedException 10 | from nonebot.matcher import Matcher 11 | from nonebot.params import CommandArg 12 | 13 | 14 | def default_parser(args): 15 | return args.extract_plain_text() 16 | 17 | 18 | def error_handle(): 19 | def wrapper(func): 20 | @wraps(func) 21 | async def decorator(**kwargs): 22 | try: 23 | return await func(**kwargs) 24 | except (ActionFailed, FinishedException): 25 | raise 26 | except: 27 | logger.exception("接口访问出错") 28 | if matcher := kwargs.get("matcher"): 29 | await matcher.finish("接口访问出错,请检查后台输出") 30 | 31 | return decorator 32 | 33 | return wrapper 34 | 35 | 36 | def format_return(ret, func=None): 37 | if not func: 38 | func = lambda x: x 39 | 40 | msg = f'\n[{(code := ret["code"])}]{ret["msg"]}' 41 | if str(code) == "200": 42 | msg += "\n--------\n" + func(ret["data"]) # MessageSegment拼接 43 | return msg + "\n--------\nAPI from https://api.gmit.vip" 44 | 45 | 46 | async def get_api_resp(name, params, original=False) -> dict | list | bytes: 47 | async with aiohttp.ClientSession() as s: 48 | async with s.get(f"https://api.gmit.vip/Api/{name}", params=params) as resp: 49 | ret = await resp.read() 50 | return ret if original else json.loads(ret) 51 | 52 | 53 | def format_json_time(t): 54 | return ( 55 | datetime.fromisoformat(t.replace("Z", "+00:00")) 56 | .astimezone() 57 | .strftime("%Y-%m-%d %H:%M:%S (%Z)") 58 | ) 59 | 60 | 61 | @on_command("二维码解析", aliases={"解析二维码", "二维码识别", "识别二维码"}).handle() 62 | @error_handle() 63 | async def _(matcher: Matcher, event: MessageEvent, args: Message = CommandArg()): 64 | if img := args["image"]: 65 | pass 66 | elif event.reply and (img := event.reply.message["image"]): 67 | pass 68 | else: 69 | await matcher.finish("请附带/回复要解析的二维码图片") 70 | 71 | await matcher.finish( 72 | format_return( 73 | await get_api_resp("QrReader", {"url": img[0].data["url"]}), 74 | lambda ret: f'识别结果:{ret["text"]}', 75 | ), 76 | at_sender=True, 77 | ) 78 | 79 | 80 | @on_command("二维码生成", aliases={"生成二维码"}).handle() 81 | @error_handle() 82 | async def _(matcher: Matcher, args: Message = CommandArg()): 83 | if not (arg := args.extract_plain_text()): 84 | await matcher.finish("请输入要用于生成二维码的内容") 85 | 86 | await matcher.finish( 87 | format_return( 88 | { 89 | "code": "200", 90 | "msg": "请求成功", 91 | "data": MessageSegment.image( 92 | await get_api_resp("QrCode", {"text": arg}, original=True) 93 | ), 94 | }, 95 | lambda ret: ret, 96 | ), 97 | at_sender=True, 98 | ) 99 | 100 | 101 | @on_command("ping", aliases={"Ping", "PING"}).handle() 102 | @error_handle() 103 | async def _(matcher: Matcher, args: Message = CommandArg()): 104 | if not (arg := args.extract_plain_text()): 105 | await matcher.finish("请输入IP/域名") 106 | 107 | await matcher.finish( 108 | format_return( 109 | await get_api_resp("Ping", {"ip": arg}), 110 | lambda ret: ( 111 | f'查询目标:{ret["host"]}\n' 112 | f'IP地址:{ret["ip"]}\n' 113 | f'最小/平均/最大延迟:{ret["ping_min"]}/{ret["ping_avg"]}/{ret["ping_max"]}\n' 114 | f'主机位置:{ret["location"]}\n' 115 | f'PING节点:{ret["node"]}' 116 | ), 117 | ), 118 | at_sender=True, 119 | ) 120 | 121 | 122 | @on_command("ICP查询", aliases={"icp查询", "Icp查询", "备案查询"}).handle() 123 | @error_handle() 124 | async def _(matcher: Matcher, args: Message = CommandArg()): 125 | if not (arg := args.extract_plain_text()): 126 | await matcher.finish("请输入域名") 127 | 128 | await matcher.finish( 129 | format_return( 130 | await get_api_resp("ICP", {"domain": arg}), 131 | lambda ret: ( 132 | f'查询域名:{ret["domain"]}\n' 133 | f'网站名称:{ret["serviceName"]}\n' 134 | f'主页地址:{ret["homeUrl"]}\n' 135 | f'主办单位名称:{ret["unitName"]}\n' 136 | f'主办单位性质:{ret["class"]}\n' 137 | f'备案号:{ret["icp"]}\n' 138 | f'审核时间:{ret["time"]}' 139 | ), 140 | ), 141 | at_sender=True, 142 | ) 143 | 144 | 145 | @on_command("拦截检测").handle() 146 | @error_handle() 147 | async def _(matcher: Matcher, args: Message = CommandArg()): 148 | if not (arg := args.extract_plain_text()): 149 | await matcher.finish("请输入网址") 150 | 151 | params = {"url": arg} 152 | qq = await get_api_resp("TencentUrl", params) 153 | if qq["code"] != 200: 154 | await matcher.finish(format_return(qq)) 155 | 156 | wx = await get_api_resp("WxUrl", params) 157 | if wx["code"] != 200: 158 | await matcher.finish(format_return(wx)) 159 | 160 | wx["data"]["qq"] = qq["data"]["type"] 161 | await matcher.finish( 162 | format_return( 163 | wx, 164 | lambda ret: f'查询网址:{ret["url"]}\nQQ/微信拦截状态:{ret["type"]}/{ret["qq"]}', 165 | ), 166 | at_sender=True, 167 | ) 168 | 169 | 170 | @on_command("收录查询").handle() 171 | @error_handle() 172 | async def _(matcher: Matcher, args: Message = CommandArg()): 173 | if not (arg := args.extract_plain_text()): 174 | await matcher.finish("请输入域名") 175 | 176 | await matcher.finish( 177 | format_return( 178 | await get_api_resp("CheckSEO", {"domain": arg}), 179 | lambda ret: ( 180 | f'查询域名:{ret["domain"]}\n' 181 | f'网站标题:{title if (title := ret["title"]) else "未知"}\n' 182 | f'百度收录量:{ret["baidu"]}\n' 183 | f'好搜收录量:{ret["haoso"]}\n' 184 | f'神马收录量:{ret["sm"]}\n' 185 | f'搜狗收录量:{ret["sogou"]}\n' 186 | f'Bing/必应中国:{ret["bing"]}/{ret["bingZh"]}\n' 187 | f'Google:{ret["google"]}' 188 | ), 189 | ), 190 | at_sender=True, 191 | ) 192 | 193 | 194 | @on_command("sping", aliases={"Sping", "SPing", "SPING"}).handle() 195 | @error_handle() 196 | async def _(matcher: Matcher, args: Message = CommandArg()): 197 | if not (arg := args.extract_plain_text()): 198 | await matcher.finish("请输入域名") 199 | 200 | arg = arg.split(" ", 1) 201 | ip = arg[0] 202 | node_num = 10 203 | if len(arg) > 1: 204 | if arg[1].isdigit() and (nn := int(arg[1])) > 0: 205 | node_num = nn 206 | else: 207 | await matcher.finish("请输入有效的节点数量") 208 | 209 | await matcher.finish( 210 | format_return( 211 | await get_api_resp("SPing", {"ip": ip, "num": node_num}), 212 | lambda ret: "\n".join( 213 | ["节点名 | IP | 平均延迟 | TTL"] 214 | + [ 215 | f'{x["node"]} | {x["ip"]} | {f"{avg}ms" if (avg := x["ping_avg"]).isdigit() else avg} | {x["ttl"]}' 216 | for x in ret 217 | ] 218 | ), 219 | ), 220 | at_sender=True, 221 | ) 222 | 223 | 224 | @on_command("whois查询", aliases={"Whois查询", "WhoIs查询", "WHOIS查询"}).handle() 225 | @error_handle() 226 | async def _(matcher: Matcher, args: Message = CommandArg()): 227 | if not (arg := args.extract_plain_text()): 228 | await matcher.finish("请输入域名") 229 | 230 | await matcher.finish( 231 | format_return( 232 | await get_api_resp("Whois", {"domain": arg}), 233 | lambda ret: ( 234 | f'查询域名:{ret["domain"]}\n' 235 | f'注册商:{ret["registrant"]}\n' 236 | f'注册邮箱:{ret["email"]}\n' 237 | f'注册时间:{format_json_time(ret["registrationTime"])}\n' 238 | f'到期时间:{format_json_time(ret["expirationTime"])}\n' 239 | f'DNS服务器:{", ".join(ret["nameServer"])}\n' 240 | f'域名状态:{", ".join([x["info"] for x in ret["domainState"]])}' 241 | ), 242 | ), 243 | at_sender=True, 244 | ) 245 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/socialify/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.5" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/socialify/__main__.py: -------------------------------------------------------------------------------- 1 | import re 2 | from argparse import Namespace 3 | 4 | from nonebot import logger, on_message, on_shell_command 5 | from nonebot.adapters.onebot.v11 import Event, MessageSegment 6 | from nonebot.exception import ParserExit 7 | from nonebot.matcher import Matcher 8 | from nonebot.params import ShellCommandArgs 9 | from nonebot.rule import ArgumentParser 10 | 11 | from .data_source import get_cover 12 | 13 | regexp = re.compile( 14 | r"(https?://)?(github\.com/)?([a-z0-9-_.]+)/([a-z0-9-_.]+)", re.IGNORECASE 15 | ) 16 | 17 | parser = ArgumentParser() 18 | parser.add_argument("url", type=str, help="Github repo url") 19 | parser.add_argument("--description", action="store_true", help="Show description") 20 | parser.add_argument("--descriptionEditable", type=str, help="Custom description") 21 | parser.add_argument( 22 | "--font", 23 | type=str, 24 | help="Set font type", 25 | default="Inter", 26 | choices=["Inter", "Bitter", "Raleway", "Rokkitt", "Source Code Pro", "KoHo"], 27 | ) 28 | parser.add_argument("--forks", action="store_true", help="Show fork num") 29 | parser.add_argument("--issues", action="store_true", help="Show issue num") 30 | parser.add_argument("--language", action="store_true", help="Show repo's main language") 31 | parser.add_argument( 32 | "--logo", type=str, help="Custom logo (provide a pic link or reply to a pic)" 33 | ) 34 | parser.add_argument("--name", action="store_true", help="Show repo name") 35 | parser.add_argument("--owner", action="store_true", help="Show repo owner") 36 | parser.add_argument( 37 | "--pattern", 38 | type=str, 39 | help="Set background pattern", 40 | default="Plus", 41 | choices=[ 42 | "Signal", 43 | "Charlie Brown", 44 | "Formal Invitation", 45 | "Plus", 46 | "Circuit Board", 47 | "Overlapping Hexagons", 48 | "Brick Wall", 49 | "Floating Cogs", 50 | "Diagonal Stripes", 51 | "Solid", 52 | ], 53 | ) 54 | parser.add_argument("--pulls", action="store_true", help="Show pr num") 55 | parser.add_argument("--stargazers", action="store_true", help="Show star num") 56 | parser.add_argument( 57 | "--theme", 58 | type=str, 59 | help="Set pic theme", 60 | default="Light", 61 | choices=["Light", "Dark"], 62 | ) 63 | 64 | handler = on_shell_command("socialify", parser=parser) 65 | 66 | 67 | def get_reply_img(event: Event): 68 | if event.reply: 69 | if img := event.reply.message["image"]: 70 | return img[0].data["url"] 71 | 72 | 73 | @handler.handle() 74 | async def _(matcher: Matcher, event: Event, args: Namespace = ShellCommandArgs()): 75 | kwargs = args.__dict__ 76 | kwargs["logo"] = get_reply_img(event) 77 | await matcher.finish(await get_im(re.match(regexp, args.url).groups(), **kwargs)) 78 | 79 | 80 | @handler.handle() 81 | async def _(matcher: Matcher, e: ParserExit = ShellCommandArgs()): 82 | if e.status != 0: 83 | await matcher.finish(f"参数错误!请检查\n{e.message}", at_sender=True) 84 | await matcher.finish(f"\n{e.message}", at_sender=True) 85 | 86 | 87 | @on_message( 88 | rule=lambda event: re.search(regexp, event.get_plaintext()) is not None, priority=99 89 | ).handle() 90 | async def _(matcher: Matcher, event: Event): 91 | ret = await get_im( 92 | re.search(regexp, event.get_plaintext()).groups(), 93 | quiet=True, 94 | logo=get_reply_img(event), 95 | ) 96 | if ret: 97 | await matcher.finish(ret) 98 | 99 | 100 | async def get_im(group, quiet=False, **kwargs): 101 | logger.debug(group) 102 | repo = f"{group[2]}/{group[3]}" 103 | try: 104 | ret = await get_cover(repo, **kwargs) 105 | except (IndexError, TypeError) as e: 106 | logger.opt(exception=e).exception("获取Github仓库简介图失败") 107 | if not quiet: 108 | return "请输入正确格式的存储库链接" 109 | except Exception as e: 110 | if (e_arg := e.args[0]) == "Not found": 111 | logger.error(err_tip := f'未找到存储库"{repo}"') 112 | if not quiet: 113 | return err_tip 114 | else: 115 | logger.opt(exception=e).exception("获取Github仓库简介图失败") 116 | if not quiet: 117 | return f"获取Github仓库简介图失败:{e_arg}" 118 | else: 119 | return MessageSegment.image(ret) 120 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/socialify/data_source.py: -------------------------------------------------------------------------------- 1 | from os import getcwd 2 | 3 | from aiohttp import ClientSession 4 | from nonebot_plugin_htmlrender import get_new_page 5 | from playwright.async_api import FloatRect, Page 6 | 7 | 8 | def parse_dict(d: dict): 9 | for k, v in d.copy().items(): 10 | if v is None or v is False: 11 | d.pop(k) 12 | if v is True: 13 | d[k] = 1 14 | return d 15 | 16 | 17 | async def get_cover(repo, **kwargs): 18 | async with ClientSession() as s: 19 | async with s.get( 20 | f"https://socialify.git.ci/{repo}/image", 21 | params=parse_dict( 22 | { 23 | "description": kwargs.get("description", 1), 24 | "descriptionEditable": kwargs.get("descriptionEditable", None), 25 | "font": kwargs.get("font", None), 26 | "forks": kwargs.get("forks", 1), 27 | "issues": kwargs.get("issues", 1), 28 | "language": kwargs.get("language", 1), 29 | "logo": kwargs.get("logo", None), 30 | "name": kwargs.get("name", 1), 31 | "owner": kwargs.get("owner", 1), 32 | "pattern": kwargs.get("pattern", None), 33 | "pulls": kwargs.get("pulls", 1), 34 | "stargazers": kwargs.get("stargazers", 1), 35 | "theme": kwargs.get("theme", None), 36 | } 37 | ), 38 | ) as resp: 39 | if resp.status != 200: 40 | raise Exception(await resp.text()) 41 | ret = await resp.text() 42 | 43 | async with get_new_page() as page: # type: Page 44 | zoom = 2.0 45 | 46 | await page.goto(f"file://{getcwd()}") 47 | await page.set_content(ret, wait_until="networkidle") 48 | svg = page.locator("svg") 49 | view_box = [ 50 | int(x) * zoom for x in (await svg.get_attribute("viewBox")).split(" ") 51 | ] 52 | await page.evaluate( 53 | f"document.getElementsByTagName('svg')[0].style.zoom={zoom};" 54 | ) 55 | img = await page.screenshot( 56 | clip=FloatRect(x=8, y=8, width=view_box[2], height=view_box[3]) 57 | ) 58 | 59 | return img 60 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/tg_sync/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/tg_sync/__main__.py: -------------------------------------------------------------------------------- 1 | from aiogram import Bot 2 | from aiogram.types import InputMediaPhoto 3 | from nonebot import logger, on_command 4 | from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, MessageEvent 5 | from nonebot.internal.matcher import Matcher 6 | from nonebot.params import CommandArg 7 | from nonebot.permission import SUPERUSER 8 | 9 | from .config import config 10 | 11 | 12 | @on_command( 13 | "tg_sync", aliases={"tgsync", "tg同步", "同步到tg"}, permission=SUPERUSER 14 | ).handle() 15 | async def _(event: MessageEvent, matcher: Matcher, arg: Message = CommandArg()): 16 | if not (rep := event.reply): 17 | await matcher.finish("请回复你要同步到TG的消息") 18 | 19 | chats = {} 20 | if arg := arg.extract_plain_text().strip(): 21 | for i in arg.split(): 22 | if not (i in config.tg_chats.keys()): 23 | await matcher.finish(f"Chat {i} 在配置文件中不存在") 24 | chats[i] = config.tg_chats[i] 25 | else: 26 | chats = config.tg_chats 27 | 28 | if img := rep.message["image"]: 29 | img = [x.data["url"] for x in img] 30 | 31 | from_ = f"{rep.sender.nickname}({rep.sender.user_id})" 32 | if isinstance(event, GroupMessageEvent): 33 | from_ = f"Group {event.group_id} -> {from_}" 34 | 35 | caption = ( 36 | f"[ShigureBot - TGSync]\n" 37 | f"From: {from_}\n" 38 | f"{rep.message.extract_plain_text()}" 39 | ) 40 | 41 | tg_bot = Bot(config.tg_bot_token, proxy=config.proxy) 42 | await matcher.send("开始同步到TG") 43 | for n, c in chats.items(): 44 | try: 45 | if img: 46 | if len(img) > 1: 47 | medias = [InputMediaPhoto(x) for x in img] 48 | medias[-1].caption = caption 49 | await tg_bot.send_media_group(c, medias) 50 | else: 51 | await tg_bot.send_photo(c, img[0], caption) 52 | 53 | else: 54 | await tg_bot.send_message(c, caption) 55 | 56 | except Exception as e: 57 | logger.exception(f"同步到TG Chat {n}({c}) 失败") 58 | try: 59 | await matcher.send(f"同步到TG Chat {n}({c}) 失败,跳过\n{e!r}") 60 | except: 61 | pass 62 | await matcher.finish("同步到TG完毕,如没有失败提示则同步成功完成!") 63 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/tg_sync/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from pydantic import BaseModel 4 | 5 | from .._config import init 6 | 7 | config = None 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | tg_bot_token: str 12 | tg_chats: dict[str, int] 13 | proxy: str 14 | 15 | 16 | async def update_conf(): 17 | global config 18 | config = await init( 19 | "tg_sync", 20 | ConfigModel, 21 | {"tg_bot_token": "", "tg_chats": {}, "proxy": ""}, 22 | ) 23 | 24 | 25 | asyncio.run(update_conf()) 26 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/website_capture/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.2.3" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/website_capture/__main__.py: -------------------------------------------------------------------------------- 1 | from argparse import Namespace 2 | 3 | from nonebot import on_shell_command 4 | from nonebot.exception import ParserExit 5 | from nonebot.matcher import Matcher 6 | from nonebot.params import ShellCommandArgs 7 | from nonebot.rule import ArgumentParser 8 | 9 | from .capture import get_msg 10 | from .config import config 11 | 12 | parser = ArgumentParser() 13 | parser.add_argument("url", type=str, help="URL to capture") 14 | parser.add_argument( 15 | "-d", "--delay", type=int, default=5, help="Delay after URL loaded before capture" 16 | ) 17 | parser.add_argument("-wd", "--width", type=int, default=1280, help="Viewport width") 18 | parser.add_argument("-hi", "--height", type=int, default=720, help="Viewport height") 19 | 20 | handler = on_shell_command("网页截图", parser=parser) 21 | 22 | 23 | @handler.handle() 24 | async def _(matcher: Matcher, args: Namespace = ShellCommandArgs()): 25 | url = args.url 26 | for i in config.ignore_sites: 27 | if url.find(i) != -1: 28 | await matcher.finish("服了你们了,搞事的都给爷爬", at_sender=True) 29 | 30 | delay = args.delay 31 | await matcher.send(f"\n请稍等,截图正在获取中~\n" f"页面加载完成{delay}秒后才会截图哦~", at_sender=True) 32 | msg = await get_msg(url, delay, args.width, args.height) 33 | await matcher.finish(msg, at_sender=True) 34 | 35 | 36 | @handler.handle() 37 | async def _(matcher: Matcher, e: ParserExit = ShellCommandArgs()): 38 | if e.status != 0: 39 | await matcher.finish(f"参数错误!请检查\n{e.message}", at_sender=True) 40 | await matcher.finish(f"\n{e.message}", at_sender=True) 41 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/website_capture/capture.py: -------------------------------------------------------------------------------- 1 | from nonebot import logger 2 | from nonebot.adapters.onebot.v11 import MessageSegment 3 | from nonebot_plugin_htmlrender.browser import get_new_page 4 | from playwright.async_api import Page, ViewportSize 5 | 6 | 7 | async def get_capture(url, delay, width, height): 8 | async with get_new_page( 9 | viewport=ViewportSize(width=width, height=height) 10 | ) as page: # type:Page 11 | await page.goto(url) 12 | await page.wait_for_timeout(delay * 1000) 13 | img = await page.screenshot(type="png", full_page=True) 14 | return img 15 | 16 | 17 | async def get_msg(url: str, delay: int, width: int, height: int): 18 | if "http://" not in url and "https://" not in url: 19 | url = f"http://{url}" 20 | 21 | try: 22 | img = await get_capture(url, delay, width, height) 23 | except Exception as e: 24 | msg = f"出错了!请检查后台输出\n{e.args[0]}" 25 | logger.exception("获取网页截图出错") 26 | else: 27 | msg = MessageSegment.image(img) 28 | return msg 29 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/website_capture/config.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from pydantic import BaseModel 4 | 5 | from .._config import init 6 | 7 | config = None 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | ignore_sites: list[str] 12 | 13 | 14 | async def update_conf(): 15 | global config 16 | config = await init( 17 | "website_capture", ConfigModel, {"ignore_sites": ["xvideos.com", "pornhub.com"]} 18 | ) 19 | 20 | 21 | asyncio.run(update_conf()) 22 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/yinglish_tr/__init__.py: -------------------------------------------------------------------------------- 1 | from .__main__ import * 2 | 3 | __version__ = "0.1.0" 4 | -------------------------------------------------------------------------------- /src/plugins/shigure_bot/plugins/yinglish_tr/__main__.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | import yinglish 4 | from nonebot import on_command 5 | from nonebot.adapters.onebot.v11 import Message 6 | from nonebot.matcher import Matcher 7 | from nonebot.params import CommandArg 8 | 9 | 10 | @on_command("淫语").handle() 11 | async def _(matcher: Matcher, arg: Message = CommandArg()): 12 | if arg := arg.extract_plain_text().strip(): 13 | lvl = 0.5 14 | arg_li = arg.split(" ") 15 | 16 | if sex_lvl := re.match("(-?\d{1,3}(\.\d+)?)%", arg_li[-1]): 17 | lvl = float(sex_lvl[1]) 18 | if lvl <= 0: 19 | return await matcher.finish("不!够!涩!!(淫乱度不能低于或等于0%)", at_sender=True) 20 | if lvl > 100: 21 | return await matcher.finish( 22 | "要……要坏掉惹❤呜咿——!(淫乱度不能大于100%)", at_sender=True 23 | ) 24 | 25 | arg = " ".join(arg_li[:-1]) 26 | lvl /= 100 27 | 28 | ret = yinglish.chs2yin(arg, lvl) 29 | await matcher.finish(f" {ret}", at_sender=True) 30 | 31 | await matcher.finish("啊呜……你不明所以的话我会很困扰的说~(内容为空)", at_sender=True) 32 | --------------------------------------------------------------------------------