[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-info":3,"card-styles":63,"article-wxco-wechat-chat-record-extractor":82,"neighbors-wxco-wechat-chat-record-extractor":121},{"background_url":4,"author_name":5,"github_url":6,"email":7,"site_name":8,"author_avatar":9,"author_tags":10,"social_links":11,"friend_links":12,"about_content":13,"protected_uploads":14,"favicon":15,"signature":16,"mobile_hover_disabled":17,"smtp_user":18,"notify_email":7,"smtp_host":19,"notify_enabled":17,"smtp_port":20,"smtp_pass_set":17,"visible_status_items":21,"status_custom_values":22,"status_card_sides":23,"show_friend_links":17,"about_page_title":24,"friend_links_title":25,"summary_title_color":26,"summary_content_color":27,"custom_font_url":28,"notice_active":29,"notice_content":30,"notice_title":31,"notice_expire":32,"notice_bg_color":33,"notice_btn_text":32,"notice_btn_url":32,"notice_click_count":34,"log_record_page":17,"log_query_location":29,"log_enabled":17,"log_max_records":35,"log_location_cache_threshold":36,"ip_location_apis":37,"log_blocked_ips":38,"log_watched_ips":39,"monitor_enabled":17,"monitor_interval":40,"monitor_memory_threshold":41,"monitor_disk_threshold":41,"footer_text":42,"pan_notify_enabled":17,"license_api_key":43,"mobile_tab_menus":44,"show_footer":17,"article_content_color":32,"article_inline_code_color":45,"protected_folders":46,"about_show_resume":17,"about_show_content1":29,"about_content_title":47,"about_page_content_title":48,"about_page_content":49,"captcha_params":50,"log_retention_days":51,"security_my_ips":52,"security_params":53,"font_backend_enabled":29,"moment_templates":54,"about_content_weight":55,"security_fail_counts":56,"monitor_cpu_threshold":51,"monitor_service_check":17,"monitor_alerts":57,"comment_throttle_params":58,"nav_menus":59,"comment_notify_enabled":17,"login_failure_notify_enabled":17,"new_device_notify_enabled":17,"alert_failure_threshold":60,"alert_cooldown_minutes":61,"pan_notify_min_size_mb":62,"comment_notify_pending_only":17,"font_frontend_enabled":17},"\u002Fuploads\u002Fbed\u002Fbackground\u002Fb666b21659cc477daea62833a78c841f.jpeg","Leap","111","vue2@qq.com","leap日志","data:image\u002Fpng;base64,UklGRswXAABXRUJQVlA4IMAXAABw\u002FQCdASpYAlgCPpFInUslq6+spVM5QfASCWdu\u002FADZos5pBcI8ObypUEg27P288x0\u002Flw18mvr3mW77yzOtvWym1EyDjkIGQZCAorHIQMgyEBRWOQgZBkICischAyDIQFFY5CBkGQgKKxyEDIMhAUVjkIGQZCAorHIQMgyEBRWOQgW5HTDvbqP2co2l63DIMhAUVjkIGQZCAorE+tTDsa7H7CYW\u002F\u002F5sqPlbt3UDQ4H6\u002FgpnuiWanwNfRAvHWKRZwE1+VFY5CBkGQgKKxyD\u002FC6OE7\u002FvCaQazeX\u002Fm8IaTbC0fjeELKrzq8N87yrQaqQaoq532T2wBAyDIQFFY5CBkGKOGIU+bn86NBiV0jyb6vVwwIKKjkjg\u002FzdtKNqE7EyxyEDIMhAUVjkGPzAfqQs07tVN5ExoTFAF+NyuZ7mM9+fm1MOyorHIQMgmAuFvHW4\u002FbiryQD\u002FhxFNbEqAL7UbLAVCgGeMqIdY3KrxcNvF\u002F3y4HEfo6\u002FFNT\u002FRY1MOyorHIQMd6OIx0wftiov9cCFGrPi8tA9Q31jicwmQa\u002FhbfbkYxYpsZYxwCCJvVcc24806eXBObJ5LREnFj9tq6braiEDIMhAUVjkGPP2lNE4frv5PHSdyxKT7MsS7sA+rNL7cbKlkPE3vYm61Jwm4ZaH1ZZU5gJ8re+vcgyEBRWOQcNRVlQoMTyhTQveG4fKYlQQqou4yv3r+q7OxqC3KLKuYFAWouIGG6CSf2y2hX0kPMsGQgKKxyDR4sBms4BvpSy08mtskgE4ThoHAwuhMxDL6s8oCEkwv7zkLt1nvoO3dlnIA2sZ9T4KxyEBOwp6x6u5VWjkp0J5G8SDqPwuhvUHCQiBcyRFFF7wIFlNI9yDiBB9+ufRivcO2R\u002FfDczWwSCXOBWph2VFY4GTiaCs9kiE\u002FHib\u002Fte9GTD2rfRVQnP\u002FKWZUeVK5x4RMVL7lcnzaJGaNmZ2p0IgaGgbeBZpG0zPwVjkIGQYcHw2zChQPgRrw4MokVa6HioUipR1rWgzyysakFdcLT\u002FnYooYAW6fq+QrZau6XjkIGQZB3kar+i63J1sEb95Bgk6eVlhMieK61tD4SWOKwQXEnuD88u5GujCZEYK+KbKEZ8mqF4DniU6+lVF8pBS8QP+pVCusg9bTnDIMhATHE\u002FH620zvswAHhRP55dUHmFliXbsepwkja7BmpjtwhvxvvEpjd2pJagIarsi2Jc\u002FLE7sHvLYG3A+iNUahvQVjkIGQYo7R5EQTo+qqyqZ8Kx\u002F8aOyIoD+uxVwxcjf5POOgTaC1LMH8s\u002FlEu0oFQDpCreLM0UL5wExmOboSfgSjcUJc\u002F3XyuHAxQFFY5CBjiVHiLFhvEdh\u002FP53xYvztfZ1Uj1tS\u002FE1kHSqpIyG4HyYfYlQr2RBmGuKn8FEIG9SsPG0YqDnKkdaQqzyS1DZjkIGQZCAmPsdfOZm19JVpbf\u002FHl8iAfS3O5\u002FF1CbpeEy4y4e1FgSxbjx\u002F1Ezw4umRNnh9ltVN6yQoTb+pNFI6cplQxjIdvOwj2lCInU+CschAx1SdFoexRiT9nuqxPrtrEG9igqDFLAeu3V4MS3+X358HmjsWlh0eZX+QJSJW+2QgKKxyEDIIHHJhOhHYZim5BYw\u002FVPtaLQRtlCb8ZqHWIVZircwug8LdTsnit\u002FQhEbir1uGQZCAorHJHSVYiCJ3b3vbWMpFHF5MTeX7G5yPu0XZ2X8UqCABkYjpoYkbhkGQgKKxyEC3cHsDjYwvBzhEFPdxGpjsgi80jtMHvlWkudvNfRIht3+AtvEs9efj0S9K1Q3f0P37MSo5xMX\u002F\u002F2uNXLU2YUgyEBRWOQgZBkICWH\u002F8saTZgcWp4gvFj8foBsmXnIIyo+DpoxyYvcIQsLA3BPQPZpWBOUM+rU+RZHJsSW7EdvCMgyEBRWOQgZBkICZemM7oODg3V+Fqr0Stxnn4yd9IKGOZSFVlSAwBIavoFb9Qv1QxFJ7zpsyA+kCtDh2sms8hAyDIQFFY5CBkGHCWBKkix9foKkSzH7R5FCdGOwjyiEW\u002FqQ\u002FlMXGPI2ps3DDaCjQvcvxIUgfcBFSrUw7KischAyDIOt6suP0o5QuAycj+xdSKETBlD8MKo5aH9Y2LT5Mua+fQ75bIEqPfhvOOu8VZpHUBYdGrngAeEMPwKM6eyW1MOyorHIQMgyDspnyqRykvd\u002FkcxBQsxVWgNmZhaux7M4p03nBH0E4jp+cF3ariW1cOsSj7rAYX2\u002FySqimq7OPHevICj4lzvofUf1FIQMgyEBRWOQgY4+SQ1CIXdYAK75jUIuq+v0xs3koWYHdk\u002FuqB59oxU\u002FXAAuO\u002FvbJepLcl79MfYQrLEMZ0n5kICischAyDIQEuljA1neO6vC7LpxWVBrebNu4qeGOaWyRiwLq7kx+QSPzjCDi+6H5Bm99OnafjVWph2VFY5CBkFlKSEnXsFpn0CbpO\u002FUYtojRl7dtDmVhTkJBBKo4xnOciP1fOZ62pU+ZBsL8peOuS9VjkIGQZCAorHIQMgjTo0yPPF4STLevY7joI+qNBuDthmplDgVXH4zH0y4V9IN6IX5CdKtTDsqKxyEDIMhAUV7nJ0hfA7QGmnsDgIZpKthgLH2yQoSCFw5zs4ALFcQHZqwpuZAeA+p8FY5CBkGQgKKxyEC3jP3b2+JIT2gGxnF3QiLkIGQZCAorHIQMgyEBRWOQgZBkICischAyDIQFFY5CBkGQgKKxyEDIMhASwAD+\u002F26YAAAAAAAAAAAAAABvtmztoRm3doU0FREFcxfGQDfyTZrARfDLIM56ckAuwAAAeRQzpXEORa1U8ZSbgIeSwwTSxnSPgwGxxzXe2bN8JxHfoDVf4Nn1KNVBLFpS5XvAPe6eT663F461uopKosssvGQ2itcpxZKI0eRTXXtsAMCbP0DpilTSgte3Z24WETY\u002F6sTDeXJ7pwjIEObU\u002FAHZzxoMQfbx2p3+r3gH1gJul0uDXGAB\u002FAAAOKBrhLqlNMNk0LW0w9KIVOUhwx\u002F9zbIDvh9eEG2XAr\u002FKoA0BqP9mSQFvTH4neiAy7\u002FipYZQ2Vlq5+yPI59+Kgnhl6MYvzoSmUGRCGAFWtf2w1BMnLmLB0YHr589IfpH88Ik3fX\u002FocoAGfoggAC717Zd1TMI9LeRpLmxYzl9\u002FRy90g65wCClUD86NJYxaPZX4qp6\u002Fn03zYGcy5YsvXX6eiT\u002F8eJiz9lf7pRNbjnovWQr8Pxjx602d1XPbHS0ABPTNcrXPqkQp9WYmxcurlYATz2n9brSZc9Zw0PwbgM4dfHpUOoeB3ZWT1clpdQrJE9QEnhyzb9RLJbKGSQVCUMTIXzcUebUj4L9MjUgJ+1AAJeN\u002Flb1IiHrmVxKy9xKrwup5rB13J+f9Q7I5X\u002FW698V3UxFnoLUsTnwNyYApx+ieLx5xBg+jTegpgRuvpiOaUAAi65qi\u002Fk9zKjoJe9NB\u002FsmaUGS4PW39fUlMb7XcI5N2ZfKsIeIB+BWVIwQfNeIctN6Psud1zbCnM8ZgFsftjpHGsowdBv3MB8d9OgUWF1ADAvhfYgyclEF6D2BZ+PH6ftHdSJSsjEAHq5ZQlmhhLM2WRj1SuQA16orz79eA6kav07C5oTteUje\u002FAk0GRSdy6WEsbF9we0Mr6lDZoX3S8x9jsdSxVqWLannqH6HmoX9DCUygn2TEVCZUyPqvlhboEp6c9QqGo+WeBl9xZsZYd09Hnsts7109ziooijy5uPhpTehw\u002FwFhyt03MA47ZW9p80VKiaDoNTmAECRXOx\u002FLCnVV\u002FqtxgfXfJ6S3j5v9v+mrY8AQwYxshWsqU8O79we8daDCUrnpKJ7igo6wuecnyNNSUW68bEqfltDF7pR9C0BPdlod3cdSYzFLPbknfB2P+KvojiC5mh6XKaK6Sb5qi0Y6hmLYwLBC1lLMQu0NArwuluyUgFeZE3jSmJz0eDl4KGKyjHmXeq\u002FI8DiQSr1Kl0t9dyQZxIANfoNKkBFsAAWIbLODYTlWXTZeBsNAc91rBpx\u002F4GoW2+aCKhNjeFmrVLx8cOE5V1tLBTzrIsHwqcxixMShrfW4iPsAtOpx8\u002FbYVCwvg\u002FAZTvQz\u002FqaQDJK8SAE6QYtXUYUQijph81WKinKOmjacyF9gdXXGJTPbE7L+Jvm6c+7qz+GA9nqaRAAHM6pVyBsaNDHVASJFFKAUmJGS\u002F\u002F04zDDNTmeE0Z9Ymy+X21Hqj85ihlCIVaP708ytZbvxHH9Kp6MHiz7oExafZB90vQPVP+i5xiTiDQaVxjQnq3wPyMof2XxxZAj3FpK927R2ZC6PpH8TSf\u002FcD4RAXjhDrNm\u002FiPHHO0RlziiTo6tmtlsn3MMQ7AYMCwvP8VLdQWPCumnmxKKAENm\u002FLjh7Cc8d1bN\u002FoLHFDG5nGLqj43yySROOVaEhOMwTO63psccuOD\u002Fv8yIYx\u002FrOIV7UPSxJt1scr\u002Fqpj75WGpsTN0aoIvWdhGEQ3K1TekhEfvc4ZJnGgqKVhirX\u002FFyIWbZ9MEvvYLFJN31JmST7UoXeYjEfPNkD0EpZ\u002F8dSwtraF2ZDabNIctOHpNqbtnXQWqkqTjxtEa0SMYYBP+yjx5YW7cyvGBeJGLWsJw+qZ9TWteOqdNQ1ZxVAheDI+FmwwAVuDb4I\u002FE+Cde4KlrywMi9KH\u002Fxd2l5jjhBEWR5PMiqgNUDv5DiGDAD7aB7puFQiShzUKoag+NdN82pV3\u002FIb\u002FRXecrAcWYTdZYBFeCVyN11DVGc9U6eNPoQzw4Bj2PhtbZ5YP\u002Fp4YuCG\u002FpdJxav3XiyUAO2WqyLP414lNAFMYbdq5wbipXvXNSva7EwEZNURcylLnsB91HOm3+3WhUD9aCJrAKNjzl3pq46Ar8aWJFdzvzzmHXNDGq3Dm99IDMJ\u002FB\u002FOEHH6agR4d4hleRoAzNnhTewOgk\u002FkS8vWkX2RmOXemCMLWd6WaMoT+IDJHdgbh7OpjM3Mvh7UsjgMow2SXUQsN5+UpHRvc+nrPtKaE76JW\u002FRnY1o9q7XNvZmg3gTMwWvmh87gVOHnjninIbjch4D0TMVrgtbqZb959RVMkjpcbbe9py4o+0HIf9YAAW2+L0qH5SdwNdkOOq7l8uecDY7SfCtYCOZXyutUqHbn2T7tcciuHuadc7u4Q3ejeVqgKuJOY8IM1Y+ASFyrxjHpzppyeCPFVnzYKrHeAtGjjLNfZMXD8uvnT7AS5v\u002FzTt93NyVra3SUfia\u002FLewRJ2PQfIvhPDjc4t3nwimKJzb+jlKf08JMt1Dj4owu14o\u002FgPCU0qQ+OqWkcbNMfSRGRCSohyxcRbI5T6GkEx\u002FzbRByngv7\u002FSOSt\u002FNYqlsAESJpyIum\u002Ft7VxeIBVEb7fUpD+iCNENZtws3ZUjMSgt+IhHLac0CosuEtyfSxJ7KivjycSXJ4F0xU9u0y1oZm4FrPmi87wtVzFlKsnfWpOrZWs7BWKyBp5bQ5eoH7xzXMfINfcuPl60OnGS42A8SxL0A5niAl0raZE+srs5\u002FsBqCmSnWZ\u002FkOHd4tubvJRY0nm86JDC\u002FNN0QfHVSt8mPgKO3bR4ojIIYwf34O4nPQAW+sBtWncoxzhFlBbF9e0MZAP+lo5Dscu2IDeABMp6lYXbgfa3XCp6qqGMCygQjEL5M17GJPV1gCyzescBehJzHWQGoSH1X3NN7bNq\u002F58oau2rib0zgLpYa\u002FfFF6gi4JA9fGtiCGl6Th88MHoLNXXE59hHdQBZ3U1Jx\u002FQS9tBL8Gl3T01sLDeSEQCRKPSdMnYQCWaWR2XHTY2EL0X22asymPCKj1AjahWB9PxVJsYPc53qg02lEhrT5tzDs2jfKw4KHuFTBKX6tmoj1GV0\u002FdlVi7djnksSWXk\u002Fnt4ehJF8DOrG669kY18WIGSpVvT8UwP5q44jZ6m58ysEvA3vGoFn948SYc4IEqKe7kLeNrL7EqpM269wr27CqsEKH0gl6rC7iaS6Jk\u002FI4RlX5AABhL7QS8oXVMeeViE2TLgs6afxiTiMMrR4\u002FQnt8gphxssEgcPXr4rzyWmbNei0NMcL3UU1Hr14XiCVOJlipDw4ITaKIFXaaHDsFiy1pNdPJ\u002F8qTHgeuj0CC8M3fLXoRoEOoeFD9PwZ7oVyPuhVCBEf9Cj3k5R9bQtoKzch1SGXQy1J9wSbKGnnSLvGmLvl7\u002FeGLD8vZsBP4ssS0tJJE1SQIL4PAAIGzz+aiPi8x7vO0C0MXdiraRjJcM3YS1sS0PFa0WTI3BtNK8GnLtAPrp7I3GGlok9zE+6Gh9FrQ0CdGCFB8Eoouw5r9EnU4Gw2LoOd9GLJZpgFlaRSEXvMvZwbup0\u002F\u002FLFeNFjMiGal7Kfh6+M\u002FRToHXE9AC3je12\u002FSAf3nuAOt8C4IWMOHzYiVrK377gBGoFxMhJycwgmGCI8UYg67LLgU8WscBUU3pze3d7VX9tI8njwtEU49RFn4E4A1oYQQAR6xbSRmifwInnVGNakQi76gd7PCjNmIKu75r5tSJMyApKjfdO1DuN4L34AAABJdpeZZSISZQ8JjQakY2xE5rjc72g+QRwci6+KsdgFWrpwJQ4bwjRhq2RpMilU4pY+7pxxat13INbLH2BPeMwp3SQWvKqz\u002Ftjjw7OvXN7jILC2gfd2OU33q45ByyYtlgt4yPRAE+Nfsf6j6skj8fzBXpsgvzPd6L45AAApgrxLyDKXVlMgGKpS9gwFUlfK\u002F44XwWmpXyRUib7y5DGSDH58BYT8TB3aXtvPsNUszgY6V1lqqnDGOzLuknTzT8KTADTuz29bw9PTJVNKQUwrNATghqCuPCkGS52YKy67oSMPhOq8b+Z1ZmZ5TYS+wvVbstRzUALYAoxFhtciqYZz033oqM74kUEwlJpGwFAoAA44GUL8hsXeSEPHUFUU\u002FgAvH74eGMcuuae7pxSR2gcfaPbJmHhX79zl+nf5+DvPHo0ARiErzH6VdeC7CBHViZfUtmYrNCMYpr6jKx1bnqcAV7IJTPQw5EHOQUbWgSq\u002Fams5nbgACjqZwKhZTGMBWMAk88wQLJQAANyHAASfWk4S8HGdIG+4a1P0rFZqluTqEzqeRNyNIoMmJEFfmaS0FWS56okrWoRLZDMewHTS+zIeZb\u002Fd2NoxlHz2CGh4U8256BVmuR1z4j\u002FSrGJWUHFxIskjOEqepjyQnV+Z3fAACfoaeCafDLnfslJIM9xMhPIOsNCAarM6rdKgs4+MK+cwraWAtZGSWkSdTOZjN4DptzAfcEUueZRYbGjZ9GouHL\u002FTbAVHVL2WTxdj46BP\u002F6jHqe6R4IAAcoF3QWUv6eXmwoyeLNRH7ZCpVjwPgddtbcYgQRwXLWSQaeeXEB\u002FoboQD27mAP5ZPeZEvWG\u002FYh8XoQtn2jwwInUdIpMyFO2+8UprahC\u002FTIwGEzTwyKPHqhQ5HbHICyF5NXbDxHfGgoIkJdOAAZqAufNAOXLSE32G\u002F5O2uLOm9WToDsxgJfoSksWd3YTw500JqwVHJm59\u002FqF9h1ctL9Ff8BkVlhsrcbDFdGc9LK830ZmO9KRrgqyBKAvbttgi4w1OpQLK6KNNch+AkHaUnbl\u002FN04ACPfNgGuTXji6Khd4tpECcAs65RTOoBsahJAw9CsTXPo1Nr72tMAxkn+ZpGHYod2jdnYVRrJ7fLfzBvQXPPyIqULFjLrwZ3\u002FfVerTgcZcKzaMf39r+79mCgvAAEsCsACRoPc8eyDJA4DLBB0dp6qqIRQTWjF7Td+L3\u002FsYqYfOSA6A0RjBy48iLvTCg\u002FVUaN5P1IczPM3LzjDrLR8WoRDQPecsS2OEB3yR4w+4AAAFmfIA0D7GgK6yZCkm2925Y3o8JzprBBt3MB0EK93tKWPa5oFaowSzU6pRn1AQTXsgOHI1YqtCpRpdiQRrdwFpyHen1bBsM\u002FlgDb42A\u002FjFteZ70bY7edxBHtTRUGQAAAhIYGTS2oXlf6B51vcNiQqjdbNQmVvJYmqf3M4QwgQ3rUuZhFx05eeF\u002F7RJ\u002FadR+SfJOn1wkQqqA9oqV4BtfI8hLFaP6YKgPtbI4o9jt0RIAAABlpzEVzMNVIqnB4rWWLFZxIRQjpt1pmNMDuUFrQLhOjevsbVHYq8VqxXLlkHNWDNVJjyWqmirXfSgr31Ot4OgbEi\u002FmNqH20xGAAAAAr22MrLh7Q1XbMkiUAJ4mFTZBAAAAAAAAAAAAAAA==","[\"时间管理大师\",\"ECS爱好者\",\"Ubuntu\",\"Nginx\",\"systemd\",\"CI-CD\",\"SSH\",\"FastAPI\",\"Docker\",\"Hysteria2\",\"Gunicorn\",\"琐碎内容写多了冗余,不写了\"]","[{\"platform\":\"email\",\"url\":\"vue2@qq.com\"},{\"platform\":\"email\",\"url\":\"toleap0203@gmail.com\"}]","[{\"name\":\"个人工具Mychat\",\"url\":\"https:\u002F\u002Fchat.vue2.xyz\",\"desc\":\"我的Web_ai构建\",\"image\":\"\",\"enabled\":false},{\"name\":\"个人工具Proxy_Control\",\"url\":\"https:\u002F\u002Fchat.vue2.xyz\u002Feaa1c83fbe48\u002F\",\"desc\":\"Proxy控制开关\",\"image\":\"\",\"enabled\":false},{\"name\":\"OpenClaw\",\"url\":\"https:\u002F\u002Fclaw.leap289.xyz\u002Fchat?session=agent%3Amain%3Amain\",\"desc\":\"我的龙虾\",\"image\":\"\",\"enabled\":false},{\"name\":\"Hermes后台\",\"url\":\"https:\u002F\u002Fhms.leap289.xyz\u002Fsessions\",\"desc\":\"QQ端机器人管理\",\"image\":\"\",\"enabled\":false},{\"name\":\"leap的邮箱\",\"url\":\"mailto:vue2@qq.com\",\"desc\":\"leap的邮箱\",\"image\":\"\",\"enabled\":true}]","\u003Cdiv class=\"flex flex-col items-center mb-6 md:mb-8\">\n  \u003C!-- 头像容器：改为3:4竖版比例 -->\n  \u003Cdiv class=\"w-20 md:w-24 aspect-[3\u002F4] rounded-2xl border-2 border-white\u002F50 dark:border-gray-300\u002F30 shadow-2xl bg-white\u002F20 dark:bg-gray-800\u002F20 backdrop-blur-sm overflow-hidden flex items-center justify-center text-3xl md:text-4xl mb-3 md:mb-4\">\n    \u003Cimg src=\"https:\u002F\u002Fvue2.xyz\u002Fuploads\u002Fbed\u002Fdefault\u002Fa1d9c7b8040e40d585e0692142d8cad1.jpg\" class=\"w-full h-full object-cover\">\n  \u003C\u002Fdiv>\n  \u003Ch2 class=\"text-xl md:text-2xl font-bold text-white\">郑成龙\u003C\u002Fh2>\n  \u003Cp class=\"text-xs md:text-sm text-white\u002F70 mt-1 text-center\">运维工程师 | Linux服务器运维 | Docker容器化 | (已按照iPhone14Promax理论分辨率适配移动端,桌面端浏览最佳)\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003C!-- 技术栈 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Ch3 class=\"text-base md:text-lg font-bold text-white mb-2 md:mb-3\">🛠️ 技术栈\u003C\u002Fh3>\n  \u003Cdiv class=\"flex flex-wrap gap-1.5 md:gap-2\">\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">Linux\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">Nginx\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">Docker\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">Shell\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">Python\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">MySQL\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">阿里云ECS\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">FastAPI\u003C\u002Fspan>\n    \u003Cspan class=\"px-2.5 py-1 md:px-3 md:py-1 rounded-full text-xs md:text-sm font-medium bg-white\u002F20 text-white\">Nuxt.js\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C!-- 个人简介 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Cp class=\"text-white\u002F90 font-bold text-sm md:text-[16px] leading-[1.5rem] md:leading-[1.75rem] tracking-wide\">\n    你好，我是 \u003Cstrong>leap\u003C\u002Fstrong>，一名运维工程师。拥有1年多Linux服务器运维经验，熟悉Docker容器化部署、Nginx配置管理、Shell\u002FPython自动化脚本编写。具备线上故障独立排查能力，熟悉服务器安全加固与监控体系建设。\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C!-- 工作经历 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Ch3 class=\"text-base md:text-lg font-bold text-white mb-2 md:mb-3\">💼 工作经历\u003C\u002Fh3>\n  \u003Cdiv class=\"space-y-3 md:space-y-4\">\n    \u003Cdiv class=\"bg-white\u002F10 rounded-xl p-3 md:p-4\">\n      \u003Cdiv class=\"flex justify-between items-start mb-1.5 md:mb-2\">\n        \u003Ch4 class=\"font-bold text-white text-sm md:text-base\">武汉途迪汽车服务有限公司\u003C\u002Fh4>\n        \u003Cspan class=\"text-xs md:text-sm text-white\u002F60 whitespace-nowrap ml-2\">2025.7 - 2026.3\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"text-xs md:text-sm text-white\u002F70 mb-2\">运维工程师\u003C\u002Fp>\n      \u003Cul class=\"space-y-1 text-xs md:text-sm text-white\u002F80\">\n        \u003Cli>• 负责公司3台阿里云ECS服务器日常运维，涵盖Nginx配置管理、Docker服务部署、防火墙策略配置及SSH安全加固\u003C\u002Fli>\n        \u003Cli>• 主导项目Docker容器化改造，编写Dockerfile和docker-compose实现多服务编排，部署时间从30分钟缩短至5分钟\u003C\u002Fli>\n        \u003Cli>• 使用curl、tcpdump等工具排查线上请求异常，独立定位并解决Nginx配置错误及后端接口异常，月均处理故障5-8次\u003C\u002Fli>\n        \u003Cli>• 搭建基于\u002Fapi\u002Fhealth接口的轻量监控方案，实时采集服务运行指标，服务可用性达99.5%\u003C\u002Fli>\n      \u003C\u002Ful>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"bg-white\u002F10 rounded-xl p-3 md:p-4\">\n      \u003Cdiv class=\"flex justify-between items-start mb-1.5 md:mb-2\">\n        \u003Ch4 class=\"font-bold text-white text-sm md:text-base\">校内工作室\u003C\u002Fh4>\n        \u003Cspan class=\"text-xs md:text-sm text-white\u002F60 whitespace-nowrap ml-2\">2021.9 - 2025.6\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"text-xs md:text-sm text-white\u002F70 mb-2\">Web开发兼运维\u003C\u002Fp>\n      \u003Cul class=\"space-y-1 text-xs md:text-sm text-white\u002F80\">\n        \u003Cli>• 负责工作室3台Linux服务器的日常运维，包括Nginx反向代理配置、数据库备份恢复、防火墙策略配置及SSH安全加固\u003C\u002Fli>\n        \u003Cli>• 使用Shell和Python编写自动化脚本20余个，涵盖日志切割、数据定时备份、服务健康检查等\u003C\u002Fli>\n        \u003Cli>• 参与处理502\u002F504网关超时、磁盘空间写满、DNS解析异常等线上故障的定位与修复，平均响应时间30分钟内\u003C\u002Fli>\n      \u003C\u002Ful>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\u003C!-- 运维能力 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Ch3 class=\"text-base md:text-lg font-bold text-white mb-2 md:mb-3\">🔧 运维能力\u003C\u002Fh3>\n  \u003Cul class=\"space-y-1.5 md:space-y-2 text-xs md:text-[15px] text-white\u002F90 leading-relaxed\">\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>\u003Cstrong>服务器运维\u003C\u002Fstrong>：熟练管理阿里云ECS服务器，负责Nginx配置优化、防火墙策略配置及SSH安全加固\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>\u003Cstrong>容器化部署\u003C\u002Fstrong>：熟练使用Docker、Docker Compose，编写Dockerfile实现多服务编排，提升部署效率\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>\u003Cstrong>自动化运维\u003C\u002Fstrong>：熟练使用Python编写运维脚本，掌握日志切割、数据备份、健康检查等自动化工具\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>\u003Cstrong>故障排查\u003C\u002Fstrong>：具备线上故障独立排查能力，熟悉使用curl、tcpdump、netstat等工具定位问题\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>\u003Cstrong>安全加固\u003C\u002Fstrong>：掌握ufw\u002Fiptables防火墙配置、SSH密钥登录、fail2ban防暴力破解等安全措施\u003C\u002Fspan>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003Chr class=\"border-white\u002F20 my-3 md:my-4\">\n\n\u003C!-- 项目展示 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Ch3 class=\"text-base md:text-lg font-bold text-white mb-2 md:mb-3\">🚀 项目展示：本博客系统\u003C\u002Fh3>\n  \u003Cp class=\"text-white\u002F90 font-bold text-xs md:text-[15px] leading-[1.5rem] md:leading-[1.75rem] tracking-wide mb-2\">\n    \u003Cstrong>技术栈\u003C\u002Fstrong>：Nuxt 3 + FastAPI + Docker + Nginx + SQLite\n  \u003C\u002Fp>\n  \u003Cul class=\"space-y-1.5 md:space-y-2 text-xs md:text-[15px] text-white\u002F90 leading-relaxed\">\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>独立完成架构设计与线上部署运维，部署在阿里云ECS服务器\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>Docker容器化部署前后端服务，编写Dockerfile和docker-compose.yml\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>配置Nginx反向代理、SSL证书自动续期、ufw防火墙策略\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>自建健康检查接口，实时采集服务器状态指标\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>独立处理OOM宕机恢复、防火墙排查、SSL证书验证失败等复杂故障\u003C\u002Fspan>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n  \u003Cdiv class=\"mt-2 md:mt-3 flex gap-3 md:gap-4\">\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmycl0203\" target=\"_blank\" class=\"text-xs md:text-sm text-white\u002F80 hover:text-white hover:underline\">GitHub\u003C\u002Fa>\n    \u003Cspan class=\"text-xs md:text-sm text-white\u002F40\">|\u003C\u002Fspan>\n    \u003Cspan class=\"text-xs md:text-sm text-white\u002F60\">线上运行中\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\u003Chr class=\"border-white\u002F20 my-3 md:my-4\">\n\n\u003C!-- 教育背景 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Ch3 class=\"text-base md:text-lg font-bold text-white mb-2 md:mb-3\">🎓 教育背景\u003C\u002Fh3>\n  \u003Cdiv class=\"bg-white\u002F10 rounded-xl p-3 md:p-4\">\n    \u003Cdiv class=\"flex justify-between items-start\">\n      \u003Cdiv>\n        \u003Ch4 class=\"font-bold text-white text-sm md:text-base\">华中科技大学文华学院\u003C\u002Fh4>\n        \u003Cp class=\"text-xs md:text-sm text-white\u002F70\">软件工程 | 本科\u003C\u002Fp>\n      \u003C\u002Fdiv>\n      \u003Cspan class=\"text-xs md:text-sm text-white\u002F60 whitespace-nowrap ml-2\">2021.9 - 2025.6\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\n\u003C!-- 其他信息 -->\n\u003Cdiv class=\"mb-5 md:mb-6\">\n  \u003Ch3 class=\"text-base md:text-lg font-bold text-white mb-2 md:mb-3\">📋 其他信息\u003C\u002Fh3>\n  \u003Cul class=\"space-y-1.5 md:space-y-2 text-xs md:text-[15px] text-white\u002F90 leading-relaxed\">\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>英语四级（CET-4），可流畅阅读英文技术文档\u003C\u002Fspan>\n    \u003C\u002Fli>\n    \u003Cli class=\"flex items-start gap-2\">\n      \u003Cspan class=\"text-white\u002F60 mt-0.5\">•\u003C\u002Fspan>\n      \u003Cspan>持C1驾驶证，可配合现场工作及差旅\u003C\u002Fspan>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003Chr class=\"border-white\u002F20 my-3 md:my-4\">\n\n\u003C!-- 关于这个项目 -->\n\u003Cdiv>\n  \u003Cp class=\"text-white\u002F90 font-bold text-xs md:text-[15px] leading-[1.5rem] md:leading-[1.75rem] tracking-wide\">\n    \u003Cstrong>关于这个项目：\u003C\u002Fstrong>\n  \u003C\u002Fp>\n  \u003Cp class=\"text-white\u002F90 font-bold text-xs md:text-[15px] leading-[1.5rem] md:leading-[1.75rem] tracking-wide\">\n    这是我独立开发并运维的线上博客系统，从服务器配置到上线部署全程自己完成。选择 Nuxt 3 + FastAPI 技术栈，采用Docker容器化部署，实现一键部署与迁移。\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n","[\"bed\u002Farticles\u002F396075c57c054166bc563c6c660b0bd6.png\", \"bed\u002Farticles\u002F7977b13e.png\", \"bed\u002Farticles\u002F0e95f144e1114154889b3f8fa143035a.png\", \"bed\u002Farticles\u002F72764f58.png\", \"bed\u002Farticles\u002F996faaa650464f9b9664d711ebc1b2c1.png\", \"bed\u002Farticles\u002Fd3b38059c7c74dc19e2a83be50880d85.png\", \"bed\u002Farticles\u002F8ef2e53f.png\", \"bed\u002Farticles\u002F7a3be68eed034f088b55fb949606b539.png\", \"bed\u002Farticles\u002Fccf6c85d695a43498875e8ad369de53a.png\", \"bed\u002Farticles\u002Fdbba953c17614063be68ea4498fd52f6.png\", \"bed\u002Farticles\u002Fe47aabdeb84949dcbbcb076d77995346.png\", \"bed\u002Farticles\u002Ff0119a775f1a43ad9cfdcd9a39f57dd8.png\", \"bed\u002Farticles\u002F9ea947d8669f43c6a7618d3be9227a6d.png\", \"bed\u002Farticles\u002F0898412ca50447479d3be3e251f3b9b0.png\", \"bed\u002Farticles\u002F7536e30f79e842668d216fdc7f33350f.png\", \"bed\u002Farticles\u002F83d5e23f.png\", \"bed\u002Farticles\u002F5cb0668ab0874d708513dfc8a30290ca.png\", \"bed\u002Farticles\u002Fb439581461bb4dd2b71b04d4b2c57bc8.png\", \"bed\u002Farticles\u002F48b2cb62866e4ea890c4d59d68557e1c.png\", \"bed\u002Farticles\u002Fdeb73293de1a4c258b7cef81cc21ab22.png\", \"bed\u002Farticles\u002Fd9daf9188f664d5bbc6ed90fabd070af.png\", \"bed\u002Farticles\u002F7b97b2e9.png\", \"bed\u002Farticles\u002Fa92b424d.png\", \"bed\u002Farticles\u002Fc84b93c1.png\", \"bed\u002Farticles\u002F2f443b03a14d4d438373a25463ddaed3.png\", \"bed\u002Farticles\u002F3f4dd5368a004a7f91c6def2cf2bacc7.png\", \"bed\u002Farticles\u002F67a41989.png\", \"bed\u002Farticles\u002F0084589e4b184b308f39d8897bef26bf.png\", \"bed\u002Farticles\u002F6f82da9a7b9047db82cc1b347afeb04b.png\", \"bed\u002Farticles\u002F5f862b98d415463b8b706ed8ec64394b.png\", \"bed\u002Farticles\u002F9cd18da57d284a1288713b76248892f1.png\", \"bed\u002Farticles\u002Ffb6488078b904bb8a0a68bebd770f51c.png\", \"bed\u002Farticles\u002F74ebb653c6c846fe8d2fb787e4fbe94b.png\", \"bed\u002Farticles\u002F2ee8ae3543d44c72b7358d977aa4909c.png\", \"bed\u002Farticles\u002F58e427916bdd4ec4bc82681183cbb7fc.png\", \"bed\u002Farticles\u002F0f7ffa2a89c74980a5aa07fa39cafc7c.png\", \"bed\u002Farticles\u002F946cf1976b3f488a80645f6f8168afac.png\", \"bed\u002Farticles\u002F36ffa03877454bcba88ca10640f60839.png\", \"bed\u002Farticles\u002Fc782f9edfcc84ff2960d33c45d1d2daf.png\", \"bed\u002Farticles\u002F822dd33a6b3249c4b493b693c59222fa.png\", \"bed\u002Farticles\u002Fe8697dad166c4e148812977d6bc03f0b.png\", \"bed\u002Farticles\u002F97c507b67d5a4d9286425206c967d3c1.png\", \"bed\u002Farticles\u002Ffbd43bf9afbc4cb8b84c3b2fde4a5ff9.png\", \"bed\u002Farticles\u002F4c0a1158a53d4841b321365d24d9c524.png\", \"bed\u002Farticles\u002Fbd50789f6b614211ba18df922988cc43.png\", \"bed\u002Fmoments\u002F19cead66c3d84b07a9a45f71ca3acb87.png\", \"bed\u002Farticles\u002F7ec0d495.png\", \"bed\u002Farticles\u002F2a7d70050d4343338eda6cd9252b344b.png\", \"bed\u002Farticles\u002F19275ecb.png\", \"bed\u002Farticles\u002F39d490f1ffcb42adb11f36241b756341.png\", \"bed\u002Farticles\u002F23a44518.png\", \"bed\u002Farticles\u002Fe716cb18784b48549097284321ff07d2.png\", \"bed\u002Farticles\u002F988361d911c74779a636e2ddc0861989.png\", \"bed\u002Farticles\u002F6aa45a9f054f495798aec5a3614e1a50.png\", \"bed\u002Farticles\u002F556eecc9b4c347dd818cd95c580f7860.png\", \"bed\u002Farticles\u002Ff3c05963062f4e1f8a45d21511579551.png\", \"bed\u002Farticles\u002Ffc4bd6d91191471f9ea6d38aa4bb6435.png\", \"bed\u002Farticles\u002F3334863832cf46b2a11ea41e2841c687.png\", \"bed\u002Farticles\u002Fbab12fc0.png\", \"bed\u002Farticles\u002F5c24001e8c604ab98d4a373611c1831c.png\", \"bed\u002Farticles\u002F5f47a5fc.png\", \"bed\u002Farticles\u002F26c640c469c34f0697afe94f28981cc4.png\", \"bed\u002Farticles\u002F1cbbc9b7.png\", \"bed\u002Farticles\u002F11580f08.png\", \"bed\u002Farticles\u002F9e13fe37.png\", \"bed\u002Farticles\u002F4aadda4090e24cc2aab8ad00b5d7bdfb.png\", \"bed\u002Farticles\u002F7aee0d11df844d5faa3804b2d6d0b6ac.png\", \"bed\u002Farticles\u002Fd58b76144a8e474286c5ed3a376aee54.png\", \"bed\u002Farticles\u002F18aab4c3330c42169cf8aabc183be5e2.png\", \"bed\u002Farticles\u002F155da0c036b0445483c97aa69e074633.png\", \"bed\u002Farticles\u002F94ea4a21.png\", \"bed\u002Farticles\u002Fb8110422c75040ddb9cb8d8c8b25de31.png\", \"bed\u002Farticles\u002Fae145d3d.png\", \"bed\u002Farticles\u002F9dd87040721748c1bd2c7a3b43a68ae3.png\", \"bed\u002Farticles\u002Fd8451d56640a48a5a1d2067f269564ed.png\", \"bed\u002Farticles\u002F2828ea09f33647a2bd82d32e91609aed.png\", \"bed\u002Farticles\u002Fc6285af6b9ac40a6b2c27599d6ea63fd.png\", \"bed\u002Farticles\u002Ff456762157204e338ba07096589b3df1.png\", \"bed\u002Farticles\u002Fcdea6c86feb04fc6ba8e04f17d1a66fa.png\", \"bed\u002Farticles\u002Feefecc21920548b4857af96365ac1876.png\", \"bed\u002Farticles\u002F0db7ecf20df94444b42061ba62b8ab9e.png\", \"bed\u002Farticles\u002F35647319eb074197b658f5573eda21e5.png\", \"bed\u002Farticles\u002Fd008810436634a80aa7f32794be41b48.png\", \"bed\u002Farticles\u002Fceb7c6c318334f1d9b3bb44cc8748569.png\", \"bed\u002Farticles\u002F1e9799bf78964038b6c49883f438dc04.png\", \"bed\u002Farticles\u002F85f87277981f47f1820c00ab3d5ecfc2.png\", \"bed\u002Farticles\u002Fe1e06a0cacf44cbdb77ba9c140b2bd5e.png\", \"bed\u002Farticles\u002F7b05eb12da0f4406b29af378604844b6.png\", \"bed\u002Farticles\u002F5287688b.png\", \"bed\u002Farticles\u002F72ba41dbfd8642028190762289101aea.png\", \"bed\u002Farticles\u002Feca0ae17902341b088a18c6b10852109.png\", \"bed\u002Farticles\u002Fd701138610ef42c9a17f8002d8b7d8ac.png\", \"bed\u002Farticles\u002F1968c33bf97040b7a3054bc470f360bd.png\", \"bed\u002Farticles\u002F1b78f32d458446a49687f74f382bbc46.png\", \"bed\u002Farticles\u002Fb70a702550444f6686f04d9fde38975c.png\", \"bed\u002Farticles\u002F7b94ffd8eb3148caa47ce0daf5631ff2.png\", \"bed\u002Farticles\u002F8256453d14534717b1861166942e2a14.png\", \"bed\u002Farticles\u002F91fab46b00e14c97b464616eba6c9ecc.png\", \"bed\u002Farticles\u002Fa6abf03c9925490997b1759cac0ab556.png\", \"bed\u002Farticles\u002Fa18f4999.png\", \"bed\u002Fdefault\u002Fa1d9c7b8040e40d585e0692142d8cad1.jpg\", \"bed\u002Fbackground\u002Fcustom_font.woff2\", \"bed\u002Farticles\u002F60a8572e.png\", \"bed\u002Farticles\u002F0d0cf4c6b3c7465e8e90997792ab8ee8.png\", \"bed\u002Farticles\u002Fb916a72feea143c9b04bc69b4626c301.png\", \"bed\u002Farticles\u002Fca6dca39.png\", \"bed\u002Farticles\u002F49b679c8918e4743aa320f8b954cc699.png\", \"bed\u002Farticles\u002F7c7b937ed4974826af54a8aaccc1147d.png\", \"bed\u002Farticles\u002F6fd43d32185e459d83fffcfbd84a3120.png\", \"bed\u002Farticles\u002F13000820.png\", \"bed\u002Farticles\u002F9372437a3bbc4177b856ca2a5f04f0c2.png\", \"bed\u002Farticles\u002Fa57ec4961327481d9e1dcbc6a85cb03a.png\", \"bed\u002Farticles\u002Ff36c654f40ff4633a29865cb98c38ddc.png\", \"bed\u002Farticles\u002Ff0978fa5c320473ca1509c2e10cd68fe.png\", \"bed\u002Farticles\u002F3170251859c64675ab6f236405987771.png\", \"bed\u002Farticles\u002Fb080ca60.png\", \"bed\u002Farticles\u002Fe59f7f96460a4aa3b78fbe5e28cbfcee.png\", \"bed\u002Farticles\u002F9f5004b3d15440d08900b5c95f8f4905.png\", \"bed\u002Farticles\u002F5f0edd32a61943fc9af37503abcde57e.png\", \"bed\u002Farticles\u002F9b319083.png\", \"bed\u002Farticles\u002Fc8051345.png\", \"bed\u002Fmoments\u002F8006301cc8c946c8baa6133fc3ed69f0.png\", \"bed\u002Farticles\u002F899317c139064933988f52096f94d513.png\", \"bed\u002Farticles\u002F8d11deba311a401c9de983e6e501bcb8.png\", \"bed\u002Farticles\u002F56c65dde366b492abbdfbf7a331b9699.png\", \"bed\u002Farticles\u002F1d2e106ca58c4467af63b3cf948e9bed.png\", \"bed\u002Farticles\u002Fc956addc90074190a1b7241d1c9ffdb3.png\", \"bed\u002Farticles\u002Ffe1fd4635e124b5eb8f5d4e34db6102f.png\", \"bed\u002Farticles\u002F4208e460.png\", \"bed\u002Farticles\u002F187b035f86804d7e826816519dd3b742.png\", \"bed\u002Farticles\u002F6b61a478c4cc4dff88a5187db87f2630.png\", \"bed\u002Fmoments\u002Fe9c778effd324af6a06c3e86bdbfb4ce.png\", \"bed\u002Farticles\u002F4b175857.png\", \"bed\u002Farticles\u002Fa9c8db07ec554f18a220cd56a7c4b952.png\", \"bed\u002Farticles\u002F4e0fd7b873934af6ab02edc6b551e2e4.png\", \"bed\u002Farticles\u002Fa8373a7debd34855a463ec800544b0ac.png\", \"bed\u002Fdefault\u002F758a72eb0fe74a2295aeaee906a9503c.png\", \"bed\u002Farticles\u002Fabd67a6e9c11465ba93888d52cf8c14d.png\", \"bed\u002Farticles\u002Fbdff5f9f148f4c42ab3a2d4168006fb6.png\", \"bed\u002Farticles\u002F4801552158084f8487fd3396c696bb0b.png\", \"bed\u002Farticles\u002F1aa643b54372473f820dc73f911b034a.png\", \"bed\u002Farticles\u002F82705cde.png\", \"bed\u002Farticles\u002Fee0f407b13a2441fa21cbd34bdcb8c39.png\", \"bed\u002Farticles\u002F5743c013062c404e8aff252a5e39f3ed.png\", \"bed\u002Farticles\u002Fb215abe45cb54041969ce36e58089284.png\", \"bed\u002Farticles\u002Ffc07f95c36514ebda7a704a1e6b64f21.png\", \"bed\u002Farticles\u002F212f3d05958b4e24877298214e481cc8.png\", \"bed\u002Farticles\u002F8e96a955acff4abfb94e829773330e06.png\", \"bed\u002Farticles\u002Fd5cdebd71c1d4e13be1e6bd4f1b46558.png\", \"bed\u002Farticles\u002F2deb813d552f4f64b4b0cbbe8fc7eeb7.png\", \"bed\u002Farticles\u002F81150f90690146aba92cbf1574369f75.png\", \"bed\u002Farticles\u002F208753df9d854ad39616b3dd62823c40.png\", \"bed\u002Farticles\u002F05348caf.png\", \"bed\u002Farticles\u002F19eac8ab.jpeg\", \"bed\u002Farticles\u002F0d24e63dab434e5397a7a905e32871e2.png\", \"bed\u002Farticles\u002F12fe5fb7924047fcb788081d1382ee40.png\", \"bed\u002Farticles\u002F01fdbbceabca411cab07b2220270e0a8.png\", \"bed\u002Farticles\u002F133c5dabf3b749cdb48137990400ae49.png\", \"bed\u002Farticles\u002F2e66e0157ca44a1a9eaff23a17b909fb.png\", \"bed\u002Farticles\u002F7c2a254b5d6a43b38425fa6b64494773.png\", \"bed\u002Farticles\u002F1f190b3f9f1b433d976e9cb47534c3cd.png\", \"bed\u002Fsite\u002F1d7c500ed7a049f282b7e6e83b6b40f4.png\", \"bed\u002Farticles\u002Ff72a6cf3.png\", \"bed\u002Farticles\u002Ff044ca151123471596b2fb420ced8776.png\", \"bed\u002Farticles\u002Ff441fa6573f4447cb879c135d777a899.png\", \"bed\u002Farticles\u002F9373e42b.png\", \"bed\u002Farticles\u002F8494f265.png\", \"bed\u002Farticles\u002Fc63eb1f2d7684d23b6bb6a388a7acded.png\", \"bed\u002Farticles\u002F700b9ad0d1554dbcbc99cb567f29ef7b.png\", \"bed\u002Fbackground\u002Fb666b21659cc477daea62833a78c841f.jpeg\", \"bed\u002Farticles\u002F6145b8ae9d024d048a56565694a6e971.png\", \"bed\u002Farticles\u002Fed5c2832b5e84827a5751f3d50a58036.png\", \"bed\u002Farticles\u002Fe3159d4d36c94d22bde150269f9e10b7.png\", \"bed\u002Farticles\u002Fc9e8a0c64e5d48cb82434f84ba0d1a0f.png\", \"bed\u002Farticles\u002F7466bd16fba942bbb73f48c403e00d59.png\", \"bed\u002Farticles\u002F43f3e4a6.png\", \"bed\u002Farticles\u002Faac9624338a64806bfcd09af447551c7.png\", \"bed\u002Farticles\u002Ffaf4d358f31a4e4293cba513d3823d60.png\", \"bed\u002Farticles\u002Fc4adc8b26320464d9e3d8f38a4b4bbfe.png\", \"bed\u002Farticles\u002F1e0f4db6aea7441a90dae0cd6690f1a2.png\", \"bed\u002Farticles\u002F2f93f0a5.png\", \"bed\u002Farticles\u002Ffc7e1b2951ac49c4b22f8cb5ab58d68c.png\", \"bed\u002Farticles\u002Ff10741fb802a45acb114ae886af34186.png\", \"bed\u002Farticles\u002Fa28e7ce4.png\", \"bed\u002Farticles\u002F4570f907ec2f4d9b8fca32f73871d73e.png\", \"bed\u002Farticles\u002Fc7ab5a6511c247ffaf227b46fe798fc0.png\", \"bed\u002Farticles\u002Fc82fcfa777c64112af32e7a7c03e5b74.png\", \"bed\u002Farticles\u002Fb41c955c506d4aceb810837fd17ac643.png\", \"bed\u002Farticles\u002F9aa04f13145543a284607c7d13f233e2.png\", \"bed\u002Farticles\u002Fa99436929f2c419a94ee6c6e2da8cc07.png\", \"bed\u002Farticles\u002Fe4881d21.webp\", \"bed\u002Farticles\u002Fb78a30defc9e409994e51763ff200d30.png\", \"bed\u002Farticles\u002Fe608c92995d74400966a740d2f91b7e8.png\", \"bed\u002Farticles\u002F17c51fb0ced04693b7aadf1508442b92.png\", \"bed\u002Fmoments\u002Fa5a1a2827515402b9c5715defbb37d02.png\", \"bed\u002Farticles\u002F610f9b601a1a48a0aadb42ab6734eacd.png\", \"bed\u002Farticles\u002F0875c465.png\", \"bed\u002Farticles\u002F7998d3ed.png\", \"bed\u002Farticles\u002F150e237a3d22431a871ebc289a842505.png\", \"bed\u002Farticles\u002Fa6da435e.png\", \"bed\u002Farticles\u002Fb1ea6487.png\", \"bed\u002Farticles\u002Fd960986053cc4f339ad29aae5daf1523.png\", \"bed\u002Farticles\u002F72850a03f9e24d8b847841211661e0c9.png\", \"bed\u002Farticles\u002Fa88321a7.png\", \"bed\u002Farticles\u002Fa85617d1f8144396b6718a060fbac415.png\", \"bed\u002Farticles\u002Fb5285df693f54b9eaf6e7c48a70c929b.png\", \"bed\u002Farticles\u002F998a0bb6501842bfb504441d510f14e8.png\", \"bed\u002Farticles\u002F8539fa2c8a614492b97daf2cf40ae95e.png\", \"bed\u002Farticles\u002Fb7b0c47db9d84f63856daa197e8aedb2.png\", \"bed\u002Farticles\u002Ff8711ddacf804fca8160547482312f10.png\", \"bed\u002Farticles\u002Fa5dcfaf7b59745d4b830d009566554a0.png\", \"bed\u002Farticles\u002F034de911.png\", \"bed\u002Farticles\u002F609efb4629e648edab205477118c3499.png\", \"bed\u002Farticles\u002Fwxco-chat-record-extractor.png\", \"bed\u002Farticles\u002F7287b218d9124b49b39805fdb7ddc758.png\", \"bed\u002Farticles\u002F13a1434ec8d34dfc8c1230ec72965ee9.png\", \"bed\u002Farticles\u002F28082dc42d584e969e26cb68049b3e93.png\", \"bed\u002Farticles\u002F5455d7c6fbbe4a4f83957ba55af68952.png\", \"bed\u002Farticles\u002Fbac9b21264364092b1539d492c44ac0e.png\", \"bed\u002Farticles\u002F74a0f1c9ac4c48418e21808c8c0e888f.png\", \"bed\u002Farticles\u002F0bd452cd8aa44b6d90afb4d1b27e7e8a.png\", \"bed\u002Farticles\u002F2a56aac7d9a1441c87ee8e77dc619c50.png\", \"bed\u002Farticles\u002F72c6e4dd.png\", \"bed\u002Fmoments\u002F64fca5d30e274020b47fda48ae69f19f.png\", \"bed\u002Fmoments\u002Fd07dbb946ed246d8bcc5bf7c4736b393.png\", \"bed\u002Farticles\u002F9cc6461986f24057a1fa6acaa004b6b5.png\", \"bed\u002Farticles\u002Fc79a2627.png\", \"bed\u002Farticles\u002F66a4078ebe664d86be08c226312ac518.png\", \"bed\u002Farticles\u002F3ad1676e6a1f44daa5f057515b9e6b4c.png\", \"bed\u002Farticles\u002F5463e7b19c314fb0925c2e464ec75df6.png\", \"bed\u002Farticles\u002F1073168f94424aea99f77421615d219d.png\", \"bed\u002Farticles\u002F11bb41881da94641b2fb335c46e5fe54.png\", \"bed\u002Farticles\u002Ff86f6e045dec4b06a152cd405b575f8d.png\", \"bed\u002Farticles\u002F7aa1de23.png\", \"bed\u002Farticles\u002F32b74a1f80b142a28087cb61f63375ef.png\", \"bed\u002Farticles\u002F4e800c1deffd4971958129141133cf04.png\", \"bed\u002Farticles\u002F2bdbf3bf.png\", \"bed\u002Farticles\u002Fd58121fb65fe488781431519a17888a3.png\", \"bed\u002Farticles\u002F634e2152d70440e5a960b511d939ca6c.png\", \"bed\u002Farticles\u002Fcd7a795c9c6e4bb099fc0a68339c2599.png\", \"bed\u002Farticles\u002Ffaf8181b48ce4975a243c098ea93204d.png\", \"bed\u002Farticles\u002F8baeecf6e12d4a93a7ddac7abd6e88cb.png\", \"bed\u002Farticles\u002F346ba0f4da9a486f828c2fe8f683bf16.png\", \"bed\u002Fsite\u002F1eada21961444b36a2de539a7c336b51.png\", \"bed\u002Farticles\u002F9928f239dc1049a8a7a76dee8f54d6d8.png\", \"bed\u002Farticles\u002F4ad48518.png\", \"bed\u002Farticles\u002F25029c22e66247a39418ace31e28c3d1.png\", \"bed\u002Farticles\u002Fb276157f0b8c4293b2bfee524a45a4d2.png\", \"bed\u002Farticles\u002Fd0cbe86e92bf4f31945b4f0e75cea109.png\", \"bed\u002Farticles\u002Ff3b38c9ec9e241f69a98ab3d4aab6efc.png\", \"bed\u002Farticles\u002F69cdcc56.png\", \"bed\u002Farticles\u002F439e7ada64e541dfb74f18b55e7012f1.png\", \"bed\u002Farticles\u002F4d2fbdeb.png\", \"bed\u002Farticles\u002F20369fa409dd4812b1e3b635ce29ea0a.png\", \"bed\u002Farticles\u002F74b6c189c71242aba255880fe93899f9.png\", \"bed\u002Farticles\u002Fe0a1beb3e21e4bd8973c3566f255e7ad.png\", \"bed\u002Farticles\u002F6ce22c315257418da55875483668c806.png\", \"bed\u002Farticles\u002Fd8cf96c53c354296b39db9afbe0cb431.png\", \"bed\u002Farticles\u002F88d7b13070094e7da0e2dffae3d14d25.png\", \"bed\u002Farticles\u002F34c4195c.png\", \"bed\u002Farticles\u002Fcfa08c55.png\", \"bed\u002Farticles\u002Fd5fab1a2a1864544ac7ec1060f025650.png\", \"bed\u002Farticles\u002Fcc3ab11d.png\", \"bed\u002Farticles\u002F55e7ac1bfa18459684e7f1ac6704a200.png\", \"bed\u002Farticles\u002Ffab66757.png\", \"bed\u002Farticles\u002Fd955311a.png\", \"bed\u002Farticles\u002F0fb452d4f5864fa9b6e7ddb9f00ad4b6.png\", \"bed\u002Farticles\u002Fbb9b73b7a0544d9694e6bd3f86295cbf.png\", \"bed\u002Farticles\u002F1f00e6c3.png\", \"bed\u002Farticles\u002F07d90524.png\", \"bed\u002Farticles\u002F79f16554745a4d77a79b10a095e91fc5.png\", \"bed\u002Farticles\u002Ff8987560.png\", \"bed\u002Farticles\u002Fa956890ea05d4911a51fb111751c6f6b.png\", \"bed\u002Farticles\u002Fba648a66087c474890d9ba3ba7a28f9f.png\", \"bed\u002Farticles\u002Fc3aa1ee5.png\", \"bed\u002Farticles\u002Fafc04840d0e044a9bce78d13e296d0db.png\", \"bed\u002Farticles\u002F4b6010cb.png\", \"bed\u002Farticles\u002Fe20392c4e1004dd0a303d70c6b953610.png\", \"bed\u002Farticles\u002F604a6dd6c9d24f86895d7732b0476cf3.png\", \"bed\u002Farticles\u002F0753f81543f94db88a58dee9ab1f1e9c.png\", \"bed\u002Farticles\u002F6fb4afa1aae842c68806256875ce7a45.png\", \"bed\u002Farticles\u002Fe10c83c6425a48e388faa4c044d9d2b0.png\", \"bed\u002Farticles\u002Fcd3706326e524d5bb2e695908097b1c5.png\", \"bed\u002Farticles\u002F2f6adbbe.png\", \"bed\u002Farticles\u002F9e2f3079b45e4e7fa1cab2036e845338.png\", \"bed\u002Farticles\u002F5468c6669fb64fe19781ad7a58c77f4d.png\", \"bed\u002Farticles\u002F66a284f050314c1a831ac13b87111175.png\", \"bed\u002Farticles\u002F79a7890366b14a11a7a2d301d8c8aaaa.png\", \"bed\u002Farticles\u002F3fc8817b869c40728c7f4ddae0551443.png\", \"bed\u002Farticles\u002F7b04ff48875b46cc897da932cd11a0ff.png\", \"bed\u002Farticles\u002F80c71500.png\", \"bed\u002Farticles\u002Fa54dc726a2864c5b8c292eec32af3052.png\", \"bed\u002Farticles\u002F9ee3250116f24c2b967bf62cb8b703d5.png\", \"bed\u002Farticles\u002F94a98ed10af74b59a9575d6bdbb11fb0.png\", \"bed\u002Farticles\u002F426cbf4dbe4a4c84a5792d361f4fbc15.png\", \"bed\u002Farticles\u002F49082910.png\", \"bed\u002Farticles\u002F9c0e6abb.png\", \"bed\u002Farticles\u002F60e002dc1e7f437589bdabf8de29d170.png\", \"bed\u002Farticles\u002F858940bad0e647d09c22d44516ddb8c6.png\", \"bed\u002Farticles\u002Ff8dcdf76d2124302b598d3680eb71ce1.png\", \"bed\u002Farticles\u002F7b226ebb.png\", \"bed\u002Farticles\u002F01e9c48b64744f5980d4ebe81b580ccc.png\", \"bed\u002Farticles\u002Fd1d6bd49.png\", \"bed\u002Farticles\u002Ff758ce1b313e443c9c4386ded9c10c61.png\", \"bed\u002Farticles\u002F1f2dc4330c044063be85c58ce3ff9218.png\", \"bed\u002Farticles\u002F3d1475e7.png\", \"bed\u002Farticles\u002F66aaadf2b40e45b88afe6e10bf4df35c.png\", \"bed\u002Farticles\u002F8abb40e30c1a48329144b0f43f0a504e.png\", \"bed\u002Farticles\u002Fd5957d6b5fbc4326a81a9e625adc2abd.png\", \"bed\u002Farticles\u002Fc2c876161aca4deb9bcc7d5ca00b255a.png\", \"bed\u002Farticles\u002F62e4921f372d47559ab85e69df6bdd29.png\", \"bed\u002Farticles\u002F9532aafd75734d928f270877d4d9de76.png\", \"bed\u002Farticles\u002Ffd9b363698804cf8bc94167e3cd8ba1c.png\", \"bed\u002Farticles\u002F68f4b0d8.png\", \"bed\u002Farticles\u002F291c872c46f74da0998659483055fd91.png\", \"bed\u002Farticles\u002F9b4d36a0.png\", \"bed\u002Farticles\u002F51774c0cccef4ad9be3934ff6c5c422d.png\", \"bed\u002Farticles\u002F5b39df03b8474219a0568141b40939a4.png\", \"bed\u002Farticles\u002F96b32f58657c4290a787afe6af005fd2.png\", \"bed\u002Farticles\u002F1220bf6e350447d7a9735987d0f54e56.png\", \"bed\u002Farticles\u002F12418beef64942e791e969efdb208e11.png\", \"bed\u002Farticles\u002F8dfe206889ea4086845c67b3f35f3df6.png\", \"bed\u002Farticles\u002F90da0c3ff2224d4687de49e7d319a728.png\", \"bed\u002Farticles\u002F4f2aade0.png\", \"bed\u002Farticles\u002F1184a174e0454a7bb75e90b54fc52e16.png\", \"bed\u002Farticles\u002Fd9c3a075a1ac4aadb5f05798cf48f70b.png\", \"bed\u002Farticles\u002Fd39a03163b4f4594a14a432e94aa2ce6.png\", \"bed\u002Farticles\u002Fb6a38bb143484f8f96a1c10ba73ec107.png\", \"bed\u002Farticles\u002Fd87f4782.png\", \"bed\u002Farticles\u002F5101e114e52343a097057ba89abc703b.png\", \"bed\u002Farticles\u002F6390c051.png\", \"bed\u002Farticles\u002F85b06c798f0f43109f32723d78d9d568.png\", \"bed\u002Farticles\u002Fd29445e7efb446b5a7bf42aa80567b97.png\", \"bed\u002Farticles\u002F145cd7507ae9497f8d24346103f52c76.png\", \"bed\u002Farticles\u002F339b2023e10e4aafaf7d24fa6b52a4a6.png\", \"bed\u002Farticles\u002Fbadd9284c5bd4ee893a558d76f306d24.png\", \"bed\u002Farticles\u002F0a69833157b64ecd9139ae8b5b015ed9.png\", \"bed\u002Farticles\u002F26eb0e985c004325bdfd315abcd6e02c.png\", \"bed\u002Farticles\u002F71442419ee664de2b64b6c30d359c775.png\", \"bed\u002Farticles\u002F9423c882e10e4194bc0c54e74f7f1584.png\", \"bed\u002Farticles\u002Ff79e779b818146e0ac2ce75dd4633e19.png\", \"bed\u002Farticles\u002F44cb59f5c56e4693b30c5ef57dc52a79.png\", \"bed\u002Farticles\u002F64548b62c5374b5b888436c9009c2dc1.png\", \"bed\u002Farticles\u002Fcc3aae33.png\", \"bed\u002Farticles\u002F9f889e1519d748cb8b6d8251c69db09d.gif\", \"bed\u002Farticles\u002Fc18ccb65ed004b2193395991e450f7d0.png\", \"bed\u002Farticles\u002Fbe14b516e06a4d5f80443cb822176989.png\", \"bed\u002Farticles\u002F8141ce0f32a744a99385fc216a6ac865.png\", \"bed\u002Farticles\u002Fcb07e92bb8b646e2b005fedff38d4f33.png\", \"bed\u002Farticles\u002F64517569f2d245fca1bea9b187eeb469.png\", \"bed\u002Farticles\u002F89e4861c.png\", \"bed\u002Farticles\u002Fff2d0518c4b1491c853f43412c3afbd0.png\", \"bed\u002Farticles\u002Ffb3019ca.png\", \"bed\u002Farticles\u002F94de0cf476f7439391ef15b29e6d5e9d.png\", \"bed\u002Farticles\u002Fac178a9872ae446da2f29d7cf3c3d353.png\", \"bed\u002Farticles\u002Ffdf231d5db3149e4aee3e09c1fed0ef3.png\", \"bed\u002Farticles\u002Fafdd59be.png\", \"bed\u002Farticles\u002Fb313126151cb4f729047593e3eb22ea0.png\", \"bed\u002Farticles\u002F46b93a3c.png\", \"bed\u002Farticles\u002Fe3f040b361dc4b119a4c3afbaa1866af.png\", \"bed\u002Farticles\u002F861de2a9d75c4e4785784e12139c3323.png\", \"bed\u002Farticles\u002F5ebb1aecaa864629bdad6be8a7ae49a4.png\", \"bed\u002Farticles\u002F1209c39bbba549dc8afb852e5db076f4.png\", \"bed\u002Farticles\u002Fca55787c76a348f697c69944e569f44d.png\", \"bed\u002Farticles\u002Fc67a20cef7704793832b5d26d90aeb5b.png\", \"bed\u002Farticles\u002F8d1b9f621d384adab19e2f9069e16231.png\", \"bed\u002Farticles\u002F6fe08092f1164c05a4d3462cc77b68e5.png\", \"bed\u002Farticles\u002Fe07c246b094247f6b1559adb44c3e504.png\", \"bed\u002Farticles\u002Fcovers\u002F6dd75bb7397043a186c001faca908fca.png\", \"bed\u002Farticles\u002Fcef76743c63e470ab846803857cfd167.png\", \"bed\u002Farticles\u002Fea14dae1bb624632bf15d20092e92d74.png\", \"bed\u002Farticles\u002F2397bfaab5aa4b5aa67271791a85e39e.png\", \"bed\u002Farticles\u002Fb9ee5172.png\", \"bed\u002Farticles\u002Fd4f19b5736cb41228abf9f40dc584753.png\", \"bed\u002Farticles\u002Fb11ed0dc85d744d289365702440bac32.png\", \"bed\u002Farticles\u002Fd74967da10a54e9a886efbb07b939066.png\", \"bed\u002Farticles\u002Fa7e4be3297154298804df4f8dfb55d8d.png\", \"bed\u002Farticles\u002Fe988ee2baa694dd991969b77183f2dd2.png\", \"bed\u002Farticles\u002F596a3ea5c02245f189f1cb915d67cc94.png\", \"bed\u002Farticles\u002Fc1e50146.png\", \"bed\u002Farticles\u002F14087c1961d94763bad772ed888e9107.png\", \"bed\u002Farticles\u002F60d9a7356dc5449d813a14198fa4eaa4.png\", \"bed\u002Farticles\u002F06cf386d20904cb0b5148bf850bf2b77.png\"]","\u002Fuploads\u002Fbed\u002Fsite\u002F1eada21961444b36a2de539a7c336b51.png","一只无趣的猴子,没有个性,所以没有签名","true","vue3@foxmail.com","smtp.qq.com","465","[\"articles\",\"views\",\"runtime\",\"api\",\"nuxt\",\"disk\",\"memory\",\"moments\",\"comments\",\"uptime\",\"words\",\"db\"]","{\"articles\":0,\"uptime\":3000,\"runtime\":2980,\"memory\":6,\"disk\":0,\"comments\":50}","{\"articles\":\"left\",\"views\":\"right\",\"runtime\":\"right\",\"words\":\"right\",\"moments\":\"left\",\"tags\":\"right\",\"comments\":\"left\",\"disk\":\"right\",\"memory\":\"right\",\"uptime\":\"right\",\"api\":\"right\",\"db\":\"right\",\"nuxt\":\"right\"}","关于本站和我","🤝友情链接(个人链接)","#0ea5e9","#0284c7","\u002Fuploads\u002Fbed\u002Fbackground\u002Fcustom_font.woff2","false","    欢迎！这里没有华丽的包装,只有一个年轻人真实的成长和记录，一起学习，所有功能独立开发部署，堆积着个人生活和技术的小仓库，后续慢慢补充以前的文档；\n    无登录，均匿名，海内存知己，欢迎各位的来访！","👋 你好","","#334155","97","10000","1000","[{\"name\": \"ShowAPI IP查询\", \"url\": \"https:\u002F\u002Froute.showapi.com\u002F20-1?appKey={token}&ip={ip}\", \"token\": \"94c826C59DAf4678a17308f3f0C56644\", \"note\": \"万维易源,精确到县区100次\u002F天\", \"enabled\": true}, {\"name\": \"ipgeolocation.io\", \"url\": \"https:\u002F\u002Fapi.ipgeolocation.io\u002Fv3\u002Fipgeo?apiKey={token}&ip={ip}\", \"token\": \"07a5c93b3cb2459b90ef377cad9dc41d\", \"note\": \"精度到城市;此key曾硬编码进代码,已经换新-1k\u002F月\", \"enabled\": true}, {\"name\": \"ip-api.com\", \"url\": \"http:\u002F\u002Fip-api.com\u002Fjson\u002F{ip}?lang=zh-CN\", \"token\": \"\", \"note\": \"免费接口,精度一般\", \"enabled\": false}]","[{\"ip\": \"118.212.158.13\", \"note\": \"\"}, {\"ip\": \"223.160.216.231\", \"note\": \"\"}, {\"ip\": \"66.249.79.76\", \"note\": \"\"}, {\"ip\": \"66.249.79.64\", \"note\": \"\"}, {\"ip\": \"66.249.79.65\", \"note\": \"\"}, {\"ip\": \"223.160.218.70\", \"note\": \"\"}, {\"ip\": \"44.222.133.103\", \"note\": \"\"}, {\"ip\": \"47.243.76.182\", \"note\": \"\"}, {\"ip\": \"34.122.147.229\", \"note\": \"\"}, {\"ip\": \"35.172.150.50\", \"note\": \"\"}, {\"ip\": \"42.194.240.188\", \"note\": \"\"}, {\"ip\": \"66.249.68.3\", \"note\": \"\"}, {\"ip\": \"36.255.112.149\", \"note\": \"\"}, {\"ip\": \"223.160.219.64\", \"note\": \"\"}, {\"ip\": \"127.0.0.1\", \"note\": \"\\u672c\\u5730\"}, {\"ip\": \"223.160.217.23\", \"note\": \"\"}, {\"ip\": \"115.152.4.59\", \"note\": \"\"}, {\"ip\": \"118.212.158.206\", \"note\": \"\"}, {\"ip\": \"223.160.219.94\", \"note\": \"\"}]","[{\"ip\": \"46.152.18.192\", \"note\": \"\"}]","5","75","别老叽霸扫描爆破后台了，个人博客能存啥有价值的东西,有这时间不如去扫俩放片的网站","my-test-key-289354","[\"articles\",\"moments\",\"licenses\",\"short-links\",\"web-hosting\"]","#c23dff","[\"articles\",\"moments\",\"site\",\"background\"]","个人简介","关于本站","\u003Cdiv>\n\n  \u003Cdiv style=\"background: linear-gradient(135deg, rgba(59,130,246,.14), rgba(139,92,246,.10)); border: 1px solid rgba(255,255,255,.12); border-radius: 16px; padding: 22px 24px; margin-bottom: 18px;\">\n    \u003Ch3 style=\"margin: 0 0 10px; font-size: 20px; letter-spacing: .5px;\">👋 你好，欢迎来到我的站点\u003C\u002Fh3>\n    \u003Cp style=\"margin: 0; line-height: 1.9; font-size: 15px;\">这里是我亲手搭建的个人博客 —— 由 \u003Ccode style=\"background: rgba(0,0,0,.28); padding: 2px 7px; border-radius: 5px; font-size: 13px;\">Nuxt 3 + FastAPI + SQLite\u003C\u002Fcode> 驱动，前后端、部署、运维全部自己动手。写代码、踩坑、记录，也分享一些有意思的个人项目。\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003Ch3 style=\"font-size: 17px; margin: 22px 0 10px;\">📖 关于本站\u003C\u002Fh3>\n  \u003Cp style=\"line-height: 1.9; font-size: 15px; margin: 0;\">博客的每一行代码、每一次部署都由我独立完成。文章以「实战」为主 —— 不只讲怎么做，更讲为什么这么做、以及踩过的坑，希望能给同样在路上的你一些参考。\u003C\u002Fp>\n\n  \u003Ch3 style=\"font-size: 17px; margin: 22px 0 10px;\">🧰 博客里有什么\u003C\u002Fh3>\n  \u003Cdiv style=\"display: flex; flex-wrap: wrap; gap: 10px;\">\n    \u003Cdiv style=\"flex: 1 1 45%; min-width: 150px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.10); border-radius: 12px; padding: 14px;\">\n      \u003Cdiv style=\"font-size: 20px;\">✍️\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-weight: 600; margin-top: 6px;\">技术文章\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-size: 13px; opacity: .8; margin-top: 4px; line-height: 1.6;\">Vue \u002F Nuxt、FastAPI、Linux 运维、nginx 等实战经验\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv style=\"flex: 1 1 45%; min-width: 150px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.10); border-radius: 12px; padding: 14px;\">\n      \u003Cdiv style=\"font-size: 20px;\">💬\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-weight: 600; margin-top: 6px;\">碎念与随笔\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-size: 13px; opacity: .8; margin-top: 4px; line-height: 1.6;\">简短的心情记录与随想，随手记下瞬间\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv style=\"flex: 1 1 45%; min-width: 150px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.10); border-radius: 12px; padding: 14px;\">\n      \u003Cdiv style=\"font-size: 20px;\">🔗\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-weight: 600; margin-top: 6px;\">短链\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-size: 13px; opacity: .8; margin-top: 4px; line-height: 1.6;\">把长链接压缩成好记的短码，分享更轻松\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv style=\"flex: 1 1 45%; min-width: 150px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.10); border-radius: 12px; padding: 14px;\">\n      \u003Cdiv style=\"font-size: 20px;\">🖼️\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-weight: 600; margin-top: 6px;\">图床\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-size: 13px; opacity: .8; margin-top: 4px; line-height: 1.6;\">图片托管，一键上传复制外链\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv style=\"flex: 1 1 45%; min-width: 150px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.10); border-radius: 12px; padding: 14px;\">\n      \u003Cdiv style=\"font-size: 20px;\">📦\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-weight: 600; margin-top: 6px;\">网盘\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-size: 13px; opacity: .8; margin-top: 4px; line-height: 1.6;\">加密分享文件，设密码、限次数、可过期\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv style=\"flex: 1 1 45%; min-width: 150px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.10); border-radius: 12px; padding: 14px;\">\n      \u003Cdiv style=\"font-size: 20px;\">🌐\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-weight: 600; margin-top: 6px;\">网页托管\u003C\u002Fdiv>\n      \u003Cdiv style=\"font-size: 13px; opacity: .8; margin-top: 4px; line-height: 1.6;\">上传静态网页 zip，一键发布访问\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Ch3 style=\"font-size: 17px; margin: 22px 0 10px;\">🧭 内容方向\u003C\u002Fh3>\n  \u003Cul style=\"line-height: 1.9; font-size: 15px; margin: 0; padding-left: 20px;\">\n    \u003Cli>前后端开发与个人项目实践\u003C\u002Fli>\n    \u003Cli>解决问题的思路与踩坑记录\u003C\u002Fli>\n    \u003Cli>效率工具与折腾心得\u003C\u002Fli>\n    \u003Cli>偶尔的生活随笔与碎念\u003C\u002Fli>\n  \u003C\u002Ful>\n\n  \u003Cdiv style=\"background: rgba(34,197,94,.08); border: 1px solid rgba(34,197,94,.18); border-radius: 12px; padding: 14px 18px; margin-top: 20px;\">\n    \u003Cp style=\"margin: 0; line-height: 1.8; font-size: 14px;\">💡 \u003Cb>交流\u003C\u002Fb>：欢迎在文章评论区留言，或通过首页的社交链接找到我。如果你也喜欢折腾技术，随时来聊聊。\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n\u003C\u002Fdiv>","{\"lines\":25,\"arcs\":25,\"wave_lines\":8,\"noise\":1500,\"amplitude\":15,\"rotation\":34,\"char_len\":4}","90","[\"127.0.0.1\", \"118.212.158.206\", \"152.32.212.152\", \"223.160.216.153\"]","{\"lock_threshold\": \"5\", \"lock_duration\": \"300\", \"auto_ban_threshold\": \"10\", \"auto_ban_duration\": \"86400\", \"middleware_enabled\": \"True\", \"block_on_malicious_ua\": \"True\"}","[{\"name\": \"今日总结\", \"content\": \"今日总结:\\n    \"}, {\"name\": \"技术备忘\", \"content\": \"记录一个开发小技巧：\"}, {\"name\": \"心情随笔\", \"content\": \"此刻的心情是：\"}, {\"name\": \"生活日常\", \"content\": \"今天发生了这样一件事：\"}]","normal","{\"8.156.84.203\": 1}","[{\"time\": \"2026-08-27 11:29:17\", \"type\": \"service\", \"message\": \"后端服务(127.0.0.1:8001)无响应\", \"value\": 0, \"threshold\": 0}]","{\"window\":60,\"max\":2}","[{\"key\":\"home\",\"to\":\"\u002F\",\"label\":\"首页\",\"enabled\":true},{\"key\":\"categories\",\"to\":\"\u002Fcategories\",\"label\":\"分类\",\"enabled\":true},{\"key\":\"tags\",\"to\":\"\u002Ftags\",\"label\":\"标签\",\"enabled\":true},{\"key\":\"pan\",\"to\":\"\u002Fpan\",\"label\":\"网盘\",\"enabled\":true},{\"key\":\"uploads\",\"to\":\"\u002Fuploads\",\"label\":\"图床\",\"enabled\":true},{\"key\":\"host\",\"to\":\"\u002Fhost\",\"label\":\"托管\",\"enabled\":true},{\"key\":\"short\",\"to\":\"\u002Fshort\",\"label\":\"短链\",\"enabled\":true},{\"key\":\"moments\",\"to\":\"\u002Fmoments\",\"label\":\"碎念\",\"enabled\":true},{\"key\":\"about\",\"to\":\"\u002Fabout\",\"label\":\"关于\",\"enabled\":true}]","3","60","0",{"active_scale":64,"active_translate_y":62,"bare_bg_opacity":65,"bare_bg_opacity_dark":66,"bare_blur":67,"bg_opacity":68,"bg_opacity_dark":69,"blur":70,"border_opacity":71,"border_radius":72,"hover_scale":64,"hover_translate_y":64,"l_bg_opacity":73,"l_bg_opacity_dark":74,"l_blur":40,"l_border_opacity":75,"mobile_flat_card":76,"nav_border_radius":77,"nav_padding_x":78,"nav_padding_y":79,"padding":80,"shadow_intensity":61,"t_bg_opacity":81,"t_bg_opacity_dark":71,"t_blur":72,"t_border_opacity":71,"t_shadow_intensity":61},"1","0.15","0.06","8","0.2","0.6","50","0.4","30","0.05","0.03","0.3","flat","0.5","0.75","0.375","1.5","0.1",{"title":83,"slug":84,"content_md":85,"summary":86,"cover_image":87,"category_id":88,"is_published":89,"is_top":90,"top_order":91,"is_deleted":90,"allow_comment":89,"meta":92,"id":93,"view_count":94,"created_at":95,"updated_at":96,"published_at":95,"category":97,"tags":101},"项目实战:从 0 到 1 写一个微信聊天记录提取工具","wxco-wechat-chat-record-extractor","# 从 0 到 1 写一个微信聊天记录提取工具\n\n> 作者：leap\n> 日期：2026-08-28\n> 个人博客：https:\u002F\u002Fvue2.xyz\n\n---\n\n## 前言\n\n电脑版微信的聊天记录都封在本地数据库里，官方不提供导出，想备份或检索只能干瞪眼。数据库本身是 SQLCipher 加密的，直接打开是一堆乱码，密钥还藏在微信进程内存里。于是我做了一个叫 wxco 的工具，从密钥提取、数据库解密，到桌面 GUI 和 Agent 的 MCP 接入，一套全打通。这篇文章把整个过程按开发顺序记录下来，包括踩过的坑。\n\n---\n\n## 第一步：摸清微信的数据结构\n\n### 1.1 数据藏在哪里\n\n电脑版微信 4.x 登录后，聊天数据都在一个叫 `db_storage` 的目录下，里面按模块分了库：\n\n- `session\u002Fsession.db`：会话列表\n- `message\u002Fmsg_*.db`：按时间分库的消息表\n- `contact\u002Fcontact.db`：联系人\n- `message\u002Fmedia_0.db`：语音等媒体索引\n\n每个库都是 SQLCipher 加密的，不是标准 SQLite。密码学的部分其实不复杂——SQLCipher 用 AES-256-CBC 按页加密，4096 字节一页。麻烦的是密钥：**每个数据库的加密密钥都写在微信进程的内存里**，磁盘上找不到。\n\n### 1.2 页结构里的关键信息\n\n读第一个页（page 1）能拿到三样东西：\n\n```python\nPAGE_SZ = 4096   # 一页大小\nSALT_SZ = 16     # salt 长度（页首）\nRESERVE_SZ = 80  # 页尾保留区：IV(16) + HMAC-SHA512(64)\n\nsalt = db_page1[:SALT_SZ]            # 页首 16 字节是 salt\niv   = db_page1[PAGE_SZ - 80: PAGE_SZ - 80 + 16]  # 页尾偏移处的 IV\n```\n\n**原理**：SQLCipher 的每个库都有独立的 salt，解密密钥就是 `enc_key + salt` 派生的。salt 可以从磁盘库直接读到，所以只要拿到内存里的 `enc_key`，就能解开。\n\n**优势**：把「破解数据库」的问题，转化成了「从进程内存里找密钥」的问题——后者有迹可循。\n\n---\n\n## 第二步：提取密钥——最难啃的骨头\n\n### 2.1 定位 Config.Cipher 对象\n\n微信进程里有一个叫 `com.Tencent.WCDB.Config.Cipher` 的全局配置对象，数据库密钥都放在它的一个 blob 字段里。思路是先在进程内存里找到这个特征字符串，再顺着指针找到对象本体。\n\n流程是这样的：\n\n```mermaid\nflowchart TD\n    A[打开微信进程] --> B[VirtualQueryEx 枚举可读内存区域]\n    B --> C[ReadProcessMemory 逐块读取]\n    C --> D{找到 Config.Cipher 特征串?}\n    D -->|否| C\n    D -->|是| E[顺着对象指针读 blob]\n    E --> F[用固定 XOR mask 解码]\n    F --> G[正则提取 key+salt 对]\n    G --> H{用 salt 匹配磁盘库?}\n    H -->|是| I[PBKDF2+HMAC 验证密钥]\n    I --> J[写入密钥缓存]\n    H -->|否| G\n```\n\n核心代码大概是这个套路：\n\n```python\ndef extract_db_keys(db_dir, pid=None):\n    h = kernel32.OpenProcess(0x0010 | 0x0400, False, pid)\n    # 1. 枚举所有已提交的可读内存区域\n    regions = _enum_regions(h)\n    # 2. 找到 Config.Cipher 特征字符串的地址\n    addrs = _find_bytes(h, regions, CONFIG_CIPHER_NAME)\n    # 3. 顺着对象指针找到 blob，XOR 解码\n    decoded = _xor_repeat(blob, CONFIG_XOR_MASK)\n    # 4. 正则提取 x'\u003C64位key>\u003C32位salt>' 形式的密钥对\n    for key_hex, salt_hex in _parse_config_blob(decoded):\n        _record_matching_keys(db_files, key_map, remaining, key_hex, salt_hex)\n```\n\n**原理**：`VirtualQueryEx` 枚举进程内存区域，`ReadProcessMemory` 读出来，按特征字符串和指针结构逐步定位到加密密钥的 blob。解码后的 blob 里以 `x'\u003C64位key>\u003C32位salt>'` 的形式内嵌所有库的密钥。\n\n**优势**：不用爆破，一次内存扫描直接还原全部库密钥；拿到 salt 后还能反过来和磁盘库逐一配对、验证。\n\n### 2.2 密钥验证：不能拿到什么就用什么\n\n内存里扫出来的候选密钥必须验证过才敢信——用 HMAC 校验页面完整性：\n\n```python\ndef verify_enc_key(enc_key, db_page1):\n    salt = db_page1[:SALT_SZ]\n    mac_salt = bytes(b ^ 0x3A for b in salt)          # mac_salt 由 salt 异或 0x3A 得到\n    mac_key = hashlib.pbkdf2_hmac(\"sha512\", enc_key, mac_salt, 2, dklen=32)\n    hmac_data = db_page1[SALT_SZ: PAGE_SZ - RESERVE_SZ + 16]\n    stored_hmac = db_page1[PAGE_SZ - 64: PAGE_SZ]\n    hm = hmac_mod.new(mac_key, hmac_data, hashlib.sha512)\n    return hm.digest() == stored_hmac\n```\n\n**原理**：SQLCipher 在页尾存了 HMAC，用 `enc_key + mac_salt` 派生 mac_key 重新算一遍，比对一致才算密钥正确。\n\n**优势**：杜绝了「内存里搜到一段看似密钥的字符串、实际不对」的误判，扫出来的密钥能直接落盘用。\n\n### 2.3 图片 V2 密钥是个例外\n\n数据库密钥搞定后，发现图片是另一套体系——V2 图片用单独的 AES 密钥加密，**这个密钥不在 Config.Cipher 里**，只在你看过图片后驻留内存。所以提取图片密钥得单独扫一遍内存，用图片文件的密文头去试解，命中 JPEG\u002FPNG 魔数才算数。\n\n这个\"时效性\"坑我放到踩坑记录里细说。\n\n---\n\n## 第三步：解密数据库\n\n拿到密钥，解密就是纯粹的密码学活了。每个库按页解密，page 1 特殊处理（要保留 SQLite 文件头）：\n\n```python\ndef decrypt_page(enc_key, page_data, pgno):\n    iv = page_data[PAGE_SZ - RESERVE_SZ: PAGE_SZ - RESERVE_SZ + 16]\n    if pgno == 1:\n        encrypted = page_data[SALT_SZ: PAGE_SZ - RESERVE_SZ]\n        cipher = AES.new(enc_key, AES.MODE_CBC, iv)\n        return SQLITE_HDR + cipher.decrypt(encrypted) + b\"\\x00\" * RESERVE_SZ\n    encrypted = page_data[:PAGE_SZ - RESERVE_SZ]\n    cipher = AES.new(enc_key, AES.MODE_CBC, iv)\n    return cipher.decrypt(encrypted) + b\"\\x00\" * RESERVE_SZ\n```\n\n**原理**：页首 16 字节是 salt（仅 page 1），页尾 80 字节是 IV + HMAC 保留区，中间部分是密文。用对应 IV 做 AES-CBC 解密，page 1 再拼回 `SQLite format 3` 文件头。\n\n**优势**：解密后的库就是标准 SQLite，可以直接用 `sqlite3` 查询，所有现成工具都能接。\n\n解密是 IO 密集活，大库首次解密要几秒。我加了个 `DBCache`：按 `mtime` 检测源库是否变化，没变就复用 `%TEMP%` 下的解密副本，跨会话也生效。\n\n---\n\n## 第四步：解析消息\n\n解密后的 `msg_*.db` 里，消息的 `message_content` 是 **zstd 压缩 + 二进制序列化** 的，直接读是一堆字节：\n\n```python\ndef decompress_content(content, ct):\n    if ct == 0:\n        return content.decode(\"utf-8\", errors=\"replace\")\n    # ct=4 表示 zstd 压缩\n    if ct == 4 and content:\n        try:\n            return zstd.ZstdDecompressor().decompress(content).decode(\"utf-8\", errors=\"replace\")\n        except Exception:\n            return None\n    return None\n```\n\n**原理**：`WCDB_CT_message_content` 列标记压缩类型，0 表示未压缩，4 表示 zstd。解压后按 `local_type` 分发解析：文本、图片、语音、系统消息各有各的格式。\n\n**优势**：解压逻辑集中一处，消息类型分发、发送人解析、媒体路径提取都复用同一份内容。\n\n发送人解析靠 `Name2Id` 表：把 `real_sender_id` 映射回用户名，再查 `contact.db` 联系人表换成显示名。群聊里还要区分是群主自己发的还是成员发的。\n\n---\n\n## 第五步：媒体解码\n\n文本搞定后是媒体。图片和语音是两块硬骨头。\n\n### 5.1 图片：V2 加密格式\n\n微信 4.x 的图片 `*.dat` 是 V2 格式，头部 6 字节魔数后跟着 AES 密文区 + XOR 区：\n\n```python\nsig = data[:6]\nif sig == b\"\\x07\\x08V2\\x08\\x07\":\n    aes_size, xor_size = struct.unpack_from(\"\u003CLL\", data, 6)\n    aes_data = data[15:15 + aligned]      # AES 区（ECB 解密）\n    xor_data = data[raw_end:]             # 尾部 XOR 区（异或 0x88）\n    dec = cipher.decrypt(aes_data)\n    total = dec + raw_data + bytes(b ^ 0x88 for b in xor_data)\n```\n\n**原理**：V2 图片是「AES-ECB 加密区 + 明文区 + XOR 尾部」三段的组合，解密后按文件魔数识别成 jpg\u002Fpng\u002Fwebp。\n\n**优势**：一套逻辑同时处理 V1\u002FV2，未知格式不硬猜，返回 `bin` 让上层决定。\n\n### 5.2 语音：silk → wav\n\n微信语音是 silkwave 格式，主流播放器不认。标准做法是转成 wav。silk 解码本身有成熟实现，但 **Python 3.14 没有现成的 wheel**（pilk 只编到旧版本）。我直接用官方预编译的 `silk-decoder.exe`，用 subprocess 调：\n\n```python\nresult = subprocess.run([decoder, silk_path, pcm_path], capture_output=True, timeout=60)\nwith open(pcm_path, \"rb\") as f:\n    pcm = f.read()\nwrite_wav(pcm, wav_path, rate=24000)   # 微信语音 24kHz，补 WAV 头\n```\n\n**原理**：silk 解码器输出裸 PCM，手动补一个 44 字节的 WAV 头就是标准 wav 文件。\n\n**优势**：绕开 Python 生态缺 wheel 的问题，用编译好的二进制，稳定可靠。\n\n---\n\n## 第六步：三种使用形态\n\n核心库做好后，我给了它三种「脸」：命令行、桌面 GUI、MCP。\n\n### 6.1 命令行（CLI）\n\n六条命令覆盖全部功能：`init`（提取密钥）、`sessions`（会话）、`history`（记录）、`search`（搜索）、`export`（导出）、`media`（媒体）。命令行是核心库的第一层验证，逻辑最薄。\n\n### 6.2 桌面 GUI\n\n用 customtkinter 做了暗色界面，五个页面：首次引导（提权提取密钥）、会话列表、聊天记录、导出向导、设置。GUI 踩了个大坑——**首次解密大库会卡死界面**，后来改成后台线程 + 主线程 `after()` 轮询的模式才解决，这个放踩坑记录。\n\n### 6.3 MCP：让 Agent 也能查微信\n\n最让我兴奋的是 MCP 形态。用 fastmcp 把核心能力包成 10 个工具，Agent（比如 Claude Code）接上后，直接打字就能查微信：\n\n```python\nfrom fastmcp import FastMCP\n\nmcp = FastMCP(\"wxco-mcp\")\n\n@mcp.tool()\ndef get_history(chat: str, limit: int = 50, offset: int = 0):\n    \"\"\"查看指定聊天记录。\"\"\"\n    ...\n\n@mcp.tool()\ndef transcribe_voice(chat: str, msg_id: int) -> str:\n    \"\"\"识别单条语音消息的文字（可选 ASR）。\"\"\"\n    ...\n```\n\n**原理**：MCP 用 stdio 和宿主通信，工具定义就是普通 Python 函数，Agent 通过标准协议发现和调用。\n\n**优势**：接入后你只需要说「搜索微信里'截止日期'的消息」，Agent 自己就会去调工具查，不用再打开微信翻聊天记录。\n\n整体架构是这样的：\n\n```mermaid\nflowchart LR\n    subgraph 使用侧\n        GUI[桌面 GUI]\n        CLI[命令行]\n        AGENT[Claude Code \u002F Agent]\n    end\n    subgraph wxco 核心\n        CORE[core 核心库]\n        MCP[fastmcp 工具层]\n    end\n    subgraph 数据侧\n        DB[微信加密数据库]\n        KEYS[进程内存密钥]\n    end\n    GUI --> CORE\n    CLI --> CORE\n    AGENT --> MCP --> CORE\n    CORE --> DB\n    CORE --> KEYS\n```\n\n---\n\n## 第七步：可选 ASR 与打包发布\n\n### 7.1 语音转文字（ASR）\n\n语音能导出 wav 后，顺手加了语音转文字。选型上试过 faster-whisper（依赖 CTranslate2，Python 3.14 没 wheel），最后用 sherpa-onnx——zipformer-ctc 中文模型，int8 版才几十 MB，**本地离线识别**，模型首次使用时自动下载：\n\n```python\nrecognizer = sherpa_onnx.OfflineRecognizer.from_zipformer_ctc(\n    model=model_dir + \"\u002Fmodel.int8.onnx\",\n    tokens=model_dir + \"\u002Ftokens.txt\",\n    num_threads=2, sample_rate=16000,\n)\nstream = recognizer.create_stream()\nstream.accept_waveform(sample_rate=16000, waveform=samples)\nrecognizer.decode_stream(stream)\ntext = stream.result.text\n```\n\n**原理**：silk 转出的 24kHz wav 先线性重采样到 16kHz，喂给 zipformer-ctc 离线识别。\n\n**优势**：全程本地跑，语音不上传，隐私友好；模型按需下载，默认关闭不拖累核心。\n\n### 7.2 打包：PyInstaller 单文件 exe\n\n最后用 PyInstaller 打成单文件 exe，普通用户双击就能用，不需要装 Python：\n\n```bash\npyinstaller --onefile --windowed --name wxco \\\n  --add-binary \"src\u002Fwxco\u002Fbin\u002Fsilk-decoder-x64.exe;bin\u002Fsilk-decoder-x64.exe\" \\\n  --collect-all customtkinter src\u002Fwxco\u002Fgui\u002Fapp.py\n```\n\n**原理**：`--onefile` 打成一个 exe，`--add-binary` 把 silk 解码器塞进包里，`--collect-all` 收集 customtkinter 的主题资源。\n\n**优势**：产物约 44MB 的单文件，发出去对方双击就能用。\n\n---\n\n## 踩坑记录\n\n### 1. 图片 V2 密钥有时效性\n\n**问题**：`wxco init` 后数据库都能解，但图片解密总是失败，报密钥错误。\n\n**原因**：图片 V2 的 AES 密钥不像数据库密钥常驻内存，它只在**微信里打开过图片**之后才驻留。没看过图，内存里就扫不到图片密钥。\n\n**解决**：在文档和 GUI 里都写明——图片密钥提取不到时，先在微信里打开几张图再提取。这是微信 4.x 的机制，绕不开，只能让用户配合。\n\n### 2. 图片 dat 是近似映射\n\n**问题**：按消息里的 md5 去找对应的 `*.dat` 文件，经常找不到。\n\n**原因**：微信 4.x 的 dat 文件名是**本地内容哈希**，和消息 XML 里的 md5 没有关联，只能按「会话 + 时间」近似匹配目录。\n\n**解决**：接受近似映射，文档里明确标注「图片定位是近似，可能不准」。语音则是精确映射（按 local_id），不受影响。\n\n### 3. Python 3.14 一堆包没 wheel\n\n**问题**：`pyaudio`、`pilk`、`PySide6` 在 Python 3.14 下都没有预编译 wheel，pip 装不上。\n\n**原因**：3.14 太新，很多包还没跟上编译。\n\n**解决**：优先找预编译二进制（silk 用官方 exe），坚决不源码编译；需要原生绑定的组件评估后换实现。\n\n### 4. fastmcp 和 mcp 的版本冲突\n\n**问题**：装上 fastmcp 最新版后，import 直接报错，整个 MCP server 起不来。\n\n**原因**：fastmcp 3.x 的元数据要求 `mcp\u003C2.0`，而 pip 默认装了 mcp 2.x。\n\n**解决**：把版本写死为 `fastmcp>=3.0` + `mcp>=1.24.0,\u003C2.0` 的兼容组合，写进 pyproject 的 extra。\n\n### 5. GUI 首次加载卡死\n\n**问题**：打开会话列表，界面卡住好几秒，鼠标都动不了。\n\n**原因**：解密大库是 IO 密集操作，直接在 GUI 主线程里同步跑，阻塞了事件循环。\n\n**解决**：改成后台线程加载 + 主线程 `after()` 轮询，再用 token 机制丢弃过期请求——用户快速切换会话时，旧线程的结果不会覆盖新界面。\n\n### 6. 打包后提权提取密钥失败\n\n**问题**：exe 打包后，GUI 里点「提取密钥」没反应。\n\n**原因**：提权命令用的是 `wxco init`，依赖系统 PATH 里有 wxco 命令；打包分发的机器上根本没装，自然找不到。\n\n**解决**：让 exe 支持 `wxco.exe init` 参数——启动时判断 argv 含 `init` 就走 CLI 逻辑，提权命令改为运行自身 exe，不再依赖 PATH。\n\n---\n\n## 总结\n\n做一个本地数据提取工具，最怕的不是算法，而是**逆向推理链路长**——密钥 → 解密 → 解析 → 媒体，每一环都卡壳就全完。整个过程踩了不少坑，几条最值钱的经验：\n\n1. **先验证再落盘**：内存里扫出来的密钥必须用 HMAC 验证过才信，防止误判。\n2. **优先预编译二进制**：Python 3.14 缺 wheel 时，官方编译好的 exe 是最稳的绕行方案。\n3. **版本冲突要写死**：fastmcp\u002Fmcp 这类强耦合依赖，锁版本比靠 pip 自动解析可靠。\n4. **GUI 别碰阻塞 IO**：后台线程 + 轮询是 tkinter 系 UI 的标准解，token 防竞态。\n5. **打包要考虑自定位**：单文件 exe 的提权操作不能依赖外部 PATH，入口做成双模式。\n6. **文档要诚实**：图片 dat 近似映射这种机制性限制，标清楚比藏着让用户猜强。\n\n工具本身已经开源（Python，仅 Windows），桌面 GUI、命令行、MCP 三条路径都能用。以后想给 Agent 接微信数据，或者想导出一份自己的聊天记录备份，都可以直接上手。\n\n---\n\n**文档版本**：v1.0\n**最后更新**：2026-08-28\n**作者**：leap\n**个人博客**：https:\u002F\u002Fvue2.xyz","微信聊天记录封在本地 SQLCipher 数据库里，官方不提供导出。文章记录我从密钥提取、数据库解密到 GUI\u002FMCP\u002F打包的完整开发过程，包含图片密钥时效、Python 3.14 依赖缺失等多个踩坑与解决。","\u002Fuploads\u002Fbed\u002Farticles\u002Fwxco-chat-record-extractor.png",3,true,false,0,{},221,4,"2026-08-27T16:02:25","2026-08-27T18:44:27.039973",{"name":98,"slug":99,"description":32,"type":100,"id":88,"article_count":91},"兴趣使然","个人兴趣探索，无关技术沉淀","blog",[102,105,108,111,114,117],{"name":103,"slug":103,"type":100,"id":104,"article_count":91},"Python",7,{"name":106,"slug":106,"type":100,"id":107,"article_count":91},"后端开发",11,{"name":109,"slug":109,"type":100,"id":110,"article_count":91},"安全",14,{"name":112,"slug":112,"type":100,"id":113,"article_count":91},"项目实战",16,{"name":115,"slug":115,"type":100,"id":116,"article_count":91},"Claude Code",37,{"name":118,"slug":119,"type":100,"id":120,"article_count":91},"Agent","agent",38,{"prev":122,"next":125},{"slug":123,"title":124},"robot-api-key-for-blog-ai-agents","机器人密钥：为博客AI机器人设计的访问凭证",null]