{"id":88,"date":"2025-09-05T15:31:02","date_gmt":"2025-09-05T07:31:02","guid":{"rendered":"https:\/\/plumephoenix.top\/?p=88"},"modified":"2025-09-11T20:36:48","modified_gmt":"2025-09-11T12:36:48","slug":"%e6%84%9f%e8%b0%a2astrbot","status":"publish","type":"post","link":"https:\/\/plumephoenix.top\/index.php\/2025\/09\/05\/%e6%84%9f%e8%b0%a2astrbot\/","title":{"rendered":"\u53c8\u60f3\u6298\u817e\u673a\u5668\u4eba\u4e86"},"content":{"rendered":"\n<p>\u611f\u8c22AstrBot\u548cnapcat<\/p>\n\n\n\n<p>\u6dfb\u52a0\u4e86\u51e0\u4e2a\u63d2\u4ef6\uff0c\u6328\u4e2a\u6298\u817e\uff0c\u8bb0\u5f55\u4e00\u4e9b\u9047\u5230\u7684\u56f0\u96be\uff0c\u770b\u770b\u4eba\u5de5\u961f\u548cai\u961f\u8c01\u7684\u65b9\u6848\u80fd\u89e3\u51b3\u95ee\u9898hhh<\/p>\n\n\n\n<p>\u5148\u8bb0\u5f55\u4e00\u4e0b\uff0cws\u94fe\u63a5\u7684\u65f6\u5019\uff0cnatcap\u8bbe\u7f6ews:\/\/192.168.0.101:6199\/ws\uff1bAstrbot\u8bbe\u7f6e0.0.0.0<\/p>\n\n\n\n<p>\u4e00\u3001Pixiv \u56fe\u7247\u641c\u7d22\u2014\u2014Refresh Token\u83b7\u53d6<\/p>\n\n\n\n<p>\u611f\u8c22B\u7ad9 up Yzenakiki \u7684<a href=\"https:\/\/www.bilibili.com\/opus\/1004683165136060432\">\u6559\u7a0b<\/a><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Android \u7aef\u53ef\u4ee5\u4f7f\u7528&nbsp;Edge\/Firefox&nbsp;\u6d4f\u89c8\u5668\u8fdb\u884c\u64cd\u4f5c<\/p>\n<\/blockquote>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9996\u5148\u5b89\u88c5 URLRedirector \u6d4f\u89c8\u5668\u63d2\u4ef6\uff0c\u4e0b\u8f7d\u5730\u5740\uff1ahttps:\/\/github.com\/fengyc\/URLRedirector<\/li>\n\n\n\n<li>\u5bfc\u5165 URLRedirector \u5728\u7ebf\u89c4\u5219\u914d\u7f6e\uff0c\u89c4\u5219\u5730\u5740\uff1ahttps:\/\/pixiv.pictures\/helper\/redirect.json<\/li>\n\n\n\n<li>\u5b89\u88c5 Tampermonkey \u6d4f\u89c8\u5668\u63d2\u4ef6\uff0c\u4e0b\u8f7d\u5730\u5740\uff1ahttps:\/\/www.tampermonkey.net\/index.php<\/li>\n\n\n\n<li>\u5b89\u88c5\u767b\u5f55\u5de5\u5177\u7528\u6237\u811a\u672c\uff0c\u811a\u672c\u5730\u5740\uff1ahttps:\/\/fastly.jsdelivr.net\/gh\/asadahimeka\/pixiv-viewer@master\/public\/helper\/helper.user.js<\/li>\n\n\n\n<li>\u5728\u6b64\u9875\u9762\u9009\u62e9&nbsp;App API (OAuth)&nbsp;\u8fdb\u884c\u767b\u5f55\uff1ahttps:\/\/pixiv.pictures\/account\/login\uff0c\u4f1a\u6253\u5f00 Pixiv \u5b98\u65b9\u767b\u5f55\u9875\u9762<\/li>\n\n\n\n<li>\u767b\u5f55\u6210\u529f\u540e\u53ef\u5728\u8bbe\u7f6e(https:\/\/pixiv.pictures\/setting\/others)\u9875\u9762\u5bfc\u51fa RefreshToken \u4ee5\u4f9b\u5176\u4ed6\u8f6f\u4ef6\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<p>\u4e8c\u3001sauceno\u641c\u56fe<\/p>\n\n\n\n<p>sauceno\u7f51\u7ad9\u767b\u5f55\u4ee5\u540e\u8bbe\u7f6eapi\u5373\u53ef <a href=\"https:\/\/saucenao.com\/user.php\">https:\/\/saucenao.com\/user.php<\/a><\/p>\n\n\n\n<p>\u4e09\u3001\u660e\u65e5\u65b9\u821f\u62bd\u5361\u67e5\u8be2<\/p>\n\n\n\n<p>\u5f88\u83ab\u540d\u5176\u5999\uff0c\u88c5\u4e86\u4ee5\u540e\u7ed1\u5b9atoken\u62a5\u9519\uff0c\u5c1d\u8bd5\u4fee\u6539\u6e90\u4ee3\u7801\u65e0\u679c\uff0c\u91cd\u88c5\u4e86\u4e00\u904d\u597d\u4e86hhh<\/p>\n\n\n\n<p>\u56db\u3001\u8d5b\u535a\u8bd5\u7ba1\u63d2\u4ef6<\/p>\n\n\n\n<p>\u4f5c\u8005\u5f15\u7528\u4e86meme_generator\u7684\u6a21\u677f\uff0c\u4f46\u662f\u540d\u5b57\u8c8c\u4f3c\u6709\u66f4\u65b0\uff0c\u4ecemy_friend\u53d8\u6210\u4e86my_friend_say<\/p>\n\n\n\n<p><s>\u6240\u4ee5\u5199\u4e86\u4e2a\u5224\u65ad\uff0c\u8fd9\u4e24\u4e2a\u90fd\u68c0\u6d4b\u4e00\u4e0b\uff0c<\/s>\u6ca1\u6709my_friend\u5c31\u7528my_friend_say<\/p>\n\n\n\n<p><s>meme = next((m for m in get_memes() if m.key in [&#8220;my_friend&#8221;, &#8220;my_friend_say&#8221;]), None)<\/s><\/p>\n\n\n\n<p>\u968f\u540e\u51fa\u73b0\u4e86\u65e0\u6cd5\u83b7\u53d6meme\u7248\u672c\u7684\u9519\u8bef\uff0c\u7ecf\u8fc7ai\u5206\u6790meme_generator\u6e90\u7801\u540e\uff0c\u601d\u8def\u5982\u4e0b\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>meme_generator<\/code> \u6ca1\u6709 <code>from_pil<\/code>\u3001<code>open<\/code>\u3001<code>core<\/code>\u3001<code>utils.load_image<\/code> \u8fd9\u4e9b\u63a5\u53e3\u3002\u5b83\u552f\u4e00\u63a5\u53d7\u7684 <code>images<\/code> \u5143\u7d20\u662f <code>MemeImage(name: str, data: bytes)<\/code> \u2014\u2014 \u5fc5\u987b\u662f\u88f8 bytes + \u540d\u5b57\u3002\u628a\u5934\u50cf bytes \u76f4\u63a5\u5305\u6210 <code>MemeImage<\/code>\uff0c\u4e0d\u8981\u4efb\u4f55 PIL \u8f6c\u6362\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>\u51b3\u5b9a\u76f4\u63a5\u56fa\u5b9ameme\u7684\u7248\u672c\uff0c\u6700\u7ec8\u667a\u80fd\u961f\u83b7\u80dc(\u606d\u559ckimi\u6253\u8d25\u4e86ds\u548cgpt)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import asyncio\nfrom astrbot import logger\nfrom astrbot.core.platform.sources.aiocqhttp.aiocqhttp_message_event import (\n    AiocqhttpMessageEvent,\n)\nfrom .utils import (\n    get_avatar,\n    get_reply_text,\n    get_replyer_id,\n    get_user_name,\n)\n\n\nasync def generate_meme(event: AiocqhttpMessageEvent) -&gt; bytes | None:\n    \"\"\"\u804a\u5929\u8bb0\u5f55\u8f6c\u8868\u60c5\u5305\uff08my_friend \u6a21\u677f\uff09\"\"\"\n\n    # 1. \u6536\u96c6\u7d20\u6750\uff0c\u4efb\u4f55\u4e00\u6b65\u5931\u8d25\u76f4\u63a5\u8fd4\u56de None\n    reply_text = get_reply_text(event)\n    if not reply_text:\n        return None\n\n    replyer_id = get_replyer_id(event)\n    if not replyer_id:\n        return None\n\n    avatar = await get_avatar(replyer_id)\n    if not avatar:\n        return None\n\n    name = await get_user_name(\n        client=event.bot,\n        group_id=int(event.get_group_id()),\n        user_id=int(replyer_id),\n    )\n\n    # 2. \u52a8\u6001\u5bfc\u5165 meme_generator\uff0c\u5931\u8d25\u76f4\u63a5\u8fd4\u56de\n    try:\n        from meme_generator import get_memes\n    except ImportError:\n        logger.error(\"\u672a\u5b89\u88c5 meme_generator\")\n        return None\n\n    meme = next((m for m in get_memes() if m.key == \"my_friend_say\"), None)\n    if not meme:\n        logger.error(\"\u672a\u627e\u5230 my_friend \u6a21\u677f\")\n        return None\n\n    # 3. \u6839\u636e\u7248\u672c\u53f7\u51b3\u5b9a\u8c03\u7528\u65b9\u5f0f\n    # 3. \u4e0d\u518d\u5c1d\u8bd5\u8bfb\u7248\u672c\uff0c\u9ed8\u8ba4\u4f7f\u7528\u65b0\u7248 API\n    __version__ = \"0.3.0\"          # \u624b\u52a8\u6307\u5b9a\n    if tuple(map(int, __version__.split(\".\"))) &lt;= (0, 2, 0):\n        try:\n            from meme_generator.utils import run_sync\n\n            image_io = await run_sync(meme)(\n                images=&#91;avatar],\n                texts=&#91;reply_text],\n                args={\"name\": name},\n            )\n            return image_io.getvalue()\n        except Exception as e:\n            logger.exception(f\"meme \u751f\u6210\u5931\u8d25: {e}\")\n            return None\n    else:  # \u7edf\u4e00\u8d70\u65b0\u7248\u5165\u53e3\n        try:\n            from meme_generator import Image as MemeImage\n\n            # \u76f4\u63a5\u5305\u6210 MemeImage\n            meme_images = &#91;MemeImage(name, avatar)]\n            image = await asyncio.to_thread(\n                meme.generate,\n                images=meme_images,\n                texts=&#91;reply_text],  \n                options={},\n            )\n            return image if isinstance(image, bytes) else image.getvalue()\n        except Exception as e:\n            logger.exception(f\"meme \u751f\u6210\u5931\u8d25: {e}\")\n            return None\n<\/code><\/pre>\n\n\n\n<p>\u4e94\u3001doro\u8868\u60c5\u5305\u63d2\u4ef6<\/p>\n\n\n\n<p>\u9700\u8981\u5ef6\u957f\u4e00\u4e0b\u83b7\u53d6\u65f6\u95f4\uff0c\u4e0d\u7136\u5c31\u7b97\u662f\u4e09\u6b21\u7533\u8bf7api\u7684\u673a\u4f1a\u53ef\u80fd\u90fd\u83b7\u53d6\u4e0d\u5230<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from httpx import Timeout\n\ntimeout = Timeout(10.0, connect=15.0)   # \u8fde\u63a5\u8d85\u65f6 15 s\uff0c\u8bfb\/\u5199\u8d85\u65f6 10 s\nasync with httpx.AsyncClient(timeout=timeout) as client:\n    response = await client.get(api_url)<\/code><\/pre>\n\n\n\n<p>\u516d\u3001\u9632\u64a4\u56de\u63d2\u4ef6<\/p>\n\n\n\n<p>\u6c14\u5f97\u8981\u6b7b\uff0c\u53ef\u80fd\u662f\u6211\u592a\u7b28\uff0c\u4e0d\u77e5\u9053\u4e3a\u5565\u4f5c\u8005\u53ea\u544a\u8bc9\u4e86\u7fa4\u7ec4\u7684\u4e09\u6bb5\u5f0ftype\uff0c\u79c1\u4eba\u804a\u5929\u7684\u6ca1\u544a\u8bc9\uff0c\u4e00\u987f\u4e71\u67e5\uff0c\u597d\u6b79\u662f\u627e\u5230\u4e86\u3002\u4ee5\u53ca\u8bb0\u5f97\u5982\u679cnapcat\u548castrbot\u662f\u90e8\u7f72\u4e86\u4e24\u4e2adocker\uff0c\u8bbe\u7f6e\u4e00\u4e2a\u5171\u4eab\u6587\u4ef6\u5939\u8fde\u901a\u4e24\u4e2adocker\u7684\u8bbf\u95ee\u6587\u4ef6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@astrbot:\/AstrBot# cat \/AstrBot\/astrbot\/core\/platform\/message_type.py\nfrom enum import Enum\n\n\nclass MessageType(Enum):\n    GROUP_MESSAGE = \"GroupMessage\"  # \u7fa4\u7ec4\u5f62\u5f0f\u7684\u6d88\u606f\uff0c\u4e5f\u53ef\u4ee5\u7528\u5b98\u65b9\u7684group\n    FRIEND_MESSAGE = \"FriendMessage\"  # \u79c1\u804a\u3001\u597d\u53cb\u7b49\u5355\u804a\u6d88\u606f\n    OTHER_MESSAGE = \"OtherMessage\"  # \u5176\u4ed6\u7c7b\u578b\u7684\u6d88\u606f\uff0c\u5982\u7cfb\u7edf\u6d88\u606f\u7b49\nroot@astrbot:\/AstrBot# \n\n<strong>### \u6700\u7ec8\u8981\u8bbe\u7f6e\u4e3a aiocqhttp:FriendMessage:qq_id \u8fd9\u79cd\u683c\u5f0f\u624d\u53ef\u4ee5<\/strong><\/code><\/pre>\n\n\n\n<p>\u4e03\u3001JM\u4e0b\u8f7d\u63d2\u4ef6<\/p>\n\n\n\n<p><s>\u5934\u4e00\u6b21\u8d70\u7aef\u53e3\u4ee3\u7406\uff0c\u624d\u77e5\u9053\u7aef\u53e3\u662f20171<\/s>\uff0c\u6211\u662f\u4e2a\u50bbberber\uff0cv2raya\u7adf\u7136\u8fd8\u6709\u4e2a\u7aef\u53e3\u5206\u4eab\u7684\u6309\u94ae\uff0c\u70b9\u4e86\u8fd9\u4e2a\u624d\u80fd\u901a\u8fc7\u7279\u5b9a\u7684\u7aef\u53e3\u8f6c\u53d1\uff0c\u670d\u4e86&#8230; &#8230;<\/p>\n\n\n\n<p>\u540e\u7eed\u53c8\u51fa\u73b0\u4e86\u4e00\u4e2a\u95ee\u9898\uff0cjm\u4e00\u4e9b\u8d44\u6e90\u9700\u8981\u767b\u5f55\u624d\u80fd\u770b\u5f97\u5230\uff08github\u4e0a\u4e5f\u6709\u4e0d\u5c11\u4eba\u9047\u5230\u4e86\u8fd9\u4e2a\u95ee\u9898\uff09\uff0c\u6839\u636e\u4f5c\u8005\u7684\u8bf4\u6cd5\u4f20\u5165avs_cookie\u5c31\u53ef\u4ee5\u6a21\u62df\u767b\u9646\uff0c\u5c1d\u8bd5\u540e\u5931\u8d25\uff0c\u9042\u51b3\u5b9a\u4fee\u6539\u4e00\u70b9\u4ee3\u7801\u4f20\u5165\u6574\u4e2acookie\uff0c\u6700\u540e\u8fd8\u771f\u641e\u6210\u529f\u4e86\uff0c\u4eba\u5de5\u961fwin\u4e86\u4e00\u5c40\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class JMClientFactory:\n    \"\"\"JM\u5ba2\u6237\u7aef\u5de5\u5382\uff0c\u8d1f\u8d23\u521b\u5efa\u548c\u7ba1\u7406JM\u5ba2\u6237\u7aef\u5b9e\u4f8b\"\"\"\n    \n    def __init__(self, config: CosmosConfig, resource_manager: ResourceManager):\n        self.config = config\n        self.resource_manager = resource_manager\n        self.option = self._create_option()\n    \n    def _create_option(self):\n        \"\"\"\u521b\u5efaJM\u5ba2\u6237\u7aef\u9009\u9879\"\"\"\n        <strong>cookies = {\n            c.split(\"=\")&#91;0].strip(): c.split(\"=\", 1)&#91;1].strip()\n            for c in self.config.avs_cookie.split(\";\")\n            if \"=\" in c\n        }\n        logger.info(f\"&#91;DEBUG] \u4f7f\u7528\u7684Cookies: {cookies}\")<\/strong>\n        option_dict = {\n            \"client\": {\n                \"impl\": \"html\",\n                \"domain\": self.config.domain_list,\n                \"retry_times\": 5,\n                \"postman\": {\n                    \"meta_data\": {\n                        \"proxies\": {\"https\": self.config.proxy} if self.config.proxy else None,\n                        <strong>\"cookies\": cookies,<\/strong>\n                        # \u6dfb\u52a0\u6d4f\u89c8\u5668\u6a21\u62df\u7684\u8bf7\u6c42\u5934\n                        \"headers\": {\n                            \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/116.0.0.0 Safari\/537.36\",\n                            \"Accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3;q=0.7\",\n                            \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n                            \"Referer\": f\"https:\/\/{self.config.domain_list&#91;0]}\/\",\n                            \"Connection\": \"keep-alive\",\n                            \"Cache-Control\": \"max-age=0\"\n                        }\n                    }\n                }\n            },\n            \"download\": {\n                \"cache\": True,\n                \"image\": {\n                    \"decode\": True,\n                    \"suffix\": \".jpg\"\n                },\n                \"threading\": {\n                    \"image\": self.config.max_threads,\n                    \"photo\": self.config.max_threads\n                }\n            },\n            \"dir_rule\": {\n                \"base_dir\": self.resource_manager.downloads_dir\n            },\n            \"plugins\": {\n                \"after_album\": &#91;\n                    {\n                        \"plugin\": \"img2pdf\",\n                        \"kwargs\": {\n                            \"pdf_dir\": self.resource_manager.pdfs_dir,\n                            \"filename_rule\": \"Aid\"\n                        }\n                    }\n                ]\n            }\n        }\n        yaml_str = yaml.safe_dump(option_dict, allow_unicode=True)\n        return jmcomic.create_option_by_str(yaml_str)<\/code><\/pre>\n\n\n\n<p>\u516b\u3001lolicon\u63d2\u4ef6<\/p>\n\n\n\n<p><s>\u6e90\u7801\u8fd0\u884c\u62a5\u9519<\/s><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><s>[19:41:23] [Core] [INFO] [core.event_bus:50]: [aiocqhttp] Plumephoenix\u2665\/1106674601: \/\u6211\u8981\u6da9\u6da9<\/s><\/p>\n\n\n\n<p><s>Unexpected error saving 69187235_p0.png:<\/s><\/p>\n\n\n\n<p><s>[19:41:43] [Core] [INFO] [respond.stage:212]: AstrBot -&gt; Plumephoenix\u2665\/1106674601: \u4f60\u600e\u4e48\u8fd9\u4e48\u81ea\u79c1<\/s><\/p>\n<\/blockquote>\n\n\n\n<p><s>\u9996\u5148\u6539\u4e00\u4e0b\u4ee3\u7801\u8f93\u51fa\u66f4\u591a\u7684traceback<\/s><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><s>import traceback\n\n    async def generate_and_save_image(self, url, filename):\n        async with file_lock:\n            try:\n                async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=15)) as session:\n                    async with session.get(url) as response:\n                        content = await response.read()  # \u5f02\u6b65\u8bfb\u53d6\u54cd\u5e94\u5185\u5bb9\n                        file_path = os.path.join(self.imgs_folder, filename)\n                        async with aiofiles.open(file_path, 'wb') as f:\n                            await f.write(content)  # \u5f02\u6b65\u5199\u5165\u6587\u4ef6\n                        logger.info(f\"Successfully saved image: {filename}\")\n                        return True\n            except aiohttp.ClientError as e:\n                logger.error(f\"HTTP Error saving {filename}: {str(e)}\")\n                return False\n            except Exception as e:\n                logger.error(f\"Unexpected error saving {filename}: {repr(e)}\\n{traceback.format_exc()}\")\n                return Fals<\/s>e<\/code><\/pre>\n\n\n\n<p>\u8d85\u5927\u5de5\u7a0b\uff0c\u6839\u636e\u81ea\u5df1\u7684\u60f3\u6cd5\u9010\u6b65\u6539\u4e0b\uff0c\u8bb0\u5f55\u4e00\u4e0b\u9047\u5230\u7684\u95ee\u9898<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e0b\u8f7d\u8d85\u65f6\uff0c\u7ecf\u5e38\u6027\u7684\u53cd\u590d\u4e0b\u8f7d\u8d85\u65f6\uff1a\u539f\u56e0\u662f\u9ed8\u8ba4\u4e0b\u8f7doriginal\u8d28\u91cf\u7684\u56fe\u7247\uff0c\u5f88\u591a\u56fe\u7247\u90fd\u592a\u5927\u4e86\uff08\u5c24\u5176\u662f.png\uff09\uff0clolicon\u4ed3\u5e93\u6709\u63d0\u4f9b\u66f4\u5c0f\u8d28\u91cf\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u5982regular\u548csmall\u7b49\u3002<\/li>\n\n\n\n<li>\u56fe\u7247\u6765\u6e90\u4e22\u5931\uff0c\u6709\u4e9b\u56fe\u7247\u53ea\u6709original\u5927\u5c0f\u7684\uff0c\u6709\u7684\u56fe\u7247\u662f\u5168\u4e22\u5931\u4e86\uff08\u7ecf\u5e38\u662f404 not found\uff09<\/li>\n\n\n\n<li>\u5c31\u7b97\u662f\u8fd9\u6837\uff0c\u5728\u7ebf\u6765\u6e90\u4e5f\u7ecf\u5e38\u62bd\u98ce\uff0c\u6b63\u597d\u6211\u8fd8\u6709\u70b9\u513f\u5b58\u50a8\u7a7a\u95f4\uff0c\u6700\u7ec8\u8fd8\u662f\u60f3\u7684\u672c\u5730+\u5728\u7ebf\u7684\u65b9\u5f0f\u8fd0\u884c<\/li>\n<\/ol>\n\n\n\n<p>\u9042\u91c7\u7528\u4e09\u6b65\u4e0b\u8f7d\u7684\u65b9\u5f0f\uff0c\u9996\u5148\u662f\u4e0b\u8f7dregular\u5927\u5c0f\u7684\u56fe\u7247\uff0c\u5982\u679c\u8d85\u65f6\u4e0b\u8f7d\u5931\u8d25\uff0c\u5219\u6267\u884c\u4e00\u6b21small\u5927\u5c0f\u7684\u4e0b\u8f7d\uff0c\u518d\u5931\u8d25\u4e24\u79cd\u53ef\u80fd\uff0c\u53ea\u6709original\u6e90\u6216\u8005\u5168\u4e22\u5931\uff0c\u6700\u540e\u518d\u5c1d\u8bd5\u4e00\u4e0boriginal\u6e90\uff0c\u6ca1\u6709\u7684\u8bdd\u5c31\u8df3\u8fc7\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u4e3a\u4e94\u79cd\u89c4\u683c\u7684\u793a\u4f8b\uff08SFW\uff0c\u8bf7\u653e\u5fc3\u6253\u5f00\uff09<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u89c4\u683c<\/th><th>\u5730\u5740<\/th><\/tr><\/thead><tbody><tr><td><code>original<\/code><\/td><td><a href=\"https:\/\/i.pixiv.re\/img-original\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/i.pixiv.re\/img-original\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0.jpg<\/a><\/td><\/tr><tr><td><code>regular<\/code><\/td><td><a href=\"https:\/\/i.pixiv.re\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_master1200.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/i.pixiv.re\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_master1200.jpg<\/a><\/td><\/tr><tr><td><code>small<\/code><\/td><td><a href=\"https:\/\/i.pixiv.re\/c\/540x540_70\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_master1200.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/i.pixiv.re\/c\/540x540_70\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_master1200.jpg<\/a><\/td><\/tr><tr><td><code>thumb<\/code><\/td><td><a href=\"https:\/\/i.pixiv.re\/c\/250x250_80_a2\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_square1200.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/i.pixiv.re\/c\/250x250_80_a2\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_square1200.jpg<\/a><\/td><\/tr><tr><td><code>mini<\/code><\/td><td><a href=\"https:\/\/i.pixiv.re\/c\/48x48\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_square1200.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/i.pixiv.re\/c\/48&#215;48\/img-master\/img\/2021\/06\/14\/17\/25\/59\/90551655_p0_square1200.jpg<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\uff1f\u6682\u65f6\u4fdd\u6301\u9ed8\u8ba4\u7684\u63d2\u4ef6<\/p>\n\n\n\n<p>\u660e\u65e5\u65b9\u821f\u62bd\u5361\u67e5\u8be2<\/p>\n\n\n\n<p>\u4eca\u5929\u5403\u4ec0\u4e48<\/p>\n\n\n\n<p>\u4eca\u65e5\u8fd0\u52bf\u56fe\u751f\u6210\u63d2\u4ef6<\/p>\n\n\n\n<p>\u6233\u4e00\u6233\u63d2\u4ef6\uff08\u591a\u529f\u80fd\u9700\u8981\u642d\u914d\u5176\u4ed6\u63d2\u4ef6\uff09<\/p>\n\n\n\n<p>\u8868\u60c5\u5305\u5236\u4f5c\u63d2\u4ef6<\/p>\n\n\n\n<p>\uff1f\u542f\u7528\u5931\u8d25\u7684\u63d2\u4ef6<\/p>\n\n\n\n<p>Lolicon API\u7684\u968f\u673a\u6da9\u56fe\u63d2\u4ef6\uff1a\u76f2\u731c\u4e00\u624b\u7f51\u7edc\u539f\u56e0\uff0c\u83b7\u53d6\u4e0d\u5230\u56fe\u7247\u7f13\u5b58<\/p>\n\n\n\n<p>\u7f51\u6613\u4e91\u70b9\u6b4c\uff1aaiocqhttp.exc message=&#8217;\u6d88\u606f\u4f53\u65e0\u6cd5\u89e3\u6790\uff0c\u8bf7\u68c0\u67e5\u662f\u5426\u53d1\u9001\u4e86\u4e0d\u652f\u6301\u7684\u6d88\u606f\u7c7b\u578b\u4f53\u65e0\u6cd5\u89e3\u6790\uff0c\u8bf7\u68c0\u67e5\u662f\u5426\u53d1\u9001\u4e86\u4e0d\u652f\u6301\u7684\u6d88\u606f\u7c7b\u578b{&#8216;seq&#8217;:22}&gt;<\/p>\n\n\n\n<p>\u6478\u9c7c\u4eba\u65e5\u5386\uff1aapi\u96c6\u4f53\u5931\u6548<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u7248\u672c<\/p>\n\n\n\n<p>v1.1.0 \u5b9e\u73b0\u4e86\u9ed1\u540d\u5355\uff0c\u4f18\u5316\u81ea\u52a8\u7f13\u5b58\u548c\u624b\u52a8\u7f13\u5b58<\/p>\n\n\n\n<p>v1.1.1 \u5c1d\u8bd5\u4f7f\u7528\u4ee3\u7406\u76f4\u63a5\u8d70\u5b98\u65b9\u7684\u94fe\u63a5\uff0c<s>\u53d1\u73b0\u4e0d\u597d\u7528\uff0c\u5e9f\u7248\u672c<\/s>\uff0c\u597d\u50cf\u8fd8\u662f\u6709\u7528\u7684\uff0c\u53ea\u662f\u6ca1\u6709\u5728\u65e5\u5fd7\u91cc\u9762\u8f93\u51fa\u6210\u529f\u4e0b\u8f7d\uff0c\u6211\u8fd8\u4ee5\u4e3a\u4e0d\u4e0b\u4e86\u6765\u7740<\/p>\n\n\n\n<p>v1.1.2 \u4f7f\u7528pid+\u9875\u6570\u7136\u540e\u901a\u8fc7pixiv api\u83b7\u53d6\u6b63\u786e\u7684url\u4e0b\u8f7d\u5730\u5740\uff08\u56e0\u4e3alolicon\u7684\u5730\u5740\u6709\u4e9b\u56e0\u4e3a\u65f6\u95f4\u53d8\u52a8\u800c\u5931\u6548\uff09<\/p>\n\n\n\n<p>v1.1.4 \u8865\u5168\u56fe\u5e93\u4f7f\u7528pixiv api\u529f\u80fd\uff0c\u4e0d\u662f\u8d70\u5b98\u65b9\u94fe\u63a5\uff0c\u53ef\u4ee5\u83b7\u53d6\u7684\u5230\u4e86\uff0c\u4f46\u662f\u8fd8\u5728\u6478\u7d22\u4e2d\uff0c\u540c\u65f6\u53d1\u73b0\u8865\u5168\u56fe\u5e93\u7684\u8bf7\u6c42\u4e0d\u80fd\u592a\u9891\u7e41\uff0c\u4e0d\u7136\u4f1a\u88ab\u98ce\u63a7\uff1b\u5c1d\u8bd5\u83b7\u53d6\u6240\u6709\u7684\u65e5\u8bedtag\u548c\u4e2d\u6587tag\uff0c\u5df2\u7ecf\u53d1\u73b0\u4e86<code>gtm-new-work-tag-event-click<\/code> \u2192 \u65e5\u6587\u6807\u7b7e + <code>gtm-new-work-translate-tag-event-click<\/code> \u2192 \u7ffb\u8bd1\u6807\u7b7e \u8fd9\u4e24\u7ec4\u6807\u7b7e\u3002\u5b98\u65b9\u9ed8\u8ba4\u662f\u82f1\u6587\u7ffb\u8bd1\u3002\u6700\u7ec8\u53ef\u80fd\u8fd8\u662f\u901a\u8fc7\u5916\u90e8python\u722c\u53d6\u7684\u65b9\u5f0f\uff0c\u7136\u540e\u53c8\u6709\u4e86\u4e00\u4e2a\u65b0\u7684\u60f3\u6cd5\uff0c\u4fe1\u606f\u8c8c\u4f3c\u80fd\u83b7\u53d6\u6536\u85cf\u6570\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u6839\u636e\u6536\u85cf\u6570\u6765\u83b7\u53d6\u66f4\u597d\u770b\u7684\u56fe\u7247\u4e86\uff0c\u5982\u4e0b<br><br>{ <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-2\"><\/a> &#8220;create_date&#8221;: &#8220;\u521b\u5efa\u65e5\u671f&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-3\"><\/a> &#8220;series&#8221;: &#8220;\u7cfb\u5217\u540d\u79f0&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-4\"><\/a> &#8220;page_count&#8221;: &#8220;\u56fe\u7247\u603b\u6570&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-5\"><\/a> &#8220;height&#8221;: &#8220;\u7b2c\u4e00\u5f20\u56fe\u7247\u7684\u9ad8\u5ea6&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-6\"><\/a> &#8220;total_view&#8221;: &#8220;\u603b\u6d4f\u89c8\u91cf&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-7\"><\/a> &#8220;id&#8221;: &#8220;\u4f5c\u54c1ID&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-8\"><\/a> &#8220;title&#8221;: &#8220;\u4f5c\u54c1\u6807\u9898&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-9\"><\/a> &#8220;width&#8221;: &#8220;\u7b2c\u4e00\u5f20\u56fe\u7247\u7684\u5bbd\u5ea6\u9ad8\u5ea6&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-10\"><\/a> &#8220;type&#8221;: &#8220;\u4f5c\u54c1\u7c7b\u578b\uff0c\u4f8b\u5982illust\u3001manga&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-11\"><\/a> &#8220;tags&#8221;: [ <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-12\"><\/a> { <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-13\"><\/a> &#8220;name&#8221;: &#8220;\u6807\u7b7e\u540d&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-14\"><\/a> &#8220;translated_name&#8221;: &#8220;\u6807\u7b7e\u540d\u7ffb\u8bd1&#8221; <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-15\"><\/a> } <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-16\"><\/a> ], <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-17\"><\/a> &#8220;user&#8221;: { <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-18\"><\/a> &#8220;account&#8221;: &#8220;\u753b\u5e08\u7528\u6237\u540d&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-19\"><\/a> &#8220;id&#8221;: &#8220;\u753b\u5e08\u7528\u6237ID&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-20\"><\/a> &#8220;name&#8221;: &#8220;\u753b\u5e08\u540d\u79f0&#8221; <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-21\"><\/a> }, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-22\"><\/a> &#8220;total_bookmarks&#8221;: &#8220;\u6536\u85cf\u603b\u6570&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-23\"><\/a> &#8220;filename&#8221;: &#8220;\u539f\u59cb\u6587\u4ef6\u540d\u79f0\uff0c\u4e0d\u542b\u6269\u5c55\u540d\uff0c\u598212345_p0&#8221;, <a href=\"https:\/\/nazurin.readthedocs.io\/zh\/site\/pixiv\/#__codelineno-0-24\"><\/a> &#8220;page&#8221;: &#8220;\u5355\u5f20\u56fe\u7247\u5728\u6240\u6709\u56fe\u7247\u4e2d\u7684\u987a\u5e8f\uff0c\u4ece\u96f6\u5f00\u59cb&#8221;<br><br>\u7ecf\u8fc7\u67e5\u8be2\uff0c\u5efa\u8bae\u5982\u679c\u8981\u68c0\u7d22\u7684\u8bdd\u628a\u6240\u6709\u7684\u6570\u636e\u90fd\u653e\u5728\u4e00\u4e2ajson\u6587\u4ef6\u91cc\u9762\u7136\u540e\u5185\u5b58\u7d22\u5f15<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u611f\u8c22AstrBot\u548cnapcat \u6dfb\u52a0\u4e86\u51e0\u4e2a\u63d2\u4ef6\uff0c\u6328\u4e2a\u6298\u817e\uff0c\u8bb0\u5f55\u4e00\u4e9b\u9047\u5230\u7684\u56f0\u96be\uff0c\u770b\u770b\u4eba\u5de5\u961f\u548cai\u961f\u8c01\u7684\u65b9\u6848\u80fd\u89e3 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-88","post","type-post","status-publish","format-standard","hentry","category-article"],"_links":{"self":[{"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/posts\/88","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/comments?post=88"}],"version-history":[{"count":12,"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/posts\/88\/revisions"}],"predecessor-version":[{"id":120,"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/posts\/88\/revisions\/120"}],"wp:attachment":[{"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/media?parent=88"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/categories?post=88"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/plumephoenix.top\/index.php\/wp-json\/wp\/v2\/tags?post=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}