博客

  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!

  • 如何使用 Google Gemini(Nano Banana) 生成个性化公仔手办模型?

    HkDoll 吉卜力风格.jpg

    想象力决定一切。

    还记得之前大家使用 ChatGPT 将现有图片转换为 吉卜力风格 的图片吗?现在 Google Gemini(Nano Banana) 在图片生成也有了非常大的进步;快来试试看吧!有女朋友的小伙伴更加要试试了! P.S. 博主在同样的条件下,使用了 Grok 和 ChatGPT ,效果(如细节/提示词符合度)均不如 Google 的 Nano Banana。

    公仔手办模型效果参考

    photo_2025-09-10_20-34-37.jpg

    photo_2025-09-10_20-34-37.jpg

    Gemini_Generated_Image_27gzoo27gzoo27gz.png

    Gemini_Generated_Image_27gzoo27gzoo27gz.png

    上面是自拍,下面是根据该自拍生成的手办模型;

    图片生成手办模型操作步骤

    操作步骤图

    Google gemini 2.5Pro.jpg

    Google gemini 2.5Pro.jpg

    如图所示,打开 https://gemini.google.com/
    选择 2.5Pro;

    Google gemini Nano banana 模型生成图片步骤.jpg

    Google gemini Nano banana 模型生成图片步骤.jpg

    上传你的自拍,或者其他需要被生成手办模型的图片;

    提示词参考:

    提示词1

    with this photo, create a 1/7 scale commercialized figure of thecharacter in the illustration, in a realistic style and environment. Place the figure on a computer desk, using a circular transparent acrylic base without any text.On the computer screen, display the ZBrush modeling process of the figure. Next to the computer screen, place a BANDAI-style toy packaging box printed with the original artwork.

    翻译过来就是:

    使用这张照片,在写实的风格和环境中,创建插图中人物的 1/7 比例商业化人物。将人物放置在电脑桌上,使用圆形透明亚克力底座,不添加任何文字。在电脑屏幕上,显示人物的ZBrush建模过程。在电脑屏幕旁边,放置一个印有原创艺术品的 BANDAI 风格玩具包装盒。

    以上,提示词收集自网络;玩法非常多,大家可以自发想象,尽情的天马行空!

    提示词2

    Gemini_Generated_Image.png

    Gemini_Generated_Image.png

    提示词2:转换成手办模型,BANDAI,放置于电脑右侧,房间布景为赛博朋克风格,电脑墙纸为宫崎骏的天空之城;

    需要注意的是

    上传的图片尽量清晰,Ai才能从中提取更多的细节用于生成手办;

    更多好用的提示词

    图片转提示词

    https://imagetoprompt.com/

    获取任何图像的文本提示:如果你看到一个由AI生成的图片很棒很惊艳很天马行空,但又不知道提示词,可以使用该工具!你可以结合从它这里获得的提示词进一步改造!

    更多相关类型工具可谷歌搜索:image to prompt;

    提示词集合

    Google Gemini Nano Banana 图片生成提示词集合,满足各类常见场景图片生成需求:https://github.com/PicoTrex/Awesome-Nano-Banana-images (收集自小红书/X等自媒体平台)

    更多网站

    以下是一些可以找到优秀图片生成提示词(AI image generation prompts)的网站。这些网站通常提供提示词库、生成器或社区分享,用户可以从中获取灵感、复制现成提示词,或使用工具自动生成高质量的提示词。我根据可靠来源(如AI工具评测和社区推荐)整理了这些推荐,主要聚焦于免费或易用的资源。它们适用于像Stable Diffusion、Midjourney、DALL·E等AI图像生成工具。

    我将它们整理成表格,便于比较。表格包括网站名称、主要功能和链接(基于最新搜索结果)。

    网站名称主要功能链接
    PromptBase一个专门交易和分享提示词的市场。你可以在这里找到各种高质量、经过优化的提示词,涵盖多种风格(如3D渲染、摄影、动漫等)。适合寻找特定风格或效果的提示词。https://promptbase.com/
    Midjourney Community ShowcaseMidjourney官方的社区画廊。你可以浏览其他用户生成的图片,并点击查看它们使用的提示词。这不仅能让你看到各种令人惊叹的创意,也能让你学习Midjourney特有的提示词用法和技巧。https://www.midjourney.com/showcase/
    PromptHero世界上最大的AI提示词搜索引擎,支持Stable Diffusion、Midjourney、ChatGPT等模型。用户可以搜索数百万提示词和生成图像,包含艺术风格、主题分类。prompthero.com
    PromptoMANIAAI艺术提示词生成器和社区,提供详细提示词构建工具,支持Midjourney和Stable Diffusion。用户可以生成自定义提示词,并查看示例图像。promptomania.com
    LexicaStable Diffusion专用提示词库,用户可以浏览AI生成图像并直接复制关联提示词。支持搜索风格、主题,支持直接生成图像。lexica.art(从社区推荐中推断)
    ImagePrompt.org图像到提示词转换工具(反向工程),也可生成文本提示词。免费核心功能,支持Midjourney、Flux等模型,提供详细描述和风格指导。imageprompt.org
    Narrato提供70+现成AI图像提示词示例,针对旅行、自然、摄影等主题。适合初学者快速复制使用,并有提示词编写技巧。narrato.io/blog
    QuillBot分享50+高质量AI图像提示词列表,适用于2025年最新模型。包括负面提示词建议,帮助优化输出质量。quillbot.com/blog
    WhyTryAI汇总14个提示词工具和站点列表,包括生成器和库。提供Midjourney和Stable Diffusion的灵感来源,便于探索。whytryai.com

     额外建议:

    如何使用这些网站:在PromptHero或Lexica上搜索关键词(如“cyberpunk city”),即可看到匹配的提示词和示例图像。PromptoMANIA适合从零构建提示词,添加细节如“highly detailed, 8K resolution”。

    为什么这些很棒:这些站点基于用户社区和AI模型优化,提供高匹配度的提示词,能生成更逼真、创意十足的图像。相比通用搜索引擎,它们更专注AI艺术。

    注意事项:部分网站有免费额度,高级功能可能需订阅。提示词效果取决于AI工具(如Midjourney通常需Discord访问),建议结合实际测试。

    如果你需要特定主题的提示词(如科幻或肖像),可以提供更多细节,我可以帮你搜索或生成示例!

    Cr Grok;

    faq

    想象力

    TIP: Ask Gemini to refine images
    With image generation in Gemini, your imagination is the limit. If what you see doesn’t quite match what you had in mind, try adding more details to the prompt. The more specific you are, the better Gemini can create images that reflect your vision.

    这是 Google Gemini Nano Banana 给的提示,翻译过来就是:

    提示:让Gemini优化图像
    借助Gemini的图像生成功能,想象力就是你的极限。若生成的图像与构想存在偏差,请尝试在提示词中添加更多细节。描述越具体,Gemini就越能精准呈现你脑海中的画面。

    使用除中国(含港澳)外的国家或地区的节点访问

    飞鸟机场近期测速—20250907-131258.png
  • 瑞草洞1080P在线 4K内封字幕

    ◎瑞草洞/서초동简介 在瑞草洞法律圈的一家律师事务所中,拥有优秀经历,个性却十分直白的律师安柱亨(李钟硕 饰),和个性坦率正直、具有独特魅力的律师姜智熙(文佳煐 饰)两人相遇后擦出了奇妙的火花和意料之外的发展。与此同时,他们两人与其他三位同为受雇律师的同事们在日常工作中相互扶持,共同成长。

    1080+4K资源
    访问码
    t101

  • 很多站长都在纠结的是用户限制一天下载次数,但是有的用户就是去连续注册,一天注册个十几个去下载资源,所以今天星空知给大家分享一个代码版本,喜欢的自行部署吧!

    代码部署

    这个代码是实现的单日IP一次注册,有技术的可以去写一个插件或者子主题去写一个限制一天注册多少!

    [hidecontent type=”reply”]

    代码部署

    这个代码是实现的单日IP一次注册,有技术的可以去写一个插件或者子主题去写一个限制一天注册多少!

    <?php
    /*
     * @Author: Qinver
     * @Url: zibll.com
     * @Date: 2024-01-01
     * @Description: 用户注册IP限制功能
     */
    
    // 防止直接访问
    defined('ABSPATH') || exit;
    
    /**
     * 检查IP是否已经注册过用户
     */
    function zib_check_ip_register_limit($user_ip) {
        global $wpdb;
    
        // 获取当前IP已注册的用户数量
        $registered_count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->usermeta} WHERE meta_key = 'register_ip' AND meta_value = %s",
            $user_ip
        ));
    
        // 如果已经有注册记录,则禁止注册
        if ($registered_count > 0) {
            return new WP_Error('ip_limit', '该IP已注册过账号,不能重复注册');
        }
    
        return true;
    }
    
    /**
     * 在用户注册时记录IP
     */
    function zib_save_register_ip($user_id) {
        if (!$user_id) return;
        
        // 获取用户注册IP
        $user_ip = zib_get_client_ip();
        
        // 保存用户注册IP
        update_user_meta($user_id, 'register_ip', $user_ip);
    }
    
    /**
     * 获取客户端真实IP
     */
    function zib_get_client_ip() {
        if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { //兼容CloudFlare
            $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
        } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { //兼容CDN和代理
            $ip = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]);
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        } else {
            $ip = '0.0.0.0';
        }
        return $ip;
    }
    
    // 在WordPress注册钩子中添加IP检查
    add_filter('registration_errors', function($errors, $sanitized_user_login, $user_email) {
        // 获取用户IP
        $user_ip = zib_get_client_ip();
        
        // 检查IP限制
        $ip_check = zib_check_ip_register_limit($user_ip);
        if (is_wp_error($ip_check)) {
            $errors->add($ip_check->get_error_code(), $ip_check->get_error_message());
        }
        
        return $errors;
    }, 10, 3);
    
    // 在用户注册成功后保存IP
    add_action('user_register', 'zib_save_register_ip');
    [/hidecontent]
  • 子比主题 – 精美弹窗样式美化

    写了一款不用子比主题的弹窗的一款弹窗,比较精美好看,腾飞把一些没有用的都去掉了,这个弹窗就单独用的JS来写的,没有用多余的,CSS代码也放到JS里面了,很实用,喜欢的自行部署吧!

    [hidecontent type=”reply”]

    定位:子比主题–>>自定义javascript代码,将代码放到里面,自己修改一下里面的内容即可!

    jQuery(document).on('click', '.user-online-status .but', function () {
        var $this = jQuery(this);
        var $container = $this.closest('.user-online-status');
        var status = $this.data('sta');
        var nonce = $container.find('#user_online_status_nonce').val() ||
                    window.user_online_status_nonce || '';
    
        if ($this.data('processing')) return;
    
        $this.data('processing', 1);
    
        $container.find('.but').removeClass('active');
        $this.addClass('active');
    
        jQuery.ajax({
            url: '/wp-admin/admin-ajax.php',
            type: 'POST',
            data: {
                action: 'user_online_status_switch',
                status: status,
                nonce: nonce
            },
            success: function (response) {
                if (response.success) {
                    var user_id = window.current_user_id || '';
                    if(user_id){
                        jQuery('.online-status-dot.user-uid-' + user_id)
                            .removeClass('online away busy offline')
                            .addClass(status);
                    }
                    if (typeof notyf === 'function') {
                        notyf(response.msg, 'success', 1000);
                    }
                } else {
                    if (typeof notyf === 'function') {
                        notyf(response.msg || '状态更新失败', "danger");
                    }
                }
            },
            error: function () {
                if (typeof notyf === 'function') {
                    notyf('网络请求异常');
                }
            },
            complete: function () {
                $this.data('processing', 0);
            }
        });
    });
    
    jQuery(document).on('click', "a[href*='action=logout']", function (e) {
        var nonce = jQuery('#user_online_status_nonce').val() ||
                    window.user_online_status_nonce || '';
        var user_id = window.current_user_id || '';
        if (user_id && nonce) {
            e.preventDefault();
            var logoutUrl = jQuery(this).attr('href');
            jQuery.ajax({
                url: '/wp-admin/admin-ajax.php',
                type: 'POST',
                data: {
                    action: 'user_online_status_switch',
                    status: 'offline',
                    nonce: nonce
                },
                complete: function () {
                    window.location.href = logoutUrl;
                }
            });
        }
    });
    (function() {
        function shouldShowAnnouncement() {
            const lastShown = localStorage.getItem('announcementLastShown');
            if (!lastShown) return true;
            
            try {
                const oneDayLater = new Date(lastShown).getTime() + (24 * 60 * 60 * 1000);
                return Date.now() > oneDayLater;
            } catch (e) {
                console.error('解析公告显示时间失败:', e);
                return true;
            }
        }
    
        if (!shouldShowAnnouncement()) {
            console.log('24小时内已显示过公告,暂不显示');
            return;
        }
    
        function disableBodyScroll() {
            document.body.style.overflow = 'hidden';
            document.body.style.paddingRight = getScrollbarWidth() + 'px';
        }
    
        function enableBodyScroll() {
            document.body.style.overflow = '';
            document.body.style.paddingRight = '';
        }
    
        function getScrollbarWidth() {
            const outer = document.createElement('div');
            outer.style.visibility = 'hidden';
            outer.style.width = '100px';
            outer.style.msOverflowStyle = 'scrollbar';
            document.body.appendChild(outer);
            
            const widthNoScroll = outer.offsetWidth;
            outer.style.overflow = 'scroll';
            
            const inner = document.createElement('div');
            inner.style.width = '100%';
            outer.appendChild(inner);
            
            const widthWithScroll = inner.offsetWidth;
            outer.parentNode.removeChild(outer);
            
            return widthNoScroll - widthWithScroll;
        }
        function injectStyles() {
            const style = document.createElement('style');
            style.textContent = `
    .one-popup-windows{display:block}.modal-backdrop.fade.in{z-index:151}.one-popup-content{position:fixed;top:50%;left:50%;z-index:152;width:480px;border-radius:10px;background-color:#fff;background-image:url(https://img.alicdn.com/imgextra/i4/2210123621994/O1CN01F0Ts8N1QbIqYOET57_!!2210123621994.png),url(https://img.alicdn.com/imgextra/i2/2210123621994/O1CN01wbq9a41QbIqZK6cK3_!!2210123621994.png);background-position:0 0,100% 280px;background-repeat:no-repeat;-webkit-box-shadow:0 0 80px rgb(0 0 0 / 25%);box-shadow:0 0 80px rgb(0 0 0 / 25%);opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.one-popup-header{margin-top:45px;color:#222;text-align:center;font-weight:700;font-size:28px}.one-popup-body{overflow-x:hidden;overflow-y:auto;margin:35px auto 40px;height:220px;padding:0 35px;scrollbar-width:none;-ms-overflow-style:none}.one-popup-body::-webkit-scrollbar{display:none}.one-popup-body p{margin-bottom:10px;color:#777;text-align:justify;font-weight:400;font-size:13px;line-height:22px;word-break:break-all}.one-popup-body p:last-child{margin-bottom:0}.one-popup-body p a{color:var(--one-popup-link_color)}.one-popup-btn-group{display:flex;justify-content:center;margin-bottom:2rem;gap:12px}.one-popup-btn{height:46px;border-radius:8px;font-size:15px;font-weight:600;cursor:pointer;transition:all 0.3s ease;border:none;outline:none;padding:0 20px;display:inline-flex;align-items:center;justify-content:center;box-shadow:0 2px 5px rgba(0,0,0,0.05)}.one-popup-btn:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,0.1)}.one-popup-btn:active{transform:translateY(0);box-shadow:0 2px 3px rgba(0,0,0,0.08)}.one-popup-btn-not-show{background:linear-gradient(135deg,#5b96f7,#3a78e0);color:#ffffff;min-width:120px}.one-popup-btn-not-show:hover{background:linear-gradient(135deg,#4a85e6,#2d67d0)}.one-popup-btn-no{background:linear-gradient(135deg,#f8f9fa,#e9ecef);color:#495057;min-width:100px}.one-popup-btn-no:hover{background:linear-gradient(135deg,#e9ecef,#dee2e6);color:#343a40}.one-popup-btn-yes{background:linear-gradient(135deg,#ff7a00,#ff5e00);color:#ffffff;min-width:180px}.one-popup-btn-yes:hover{background:linear-gradient(135deg,#e66b00,#e65200)}
            `;
            document.head.appendChild(style);
        }
    
        function closeAnnouncement(remember = false) {
            const popup = document.getElementById('one-popup-windows');
            const backdrop = document.querySelector('.modal-backdrop.fade.in');
            
            if (popup) {
                popup.style.transition = 'opacity 0.3s ease, transform 0.3s ease';
                popup.style.opacity = '0';
                popup.style.transform = 'translate(-50%, -55%)';
            }
            
            if (backdrop) {
                backdrop.style.transition = 'opacity 0.3s ease';
                backdrop.style.opacity = '0';
            }
            
            setTimeout(() => {
                if (popup) popup.remove();
                if (backdrop) backdrop.remove();
                enableBodyScroll();
            }, 300);
            
            if (remember) {
                localStorage.setItem('announcementLastShown', new Date().toISOString());
            } else {
                localStorage.removeItem('announcementLastShown');
            }
        }
        
        function createAnnouncement() {
            disableBodyScroll();
            
            const backdrop = document.createElement('div');
            backdrop.className = 'modal-backdrop fade in';
            document.body.appendChild(backdrop);
            
            const popupContainer = document.createElement('div');
            popupContainer.className = 'one-popup-windows';
            popupContainer.id = 'one-popup-windows';
    
            popupContainer.innerHTML = `
                <div class="one-popup-content">
                    <div class="one-popup-header">站内通告</div>
                    <div class="one-popup-body">
                        <p>星空知专注于子比主题、教程、精品源码、软件基地分享</p>
                        <p>1.丰富功能系统,扩展社区特色玩法,打造最好的互联网聚集圈子。</p>
                        <p>2.准确信息真实交易,安全快捷又方便,让虚拟交易面对面。</p>
                        <p>3.天上不会掉馅饼,话术骗术迷人心,切勿脱离平台线下交易,被骗与平台无关!</p>
                        <p>官方Q群:<span><a href="/" rel="external nofollow"  target="_blank" style="color:#0000ff;">123456</a></span>钉推群:<span style="color:#dc3023;">123456</span>  站长QQ:<a href="https://wpa.qq.com/msgrd?v=3&uin=123456&site=ThemeBox&menu=yes" rel="external nofollow"  target="_blank" style="color:#00e079;">1234567</a></p>
                    </div>
                    <div class="one-popup-btn-group">
                        <button class="one-popup-btn one-popup-btn-not-show">一天内不显示</button>
                        <button class="one-popup-btn one-popup-btn-no">取消</button>
                        <button class="one-popup-btn one-popup-btn-yes">我知道啦</button>
                    </div>
                </div>
            `;
    
            document.body.appendChild(popupContainer);
            
            const notShowBtn = popupContainer.querySelector('.one-popup-btn-not-show');
            const cancelBtn = popupContainer.querySelector('.one-popup-btn-no');
            const confirmBtn = popupContainer.querySelector('.one-popup-btn-yes');
    
            if (notShowBtn) {
                notShowBtn.addEventListener('click', () => closeAnnouncement(true));
            }
    
            if (cancelBtn) {
                cancelBtn.addEventListener('click', () => closeAnnouncement(false));
            }
    
            if (confirmBtn) {
                confirmBtn.addEventListener('click', () => closeAnnouncement(false));
            }
            
            if (backdrop) {
                backdrop.addEventListener('click', () => closeAnnouncement(false));
            }
    
            document.addEventListener('keydown', (e) => {
                if (e.key === 'Escape') closeAnnouncement(false);
            });
        }
    
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', () => {
                injectStyles();
                createAnnouncement();
            });
        } else {
            injectStyles();
            createAnnouncement();
        }
    })();
    [/hidecontent]
  • 子比主题功能 – 卡片小工具展示

    功能简介

    我这个原来是在组题网看到的样式,感觉很好看,就给他拿下来了并且修复下,我的样式可能不好看,所以,有能力可以自己改改

    功能截图

    前端

    后端

    部署教程

    [hidecontent type=”reply”]

    打开/wp-content/themes/zibll/functions.php文件,把下面粘贴下去

    /*FOX cs.qindiaos.cn/*/
    class Anime_Social_Responsibility_Widget extends WP_Widget {
    
        function __construct() {
            parent::__construct(
                'anime_social_widget',
                __('Hi FOX卡片小工具', 'text_domain'),
                array('description' => __('显示自定义的卡片', 'text_domain'))
            );
        }
    
        // 创建小工具后台表单
        public function form($instance) {
            $defaults = array(
                'main_title' => '二次元公益',
                'subtitle' => 'Anime Social Responsibility',
                'card1_title' => '动漫创作扶持计划',
                'card1_desc' => '支持新生代动漫创作者,提供创作基金与专业指导,助力国漫崛起。',
                'card1_image' => 'https://images.unsplash.com/photo-1638803040283-7a5ffd48dad5?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
                'card1_link' => 'https://www.xkzhi.com/',
                
                'card2_title' => '二次元文化传承',
                'card2_desc' => '举办全国动漫文化节,保护传统二次元文化,推广健康动漫价值观。',
                'card2_image' => 'https://images.unsplash.com/photo-1579546929662-711aa81148cf?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
                'card2_link' => 'https://www.xkzhi.com/',
                
                'card3_title' => '动漫公益慈善',
                'card3_desc' => '联合知名动漫IP开展慈善活动,为贫困地区儿童送去动漫温暖。',
                'card3_image' => 'https://images.unsplash.com/photo-1545569341-9eb8b30979d9?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
                'card3_link' => 'https://www.xkzhi.com/',
                
                'card4_title' => '动漫教育普及',
                'card4_desc' => '建立动漫教育基金,让更多青少年接触和学习动漫创作技能。',
                'card4_image' => 'https://images.unsplash.com/photo-1542831371-29b0f74f9713?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80',
                'card4_link' => 'https://www.xkzhi.com/'
            );
            
            $instance = wp_parse_args((array) $instance, $defaults);
            ?>
            
    
            <!-- 副标题 -->
            <p>
                <label for="<?php echo $this->get_field_id('subtitle'); ?>">标题:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('subtitle'); ?>" 
                       name="<?php echo $this->get_field_name('subtitle'); ?>" 
                       type="text" value="<?php echo esc_attr($instance['subtitle']); ?>" />
            </p>
    
            <hr style="margin: 20px 0; border: 1px solid #ddd;">
    
            <!-- 卡片1设置 -->
            <h3>卡片1设置</h3>
            <p>
                <label for="<?php echo $this->get_field_id('card1_title'); ?>">标题:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card1_title'); ?>" 
                       name="<?php echo $this->get_field_name('card1_title'); ?>" 
                       type="text" value="<?php echo esc_attr($instance['card1_title']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card1_desc'); ?>">描述:</label>
                <textarea class="widefat" id="<?php echo $this->get_field_id('card1_desc'); ?>" 
                          name="<?php echo $this->get_field_name('card1_desc'); ?>"><?php echo esc_textarea($instance['card1_desc']); ?></textarea>
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card1_image'); ?>">图片URL:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card1_image'); ?>" 
                       name="<?php echo $this->get_field_name('card1_image'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card1_image']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card1_link'); ?>">链接:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card1_link'); ?>" 
                       name="<?php echo $this->get_field_name('card1_link'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card1_link']); ?>" />
            </p>
    
            <hr style="margin: 20px 0; border: 1px solid #ddd;">
    
            <!-- 卡片2设置 -->
            <h3>卡片2设置</h3>
            <p>
                <label for="<?php echo $this->get_field_id('card2_title'); ?>">标题:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card2_title'); ?>" 
                       name="<?php echo $this->get_field_name('card2_title'); ?>" 
                       type="text" value="<?php echo esc_attr($instance['card2_title']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card2_desc'); ?>">描述:</label>
                <textarea class="widefat" id="<?php echo $this->get_field_id('card2_desc'); ?>" 
                          name="<?php echo $this->get_field_name('card2_desc'); ?>"><?php echo esc_textarea($instance['card2_desc']); ?></textarea>
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card2_image'); ?>">图片URL:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card2_image'); ?>" 
                       name="<?php echo $this->get_field_name('card2_image'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card2_image']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card2_link'); ?>">链接:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card2_link'); ?>" 
                       name="<?php echo $this->get_field_name('card2_link'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card2_link']); ?>" />
            </p>
    
            <hr style="margin: 20px 0; border: 1px solid #ddd;">
    
            <!-- 卡片3设置 -->
            <h3>卡片3设置</h3>
            <p>
                <label for="<?php echo $this->get_field_id('card3_title'); ?>">标题:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card3_title'); ?>" 
                       name="<?php echo $this->get_field_name('card3_title'); ?>" 
                       type="text" value="<?php echo esc_attr($instance['card3_title']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card3_desc'); ?>">描述:</label>
                <textarea class="widefat" id="<?php echo $this->get_field_id('card3_desc'); ?>" 
                          name="<?php echo $this->get_field_name('card3_desc'); ?>"><?php echo esc_textarea($instance['card3_desc']); ?></textarea>
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card3_image'); ?>">图片URL:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card3_image'); ?>" 
                       name="<?php echo $this->get_field_name('card3_image'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card3_image']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card3_link'); ?>">链接:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card3_link'); ?>" 
                       name="<?php echo $this->get_field_name('card3_link'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card3_link']); ?>" />
            </p>
    
            <hr style="margin: 20px 0; border: 1px solid #ddd;">
    
            <!-- 卡片4设置 -->
            <h3>卡片4设置</h3>
            <p>
                <label for="<?php echo $this->get_field_id('card4_title'); ?>">标题:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card4_title'); ?>" 
                       name="<?php echo $this->get_field_name('card4_title'); ?>" 
                       type="text" value="<?php echo esc_attr($instance['card4_title']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card4_desc'); ?>">描述:</label>
                <textarea class="widefat" id="<?php echo $this->get_field_id('card4_desc'); ?>" 
                          name="<?php echo $this->get_field_name('card4_desc'); ?>"><?php echo esc_textarea($instance['card4_desc']); ?></textarea>
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card4_image'); ?>">图片URL:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card4_image'); ?>" 
                       name="<?php echo $this->get_field_name('card4_image'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card4_image']); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id('card4_link'); ?>">链接:</label>
                <input class="widefat" id="<?php echo $this->get_field_id('card4_link'); ?>" 
                       name="<?php echo $this->get_field_name('card4_link'); ?>" 
                       type="text" value="<?php echo esc_url($instance['card4_link']); ?>" />
            </p>
    
            <?php
        }
    
        // 更新小工具设置
        public function update($new_instance, $old_instance) {
            $instance = $old_instance;
            
            $instance['subtitle'] = sanitize_text_field($new_instance['subtitle']);
            
            // 卡片1
            $instance['card1_title'] = sanitize_text_field($new_instance['card1_title']);
            $instance['card1_desc'] = sanitize_textarea_field($new_instance['card1_desc']);
            $instance['card1_image'] = esc_url_raw($new_instance['card1_image']);
            $instance['card1_link'] = esc_url_raw($new_instance['card1_link']);
            
            // 卡片2
            $instance['card2_title'] = sanitize_text_field($new_instance['card2_title']);
            $instance['card2_desc'] = sanitize_textarea_field($new_instance['card2_desc']);
            $instance['card2_image'] = esc_url_raw($new_instance['card2_image']);
            $instance['card2_link'] = esc_url_raw($new_instance['card2_link']);
            
            // 卡片3
            $instance['card3_title'] = sanitize_text_field($new_instance['card3_title']);
            $instance['card3_desc'] = sanitize_textarea_field($new_instance['card3_desc']);
            $instance['card3_image'] = esc_url_raw($new_instance['card3_image']);
            $instance['card3_link'] = esc_url_raw($new_instance['card3_link']);
            
            // 卡片4
            $instance['card4_title'] = sanitize_text_field($new_instance['card4_title']);
            $instance['card4_desc'] = sanitize_textarea_field($new_instance['card4_desc']);
            $instance['card4_image'] = esc_url_raw($new_instance['card4_image']);
            $instance['card4_link'] = esc_url_raw($new_instance['card4_link']);
            
            return $instance;
        }
    
        // 前台显示小工具
        public function widget($args, $instance) {
            // 输出小工具容器,但不输出WordPress默认的标题
            echo $args['before_widget'];
            
            // 检查是否设置了WordPress小工具标题,如果有就清空它
            $widget_title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title'], $instance, $this->id_base);
            
            // 如果WordPress小工具标题不为空,我们手动处理它
            if (!empty($widget_title)) {
                // 但我们不输出它,因为我们有自己的标题系统
                // 或者你可以选择输出它,但通常我们不需要
            }
            
            // 输出小工具内容
            ?>
            <div class="anime-social-responsibility-container">
                <!-- 标题区域 - 在卡片上方 -->
                <div class="anime-header">
                    <p class="anime-subtitle"><?php echo esc_html($instance['subtitle']); ?></p>
                    <div class="anime-title-divider"></div>
                </div>
                
                <!-- 卡片区域 -->
                <div class="anime-box-content">
                    <!-- 卡片1 -->
                    <a href="<?php echo esc_url($instance['card1_link']); ?>" rel="external nofollow"  target="_blank" class="anime-card anime-card-1" style="background-image: url('<?php echo esc_url($instance['card1_image']); ?>')">
                        <div class="anime-card-content">
                            <p><?php echo esc_html($instance['card1_title']); ?></p>
                            <span><?php echo esc_html($instance['card1_desc']); ?></span>
                        </div>
                    </a>
                    
                    <!-- 卡片2 -->
                    <a href="<?php echo esc_url($instance['card2_link']); ?>" rel="external nofollow"  target="_blank" class="anime-card anime-card-2" style="background-image: url('<?php echo esc_url($instance['card2_image']); ?>')">
                        <div class="anime-card-content">
                            <p><?php echo esc_html($instance['card2_title']); ?></p>
                            <span><?php echo esc_html($instance['card2_desc']); ?></span>
                        </div>
                    </a>
                    
                    <!-- 卡片3 -->
                    <a href="<?php echo esc_url($instance['card3_link']); ?>" rel="external nofollow"  target="_blank" class="anime-card anime-card-3" style="background-image: url('<?php echo esc_url($instance['card3_image']); ?>')">
                        <div class="anime-card-content">
                            <p><?php echo esc_html($instance['card3_title']); ?></p>
                            <span><?php echo esc_html($instance['card3_desc']); ?></span>
                        </div>
                    </a>
                    
                    <!-- 卡片4 -->
                    <a href="<?php echo esc_url($instance['card4_link']); ?>" rel="external nofollow"  target="_blank" class="anime-card anime-card-4" style="background-image: url('<?php echo esc_url($instance['card4_image']); ?>')">
                        <div class="anime-card-content">
                            <p><?php echo esc_html($instance['card4_title']); ?></p>
                            <span><?php echo esc_html($instance['card4_desc']); ?></span>
                        </div>
                    </a>
                </div>
            </div>
            
            <style>
            .anime-social-responsibility-container {
                width: 100%;
                position: relative;
                z-index: 10;
                padding: 20px 0;
                font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Microsoft YaHei", sans-serif;
            }
            
            .anime-social-responsibility-container .anime-header {
                text-align: center;
                margin-bottom: 50px;
                width: 100%;
            }
            
            .anime-social-responsibility-container .anime-main-title {
                font-size: 48px;
                font-weight: 900;
                color: #ff4081;
                margin-bottom: 12px;
                letter-spacing: 2px;
                text-shadow: 3px 3px 0px #ff9ec0, 6px 6px 0px rgba(0,0,0,0.1);
                position: relative;
                display: inline-block;
            }
            
            .anime-social-responsibility-container .anime-main-title::after {
                content: "";
                position: absolute;
                bottom: -10px;
                left: 10%;
                width: 80%;
                height: 8px;
                background: linear-gradient(to right, #ff4081, #7b68ee);
                border-radius: 4px;
                transform: skewX(-15deg);
            }
            
            .anime-social-responsibility-container .anime-subtitle {
                font-size: 22px;
                color: #7b68ee;
                margin-bottom: 25px;
                font-weight: 700;
                letter-spacing: 3px;
                text-shadow: 1px 1px 0px white;
                background: rgba(255,255,255,0.7);
                display: inline-block;
                padding: 8px 20px;
                border-radius: 30px;
                border: 2px dashed #7b68ee;
            }
            
            .anime-social-responsibility-container .anime-title-divider {
                width: 100px;
                height: 6px;
                background: linear-gradient(to right, #ff4081, #7b68ee);
                margin: 0 auto;
                border-radius: 3px;
                box-shadow: 0 2px 8px rgba(123, 104, 238, 0.5);
                position: relative;
            }
            
            .anime-social-responsibility-container .anime-title-divider::before, 
            .anime-social-responsibility-container .anime-title-divider::after {
                content: "✦";
                position: absolute;
                top: -8px;
                color: #7b68ee;
                font-size: 18px;
            }
            
            .anime-social-responsibility-container .anime-title-divider::before {
                left: -15px;
            }
            
            .anime-social-responsibility-container .anime-title-divider::after {
                right: -15px;
            }
            
            .anime-social-responsibility-container .anime-box-content {
                display: flex;
                justify-content: center;
                gap: 20px;
                flex-wrap: nowrap;
                width: 100%;
            }
            
            .anime-social-responsibility-container .anime-card {
                display: flex;
                flex-direction: column;
                flex: 1;
                min-width: 0;
                height: 350px;
                background-size: cover;
                background-position: center;
                border-radius: 20px;
                overflow: hidden;
                text-decoration: none;
                color: inherit;
                box-shadow: 0 10px 25px rgba(123, 104, 238, 0.2);
                transition: all 0.4s ease;
                position: relative;
                border: 3px solid white;
            }
            
            .anime-social-responsibility-container .anime-card::before {
                content: "";
                position: absolute;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background: linear-gradient(to bottom, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.7) 100%);
                z-index: 1;
                border-radius: 18px;
                transition: all 0.4s ease;
            }
            
            .anime-social-responsibility-container .anime-card:hover::before {
                background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.8) 100%);
            }
            
            .anime-social-responsibility-container .anime-card:hover {
                transform: translateY(-12px) scale(1.03);
                box-shadow: 0 20px 35px rgba(123, 104, 238, 0.4);
            }
            
            .anime-social-responsibility-container .anime-card-content {
                padding: 25px 20px;
                flex-grow: 1;
                display: flex;
                flex-direction: column;
                justify-content: flex-end;
                position: relative;
                z-index: 2;
                color: white;
            }
            
            .anime-social-responsibility-container .anime-card p {
                font-size: 22px;
                font-weight: 900;
                margin-bottom: 15px;
                color: white;
                text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
                position: relative;
                padding-left: 15px;
            }
            
            .anime-social-responsibility-container .anime-card p::before {
                content: "";
                position: absolute;
                left: 0;
                top: 0;
                height: 100%;
                width: 5px;
                background: linear-gradient(to bottom, #ff4081, #7b68ee);
                border-radius: 3px;
            }
            
            .anime-social-responsibility-container .anime-card span {
                font-size: 15px;
                color: rgba(255,255,255,0.9);
                line-height: 1.6;
                background: rgba(0,0,0,0.3);
                padding: 10px;
                border-radius: 10px;
                border: 1px solid rgba(255,255,255,0.3);
            }
            
            /* 响应式设计 */
            @media (max-width: 1024px) {
                .anime-social-responsibility-container .anime-box-content {
                    flex-wrap: wrap;
                }
                
                .anime-social-responsibility-container .anime-card {
                    flex: 0 0 calc(50% - 20px);
                    height: 300px;
                }
            }
            
            @media (max-width: 768px) {
                .anime-social-responsibility-container .anime-box-content {
                    flex-direction: column;
                    align-items: center;
                }
                
                .anime-social-responsibility-container .anime-card {
                    flex: 1;
                    width: 100%;
                    max-width: 400px;
                    height: 250px;
                }
                
                .anime-social-responsibility-container .anime-main-title {
                    font-size: 36px;
                }
                
                .anime-social-responsibility-container .anime-subtitle {
                    font-size: 18px;
                }
            }
            </style>
            <?php
            
            echo $args['after_widget'];
        }
    }
    
    // 注册小工具
    function register_anime_social_widget() {
        register_widget('Anime_Social_Responsibility_Widget');
    }
    add_action('widgets_init', 'register_anime_social_widget');
    [/hidecontent]
  • 三星S8或S8+ 刷 root 和xposed 框架 三星s8 水货手机root 和激活xposed 框架

     三星S8或S8+ 刷 root 和xposed 框架  三星s8 水货手机root 和激活xposed 框架

    此贴理论上适用于S8或S8+、猎户或高通CPU,由于OTA或线刷官方9.0固件后,如何重刷固件、降级、刷入非官方TWRP Recovery、刷第三方包、ROOT等问题。感谢各路大神的辛勤付出。

    前序:G950FD刚拿到手是官方9.0的,由于本人一直使用极光的8.0,于是我首先进入开发者模式将OEM解锁,但刷8.0死活刷不进,刷TWRP Recovery也刷不进,查资料才知道BL只能升级或平刷,不能降级,所以我下载了一个最新版本的8.0固件就刷成功,心想TWRP Recovery可以刷入了吧,结果也是不行,折腾了一个晚上没解决,到第二天心还是不死,不断参考其他大神的帖子一边分析一边实操,幸运的是,功夫不负有心人,终于让我找到解决方法了,在这个过程我发现不少朋友也经历我这种情况,而大部分还没有解决问题,也没有很完整的一篇文章可以将这个问题解决,特此立贴,希望帮到其他人。

    其实多数问题就是总结为这句话:无论你的是官方最新版本的8.0还是9.0,遇到TWRP Recovery刷入失败的话,是OEM锁作怪,重新开关OEM锁就可以解决了。所以奉劝大家升9.0的话还是三思啊,免得折腾。

    解决步骤:
    一、解OEM锁:其实解锁的方法已经有大神总结出来了,我就拿自己成功的方法出来分享吧。
    1,用Odin线刷最新的官方四件套:刷9.0或8.0最新版的固件都可以的,以G950FD为例(G950FD最新官方固件连接https://www.netded.com/a/jishuyingyong/2017/0702/33454.html),最新版的8.0固件版本应该是G950FXXU4CRL3,关于怎么判断固件版本的新旧请参考http://bbs.gfan.com/android-9404368-1-1.html
    2,刷完后,登陆三星账号进入系统。进入 设置-常规管理-日期和时间 将日期改成9天前。
    3,然后进系统更新,点手动下载更新,等它连接三星服务器检测更新,直到他提示你是最新的版本,返回。看检查时间是不是你改的日期。(以防万一,可以多检测几次)确定检测时间是你改的日期后。重启手机!
    4,重启完后,将日期改回你当前真实日期(我的重启完自动更新成当前日期),然后进系统更新那,看到时间还是你改的日期。点检测更新,等他连接三星服务器检测,直到提示你是最新版本,返回,(以防万一,可以多检测几次)    确定检测时间是你当前的真实日期后。重启手机!5,重启完后,开启开发者选项,你就看到OEM选项了,将开关打开。然后就开始刷机吧(如果没有那选项,就等几个小时,还是没有就重新线刷按步骤来一次。祝你好运!)
    参考连接http://bbs.gfan.com/android-9314680-1-1.html
    二、长按音量下键+电源键+Bixby,进入线刷模式,在Odin中的AP里选择最新版的CN_TWRP_3.2.3.2_S8_Exynos8895,开刷,很快刷好并重启,这里建议大家不要勾选自动重启,因为刷完后没有成功进入第三方TWRP Recovery的话,就有可能恢复为官方TWRP Recovery,这样又要重新刷过了。刷TWRP Recovery:请确保FAP和OEM均为OFF状态,即已全部解锁。
    1、CN_TWRP_3.2.3.2_S8_Exynos8895:https://pan.baidu.com/s/1lbGNBYZLRXtFZTPyg7tKtA 提取码: emf7
    2、Odin3_V3.13.3: https://pan.baidu.com/s/1CvcHz8ac86naZcd8rwPNbA 提取码: 75kg


    三、进入TWRP Recovery:成功刷入TWRP Recovery后,若没有勾选自动重启,请将数据线断开,然后长按音量向下键+电源键7秒,黑屏后立即长按音量向上键+BB键+电源键,正常就可以进入第三方TWRP Recovery了。可能有种情况会是重启时手机进入无限重启模式(就跟砖一样了),不用管它,只需一直长按音量上键+电源键+Bixby,很快手机进入recovery,由于无法挂载存储,就不能卡刷新ROM,此时选择“清除”按钮,然后选择“高级清除选项”, 勾选:Dalvik cache;system;data;cache,然后滑动按钮清除,如果四清后还是不行,就必须选择“格式化data分区”(请提前备份好照片音乐文档等),输入yes,然后点右下角那个√,再重启手机进入recovery。

    四、复制第三方刷机包:此时将手机连接至电脑,就可以将第三方刷机包直接拷到手机里,无需在手机中放置TF卡。拷好后直接在recovery下安装系统。强烈推荐极光刷机包http://bbs.gfan.com/android-9542131-1-1.html

    至此整个流程写完了,小弟献丑了,希望大家不要笑。大家在过程在有不明白或者遇到问题的请在下面反映,我看到后会回复并更新的。原创贴,谢谢大家支持!

  • 彩虹易支付最新版源码,更新时间为2025/09/27 亲测完美运行

    本站易支付源码经过D盾扫描无后门和病毒!

    【付款后网页自动跳转发货显示下载地址,不需要人工发货】

    【亲测源码,在售即表示源码完美运行,无需再次人工确认,放心选购】

    代搭建手工费50 联系站长:xrgzwh

    源码简介

    彩虹易支付最新版源码,更新时间为2025/09/27

    ~持续更新~ 安装 易支付 下载 安装包 就行了 如果没有用过彩虹易支付的 也得下载安装包 不然更新了可能会不能用

    2025/09/27:
    1.微信小程序支付前支持获取手机号码
    2.投诉单兼容关联多个订单的情况

    3.部分支付插件增加关闭订单接口

    2025/08/26:
    1.增加渠道交易单号查询
    2.增加检测单个支付账号订单支付速度自动封禁账号
    3.公共静态资源CDN可选择本地
    4.平板&安卓模拟器支付时调整为不自动跳转支付宝微信
    5.支付宝身份认证支持海外身份证件
    6.支付宝安全发新增转账场景报备功能

    2025/08/15:
    1.修复支付宝付款记录导出乱码问题
    2.增加管理员短信通知方式
    3.修复微信支付V3切换平台公钥过程中无法回调
    4.商户后台增加导出订单功能
    5.后台订单列表新增批量选中执行回调通知
    6.交易投诉可按时间查询,增加导出功能

    2025/07/30:
    1.支付宝码支付插件新增转账确认单模式
    2.修复静态资源失效

    2025/07/24:
    1.风控检测增加直付通结算失败自动关闭支付通道
    2.用户组通道选择,增加顺序可用通道、首个可用通道
    3.支付通道设置支持限制日订单数量
    4.用户可自行设置最大与最小支付金额限制
    5.修复使用轮询组时可能无法支付问题

    2025/07/12:
    1.增加企业微信/钉钉/飞书群机器人通知
    2.用户组支付通道增加“随机可用轮询组”
    3.增加支付用户每日支付限额设定
    4.后台订单列表支持直付通批量结算

    2025/06/24:
    1.新增导入Excel批量转账功能
    2.商户直清模式订单退款可同时退手续费
    3.付款记录页面增加统计
    4.支持设置自定义分账描述
    5.修复合单支付时的分账
    6.邀请返现可改为每天定时返现一次

  • 免费自己搭建 闲鱼智能回复、自动发货系统搭建

    最新代码获取地址(尽量转存)

    夸克盘
    提取码:wXN7
    FOX本地下载

    📋 项目概述

    一个功能完整的闲鱼自动回复和管理系统,采用现代化的技术架构,支持多用户、多账号管理,具备智能回复、自动发货、自动确认发货、商品管理等企业级功能。系统基于Python异步编程,使用FastAPI提供RESTful API,SQLite数据库存储,支持Docker一键部署。

    ⚠️ 重要提示:本项目仅供学习研究使用,严禁商业用途!使用前请仔细阅读版权声明

    核心技术栈

    • 后端框架: FastAPI + Python 3.11+ 异步编程
    • 数据库: SQLite 3 + 多用户数据隔离 + 自动迁移
    • 前端: Bootstrap 5 + Vanilla JavaScript + 响应式设计
    • 通信协议: WebSocket + RESTful API + 实时通信
    • 部署方式: Docker + Docker Compose + 一键部署
    • 日志系统: Loguru + 文件轮转 + 实时收集
    • 安全认证: JWT + 图形验证码 + 邮箱验证 + 权限控制

    系统架构特点

    • 微服务设计: 模块化架构,易于维护和扩展
    • 异步处理: 基于asyncio的高性能异步处理
    • 多用户隔离: 完全的数据隔离和权限控制
    • 容器化部署: Docker容器化,支持一键部署
    • 实时监控: WebSocket实时通信和状态监控
    • 自动化运维: 自动重连、异常恢复、日志轮转

    🔐 多用户系统

    • 用户注册登录 – 支持邮箱验证码注册,图形验证码保护
    • 数据完全隔离 – 每个用户的数据独立存储,互不干扰
    • 权限管理 – 严格的用户权限控制和JWT认证
    • 安全保护 – 防暴力破解、会话管理、安全日志

    📱 多账号管理

    • 无限账号支持 – 每个用户可管理多个闲鱼账号
    • 独立运行 – 每个账号独立监控,互不影响
    • 实时状态 – 账号连接状态实时监控
    • 批量操作 – 支持批量启动、停止账号任务

    🤖 智能回复系统

    • 关键词匹配 – 支持精确关键词匹配回复
    • 指定商品回复 – 支持为特定商品设置专门的回复内容,优先级最高
    • 商品专用关键词 – 支持为特定商品设置专用关键词回复
    • 通用关键词 – 支持全局通用关键词,适用于所有商品
    • 批量导入导出 – 支持Excel格式的关键词批量导入导出
    • AI智能回复 – 集成OpenAI API,支持上下文理解
    • 变量替换 – 回复内容支持动态变量(用户名、商品信息、商品ID等)
    • 优先级策略 – 指定商品回复 > 商品专用关键词 > 通用关键词 > 默认回复 > AI回复

    🚚 自动发货功能

    • 智能匹配 – 基于商品信息自动匹配发货规则
    • 多规格支持 – 支持同一商品的不同规格自动匹配对应卡券
    • 精确匹配+兜底机制 – 优先精确匹配规格,失败时自动降级到普通卡券
    • 延时发货 – 支持设置发货延时时间(0-3600秒)
    • 多种触发 – 支持付款消息、小刀消息等多种触发条件
    • 防重复发货 – 智能防重复机制,避免重复发货
    • 多种发货方式 – 支持固定文字、批量数据、API调用、图片发货等方式
    • 图片发货 – 支持上传图片并自动发送给买家,图片自动上传到CDN
    • 自动确认发货 – 检测到付款后自动调用闲鱼API确认发货,支持锁机制防并发
    • 防重复确认 – 智能防重复确认机制,避免重复API调用
    • 订单详情缓存 – 订单详情获取支持数据库缓存,大幅提升性能
    • 发货统计 – 完整的发货记录和统计功能

    🛍️ 商品管理

    • 自动收集 – 消息触发时自动收集商品信息
    • API获取 – 通过闲鱼API获取完整商品详情
    • 多规格支持 – 支持多规格商品的规格信息管理
    • 批量管理 – 支持批量查看、编辑、切换多规格状态
    • 智能去重 – 自动去重,避免重复存储

    🔍 商品搜索功能

    • 真实数据获取 – 基于Playwright技术获取真实闲鱼商品数据
    • 智能排序 – 按”人想要”数量自动倒序排列
    • 多页搜索 – 支持一次性获取多页商品数据
    • 前端分页 – 灵活的前端分页显示
    • 商品详情 – 支持查看完整商品详情信息

    📊 系统监控

    • 实时日志 – 完整的操作日志记录和查看
    • 性能监控 – 系统资源使用情况监控
    • 健康检查 – 服务状态健康检查

    📁 数据管理

    • Excel导入导出 – 支持关键词数据的Excel格式导入导出
    • 模板生成 – 自动生成包含示例数据的导入模板
    • 批量操作 – 支持批量添加、更新关键词数据
    • 数据验证 – 导入时自动验证数据格式和重复性
    • 多规格卡券管理 – 支持创建和管理多规格卡券
    • 发货规则管理 – 支持多规格发货规则的创建和管理
    • 数据备份 – 自动数据备份和恢复
    • 一键部署 – 提供预构建Docker镜像,无需编译即可快速部署
    xianyu-auto-reply/
    ├── 📄 核心文件
    │   ├── Start.py                    # 项目启动入口,初始化所有服务
    │   ├── XianyuAutoAsync.py         # 闲鱼WebSocket连接和消息处理核心
    │   ├── reply_server.py            # FastAPI Web服务器和完整API接口
    │   ├── db_manager.py              # SQLite数据库管理,支持多用户数据隔离
    │   ├── cookie_manager.py          # 多账号Cookie管理和任务调度
    │   ├── ai_reply_engine.py         # AI智能回复引擎,支持多种AI模型
    │   ├── file_log_collector.py      # 实时日志收集和管理系统
    │   ├── config.py                  # 全局配置文件管理器
    │   ├── secure_confirm_ultra.py    # 自动确认发货模块(多层加密保护)
    │   └── secure_freeshipping_ultra.py # 自动免拼发货模块(多层加密保护)
    ├── 🛠️ 工具模块
    │   └── utils/
    │       ├── xianyu_utils.py        # 闲鱼API工具函数(加密、签名、解析)
    │       ├── message_utils.py       # 消息格式化和处理工具
    │       ├── ws_utils.py            # WebSocket客户端封装
    │       ├── image_utils.py         # 图片处理和管理工具
    │       ├── image_uploader.py      # 图片上传到闲鱼CDN
    │       ├── image_utils.py         # 图片处理工具(压缩、格式转换)
    │       ├── item_search.py         # 商品搜索功能(基于Playwright,无头模式)
    │       ├── order_detail_fetcher.py # 订单详情获取工具
    │       └── qr_login.py            # 二维码登录功能
    ├── 🌐 前端界面
    │   └── static/
    │       ├── index.html             # 主管理界面(集成所有功能模块)
    │       ├── login.html             # 用户登录页面
    │       ├── register.html          # 用户注册页面(邮箱验证)
    │       ├── js/
    │       │   └── app.js             # 主要JavaScript逻辑和所有功能模块
    │       ├── css/
    │       │   ├── variables.css      # CSS变量定义
    │       │   ├── layout.css         # 布局样式
    │       │   ├── components.css     # 组件样式
    │       │   ├── accounts.css       # 账号管理样式
    │       │   ├── keywords.css       # 关键词管理样式
    │       │   ├── items.css          # 商品管理样式
    │       │   ├── logs.css           # 日志管理样式
    │       │   ├── notifications.css  # 通知样式
    │       │   ├── dashboard.css      # 仪表板样式
    │       │   ├── admin.css          # 管理员样式
    │       │   └── app.css            # 主应用样式
    │       ├── lib/
    │       │   ├── bootstrap/         # Bootstrap框架
    │       │   └── bootstrap-icons/   # Bootstrap图标
    │       ├── uploads/
    │       │   └── images/            # 上传的图片文件
    │       ├── xianyu_js_version_2.js # 闲鱼JavaScript工具库
    │       ├── wechat-group.png       # 微信群二维码
    │       └── qq-group.png           # QQ群二维码
    ├── 🐳 Docker部署
    │   ├── Dockerfile                 # Docker镜像构建文件(优化版)
    │   ├── Dockerfile-cn             # 国内优化版Docker镜像构建文件
    │   ├── docker-compose.yml        # Docker Compose一键部署配置
    │   ├── docker-compose-cn.yml     # 国内优化版Docker Compose配置
    │   ├── docker-deploy.sh          # Docker部署管理脚本(Linux/macOS)
    │   ├── docker-deploy.bat         # Docker部署管理脚本(Windows)
    │   ├── entrypoint.sh              # Docker容器启动脚本
    │   └── .dockerignore             # Docker构建忽略文件
    ├── 🌐 Nginx配置
    │   └── nginx/
    │       ├── nginx.conf            # Nginx反向代理配置
    │       └── ssl/                  # SSL证书目录
    ├── 📋 配置文件
    │   ├── global_config.yml         # 全局配置文件(WebSocket、API等)
    │   ├── requirements.txt          # Python依赖包列表(精简版,无内置模块)
    │   ├── .gitignore                # Git忽略文件配置(完整版)
    │   └── README.md                 # 项目说明文档(本文件)
    └── 📊 数据目录(运行时创建)
        ├── data/                     # 数据目录(Docker挂载)
        │   └── xianyu_data.db        # SQLite数据库文件
        ├── logs/                     # 按日期分割的日志文件
        └── backups/                  # 数据备份文件

    ⚡ 最快部署方式(推荐):使用预构建镜像,无需下载源码,一条命令即可启动!

    方式一:Docker 一键部署(最简单)

    # 1. 创建数据目录
    mkdir -p xianyu-auto-reply
    
    # 2. 一键启动容器
    docker run -d \
      -p 8080:8080 \
      -v $PWD/xianyu-auto-reply/:/app/data/ \
      --name xianyu-auto-reply \
      registry.cn-shanghai.aliyuncs.com/zhinian-software/xianyu-auto-reply:1.0.2
    
    # 3. 访问系统
    # http://localhost:8080

    Windows用户

    # 创建数据目录
    mkdir xianyu-auto-reply
    
    # 启动容器
    docker run -d -p 8080:8080 -v %cd%/xianyu-auto-reply/:/app/data/ --name xianyu-auto-reply registry.cn-shanghai.aliyuncs.com/zhinian-software/xianyu-auto-reply:1.0

    方式二:从源码构建部署

    # 1. 克隆项目
    git clone https://github.com/zhinianboke/xianyu-auto-reply.git
    cd xianyu-auto-reply
    
    # 2. 设置脚本执行权限(Linux/macOS)
    chmod +x docker-deploy.sh
    
    # 3. 一键部署(自动构建镜像)
    ./docker-deploy.sh
    
    # 4. 访问系统
    # http://localhost:8080

    Windows用户

    # 使用Windows批处理脚本(推荐)
    docker-deploy.bat
    
    # 或者使用Git Bash/WSL
    bash docker-deploy.sh
    
    # 或者直接使用Docker Compose
    docker-compose up -d --build

    方式三:本地开发部署

    # 1. 克隆项目
    git clone https://github.com/zhinianboke/xianyu-auto-reply.git
    cd xianyu-auto-reply
    
    # 2. 创建虚拟环境(推荐)
    python -m venv venv
    source venv/bin/activate  # Linux/macOS
    # 或 venv\Scripts\activate  # Windows
    
    # 3. 安装Python依赖
    pip install --upgrade pip
    pip install -r requirements.txt
    
    # 4. 安装Playwright浏览器
    playwright install chromium
    playwright install-deps chromium  # Linux需要
    
    # 5. 启动系统
    python Start.py
    
    # 6. 访问系统
    # http://localhost:8080
    • Python: 3.11+
    • Node.js: 16+ (用于JavaScript执行)
    • 系统: Windows/Linux/macOS
    • 内存: 建议2GB+
    • 存储: 建议10GB+
    • Docker: 20.10+ (Docker部署)
    • Docker Compose: 2.0+ (Docker部署)

    部署完成后,您可以通过以下方式访问系统:

    ⚠️ 安全提示:首次登录后请立即修改默认密码!

    1. 用户注册

    • 访问 http://localhost:8080/register.html
    • 填写用户信息,完成邮箱验证
    • 输入图形验证码完成注册

    2. 添加闲鱼账号

    • 登录系统后进入主界面
    • 点击”添加新账号”
    • 输入账号ID和完整的Cookie值
    • 系统自动启动账号监控任务

    3. 配置自动回复

    • 关键词回复:设置关键词和对应回复内容
    • AI回复:配置OpenAI API密钥启用智能回复
    • 默认回复:设置未匹配时的默认回复

    4. 设置自动发货

    • 添加发货规则,设置商品关键词和发货内容
    • 支持文本内容和卡密文件两种发货方式
    • 系统检测到付款消息时自动确认发货并自动发货

    5. 使用商品搜索功能

    • 访问商品搜索页面(需要登录)
    • 输入搜索关键词和查询页数
    • 系统自动获取真实闲鱼商品数据
    • 商品按”人想要”数量自动排序
    • 支持查看商品详情和跳转到闲鱼页面
    ┌─────────────────────────────────────┐
    │           Web界面 (FastAPI)         │
    │         用户管理 + 功能界面          │
    └─────────────┬───────────────────────┘
                  │
    ┌─────────────▼───────────────────────┐
    │        CookieManager               │
    │         多账号任务管理              │
    └─────────────┬───────────────────────┘
                  │
    ┌─────────────▼───────────────────────┐
    │      XianyuLive (多实例)           │
    │     WebSocket连接 + 消息处理        │
    └─────────────┬───────────────────────┘
                  │
    ┌─────────────▼───────────────────────┐
    │        SQLite数据库                │
    │   用户数据 + 商品信息 + 配置数据     │
    └─────────────────────────────────────┘
    

    🚀 自动回复系统

    • 智能关键词匹配 – 支持精确匹配和模糊匹配,灵活配置回复规则
    • AI智能回复 – 集成多种AI模型(通义千问、GPT等),智能理解用户意图
    • 多账号管理 – 支持同时管理多个闲鱼账号,独立配置和运行
    • 实时消息处理 – WebSocket长连接,毫秒级响应用户消息
    • 自定义回复模板 – 支持占位符和动态内容,个性化回复体验

    🛒 自动发货系统

    • 智能订单识别 – 自动识别虚拟商品订单,精准匹配发货规则
    • 多重安全验证 – 超级加密保护,防止误操作和数据泄露
    • 批量处理能力 – 支持批量确认发货,提高处理效率
    • 异常处理机制 – 完善的错误处理和重试机制,确保发货成功
    • 多渠道通知 – 支持QQ、钉钉、飞书、Bark、邮件等多种发货通知方式

    👥 多用户系统

    • 用户注册登录 – 支持邮箱验证和图形验证码,安全可靠
    • 权限管理 – 管理员和普通用户权限分离,精细化权限控制
    • 数据隔离 – 每个用户的数据完全隔离,保护隐私安全
    • 会话管理 – JWT Token认证,支持自动续期和安全登出

    📊 数据管理

    • 商品信息管理 – 自动获取和同步商品信息,实时更新状态
    • 订单数据统计 – 详细的订单数据分析和可视化图表
    • 关键词管理 – 灵活的关键词配置,支持正则表达式
    • 数据导入导出 – 支持Excel格式的批量数据操作
    • 自动备份 – 定期自动备份重要数据,防止数据丢失

    🔍 商品搜索

    • 真实数据获取 – 基于Playwright技术,无头模式获取真实闲鱼商品数据
    • 多页搜索 – 支持分页搜索和批量获取,无限制数据采集
    • 智能排序 – 按”人想要”数量自动倒序排列,优先显示热门商品
    • 数据可视化 – 美观的商品展示界面,支持排序和筛选
    • 前端分页 – 灵活的前端分页显示,提升用户体验
    • 账号状态验证 – 自动检查cookies启用状态,确保搜索功能正常

    📱 通知系统

    • 多渠道支持 – QQ、钉钉、飞书、Bark、邮件、微信、Telegram等8种通知方式
    • 智能配置 – 可视化配置界面,支持复杂参数和加密设置
    • 实时推送 – 重要事件实时通知,及时了解系统状态
    • 通知模板 – 自定义通知内容和格式,个性化消息推送
    • 移动端支持 – Bark iOS推送,随时随地接收通知

    🔐 安全特性

    • Cookie安全管理 – 加密存储用户凭证,定期自动刷新
    • Token自动刷新 – 智能检测和刷新过期Token,保持连接稳定
    • 操作日志 – 详细记录所有操作日志,支持审计和追踪
    • 异常监控 – 实时监控系统异常和错误,主动预警

    🎨 用户界面

    • 现代化设计 – 基于Bootstrap 5的响应式界面,美观易用
    • 多主题支持 – 支持明暗主题切换,个性化界面体验
    • 移动端适配 – 完美适配手机和平板设备,随时随地管理
    • 实时更新 – 界面数据实时更新,无需手动刷新

    🚀 核心启动模块

    • Start.py – 项目启动入口,初始化CookieManager和FastAPI服务,从数据库加载账号任务并启动后台API服务,支持环境变量配置
    • XianyuAutoAsync.py – 闲鱼WebSocket连接核心,处理消息收发、自动回复、指定商品回复、自动发货、商品信息收集、AI回复
    • reply_server.py – FastAPI Web服务器,提供完整的管理界面和RESTful API接口,支持多用户系统、JWT认证、权限管理
    • cookie_manager.py – 多账号Cookie管理器,负责账号任务的启动、停止、状态管理和线程安全操作,支持数据库持久化

    🗄️ 数据和配置管理

    • db_manager.py – SQLite数据库管理器,支持多用户数据隔离、自动迁移、版本管理、完整的CRUD操作、邮箱验证、系统设置
    • config.py – 全局配置文件管理器,加载YAML配置和环境变量,提供配置项访问接口,支持动态配置更新
    • global_config.yml – 全局配置文件,包含WebSocket、API、自动回复、AI、通知等所有系统配置项

    🤖 智能功能模块

    • ai_reply_engine.py – AI智能回复引擎,支持OpenAI、通义千问等多种AI模型,意图识别、上下文管理、个性化回复
    • secure_confirm_ultra.py – 自动确认发货模块,采用多层加密保护,调用闲鱼API确认发货状态,支持锁机制防并发
    • secure_freeshipping_ultra.py – 自动免拼发货模块,支持批量处理、异常恢复、智能匹配、规格识别
    • file_log_collector.py – 实时日志收集器,提供Web界面日志查看、搜索、过滤、下载和管理功能

    🛠️ 工具模块 (utils/)

    • xianyu_utils.py – 闲鱼API核心工具,包含加密算法、签名生成、数据解析、Cookie处理、请求封装
    • message_utils.py – 消息处理工具,格式化消息内容、变量替换、内容过滤、模板渲染、表情处理
    • ws_utils.py – WebSocket客户端封装,处理连接管理、心跳检测、重连机制、消息队列、异常恢复
    • qr_login.py – 二维码登录功能,生成登录二维码、状态检测、Cookie获取、验证、自动刷新
    • item_search.py – 商品搜索功能,基于Playwright获取真实闲鱼商品数据,支持分页、过滤、排序
    • order_detail_fetcher.py – 订单详情获取工具,解析订单信息、买家信息、SKU详情,支持缓存优化、锁机制
    • image_utils.py – 图片处理工具,支持压缩、格式转换、尺寸调整、水印添加、质量优化
    • image_uploader.py – 图片上传工具,支持多种CDN服务商、自动压缩、格式优化、批量上传

    🌐 前端界面 (static/)

    • index.html – 主管理界面,集成所有功能模块:账号管理、关键词管理、商品管理、发货管理、系统监控、用户管理等
    • login.html – 用户登录页面,支持图形验证码、记住登录状态、多重安全验证
    • register.html – 用户注册页面,支持邮箱验证码、实时验证、密码强度检测
    • js/app.js – 主要JavaScript逻辑,包含所有功能模块:前端交互、API调用、实时更新、数据管理、用户界面控制
    • css/ – 模块化样式文件,包含布局、组件、主题等分类样式,响应式设计,支持明暗主题切换
    • xianyu_js_version_2.js – 闲鱼JavaScript工具库,加密解密、数据处理、API封装
    • lib/ – 前端依赖库,包含Bootstrap 5、Bootstrap Icons等第三方库
    • uploads/images/ – 图片上传目录,支持发货图片和其他媒体文件存储

    🐳 部署配置

    • Dockerfile – Docker镜像构建文件,基于Python 3.11-slim,包含Playwright浏览器、系统依赖,支持无头模式运行,优化构建层级
    • Dockerfile-cn – 国内优化版Docker镜像构建文件,使用国内镜像源加速构建,适合国内网络环境
    • docker-compose.yml – Docker Compose配置,支持一键部署、完整环境变量配置、资源限制、健康检查、可选Nginx代理
    • docker-compose-cn.yml – 国内优化版Docker Compose配置文件,使用国内镜像源
    • docker-deploy.sh – Docker部署管理脚本,提供构建、启动、停止、重启、监控、日志查看等功能(Linux/macOS)
    • docker-deploy.bat – Windows版本部署脚本,支持Windows环境一键部署和管理
    • entrypoint.sh – Docker容器启动脚本,处理环境初始化、目录创建、权限设置和服务启动
    • nginx/nginx.conf – Nginx反向代理配置,支持负载均衡、SSL终端、WebSocket代理、静态文件服务
    • requirements.txt – Python依赖包列表,精简版本无内置模块,按功能分类组织,包含详细版本说明和安装指南
    • .gitignore – Git忽略文件配置,完整覆盖Python、Docker、前端、测试、临时文件等,支持项目特定文件类型
    • .dockerignore – Docker构建忽略文件,优化构建上下文大小和构建速度,排除不必要的文件和目录

    📊 系统架构图

    ┌─────────────────────────────────────────────────────────────────┐
    │                        Web前端界面                              │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  用户管理   │ │  账号管理   │ │  关键词管理 │ │  商品管理   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  日志管理   │ │  数据管理   │ │  商品搜索   │ │  系统监控   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
    ┌─────────────────────────────────────────────────────────────────┐
    │                     FastAPI Web服务器                          │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  用户认证   │ │  权限管理   │ │  API接口    │ │  文件上传   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  邮箱验证   │ │  图形验证码 │ │  实时日志   │ │  健康检查   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
    ┌─────────────────────────────────────────────────────────────────┐
    │                    CookieManager 多账号管理器                   │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  任务调度   │ │  状态监控   │ │  线程管理   │ │  异常处理   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
    ┌─────────────────────────────────────────────────────────────────┐
    │                XianyuLive 实例集群 (多实例并行)                  │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  账号A实例  │ │  账号B实例  │ │  账号C实例  │ │    ...      │ │
    │  │ WebSocket   │ │ WebSocket   │ │ WebSocket   │ │             │ │
    │  │ 消息处理    │ │ 消息处理    │ │ 消息处理    │ │             │ │
    │  │ 自动回复    │ │ 自动回复    │ │ 自动回复    │ │             │ │
    │  │ 自动发货    │ │ 自动发货    │ │ 自动发货    │ │             │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
    ┌─────────────────────────────────────────────────────────────────┐
    │                      辅助服务模块                               │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │ AI回复引擎  │ │ 图片处理    │ │ 商品搜索    │ │ 订单处理    │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │ 日志收集    │ │ 文件管理    │ │ 通知推送    │ │ 数据备份    │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
    ┌─────────────────────────────────────────────────────────────────┐
    │                      SQLite数据库                               │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  用户数据   │ │  账号数据   │ │  关键词数据 │ │  商品数据   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  发货数据   │ │  系统设置   │ │  日志数据   │ │  统计数据   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
    

    🔄 数据流程图

    用户消息 → WebSocket接收 → 消息解析 → 关键词匹配 → 回复生成 → 消息发送
        │           │            │          │          │          │
        ▼           ▼            ▼          ▼          ▼          ▼
     商品识别   连接管理      内容过滤   AI处理    模板渲染   发送确认
        │           │            │          │          │          │
        ▼           ▼            ▼          ▼          ▼          ▼
     数据存储   状态监控      安全检查   上下文    变量替换   日志记录
    

    🔐 安全架构

    ┌─────────────────────────────────────────────────────────────────┐
    │                        安全防护层                               │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  JWT认证    │ │  权限控制   │ │  数据加密   │ │  访问控制   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
    │  │  图形验证码 │ │  邮箱验证   │ │  会话管理   │ │  操作日志   │ │
    │  └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
    └─────────────────────────────────────────────────────────────────┘
    

    管理员密码配置

    重要:为了系统安全,强烈建议修改默认管理员密码!

    默认密码

    • 用户名admin
    • 默认密码admin123
    • 初始化机制:首次创建数据库时自动创建admin用户

    全局配置文件

    global_config.yml 包含详细的系统配置,支持:

    • WebSocket连接参数
    • API接口配置
    • 自动回复设置
    • 商品管理配置
    • 日志配置等

    AI回复配置

    1. 在用户设置中配置OpenAI API密钥
    2. 选择AI模型(支持GPT-3.5、GPT-4、通义千问等)
    3. 设置回复策略和提示词
    4. 启用AI回复功能

    自动发货规则

    1. 进入发货管理页面
    2. 添加发货规则,设置商品关键词
    3. 上传卡密文件或输入发货内容
    4. 系统自动匹配商品并发货

    商品信息管理

    1. 系统自动收集消息中的商品信息
    2. 通过API获取完整商品详情
    3. 支持手动编辑商品信息
    4. 为自动发货提供准确的商品数据

    日志管理

    • 实时日志:Web界面查看实时系统日志
    • 日志文件logs/ 目录下的按日期分割的日志文件
    • 日志级别:支持DEBUG、INFO、WARNING、ERROR级别

    🔒 安全特性

    • JWT认证:安全的用户认证机制
    • 图形验证码:防止自动化攻击
    • 邮箱验证:确保用户邮箱真实性
    • 数据隔离:用户数据完全隔离
    • 会话管理:安全的会话超时机制
    • 操作日志:完整的用户操作记录
    • 代码加密:核心业务逻辑采用多层加密保护

    🛡️ 技术特性

    🏗️ 架构设计

    • 微服务架构:模块化设计,易于维护和扩展
    • 异步编程:基于asyncio的高性能异步处理
    • WebSocket长连接:实时消息处理,低延迟响应
    • RESTful API:标准化的API接口设计

    🔧 技术栈

    • 后端框架:FastAPI + Uvicorn
    • 数据库:SQLite(轻量级,无需额外配置)
    • 前端技术:原生HTML/CSS/JavaScript + Bootstrap
    • WebSocket:实时双向通信
    • 容器化:Docker + Docker Compose

    🚀 性能优化

    • 连接池管理:高效的数据库连接管理
    • 异步处理:非阻塞I/O操作
    • 内存优化:智能缓存和垃圾回收
    • 资源限制:Docker容器资源限制和监控

    🔐 安全机制

    • 多层加密:敏感代码采用5层编码混淆
    • 变量名随机化:防止静态分析
    • 运行时解密:代码在内存中动态解密执行
    • 防重复机制:智能防重复确认和发货

    🤝 贡献指南

    欢迎为项目做出贡献!您可以通过以下方式参与:

    📝 提交问题

    • 在 GitHub Issues 中报告Bug
    • 提出新功能建议和改进意见
    • 分享使用经验和最佳实践

    🔧 代码贡献

    • Fork 项目到您的GitHub账号
    • 创建功能分支:git checkout -b feature/your-feature
    • 提交更改:git commit -am 'Add some feature'
    • 推送分支:git push origin feature/your-feature
    • 提交 Pull Request

    ❓ 常见问题

    1. 端口被占用

    如果8080端口被占用,可以修改 global_config.yml 文件中的 AUTO_REPLY.api.port 配置,或者在 Docker 启动时通过环境变量 WEB_PORT 指定端口。

    2. 数据库连接失败

    检查数据库文件权限,确保应用有读写权限。

    3. WebSocket连接失败

    检查防火墙设置,确保WebSocket端口可以访问。

    4. Shell脚本执行错误(Linux/macOS)

    如果遇到 bad interpreter 错误,说明脚本的行结束符格式不正确:

    # 方法1:手动修复行结束符
    sed -i 's/\r$//' docker-deploy.sh
    chmod +x docker-deploy.sh
    ./docker-deploy.sh
    
    # 方法2:直接使用bash运行
    bash docker-deploy.sh

    5. Docker容器启动失败

    如果遇到 exec /app/entrypoint.sh: no such file or directory 错误:

    # 确保entrypoint.sh文件存在并重新构建
    docker-compose down
    docker-compose build --no-cache
    docker-compose up -d

    6. 预构建镜像拉取失败

    如果无法拉取预构建镜像,可以使用源码构建:

    # 克隆项目并从源码构建
    git clone https://github.com/zhinianboke/xianyu-auto-reply.git
    cd xianyu-auto-reply
    ./docker-deploy.sh

    7. Windows系统部署

    Windows用户推荐使用批处理脚本:

    # 使用Windows批处理脚本
    docker-deploy.bat
    
    # 或者使用PowerShell
    powershell -ExecutionPolicy Bypass -File docker-deploy.bat

    📋 重要声明

    本项目仅供学习和研究使用,严禁商业用途!

    🚫 使用限制

    • ❌ 禁止商业使用 – 本项目及其衍生作品不得用于任何商业目的
    • ❌ 禁止销售 – 不得以任何形式销售本项目或基于本项目的服务
    • ❌ 禁止盈利 – 不得通过本项目进行任何形式的盈利活动
    • ❌ 禁止违法使用 – 不得将本项目用于任何违法违规活动

    ✅ 允许使用

    • ✅ 学习研究 – 可用于个人学习和技术研究
    • ✅ 非商业分享 – 可在非商业环境下分享和讨论
    • ✅ 开源贡献 – 欢迎为项目贡献代码和改进

    📝 使用要求

    如果您使用、修改或分发本项目,必须:

    1. 保留原作者信息 – 必须在显著位置标注原作者和项目来源
    2. 保留版权声明 – 不得删除或修改本版权声明
    3. 注明修改内容 – 如有修改,需明确标注修改部分
    4. 遵守开源协议 – 严格遵守项目的开源许可协议

    👤 原作者信息

    ⚠️ 免责声明

    1. 使用风险自负 – 使用本项目产生的任何风险由使用者自行承担
    2. 无质量保证 – 本项目按”现状”提供,不提供任何明示或暗示的保证
    3. 责任限制 – 作者不对使用本项目造成的任何损失承担责任
    4. 合规使用 – 使用者需确保使用行为符合当地法律法规

    📞 侵权处理

    如发现本项目存在侵权内容,请通过以下方式联系:

    我们将在收到通知后立即处理并删除相关内容。

    🤝 合作与授权

    如需商业使用或特殊授权,请通过项目交流群联系作者进行协商。


    ⚖️ 使用本项目即表示您已阅读、理解并同意遵守以上所有条款。

  •  免费下载Adobe Photoshop 2025 v26.11.0.18 for Win多国语言中文版PS激活正式最新软件一键安装包

    Adobe Photoshop 2025 v26.11.0.18 for Win的更新聚焦于AI驱动的效率提升与功能扩展。核心亮点包括:

    智能移除工具‌:新增AI查找干扰功能,可一键识别并清除图像中的电线、背景人物等干扰元素,支持复杂场景下的无缝修复;

    滤镜升级‌:新增刺绣滤镜风格,提供22种预设效果,AI自动融合生成逼真纹理;

    ACR17.5优化‌:强化去除反射功能,消除玻璃反光;新增椭圆形、猫眼形散景选项,提升电影质感;

    神经滤镜扩展‌:集成16款AI画笔,支持离线使用老照片修复、妆容迁移等高级功能;

    性能优化‌:多图层处理速度显著提升,1GB文件加载时间缩短至秒级。

    此外,版本延续了实时协作、预设智能管理等高效工作流设计。

    免费下载