<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="description"
    content="虾推啥 - 一行代码推送手机通知，免费、实时、跨平台、保护隐私。支持微信/Bark免费推送，并提供升级版 Email 通知与企业微信通知推送服务。无需注册，HTTP请求即可推送消息到微信。">
  <meta name="keywords"
    content="微信推送通知,手机推送服务,代码推送通知,HTTP推送消息,Python发送微信通知,Python推送消息,服务器监控通知,服务器告警通知,服务器宕机提醒,量化交易通知,期货交易提醒,爬虫完成通知,抢购成功通知,免费推送服务,无需注册推送,一行代码推送,微信通知API,如何用代码发送微信通知,如何用Python发送手机通知,服务器挂了如何通知我,Email通知推送,企业微信通知推送,企业微信消息推送">
  <meta name="author" content="虾推啥">
  <meta name="robots" content="index, follow">
  <meta name="googlebot" content="index, follow">
  <meta name="baiduspider" content="index, follow">
  <meta name="360spider" content="index, follow">
  <meta name="sogou" content="index, follow">
  <link rel="canonical" href="https://xtuis.cn/">
  <link rel="alternate" hreflang="zh-CN" href="https://xtuis.cn/">
  <link rel="alternate" hreflang="x-default" href="https://xtuis.cn/">
  <link rel="sitemap" type="application/xml" title="Sitemap" href="https://xtuis.cn/sitemap.xml">
  <link rel="icon" type="image/png" href="assets/images/xtuislogo.png">

  <!-- Open Graph / Facebook -->
  <meta property="og:type" content="website">
  <meta property="og:url" content="https://xtuis.cn/">
  <meta property="og:title" content="虾推啥 - 一行代码推送手机通知">
  <meta property="og:description" content="虾推啥 - 一行代码推送手机通知，免费、实时、跨平台、保护隐私。支持微信/Bark免费推送，并提供升级版 Email 通知与企业微信通知推送服务。">
  <meta property="og:image" content="https://xtuis.cn/assets/images/xtuislogo.png">
  <meta property="og:locale" content="zh_CN">
  <meta property="og:site_name" content="虾推啥">

  <!-- Twitter Card -->
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:url" content="https://xtuis.cn/">
  <meta name="twitter:title" content="虾推啥 - 一行代码推送手机通知">
  <meta name="twitter:description" content="虾推啥 - 一行代码推送手机通知，免费、实时、跨平台、保护隐私。支持微信/Bark免费推送，并提供升级版 Email 通知与企业微信通知推送服务。">
  <meta name="twitter:image" content="https://xtuis.cn/assets/images/xtuislogo.png">

  <!-- Mobile Theme Color -->
  <meta name="theme-color" content="#40babd">

  <title>虾推啥 - 一行代码推送手机通知</title>

  <!-- WeChat JS-SDK: customize share to chat / Moments when opened in WeChat -->
  <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
  <script>
    // Initialize sharing before the page body and other third-party scripts load.
    // User OAuth is unrelated: if an OAuth callback is in progress, clearOAuthParams()
    // calls this setup again after the token-fill flow has consumed ?code=.
    (function setupHomepageWeChatShare() {
      var SHARE = {
        API_BASE: 'https://qy.xtuis.cn',
        link: 'https://xtuis.cn/',
        title: '虾推啥 — 一行代码推送到手机',
        desc: '免费微信/Bark 推送通知，HTTP 一行代码即可推到手机',
        // Moments preview prefers larger thumbs; 100x100 logo often falls back to plain URL.
        imgUrl: 'https://xtuis.cn/assets/images/xtuislogo_new_original.png'
      };
      var setupGeneration = 0;

      function inWeChat() {
        return /MicroMessenger/i.test(navigator.userAgent || '');
      }

      function isAndroidWeChat() {
        return /Android/i.test(navigator.userAgent || '');
      }

      function hasOauthCallbackParams() {
        var params = new URLSearchParams(window.location.search);
        return params.has('code') || params.has('state');
      }

      function bindShareData() {
        var share = {
          title: SHARE.title,
          desc: SHARE.desc,
          link: SHARE.link,
          imgUrl: SHARE.imgUrl,
          success: function () {
            console.info('[jssdk] share data set ok');
          },
          fail: function (err) {
            console.warn('[jssdk] share data set fail', err);
          },
          cancel: function () {}
        };
        // Moments does not use desc — title + link + imgUrl only.
        var timeline = {
          title: SHARE.title,
          link: SHARE.link,
          imgUrl: SHARE.imgUrl,
          success: share.success,
          fail: share.fail,
          cancel: share.cancel
        };

        // Declaring / calling old+new on the same client often breaks Moments on one OS.
        // Android: legacy onMenu* ; iOS / others: update* (JSSDK 1.4+).
        // Still list both families in jsApiList — required for update* on some builds.
        if (isAndroidWeChat()) {
          if (wx.onMenuShareAppMessage) wx.onMenuShareAppMessage(share);
          if (wx.onMenuShareTimeline) wx.onMenuShareTimeline(timeline);
        } else {
          if (wx.updateAppMessageShareData) wx.updateAppMessageShareData(share);
          if (wx.updateTimelineShareData) wx.updateTimelineShareData(timeline);
        }
      }

      async function run() {
        if (!inWeChat() || typeof wx === 'undefined' || !wx.config) {
          return;
        }
        if (hasOauthCallbackParams()) {
          console.info('[jssdk] defer until oauth callback params cleared');
          return;
        }

        var myGeneration = ++setupGeneration;
        var pageUrl = window.location.href.split('#')[0];

        try {
          var configUrl = new URL(SHARE.API_BASE + '/payment/jssdk-config');
          configUrl.searchParams.set('url', pageUrl);
          var response = await fetch(configUrl.toString(), {
            method: 'GET',
            credentials: 'omit'
          });
          var config = await response.json();
          if (myGeneration !== setupGeneration) return;
          if (!response.ok) {
            console.warn('[jssdk] config failed', response.status, config);
            return;
          }

          // List both old + new; WeChat tip: update* may not work unless old names are listed too.
          var apiList = Array.from(new Set((config.jsApiList || []).concat([
            'updateAppMessageShareData',
            'updateTimelineShareData',
            'onMenuShareAppMessage',
            'onMenuShareTimeline'
          ])));

          wx.config({
            debug: new URLSearchParams(window.location.search).get('jssdk_debug') === 'true',
            appId: config.appId,
            timestamp: config.timestamp,
            nonceStr: config.nonceStr,
            signature: config.signature,
            jsApiList: apiList
          });

          wx.ready(function () {
            if (myGeneration !== setupGeneration) return;
            bindShareData();
            window.__xtuisWeChatShareReady = true;
            console.info('[jssdk] ready; share chat/moments →', SHARE.link,
              isAndroidWeChat() ? '(android/onMenu*)' : '(ios/update*)');
          });
          wx.error(function (error) {
            window.__xtuisWeChatShareReady = false;
            console.warn('[jssdk] config error', error);
          });
        } catch (error) {
          window.__xtuisWeChatShareReady = false;
          console.warn('[jssdk] setup failed', error);
        }
      }

      window.__xtuisSetupWeChatShare = run;
      run();
    })();
  </script>

  <!-- JSON-LD Structured Data -->
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "name": "虾推啥",
    "alternateName": "xtuis",
    "url": "https://xtuis.cn",
    "description": "一行代码推送手机通知，免费、实时、跨平台、保护隐私。支持微信/Bark免费推送，并提供升级版 Email 通知与企业微信通知推送服务。",
    "applicationCategory": "DeveloperApplication",
    "operatingSystem": "Any",
    "offers": {
      "@type": "Offer",
      "price": "0",
      "priceCurrency": "CNY"
    },
    "featureList": [
      "免费推送服务",
      "实时推送通知",
      "跨平台支持",
      "无需注册",
      "HTTP请求推送",
      "Python推送消息",
      "服务器监控告警",
      "量化交易提醒",
      "升级版Email通知",
      "升级版企业微信通知推送服务"
    ]
  }
  </script>

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "什么是虾推啥",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "虾推啥是一个能让你轻松地使用一行代码（一个http请求）就可以推送消息到手机通知的工具服务。"
        }
      },
      {
        "@type": "Question",
        "name": "如何用Python发送微信通知",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "使用虾推啥，只需一行Python代码即可发送微信通知：import requests; requests.get('https://wx.xtuis.cn/您的token.send?text=消息标题&desp=消息内容')"
        }
      },
      {
        "@type": "Question",
        "name": "服务器挂了如何通知我",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "使用虾推啥可以轻松实现服务器监控告警。当服务器宕机或出现异常时，只需在监控脚本中发送HTTP请求，即可实时收到微信通知。"
        }
      },
      {
        "@type": "Question",
        "name": "如何用代码发送手机通知",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "虾推啥支持任何能发送HTTP请求的编程语言。无论是Python、Java、JavaScript、Go、C++等，只需发送一个HTTP GET或POST请求即可推送消息到微信。"
        }
      }
    ]
  }
  </script>

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "name": "虾推啥",
    "url": "https://xtuis.cn",
    "logo": "https://xtuis.cn/assets/images/xtuislogo.png",
    "contactPoint": {
      "@type": "ContactPoint",
      "email": "weixin@xtuis.cn",
      "contactType": "customer service"
    }
  }
  </script>

  <!-- Baidu Analytics -->
  <script>
    var _hmt = _hmt || [];
    (function () {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?560164f408a54636a92aab7714eaa24c";
      hm.async = true;
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>

  <!-- External Fonts -->
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">

  <!-- Bootstrap CSS (CDN) -->
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">

  <!-- Code font -->
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap"
    rel="stylesheet">

  <!-- Prism CSS (CDN) -->
  <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">

  <!-- Font Awesome (CDN) -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">

  <!-- Custom CSS -->
  <link rel="stylesheet" href="assets/css/styles.css">
  <style>
    .token-fill-banner {
      position: fixed;
      left: 12px;
      right: 12px;
      bottom: calc(12px + env(safe-area-inset-bottom));
      z-index: 1200;
      display: none;
      align-items: center;
      justify-content: space-between;
      gap: 12px;
      padding: 12px 14px;
      border-radius: 12px;
      background: rgba(28, 28, 30, 0.94);
      color: #fff;
      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.22);
    }
    .token-fill-banner.visible { display: flex; }
    .token-fill-banner p {
      margin: 0;
      font-size: 13px;
      line-height: 1.45;
      flex: 1;
    }
    .token-fill-banner-actions {
      display: flex;
      gap: 8px;
      flex-shrink: 0;
    }
    .token-fill-banner-btn {
      border: none;
      border-radius: 999px;
      padding: 8px 14px;
      font-size: 13px;
      font-weight: 600;
      cursor: pointer;
    }
    .token-fill-banner-btn.primary {
      background: #07c160;
      color: #fff;
    }
    .token-fill-banner-btn.ghost {
      background: rgba(255, 255, 255, 0.12);
      color: #fff;
    }
    body.token-fill-banner-open {
      padding-bottom: 84px;
    }
    .lang-example-copy-btn.token-fill-highlight {
      border: 2px solid #07c160 !important;
      background: #e8fff2 !important;
      color: #067a3d !important;
      font-weight: 700 !important;
      box-shadow: 0 0 0 3px rgba(7, 193, 96, 0.28);
      animation: token-copy-pulse 1.2s ease-in-out 4;
    }
    @keyframes token-copy-pulse {
      0%, 100% { box-shadow: 0 0 0 3px rgba(7, 193, 96, 0.28); }
      50% { box-shadow: 0 0 0 6px rgba(7, 193, 96, 0.12); }
    }
  </style>

</head>

<body>
  <!-- Share Buttons -->
  <div class="share-buttons">
    <a href="javascript:void(0);" class="share-btn wechat" onclick="showWeChatShare()" title="分享到微信" aria-label="分享到微信">
      <i class="fab fa-weixin"></i>
    </a>
    <a href="javascript:void(0);" class="share-btn weibo" onclick="shareToWeibo()" title="分享到微博" aria-label="分享到微博">
      <i class="fab fa-weibo"></i>
    </a>
  </div>

  <!-- WeChat QR Code Modal -->
  <div class="wechat-qr-modal" id="wechatQrModal" onclick="closeWeChatShare()">
    <div class="wechat-qr-content" onclick="event.stopPropagation()">
      <span class="wechat-qr-close" onclick="closeWeChatShare()">&times;</span>
      <h3>分享到微信</h3>
      <p>请使用微信扫描二维码</p>
      <div id="wechatQrCode"></div>
                  <p style="font-size: 12px; color: #6e7381; margin-top: 10px;">微信内请用右上角菜单：发送给朋友 / 分享到朋友圈</p>
    </div>
  </div>

  <!-- Header -->
  <header class="header">
    <div class="container">
      <div class="header-content">
        <div class="logo-section">
          <img src="assets/images/xtuislogo.png" alt="虾推啥 Logo - 免费微信推送通知服务" class="logo-img" decoding="async"
            fetchpriority="high"
            onerror="this.style.display='none'; this.nextElementSibling.classList.remove('logo-icon-hidden');">
          <i class="fas fa-bell logo-icon logo-icon-hidden"></i>
          <p class="logo-text">虾推啥</p>
        </div>
        <button class="mobile-menu-toggle" aria-label="Toggle menu">
          <i class="fas fa-bars"></i>
        </button>
        <nav class="main-nav" id="main-nav">
          <div class="nav-upgrade-group" role="group" aria-label="升级版通知服务">
            <button type="button" class="nav-upgrade-trigger" aria-expanded="false"
              aria-controls="nav-upgrade-subitems">
              <span class="nav-upgrade-trigger-label">
                <i class="fas fa-rocket"></i> 升级版通知
              </span>
              <i class="fas fa-chevron-down nav-upgrade-caret" aria-hidden="true"></i>
            </button>
            <div class="nav-upgrade-subitems" id="nav-upgrade-subitems">
              <a href="https://xtuis.com" target="_blank" rel="noopener" class="nav-upgrade-link">
                <i class="fas fa-envelope-open-text"></i> Email通知
                <i class="fas fa-external-link-alt" style="font-size: 0.7em; margin-left: 0.25rem;"></i>
              </a>
              <a href="/payment/?service=qy_push" class="nav-upgrade-link">
                <i class="fas fa-building"></i> 企业微信通知
              </a>
            </div>
          </div>
          <a href="#usecases"><i class="fas fa-lightbulb"></i> 使用场景</a>
          <a href="#instruction"><i class="fas fa-book"></i> 使用方法</a>
          <a href="#pushcategoryform"><i class="fas fa-sliders-h"></i> 推送参数</a>
          <a href="#msgstatus"><i class="fas fa-magnifying-glass-chart"></i> 消息状态追踪</a>
          <a href="#agentcli"><i class="fas fa-robot"></i> Agent Xtuis</a>
          <a href="#donate"><i class="fas fa-heart"></i> 捐助我们</a>
          <a href="#FAQ"><i class="fas fa-question-circle"></i> 常见问题 FAQ</a>
          <a href="#contact"><i class="fas fa-envelope"></i> 联系我们</a>
        </nav>
      </div>
    </div>
  </header>

  <!-- Hero Section -->
  <section class="hero">
    <div class="container">
      <div class="hero-content">
        <div class="hero-text">
          <h1 class="tagline">一行代码推送手机通知</h1>
          <div class="features">
            <span class="feature-item">
              <i class="fas fa-check-circle"></i> 免费
            </span>
            <span class="feature-item">
              <i class="fas fa-bolt"></i> 实时
            </span>
            <span class="feature-item">
              <i class="fas fa-mobile-alt"></i> 跨平台
            </span>
            <span class="feature-item">
              <i class="fas fa-shield-alt"></i> 保护隐私
            </span>
          </div>

          <!-- Upgrade Service Entry -->
          <!-- <div class="email-upgrade-entry">
            <div class="email-upgrade-content">
              <i class="fas fa-envelope-open-text email-upgrade-icon"></i>
              <div class="email-upgrade-text">
                <span class="email-upgrade-label">升级版</span>
                <span class="email-upgrade-title">E-mail/企业微信通知</span>
              </div>
              <a href="https://xtuis.com" target="_blank" rel="noopener" class="email-upgrade-link">
                <span>了解更多</span>
                <i class="fas fa-arrow-right"></i>
              </a>
            </div>
          </div> -->

          <!-- <a href="xtuisstart.html" class="cta-button">
            <i class="fas fa-book"></i> 了解更多
          </a> -->
        </div>
        <div class="hero-image">
          <img src="assets/images/xtuis-notification-flow-logo-exact.png" alt="虾推啥 - 一行代码推送手机通知服务展示" decoding="async" fetchpriority="high"
            onerror="this.style.display='none'">
        </div>
      </div>
    </div>
  </section>

  <!-- Use Cases Section -->
  <section id="usecases" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-lightbulb"></i> 使用场景
      </h2>

      <div class="use-cases">
        <div class="use-case-card primary">
          <h3><i class="fas fa-chart-line"></i> 量化交易</h3>
        </div>
        <div class="use-case-card success">
          <h3><i class="fas fa-server"></i> 服务器运维</h3>
        </div>
        <div class="use-case-card info">
          <h3><i class="fas fa-spider"></i> 网络爬虫</h3>
        </div>
        <div class="use-case-card warning">
          <h3><i class="fas fa-gamepad"></i> 游戏脚本外挂</h3>
        </div>
      </div>

      <ul class="use-case-list">
        <li><i class="fas fa-comment-dots"></i> 我做程序化期货交易，想在成交后给我实时发送成交内容摘要</li>
        <li><i class="fas fa-comment-dots"></i> 我想在服务器宕机时候给我实时发送提醒以便及时处理</li>
        <li><i class="fas fa-comment-dots"></i> 我用程序在网上抢茅台，想在抢到后通知我</li>
        <li><i class="fas fa-comment-dots"></i> 我想在我的游戏外挂挂机时，定期通知我一些升级状态</li>
      </ul>
    </div>
  </section>

  <!-- Instructions Section -->
  <section id="instruction" class="section">
    <div class="container">
      <!-- Service Type Tabs -->
      <div class="service-tabs">
        <div class="tab-header">
          <button class="tab-btn active" data-tab="wechat-bark" onclick="switchTab('wechat-bark')">
            <i class="fas fa-comments"></i>
            <span>微信/Bark 通知</span>
          </button>
          <a href="https://xtuis.com" target="_blank" rel="noopener" class="tab-btn" data-tab="email">
            <i class="fas fa-envelope"></i>
            <span>Email 通知（升级版）</span>
            <i class="fas fa-external-link-alt tab-external-icon"></i>
          </a>
          <a href="/payment/?service=qy_push" class="tab-btn" data-tab="wecom">
            <i class="fas fa-building"></i>
            <span>企业微信通知（升级版）</span>
          </a>
        </div>
      </div>

      <h2 class="section-title">
        <i class="fas fa-book"></i> 使用方法
      </h2>

      <div class="instructions">
        <ol>
          <li id="instruction-step-follow">
            <strong>关注：</strong>微信扫一扫下面的二维码，关注我们的公众号
            <div class="qr-code-container" style="margin-top: 1rem;">
              <img src="assets/images/qrcode_for_gh_b9cfd57a0dd2_258.jpg" alt="虾推啥微信公众号二维码 - 关注获取推送token" loading="lazy"
                decoding="async" onerror="this.style.display='none'">
            </div>
          </li>
          <li id="instruction-step-copy">
            <strong>复制：</strong>关注后自动收到token并复制保存
          </li>
          <li id="httprequest">
            <strong>推送：</strong>发送http请求，推送到微信
            <div class="mt-3">
              <div class="lang-example-tabs" style="margin-top: 1rem;">
                <div class="lang-example-topbar">
                  <div class="lang-example-topbar-title">
                    <i class="fas fa-info-circle" style="color: var(--lang-accent);"></i>
                    <span class="lang-example-topbar-text">复制如下文本</span>
                    <button type="button" class="lang-example-copy-btn"
                      style="margin-left: 8px; font-size: 0.75rem; padding: 2px 8px;"
                      onclick="copyText(personalizeExampleText('https://wx.xtuis.cn/ABCDEFG.send?text=黄金大涨&desp=黄金大涨100元'), this)">复制代码</button>
                  </div>
                </div>
                <div class="code-block" style="margin:0; border-radius: 0 0 10px 10px; border-top: none;">
                  <code>https://wx.xtuis.cn/ABCDEFG.send?text=黄金大涨&desp=黄金大涨100元</code>
                </div>
              </div>
              <p id="browserExampleHint" class="mt-2">粘贴到网页浏览器的地址栏里，并用您的token替换其中的ABCDEFG，回车，即可收到微信通知。</p>
              <div class="browser-example mt-3">
                <img src="assets/images/browseraddressbar.png" alt="虾推啥HTTP请求推送示例 - 浏览器地址栏使用方法"
                  style="max-width: 100%; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); display: block; margin: 0 auto;"
                  loading="lazy" decoding="async" onerror="this.style.display='none'">
              </div>
            </div>

            <div class="mt-4">
              <h6><i class="fas fa-code"></i> 或者使用常用语言推送：</h6>
              <div class="lang-example-tabs" id="lang-example-tabs-get" data-http-method="GET">
                <div class="lang-example-topbar">
                  <div class="lang-example-topbar-title">
                    <span class="lang-example-method-badge" aria-label="GET 请求">GET</span>
                    <span class="lang-example-topbar-text">示例</span>
                    <button type="button" class="lang-example-copy-btn" style="margin-left: 8px;"
                      onclick="copyLangExampleCode('lang-example-tabs-get', this)"
                      aria-label="复制当前 GET 示例代码">复制代码</button>
                  </div>
                </div>
                <p class="lang-example-note">
                  <i class="fas fa-info-circle"></i>
                  下方示例基于同一个 GET 请求思路（将参数编码后拼到 URL）。请把 <code>您的token</code> 替换成你自己的 token。
                  中文等非 ASCII 内容必须 URL 编码；MetaTrader（MQL5）的 <code>WebRequest</code> 若直接把中文写进 URL，会被拒绝并返回 400。
                </p>
                <div class="lang-tab-header" role="tablist" aria-label="常用语言示例标签">
                  <button class="lang-tab-btn active" type="button" data-lang-tab="curl"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'curl')">cURL</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="python"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'python')">Python</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="javascript"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'javascript')">JavaScript</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="nodejs"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'nodejs')">Node.js</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="go"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'go')">Go</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="php"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'php')">PHP</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="java"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'java')">Java</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="csharp"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'csharp')">C#</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="ruby"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'ruby')">Ruby</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="rust"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'rust')">Rust</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="kotlin"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'kotlin')">Kotlin</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="powershell"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'powershell')">PowerShell</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="mt5"
                    onclick="switchLangExampleTab('lang-example-tabs-get', 'mt5')">MetaTrader</button>
                </div>

                <div class="lang-tab-content active" id="lang-tab-content-curl" data-lang-content="curl">
                  <div class="code-block">
                    <pre><code class="language-bash">curl -G 'https://wx.xtuis.cn/您的token.send' \
  --data-urlencode 'text=黄金大涨' \
  --data-urlencode 'desp=黄金大涨100元'</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-python" data-lang-content="python">
                  <div class="code-block">
                    <pre><code class="language-python">import requests

params = {
    "text": "黄金大涨",
    "desp": "黄金大涨100元",
}

response = requests.get(
    "https://wx.xtuis.cn/您的token.send",
    params=params,
    timeout=10,
)

print(response.text)</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-javascript" data-lang-content="javascript">
                  <div class="code-block">
                    <pre><code class="language-javascript">const params = new URLSearchParams({
  text: "黄金大涨",
  desp: "黄金大涨100元",
});

fetch(`https://wx.xtuis.cn/您的token.send?${params.toString()}`)
  .then((res) => res.text())
  .then((text) => console.log(text));</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-nodejs" data-lang-content="nodejs">
                  <div class="code-block">
                    <pre><code class="language-javascript">const axios = require("axios");

axios
  .get("https://wx.xtuis.cn/您的token.send", {
    params: {
      text: "黄金大涨",
      desp: "黄金大涨100元",
    },
    timeout: 10000,
  })
  .then(({ data }) => console.log(data))
  .catch((err) => console.error(err.message));</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-go" data-lang-content="go">
                  <div class="code-block">
                    <pre><code class="language-go">package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    params := url.Values{}
    params.Set("text", "黄金大涨")
    params.Set("desp", "黄金大涨100元")

    endpoint := "https://wx.xtuis.cn/您的token.send?" + params.Encode()
    resp, err := http.Get(endpoint)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-php" data-lang-content="php">
                  <div class="code-block">
                    <pre><code class="language-php">&lt;?php
$query = http_build_query([
    'text' => '黄金大涨',
    'desp' => '黄金大涨100元',
]);

$url = 'https://wx.xtuis.cn/您的token.send?' . $query;
$result = file_get_contents($url);

echo $result;</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-java" data-lang-content="java">
                  <div class="code-block">
                    <pre><code class="language-java">import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

HttpClient client = HttpClient.newHttpClient();
String query = "text=" + URLEncoder.encode("黄金大涨", StandardCharsets.UTF_8)
    + "&amp;desp=" + URLEncoder.encode("黄金大涨100元", StandardCharsets.UTF_8);

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://wx.xtuis.cn/您的token.send?" + query))
    .GET()
    .build();

HttpResponse&lt;String&gt; response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-csharp" data-lang-content="csharp">
                  <div class="code-block">
                    <pre><code class="language-csharp">using System;
using System.Net.Http;
using System.Threading.Tasks;

using var client = new HttpClient();

var query = $"text={Uri.EscapeDataString("黄金大涨")}&amp;desp={Uri.EscapeDataString("黄金大涨100元")}";
var url = $"https://wx.xtuis.cn/您的token.send?{query}";

var result = await client.GetStringAsync(url);
Console.WriteLine(result);</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-ruby" data-lang-content="ruby">
                  <div class="code-block">
                    <pre><code class="language-ruby">require "uri"
require "net/http"

uri = URI("https://wx.xtuis.cn/您的token.send")
uri.query = URI.encode_www_form(
  text: "黄金大涨",
  desp: "黄金大涨100元"
)

response = Net::HTTP.get_response(uri)
puts response.body</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-rust" data-lang-content="rust">
                  <div class="code-block">
                    <pre><code class="language-rust">use reqwest::blocking::Client;
use reqwest::Url;

fn main() -> Result<(), Box&lt;dyn std::error::Error&gt;> {
    let mut url = Url::parse("https://wx.xtuis.cn/您的token.send")?;
    url.query_pairs_mut()
        .append_pair("text", "黄金大涨")
        .append_pair("desp", "黄金大涨100元");

    let body = Client::new().get(url).send()?.text()?;
    println!("{body}");
    Ok(())
}</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-kotlin" data-lang-content="kotlin">
                  <div class="code-block">
                    <pre><code class="language-kotlin">import java.net.URI
import java.net.URLEncoder
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.nio.charset.StandardCharsets

fun main() {
    val query = "text=" + URLEncoder.encode("黄金大涨", StandardCharsets.UTF_8) +
        "&amp;desp=" + URLEncoder.encode("黄金大涨100元", StandardCharsets.UTF_8)

    val request = HttpRequest.newBuilder()
        .uri(URI.create("https://wx.xtuis.cn/您的token.send?$query"))
        .GET()
        .build()

    val response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString())
    println(response.body())
}</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-powershell" data-lang-content="powershell">
                  <div class="code-block">
                    <pre><code class="language-powershell">$text = [uri]::EscapeDataString("黄金大涨")
$desp = [uri]::EscapeDataString("黄金大涨100元")

$url = "https://wx.xtuis.cn/您的token.send?text=$text&amp;desp=$desp"
$result = Invoke-RestMethod -Method Get -Uri $url

$result</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" id="lang-tab-content-mt5" data-lang-content="mt5">
                  <div class="code-block">
                    <pre><code class="language-cpp">// MetaTrader 5 / MQL5 Script
// 1) Tools → Options → Expert Advisors
// 2) Allow WebRequest for listed URL，添加：https://wx.xtuis.cn
#property script_show_inputs

input string InpToken = "您的token";
input string InpText  = "黄金大涨";
input string InpDesp  = "黄金大涨100元";

string UrlEncodeUtf8(const string s)
{
   uchar bytes[];
   int n = StringToCharArray(s, bytes, 0, WHOLE_ARRAY, CP_UTF8);
   string out = "";
   for(int i = 0; i &lt; n - 1; i++)
   {
      int c = bytes[i];
      if((c &gt;= '0' &amp;&amp; c &lt;= '9') || (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') || (c &gt;= 'a' &amp;&amp; c &lt;= 'z')
         || c == '-' || c == '_' || c == '.' || c == '~')
         out += CharToString((uchar)c);
      else
         out += StringFormat("%%%02X", c);
   }
   return out;
}

void OnStart()
{
   string url = StringFormat(
      "https://wx.xtuis.cn/%s.send?text=%s&amp;desp=%s",
      InpToken,
      UrlEncodeUtf8(InpText),
      UrlEncodeUtf8(InpDesp)
   );

   char   post[];
   char   result[];
   string result_headers;
   ResetLastError();

   int res = WebRequest("GET", url, "", 5000, post, result, result_headers);
   if(res == -1)
   {
      Print("WebRequest failed, LastError=", GetLastError(),
            " (请确认已允许 https://wx.xtuis.cn)");
      return;
   }

   Print("HTTP ", res, " body=", CharArrayToString(result));
}</code></pre>
                  </div>
                </div>
              </div>

              <h6 class="mt-3">推送支持POST方法，推送内容最大支持64KB大小的文字。以下是常用语言 POST 示例：</h6>
              <div class="lang-example-tabs" id="lang-example-tabs-post" data-http-method="POST">
                <div class="lang-example-topbar">
                  <div class="lang-example-topbar-title">
                    <span class="lang-example-method-badge" aria-label="POST 请求">POST</span>
                    <span class="lang-example-topbar-text">示例</span>
                    <button type="button" class="lang-example-copy-btn" style="margin-left: 8px;"
                      onclick="copyLangExampleCode('lang-example-tabs-post', this)"
                      aria-label="复制当前 POST 示例代码">复制代码</button>
                  </div>
                </div>
                <p class="lang-example-note">
                  <i class="fas fa-paper-plane"></i>
                  POST 示例默认发送 <code>application/x-www-form-urlencoded</code>，字段名为 <code>text</code> 和 <code>desp</code>。
                </p>
                <div class="lang-tab-header" role="tablist" aria-label="常用语言 POST 示例标签">
                  <button class="lang-tab-btn active" type="button" data-lang-tab="curl"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'curl')">cURL</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="python"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'python')">Python</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="javascript"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'javascript')">JavaScript</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="nodejs"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'nodejs')">Node.js</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="go"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'go')">Go</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="php"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'php')">PHP</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="java"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'java')">Java</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="csharp"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'csharp')">C#</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="ruby"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'ruby')">Ruby</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="rust"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'rust')">Rust</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="kotlin"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'kotlin')">Kotlin</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="powershell"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'powershell')">PowerShell</button>
                  <button class="lang-tab-btn" type="button" data-lang-tab="mt5"
                    onclick="switchLangExampleTab('lang-example-tabs-post', 'mt5')">MetaTrader</button>
                </div>

                <div class="lang-tab-content active" data-lang-content="curl">
                  <div class="code-block">
                    <pre><code class="language-bash">curl 'https://wx.xtuis.cn/您的token.send' \
  --data-urlencode 'text=你的标题' \
  --data-urlencode 'desp=最大支持64KB的文字内容'</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="python">
                  <div class="code-block">
                    <pre><code class="language-python">import requests

payload = {
    "text": "你的标题",
    "desp": "最大支持64KB的文字内容",
}

response = requests.post(
    "https://wx.xtuis.cn/您的token.send",
    data=payload,
    timeout=10,
)

print(response.text)</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="javascript">
                  <div class="code-block">
                    <pre><code class="language-javascript">const body = new URLSearchParams({
  text: "你的标题",
  desp: "最大支持64KB的文字内容",
});

fetch("https://wx.xtuis.cn/您的token.send", {
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
  },
  body,
})
  .then((res) => res.text())
  .then((text) => console.log(text));</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="nodejs">
                  <div class="code-block">
                    <pre><code class="language-javascript">const axios = require("axios");

const form = new URLSearchParams({
  text: "你的标题",
  desp: "最大支持64KB的文字内容",
});

axios
  .post("https://wx.xtuis.cn/您的token.send", form, {
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
    },
    timeout: 10000,
  })
  .then(({ data }) => console.log(data))
  .catch((err) => console.error(err.message));</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="go">
                  <div class="code-block">
                    <pre><code class="language-go">package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    form := url.Values{}
    form.Set("text", "你的标题")
    form.Set("desp", "最大支持64KB的文字内容")

    resp, err := http.PostForm("https://wx.xtuis.cn/您的token.send", form)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="php">
                  <div class="code-block">
                    <pre><code class="language-php">&lt;?php
$payload = http_build_query([
    'text' => '你的标题',
    'desp' => '最大支持64KB的文字内容',
]);

$opts = [
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
        'content' => $payload,
    ],
];

$context = stream_context_create($opts);
$result = file_get_contents('https://wx.xtuis.cn/您的token.send', false, $context);

echo $result;</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="java">
                  <div class="code-block">
                    <pre><code class="language-java">import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

HttpClient client = HttpClient.newHttpClient();
String form = "text=" + URLEncoder.encode("你的标题", StandardCharsets.UTF_8)
    + "&amp;desp=" + URLEncoder.encode("最大支持64KB的文字内容", StandardCharsets.UTF_8);

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://wx.xtuis.cn/您的token.send"))
    .header("Content-Type", "application/x-www-form-urlencoded")
    .POST(HttpRequest.BodyPublishers.ofString(form))
    .build();

HttpResponse&lt;String&gt; response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="csharp">
                  <div class="code-block">
                    <pre><code class="language-csharp">using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

using var client = new HttpClient();

var form = new FormUrlEncodedContent(new Dictionary&lt;string, string&gt;
{
    ["text"] = "你的标题",
    ["desp"] = "最大支持64KB的文字内容",
});

var response = await client.PostAsync("https://wx.xtuis.cn/您的token.send", form);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="ruby">
                  <div class="code-block">
                    <pre><code class="language-ruby">require "uri"
require "net/http"

uri = URI("https://wx.xtuis.cn/您的token.send")
response = Net::HTTP.post_form(uri, {
  "text" => "你的标题",
  "desp" => "最大支持64KB的文字内容"
})

puts response.body</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="rust">
                  <div class="code-block">
                    <pre><code class="language-rust">use reqwest::blocking::Client;

fn main() -> Result<(), Box&lt;dyn std::error::Error&gt;> {
    let body = Client::new()
        .post("https://wx.xtuis.cn/您的token.send")
        .form(&amp;[
            ("text", "你的标题"),
            ("desp", "最大支持64KB的文字内容"),
        ])
        .send()?
        .text()?;

    println!("{body}");
    Ok(())
}</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="kotlin">
                  <div class="code-block">
                    <pre><code class="language-kotlin">import java.net.URI
import java.net.URLEncoder
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.nio.charset.StandardCharsets

fun main() {
    val form = "text=" + URLEncoder.encode("你的标题", StandardCharsets.UTF_8) +
        "&amp;desp=" + URLEncoder.encode("最大支持64KB的文字内容", StandardCharsets.UTF_8)

    val request = HttpRequest.newBuilder()
        .uri(URI.create("https://wx.xtuis.cn/您的token.send"))
        .header("Content-Type", "application/x-www-form-urlencoded")
        .POST(HttpRequest.BodyPublishers.ofString(form))
        .build()

    val response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString())
    println(response.body())
}</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="powershell">
                  <div class="code-block">
                    <pre><code class="language-powershell">$body = @{
  text = "你的标题"
  desp = "最大支持64KB的文字内容"
}

$result = Invoke-RestMethod -Method Post `
  -Uri "https://wx.xtuis.cn/您的token.send" `
  -Body $body `
  -ContentType "application/x-www-form-urlencoded"

$result</code></pre>
                  </div>
                </div>

                <div class="lang-tab-content" data-lang-content="mt5">
                  <div class="code-block">
                    <pre><code class="language-cpp">// MetaTrader 5 / MQL5 — POST（路径无 ASCII，中文放在 body 里更稳妥）
// Tools → Options → Expert Advisors → 允许 https://wx.xtuis.cn
#property script_show_inputs

input string InpToken = "您的token";
input string InpText  = "你的标题";
input string InpDesp  = "最大支持64KB的文字内容";

string UrlEncodeUtf8(const string s)
{
   uchar bytes[];
   int n = StringToCharArray(s, bytes, 0, WHOLE_ARRAY, CP_UTF8);
   string out = "";
   for(int i = 0; i &lt; n - 1; i++)
   {
      int c = bytes[i];
      if((c &gt;= '0' &amp;&amp; c &lt;= '9') || (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') || (c &gt;= 'a' &amp;&amp; c &lt;= 'z')
         || c == '-' || c == '_' || c == '.' || c == '~')
         out += CharToString((uchar)c);
      else
         out += StringFormat("%%%02X", c);
   }
   return out;
}

void OnStart()
{
   string url = "https://wx.xtuis.cn/" + InpToken + ".send";
   string body = "text=" + UrlEncodeUtf8(InpText) + "&amp;desp=" + UrlEncodeUtf8(InpDesp);

   uchar post[];
   int n = StringToCharArray(body, post, 0, WHOLE_ARRAY, CP_UTF8);
   ArrayResize(post, n - 1);

   char   result[];
   string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
   string result_headers;
   ResetLastError();

   int res = WebRequest("POST", url, headers, 5000, post, result, result_headers);
   if(res == -1)
   {
      Print("WebRequest failed, LastError=", GetLastError());
      return;
   }
   Print("HTTP ", res, " body=", CharArrayToString(result));
}</code></pre>
                  </div>
                </div>
              </div>
            </div>
          </li>
        </ol>
      </div>
    </div>
  </section>

  <!-- Push Parameters Section -->
  <section id="pushcategoryform" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-sliders-h"></i> 推送参数
      </h2>

      <!-- Push Type Tabs -->
      <div class="push-type-tabs">
        <div class="push-tab-header">
          <button class="push-tab-btn active" data-push-tab="wechat" onclick="switchPushTab('wechat')">
            <i class="fab fa-weixin"></i>
            <span>微信</span>
          </button>
          <button class="push-tab-btn" data-push-tab="bark" onclick="switchPushTab('bark')">
            <i class="fas fa-mobile-alt"></i>
            <span>Bark</span>
          </button>
        </div>

        <!-- WeChat Push Tab Content -->
        <div class="push-tab-content active" id="wechat-tab-content">
          <div class="push-tab-grid">
            <div class="push-tab-col">
              <h4><i class="fas fa-list-ol"></i> 步骤</h4>
              <p>直接发送http请求</p>
            </div>
            <div class="push-tab-col">
              <h4><i class="fas fa-code"></i> HTTP请求格式</h4>
              <!-- <div class="code-block" style="margin: 0.5rem 0;">
                <code>http://wx.xtuis.cn/您的token.send</code>
              </div>
              <p>或者</p> -->
              <div class="code-block" style="margin: 0.5rem 0;">
                <code>https://wx.xtuis.cn/您的token.send</code>
              </div>
              <p><strong>参数说明：</strong></p>
              <ul>
                <li>text: 消息标题，必填。</li>
                <li>desp: 消息内容，选填。</li>
              </ul>
              <p><strong>例如：</strong></p>
              <div class="code-block" style="margin: 0.5rem 0;">
                <code>https://wx.xtuis.cn/您的token.send?text=白银大涨&desp=白银2012超过5000</code>
              </div>
            </div>
          </div>
        </div>

        <!-- Bark Push Tab Content -->
        <div class="push-tab-content" id="bark-tab-content">
          <div class="push-tab-grid">
            <div class="push-tab-col">
              <h4><i class="fas fa-list-ol"></i> 步骤</h4>
              <p>仅支持iPhone，使用步骤如下：</p>
              <ul>
                <li>iPhone下载软件"Bark"</li>
                <li>填写Bark私有服务器为虾推啥</li>
                <li>发送bark http请求</li>
              </ul>
            </div>
            <div class="push-tab-col">
              <h4><i class="fas fa-code"></i> HTTP请求格式</h4>
              <p><strong>注册：</strong>Bark服务器-私有地址</p>
              <div class="code-block" style="margin: 0.5rem 0;">
                <code>https://bark.xtuis.cn?xia=您的token</code>
              </div>
              <p><strong>使用：</strong>发送Bark的http请求</p>
              <div class="code-block" style="margin: 0.5rem 0;">
                <code>https://bark.xtuis.cn/您的token.send</code>
              </div>
              <p><strong>参数说明：</strong></p>
              <ul>
                <li>text: 消息标题，必填。</li>
                <li>desp: 消息内容，选填。</li>
              </ul>
              <p><strong>例如：</strong></p>
              <div class="code-block" style="margin: 0.5rem 0;">
                <code>https://bark.xtuis.cn/您的token.send?text=白银大涨&desp=白银2012超过5000</code>
              </div>
            </div>
          </div>
        </div>
      </div>

      <div class="table-container">
        <table>
          <thead>
            <tr>
              <th>限制类别</th>
              <th>限制条数</th>
              <th>超过后处理规则</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <th scope="row">每日推送上限</th>
              <td>300</td>
              <td>账户可能被锁定；需在微信中打开 <a href="/unlock/">https://xtuis.cn/unlock/</a> 支付解锁</td>
            </tr>
            <tr>
              <th scope="row">每分钟推送上限</th>
              <td>10</td>
              <td>账户可能被锁定；需在微信中打开 <a href="/unlock/">https://xtuis.cn/unlock/</a> 支付解锁</td>
            </tr>
            <tr>
              <th scope="row">单ip每日http请求上限</th>
              <td>5000</td>
              <td>当前 IP 的请求可能被临时拒绝；更换出口 IP 后通常仍可继续推送（与账户锁定不同）</td>
            </tr>
          </tbody>
        </table>
      </div>

      <!-- Upgrade Notice - Applies to entire limit table -->
      <div class="upgrade-notice"
        style="background: linear-gradient(135deg, #f0f9ff 0%, #e6f7ff 100%); border-left: 4px solid #40babd; padding: 1.25rem; border-radius: 8px; margin-top: 1.5rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); max-width: 900px;">
        <div style="display: flex; align-items: flex-start; gap: 1rem;">
          <i class="fas fa-rocket" style="color: #40babd; font-size: 1.5rem; margin-top: 0.2rem; flex-shrink: 0;"></i>
          <div style="flex: 1;">
            <p style="margin: 0 0 0.5rem 0; color: #2c3e50; font-weight: 600; font-size: 1rem;">
              <i class="fas fa-infinity" style="color: #40babd; margin-right: 0.5rem;"></i>需要更高推送额度？
            </p>
            <p style="margin: 0 0 1rem 0; color: #6e7381; font-size: 0.95rem; line-height: 1.6;">
              以上限制适用于<strong style="color: #40babd;">免费微信/Bark推送服务</strong>。如需更高推送限额，可按需升级到以下服务：
              <strong style="color: #40babd;">升级版 Email 通知</strong> 或
              <strong style="color: #07c160;">升级版 企业微信通知推送服务</strong>（请在微信中打开 xtuis.cn/payment/）。
            </p>
            <div style="display: flex; flex-wrap: wrap; gap: 0.75rem;">
              <a href="https://xtuis.com" target="_blank" rel="noopener" class="upgrade-link"
                style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: linear-gradient(135deg, #40babd 0%, #3aa7aa 100%); color: white; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 0.95rem; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(64, 186, 189, 0.3);">
                <i class="fas fa-external-link-alt"></i>
                <span>升级到 Email 通知</span>
              </a>
              <a href="/payment/?service=qy_push" class="upgrade-link"
                style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: linear-gradient(135deg, #07c160 0%, #06ad56 100%); color: white; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 0.95rem; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(7, 193, 96, 0.3);">
                <i class="fas fa-mobile-alt"></i>
                <span>在微信中升级企业微信推送</span>
              </a>
            </div>
          </div>
        </div>
      </div>
    </div>
  </section>

  <!-- Message Status Tracking Section -->
  <section id="msgstatus" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-magnifying-glass-chart"></i> 消息状态追踪
      </h2>
      <div class="section-block">
        <p>每条消息发送后，虾推啥都会返回一个唯一的 <strong>msg_id</strong>。用这个 ID 可以查询这条消息最终的投递结果——是成功送达手机，还是因为某种原因失败了。常见用途：程序里加上失败重试、运维脚本里加上告警闭环、抢购脚本里确认通知确实到了。</p>

        <p><strong>msg_id 长这样：</strong></p>
        <div class="code-block" style="margin: 0.5rem 0;">
          <code>wx_20260623164956_8db1c691e77fe369</code>
        </div>

        <p><strong>查询接口（GET 请求）：</strong></p>
        <div class="code-block" style="margin: 0.5rem 0;">
          <code>https://msgstatus.xtuis.cn/status/你的msg_id</code>
        </div>

        <p>把 <code>你的msg_id</code> 换成实际拿到的 ID。例如：</p>
        <div class="code-block" style="margin: 0.5rem 0;">
          <code>https://msgstatus.xtuis.cn/status/wx_20260623164956_8db1c691e77fe369</code>
        </div>

        <p>返回内容会告诉你这条消息当前的状态（成功 / 失败 / 处理中），失败时会附带原因（比如 token 错误、未关注公众号、超限被锁定等），方便你在程序里做精确处理。</p>

        <p style="margin-top: 1rem;"><i class="fas fa-info-circle" style="color: var(--primary-color);"></i> <strong>限流：</strong>同一个 IP 每分钟最多查询 5 次，超出会被拒绝（HTTP 429）。如果你在重试退避逻辑里循环查询，记得加上间隔，避免触发限流。</p>

        <p style="margin-top: 1.5rem; font-size: 0.9rem; color: var(--text-muted);">
          <i class="fas fa-book"></i> 需要更详细的技术信息（msg_id 生成规则、状态码定义、查询接口实现细节），请参阅项目关于 <code>msg_id</code> 状态追踪的设计文档。
        </p>
      </div>
    </div>
  </section>

  <!-- Agent Xtuis CLI Section -->
  <section id="agentcli" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-robot"></i> Agent Xtuis — 专为 AI Agent 打造
      </h2>
      <div class="section-block">
        <p><strong>Agent Xtuis CLI</strong> 是专为 AI Agent 打造的命令行工具——让 Agent 直接用一条 shell 命令（<code>xtuis send</code>）把消息推到你的手机。CLI 本身<strong>不绑定具体 Agent</strong>，<strong>Claude Code、Codex、Cline</strong> 等都能直接调用；不需要 Agent 自己拼 HTTP 请求、不需要在对话里暴露 token，全部走本地配置文件。</p>

        <p>「自然语言一句话触发推送」的 <strong>Skill 自动适配</strong>目前仅支持 <strong>Claude Code</strong>（在 <code>~/.claude/skills/</code> 装一个 SKILL.md，Claude 会自动识别）。<strong>Codex / Cline</strong> 等其他 Agent 暂时通过 <code>xtuis send</code> 显式调用即可——后续会补上各自的 Skill 适配。</p>

        <p><strong>一句话，让 Agent 自己装好：</strong></p>
        <div class="code-block" style="margin: 0.75rem 0;">
          <code style="white-space: normal; word-break: break-word; line-height: 1.6; display: inline-block; color: #e6edf3;">请阅读 https://xtuis.cn/doc/cli-setup.md 文档，按照步骤为我安装并配置 Agent Xtuis CLI。</code>
        </div>

        <p>把上面这句话发给你的 AI Agent，它会自动读取官方安装文档，独立完成 <strong>CLI 安装 → Skill 注册 → Token 配置 → 测试推送</strong> 全流程——整个过程中 <strong>Token 不会出现在对话里</strong>（Agent 会引导你自己在终端输入），你只需要最后看一眼手机，确认测试通知收到了。</p>

        <p>装好后，你可以直接用自然语言指挥 Agent：</p>
        <ul style="list-style: none; padding-left: 0;">
          <li style="margin: 0.4rem 0;"><i class="fas fa-comment-dots" style="color: var(--primary-color);"></i> 「把这个错误堆栈虾推啥发给我」</li>
          <li style="margin: 0.4rem 0;"><i class="fas fa-comment-dots" style="color: var(--primary-color);"></i> 「部署跑完通知我」</li>
          <li style="margin: 0.4rem 0;"><i class="fas fa-comment-dots" style="color: var(--primary-color);"></i> 「把当前 git status 推到我手机」</li>
          <li style="margin: 0.4rem 0;"><i class="fas fa-comment-dots" style="color: var(--primary-color);"></i> 「提醒我下午 3 点开会」（Agent 会用 sleep / 定时任务实现延迟推送）</li>
        </ul>

        <p>完整安装指南与命令清单：<a href="https://xtuis.cn/doc/cli-setup.md" target="_blank" rel="noopener"><strong>https://xtuis.cn/doc/cli-setup.md</strong></a></p>
      </div>
    </div>
  </section>

  <!-- MT5 Plugin Section -->
  <section id="mt5plugin" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-chart-line"></i> 虾推啥 MT5 插件 — 让交易信号直接到手机
      </h2>
      <div class="section-block">
        <p>下单成交、止损触发、价格突破关键位、移动止盈被激活——这些时刻你不可能一直盯盘。<strong>虾推啥 MT5 插件</strong>让你的 MetaTrader 5 在这些时刻，<strong>一行代码</strong>就把消息推到你的手机微信。</p>

        <p>不用搭服务器，不用配 webhook，不挑经纪商。装好插件、关注公众号拿到 token，你的 EA / 指标 / 脚本里加一行就能用。</p>

        <h3 style="margin-top: 2rem; color: var(--primary-color);"><i class="fas fa-list-ol"></i> 三步上手</h3>
        <ol style="line-height: 1.8; padding-left: 1.5rem;">
          <li><strong>装插件</strong>：下载 <code>XTuis_MT5.7z</code>，用 <a href="https://www.7-zip.org/" target="_blank" rel="noopener">7-Zip</a> 或 WinRAR 解压，双击里面的 <code>.exe</code> 安装程序，按提示输入虾推啥网址 <code>xtuis.cn</code>、点「安装」——完成。</li>
          <li><strong>拿 token</strong>：微信扫码关注虾推啥公众号，把收到的 token 复制保存。</li>
          <li><strong>跑测试</strong>：下载 <code>xtuis_test.mq5</code>，扔进 MT5 的 <code>MQL5/Scripts</code> 目录，刷新 Navigator 面板后双击运行——几秒内手机就会收到测试消息。</li>
        </ol>

        <p style="margin-top: 1.5rem;"><strong>装好之后</strong>，在你的 EA 或指标里这样调用就行：</p>
        <div class="code-block" style="margin: 0.75rem 0;">
          <pre style="margin:0; padding: 1rem; overflow-x: auto;"><code style="color: #e6edf3;">#include &lt;xtuis.mqh&gt;

void OnTradeTransaction(...)
{
   XTuisSend(Token, "成交提醒", "黄金 100g 多单 @ 520.30", "wx");
}</code></pre>
        </div>
        <p style="font-size: 0.9rem; color: var(--text-muted);">目前插件仅支持微信通道（参数固定填 <code>"wx"</code>）。token 只需在脚本顶部声明一次，调用时不用反复拼 URL。</p>

        <figure style="margin: 2rem 0; text-align: center;">
          <img src="/download/mt5/mt5-install-flow.jpg"
               alt="虾推啥 MT5 插件安装流程：下载解压、双击 exe、输入网址、自动安装到 MT5"
               style="max-width: 100%; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);"
               loading="lazy" decoding="async">
          <figcaption style="margin-top: 0.5rem; font-size: 0.9rem; color: var(--text-muted);">
            <i class="fas fa-image"></i> 安装流程一览：解压 → 双击 exe → 输入虾推啥网址 → 自动落地到 MT5
          </figcaption>
        </figure>

        <div style="display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 2rem; justify-content: center;">
          <a href="/download/mt5/XTuis_MT5.7z"
             style="display: inline-flex; align-items: center; gap: 0.5rem;
                    padding: 0.85rem 1.6rem; font-size: 1rem; font-weight: 600;
                    color: #fff; background: var(--primary-color);
                    border-radius: 8px; text-decoration: none;
                    box-shadow: 0 2px 6px rgba(64,186,189,0.3);">
            <i class="fas fa-download"></i> 下载插件包（XTuis_MT5.7z）
          </a>
          <a href="/download/mt5/xtuis_test.mq5"
             style="display: inline-flex; align-items: center; gap: 0.5rem;
                    padding: 0.85rem 1.6rem; font-size: 1rem; font-weight: 600;
                    color: var(--primary-color); background: transparent;
                    border: 2px solid var(--primary-color);
                    border-radius: 8px; text-decoration: none;">
            <i class="fas fa-vial"></i> 下载测试脚本（xtuis_test.mq5）
          </a>
        </div>

        <p style="margin-top: 1.5rem; font-size: 0.9rem; color: var(--text-muted); text-align: center;">
          <i class="fas fa-info-circle"></i> 仅支持 Windows x64（MT5 本身限制）。首次安装如被 SmartScreen 拦截，点「更多信息 → 仍要运行」即可。
        </p>
      </div>
    </div>
  </section>

  <!-- Donate Section -->
  <section id="donate" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-heart"></i> 捐助我们
      </h2>
      <div class="section-block">
        <div class="qr-code-container" style="text-align: center; margin: 2rem 0;">
          <img src="assets/images/support_wx_2dcode.png" alt="虾推啥微信赞赏二维码 - 支持项目发展"
            style="max-width: 300px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);" loading="lazy"
            decoding="async" onerror="this.style.display='none'">
        </div>
        <p style="text-align: center; max-width: 600px; margin: 0 auto;">如果你觉得「虾推啥」帮到了你，
          如果你愿意轻轻表达一句“谢谢”——
          我们准备了一个赞赏通道。
          它不是付费墙，不是充值入口，
          只是你和我们之间的一次小小链接。

          💡 不论是否赞赏，服务都将照常运行。
          你的支持，只会让我们更有动力，
          在深夜，也继续把消息送达你想要的地方。</p>
      </div>
    </div>
  </section>

  <!-- FAQ Section -->
  <section id="FAQ" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-question-circle"></i> 常见问题 FAQ
      </h2>

      <div class="section-block">
        <div class="faq-item">
          <h4 class="faq-question">
            <i class="fas fa-lightbulb"></i> 什么是虾推啥
            <i class="fas fa-chevron-down faq-toggle"></i>
          </h4>
          <div class="faq-answer">
            <p>虾推啥是一个能让你轻松地使用一行代码（一个<a href="https://baike.baidu.com/item/HTTP%E8%AF%B7%E6%B1%82/10882159"
                target="_blank" rel="noopener">http请求</a>）就可以推送消息到手机通知的工具服务。</p>
          </div>
        </div>

        <div class="faq-item">
          <h4 class="faq-question">
            <i class="fas fa-star"></i> 为什么使用
            <i class="fas fa-chevron-down faq-toggle"></i>
          </h4>
          <div class="faq-answer">
            <div class="features-list">
              <div class="feature-item">
                <i class="fas fa-gift"></i>
                <strong>免费：</strong>在条数限制范围内免费（有关条数限制参见推送参数）
              </div>
              <div class="feature-item">
                <i class="fas fa-bolt"></i>
                <strong>简单：</strong>无需注册，无需安装客户端，跨平台使用，只需微信关注我们的公众号即可使用
              </div>
              <div class="feature-item">
                <i class="fas fa-clock"></i>
                <strong>实时：</strong>即时推送，延时毫秒级
              </div>
              <div class="feature-item">
                <i class="fas fa-shield-alt"></i>
                <strong>保护隐私：</strong>
                <ul style="margin: 0.5em 0 0; padding-left: 1.2em;">
                  <li>消息内容与明细日志不会提供给广告商、数据商等商业第三方。</li>
                  <li>消息内容约保留 3 天，到期后服务器删除相关内容，详情页将无法再打开。</li>
                </ul>
              </div>
            </div>
          </div>
        </div>

        <div class="faq-item">
          <h4 class="faq-question">
            <i class="fas fa-lock"></i> 什么情况下账户会被锁定？
            <i class="fas fa-chevron-down faq-toggle"></i>
          </h4>
          <div class="faq-answer">
            <p>短时间内大量请求，或推送超过上方「推送限制」中的上限，账户会被锁定，无法再推送。锁定后需在微信中打开 <a href="/unlock/">https://xtuis.cn/unlock/</a> 支付后自动解锁。</p>
          </div>
        </div>

        <div class="faq-item">
          <h4 class="faq-question">
            <i class="fas fa-unlock"></i> 如何解锁账户？
            <i class="fas fa-chevron-down faq-toggle"></i>
          </h4>
          <div class="faq-answer">
            <p>请在微信里打开 <a href="/unlock/">https://xtuis.cn/unlock/</a>，系统会自动识别当前微信账号，支付完成后自动解锁。若仍有问题，发 E-mail 给 <a href="mailto:weixin@xtuis.cn">weixin@xtuis.cn</a>。</p>
          </div>
        </div>

        <div class="faq-item active">
          <h4 class="faq-question">
            <i class="fas fa-book"></i> 相关教程文章
            <i class="fas fa-chevron-up faq-toggle"></i>
          </h4>
          <div class="faq-answer">
            <ul class="faq-list">
              <li>
                <a href="https://mp.weixin.qq.com/s/ow-N8M8qqaHjzWYyFp9RQg" target="_blank">
                  <i class="fas fa-file-alt"></i> 虾推啥如何推送多行的消息呢
                </a>
              </li>
              <li>
                <a href="https://mp.weixin.qq.com/s/7syh1CPLA8GkNYmxGBKy-w" target="_blank">
                  <i class="fas fa-bullhorn"></i> 虾推啥正式推出推送微信通知新渠道
                </a>
              </li>
              <li>
                <a href="https://mp.weixin.qq.com/s/dckU9nSGY2fF55S_pr83HQ" target="_blank">
                  <i class="fas fa-chart-bar"></i> 如何获取天勤 INFO-通知: 下单成功
                </a>
              </li>
              <li>
                <a href="https://mp.weixin.qq.com/s/MzzdczOEKBCYobMwOy9uMg" target="_blank">
                  <i class="fas fa-virus"></i> 如何用Python抓取实时疫情更新
                </a>
              </li>
              <li>
                <a href="https://mp.weixin.qq.com/s/ODxaGpu015FD6BAMz2w-OQ" target="_blank">
                  <i class="fas fa-chart-line"></i> 在天勤量化交易中把告警信息推到你的微信
                </a>
              </li>
              <li>
                <a href="https://mp.weixin.qq.com/s/mDmIL2igKw64gLJgZMLlIQ" target="_blank">
                  <i class="fas fa-exchange-alt"></i> MT5 MetaTrader交易信息中文推送到微信
                </a>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </section>

  <!-- Contact Section -->
  <section id="contact" class="section">
    <div class="container">
      <h2 class="section-title">
        <i class="fas fa-envelope"></i> 联系我们
      </h2>
      <div class="section-block">
        <p style="text-align: center; margin: 1rem 0;">
          <i class="fas fa-envelope-open-text"></i>
          <a href="mailto:weixin@xtuis.cn">weixin@xtuis.cn</a>
        </p>
        <p style="text-align: center; margin: 1rem 0;">
          <i class="fas fa-comment"></i>
          <a href="https://support.qq.com/product/291559/" target="_blank">我要留言</a>
        </p>
      </div>
    </div>
  </section>

  <!-- Footer -->
  <footer class="footer">
    <div class="container">
      <div class="footer-content">
        <div class="footer-links">
          <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=51019002003266">
            <img src="assets/images/beianicon.png" alt="备案图标" style="height: 20px; vertical-align: middle;"
              loading="lazy" decoding="async" onerror="this.style.display='none'">
            川公网安备 51019002003266号
          </a>
          <a target="_blank" href="https://beian.miit.gov.cn/">
            蜀ICP备2020030496号-1
          </a>
        </div>
      </div>
    </div>
  </footer>

  <div id="tokenFillBanner" class="token-fill-banner" role="status" aria-live="polite">
    <p id="tokenFillBannerText">检测到微信打开。可一键填入你的 Token 到下方示例（默认脱敏显示）。</p>
    <div class="token-fill-banner-actions">
      <button type="button" id="tokenFillDismissBtn" class="token-fill-banner-btn ghost">暂不</button>
      <button type="button" id="tokenFillStartBtn" class="token-fill-banner-btn primary">填入我的 Token</button>
    </div>
  </div>

  <!-- Bootstrap JS (CDN) -->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>

  <!-- Prism JS (CDN) -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>

  <!-- Smooth Scroll -->
  <script>
    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
      anchor.addEventListener('click', function (e) {
        const href = this.getAttribute('href');
        if (href === '#') return;
        e.preventDefault();
        const target = document.querySelector(href);
        if (target) {
          target.scrollIntoView({
            behavior: 'smooth',
            block: 'start'
          });
        }
      });
    });

    // Initialize FAQ items - expand active ones by default
    document.querySelectorAll('.faq-item.active').forEach(faqItem => {
      const answer = faqItem.querySelector('.faq-answer');
      if (answer) {
        // Always recalculate based on actual content height for consistency
        answer.style.maxHeight = answer.scrollHeight + 'px';
      }
    });

    // Mobile Menu Toggle
    const mobileMenuToggle = document.querySelector('.mobile-menu-toggle');
    const mainNav = document.getElementById('main-nav');
    const upgradeNavGroup = document.querySelector('.nav-upgrade-group');
    const upgradeNavTrigger = document.querySelector('.nav-upgrade-trigger');

    function setUpgradeNavOpen(isOpen) {
      if (!upgradeNavGroup || !upgradeNavTrigger) return;
      upgradeNavGroup.classList.toggle('open', isOpen);
      upgradeNavTrigger.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
    }

    if (upgradeNavGroup && upgradeNavTrigger) {
      upgradeNavTrigger.addEventListener('click', function (e) {
        e.preventDefault();
        e.stopPropagation();
        const isOpen = upgradeNavGroup.classList.contains('open');
        setUpgradeNavOpen(!isOpen);
      });

      document.addEventListener('click', function (e) {
        if (!upgradeNavGroup.contains(e.target)) {
          setUpgradeNavOpen(false);
        }
      });

      document.addEventListener('keydown', function (e) {
        if (e.key === 'Escape') {
          setUpgradeNavOpen(false);
        }
      });
    }

    if (mobileMenuToggle && mainNav) {
      mobileMenuToggle.addEventListener('click', function () {
        mainNav.classList.toggle('active');
        const icon = this.querySelector('i');
        if (mainNav.classList.contains('active')) {
          icon.classList.remove('fa-bars');
          icon.classList.add('fa-times');
        } else {
          icon.classList.remove('fa-times');
          icon.classList.add('fa-bars');
        }
      });

      // Close menu when clicking on a link
      mainNav.querySelectorAll('a').forEach(link => {
        link.addEventListener('click', function () {
          setUpgradeNavOpen(false);
          mainNav.classList.remove('active');
          const icon = mobileMenuToggle.querySelector('i');
          icon.classList.remove('fa-times');
          icon.classList.add('fa-bars');
        });
      });
    }

    // FAQ Toggle Functionality
    document.querySelectorAll('.faq-question').forEach(question => {
      question.addEventListener('click', function () {
        const faqItem = this.closest('.faq-item');
        const answer = faqItem.querySelector('.faq-answer');
        const toggle = this.querySelector('.faq-toggle');

        const isExpanded = faqItem.classList.contains('active');

        if (isExpanded) {
          faqItem.classList.remove('active');
          answer.style.maxHeight = null;
          toggle.classList.remove('fa-chevron-up');
          toggle.classList.add('fa-chevron-down');
        } else {
          faqItem.classList.add('active');
          answer.style.maxHeight = answer.scrollHeight + 'px';
          toggle.classList.remove('fa-chevron-down');
          toggle.classList.add('fa-chevron-up');
        }
      });
    });

    // Share Functions
    function shareToWeibo() {
      const url = encodeURIComponent(window.location.href);
      const title = encodeURIComponent(document.title);
      const shareUrl = `https://service.weibo.com/share/share.php?url=${url}&title=${title}`;
      window.open(shareUrl, '_blank', 'width=600,height=400');
    }

    function showWeChatShare() {
      const modal = document.getElementById('wechatQrModal');
      const qrContainer = document.getElementById('wechatQrCode');

      // Check if we're in WeChat browser
      const isWeChat = /MicroMessenger/i.test(navigator.userAgent);

      if (isWeChat) {
        // In WeChat, share card is set via JS-SDK; guide user to the menu.
        qrContainer.innerHTML = `
          <p style="margin: 20px 0;">分享卡片已准备好</p>
          <p style="margin: 10px 0;">请点右上角 ··· ，选择「发送给朋友」或「分享到朋友圈」</p>
        `;
      } else {
        // Generate QR code using a free QR code API
        const currentUrl = encodeURIComponent('https://xtuis.cn/');
        const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${currentUrl}`;
        qrContainer.innerHTML = `<img src="${qrApiUrl}" alt="分享二维码" style="width: 200px; height: 200px;">`;
      }

      modal.classList.add('active');
    }

    function closeWeChatShare() {
      const modal = document.getElementById('wechatQrModal');
      modal.classList.remove('active');
    }

    // Close modal when clicking outside
    document.getElementById('wechatQrModal').addEventListener('click', function (e) {
      if (e.target === this) {
        closeWeChatShare();
      }
    });

    // Tab Switching Function
    function switchTab(tabName) {
      // Keep external upgrade tabs as links; only wechat-bark stays active
      if (tabName !== 'wechat-bark') {
        return;
      }

      const tabs = document.querySelectorAll('.tab-btn');
      tabs.forEach(tab => {
        tab.classList.remove('active');
        if (tab.getAttribute('data-tab') === tabName) {
          tab.classList.add('active');
        }
      });

      // Always ensure wechat-bark tab is active
      const wechatBarkTab = document.querySelector('.tab-btn[data-tab="wechat-bark"]');
      if (wechatBarkTab) {
        wechatBarkTab.classList.add('active');
      }
    }

    // Initialize: Ensure wechat-bark tab is always active on page load
    document.addEventListener('DOMContentLoaded', function () {
      const externalTabs = document.querySelectorAll('.tab-btn[data-tab="email"], .tab-btn[data-tab="wecom"]');
      const wechatBarkTab = document.querySelector('.tab-btn[data-tab="wechat-bark"]');

      externalTabs.forEach(tab => tab.classList.remove('active'));

      if (wechatBarkTab) {
        wechatBarkTab.classList.add('active');
      }
    });

    // Push Type Tab Switching Function
    function switchPushTab(pushType) {
      const pushTabs = document.querySelectorAll('.push-tab-btn');
      const pushContents = document.querySelectorAll('.push-tab-content');

      pushTabs.forEach(tab => {
        tab.classList.remove('active');
        if (tab.getAttribute('data-push-tab') === pushType) {
          tab.classList.add('active');
        }
      });

      pushContents.forEach(content => {
        content.classList.remove('active');
      });

      const targetContent = document.getElementById(pushType + '-tab-content');
      if (targetContent) {
        targetContent.classList.add('active');
      }
    }

    function switchLangExampleTab(groupId, language) {
      const group = document.getElementById(groupId);
      if (!group) return;

      const tabs = group.querySelectorAll('.lang-tab-btn');
      const contents = group.querySelectorAll('.lang-tab-content');

      tabs.forEach(tab => {
        tab.classList.remove('active');
        if (tab.getAttribute('data-lang-tab') === language) {
          tab.classList.add('active');
        }
      });

      contents.forEach(content => content.classList.remove('active'));

      const target = group.querySelector(`.lang-tab-content[data-lang-content="${language}"]`);
      if (target) {
        target.classList.add('active');
        if (window.Prism && typeof window.Prism.highlightAllUnder === 'function') {
          window.Prism.highlightAllUnder(target);
        }
      }
    }

    function personalizeExampleText(text) {
      if (!text) return text;
      if (typeof window.__xtuisPersonalizeCopy === 'function') {
        return window.__xtuisPersonalizeCopy(text);
      }
      return text;
    }

    async function copyText(text, buttonEl) {
      if (!text || !buttonEl) return;
      text = personalizeExampleText(text);
      const originalLabel = buttonEl.textContent.trim() || '复制代码';
      try {
        if (navigator.clipboard && window.isSecureContext) {
          await navigator.clipboard.writeText(text);
        } else {
          const textArea = document.createElement("textarea");
          textArea.value = text;
          textArea.style.position = "fixed";
          textArea.style.left = "-9999px";
          textArea.style.top = "0";
          document.body.appendChild(textArea);
          textArea.focus();
          textArea.select();
          document.execCommand('copy');
          textArea.remove();
        }
        buttonEl.textContent = '已复制';
        buttonEl.classList.add('copied');
      } catch (err) {
        console.error('Copy failed', err);
        buttonEl.textContent = '复制失败';
      }
      setTimeout(() => {
        buttonEl.textContent = originalLabel;
        buttonEl.classList.remove('copied');
      }, 2000);
    }

    async function copyLangExampleCode(groupId, buttonEl) {
      const group = document.getElementById(groupId);
      if (!group || !buttonEl) return;

      const activeCode = group.querySelector('.lang-tab-content.active code');
      if (!activeCode) return;

      let text = activeCode.textContent.replace(/\r\n/g, '\n').replace(/\s+$/, '');
      text = personalizeExampleText(text);
      if (!text) return;

      const originalLabel = buttonEl.dataset.copyLabel || buttonEl.textContent.trim() || '复制代码';
      buttonEl.dataset.copyLabel = originalLabel;

      const setState = (label, stateClass) => {
        buttonEl.textContent = label;
        buttonEl.classList.remove('copied', 'copy-error');
        if (stateClass) buttonEl.classList.add(stateClass);
      };

      const restore = () => {
        window.clearTimeout(buttonEl._copyResetTimer);
        buttonEl._copyResetTimer = window.setTimeout(() => {
          setState(originalLabel);
        }, 1400);
      };

      try {
        if (navigator.clipboard && window.isSecureContext) {
          await navigator.clipboard.writeText(text);
        } else {
          const ta = document.createElement('textarea');
          ta.value = text;
          ta.setAttribute('readonly', '');
          ta.style.position = 'fixed';
          ta.style.opacity = '0';
          ta.style.pointerEvents = 'none';
          document.body.appendChild(ta);
          ta.select();
          document.execCommand('copy');
          document.body.removeChild(ta);
        }
        setState('已复制', 'copied');
      } catch (err) {
        console.error('Copy failed:', err);
        setState('复制失败', 'copy-error');
      }

      restore();
    }

    // WeChat opt-in: fill masked token into homepage examples
    (function () {
      var Config = {
        API_BASE_URL: 'https://qy.xtuis.cn',
        APP_ID: 'wx8079974e3b679df6'
      };
      var FILL_INTENT_KEY = 'xtuis_home_fill_intent';
      var DISMISS_KEY = 'xtuis_home_fill_dismissed';
      var fullToken = '';
      var maskedToken = '';
      var revealTimer = null;
      var revealing = false;
      var bannerMode = 'prompt'; // prompt | filled

      var banner = document.getElementById('tokenFillBanner');
      var bannerText = document.getElementById('tokenFillBannerText');
      var startBtn = document.getElementById('tokenFillStartBtn');
      var dismissBtn = document.getElementById('tokenFillDismissBtn');
      var browserHint = document.getElementById('browserExampleHint');

      function isWeChat() {
        return /MicroMessenger/i.test(navigator.userAgent || '');
      }

      function isDebug() {
        return new URLSearchParams(window.location.search).get('debug') === 'true';
      }

      function readSession(key) {
        try { return window.sessionStorage.getItem(key) || ''; } catch (e) { return ''; }
      }

      function writeSession(key, value) {
        try { window.sessionStorage.setItem(key, value); } catch (e) {}
      }

      function removeSession(key) {
        try { window.sessionStorage.removeItem(key); } catch (e) {}
      }

      function maskToken(token) {
        if (!token) return '——';
        if (token.length <= 8) return token.slice(0, 2) + '****';
        return token.slice(0, 4) + '...' + token.slice(-4);
      }

      function clearOAuthParams() {
        var url = new URL(window.location.href);
        url.searchParams.delete('code');
        url.searchParams.delete('state');
        window.history.replaceState({}, document.title, url.toString());
        // Re-bind share after URL cleanup so signature matches the address bar.
        if (typeof window.__xtuisSetupWeChatShare === 'function') {
          window.__xtuisSetupWeChatShare();
        }
      }

      function doOAuth() {
        var url = new URL(window.location.href);
        url.searchParams.delete('code');
        url.searchParams.delete('state');
        var redirectUri = encodeURIComponent(url.toString());
        window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='
          + Config.APP_ID
          + '&redirect_uri=' + redirectUri
          + '&response_type=code&scope=snsapi_base#wechat_redirect';
      }

      function showBanner(message) {
        if (!banner) return;
        if (message && bannerText) bannerText.textContent = message;
        banner.classList.add('visible');
        document.body.classList.add('token-fill-banner-open');
      }

      function hideBanner() {
        if (!banner) return;
        banner.classList.remove('visible');
        document.body.classList.remove('token-fill-banner-open');
      }

      function setBannerBusy(busy, label) {
        if (!startBtn) return;
        startBtn.disabled = !!busy;
        if (busy) {
          startBtn.textContent = label || '处理中...';
          return;
        }
        startBtn.textContent = label || (bannerMode === 'filled'
          ? (revealing ? '隐藏完整 Token' : '显示完整 Token')
          : '填入我的 Token');
      }

      function showFilledBanner() {
        bannerMode = 'filled';
        showBanner('Token 已填入示例（脱敏）。点「显示完整 Token」可临时查看；「复制代码」已高亮。');
        if (startBtn) {
          startBtn.disabled = false;
          startBtn.textContent = revealing ? '隐藏完整 Token' : '显示完整 Token';
        }
        if (dismissBtn) dismissBtn.textContent = '关闭';
      }

      window.__xtuisPersonalizeCopy = function (text) {
        if (!fullToken || !text) return text;
        var out = String(text);
        if (maskedToken) {
          out = out.split(maskedToken).join(fullToken);
        }
        out = out.split('ABCDEFG').join(fullToken);
        out = out.split('您的token').join(fullToken);
        return out;
      };

      function replaceInScopes(from, to) {
        if (!from || from === to) return;
        var scopes = ['instruction', 'pushcategoryform']
          .map(function (id) { return document.getElementById(id); })
          .filter(Boolean);
        scopes.forEach(function (root) {
          var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
            acceptNode: function (node) {
              if (!node.nodeValue || node.nodeValue.indexOf(from) === -1) {
                return NodeFilter.FILTER_REJECT;
              }
              var parent = node.parentElement;
              if (!parent) return NodeFilter.FILTER_REJECT;
              var tag = parent.tagName;
              if (tag === 'SCRIPT' || tag === 'STYLE') {
                return NodeFilter.FILTER_REJECT;
              }
              return NodeFilter.FILTER_ACCEPT;
            }
          });
          var nodes = [];
          while (walker.nextNode()) nodes.push(walker.currentNode);
          nodes.forEach(function (node) {
            node.nodeValue = node.nodeValue.split(from).join(to);
          });
        });
      }

      function applyMaskedExamples() {
        if (!fullToken || !maskedToken) return;
        replaceInScopes('ABCDEFG', maskedToken);
        replaceInScopes('您的token', maskedToken);
        if (browserHint) {
          browserHint.textContent = '示例已填入你的脱敏 Token。点「复制代码」会复制带完整 Token 的链接；也可在底部横幅点「显示完整 Token」。';
        }
      }

      function focusPushStep() {
        var pushStep = document.getElementById('httprequest');
        if (!pushStep) return;
        window.setTimeout(function () {
          pushStep.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }, 120);
      }

      function highlightCopyButtons() {
        document.querySelectorAll('.lang-example-copy-btn').forEach(function (btn) {
          btn.classList.add('token-fill-highlight');
        });
      }

      function remaskExamples() {
        if (!fullToken || !maskedToken || !revealing) return;
        replaceInScopes(fullToken, maskedToken);
        revealing = false;
        if (startBtn && bannerMode === 'filled') {
          startBtn.textContent = '显示完整 Token';
        }
      }

      function toggleReveal() {
        if (!fullToken || !maskedToken) return;
        if (revealing) {
          if (revealTimer) window.clearTimeout(revealTimer);
          remaskExamples();
          return;
        }
        replaceInScopes(maskedToken, fullToken);
        revealing = true;
        if (startBtn) startBtn.textContent = '隐藏完整 Token';
        if (revealTimer) window.clearTimeout(revealTimer);
        revealTimer = window.setTimeout(function () {
          remaskExamples();
        }, 8000);
      }

      function applyToken(token) {
        fullToken = String(token || '').trim();
        if (!fullToken) {
          bannerMode = 'prompt';
          showBanner('未找到绑定的 Token。请先关注公众号获取 Token 后再试。');
          setBannerBusy(false, '填入我的 Token');
          return;
        }
        maskedToken = maskToken(fullToken);
        revealing = false;
        applyMaskedExamples();
        focusPushStep();
        highlightCopyButtons();
        removeSession(FILL_INTENT_KEY);
        showFilledBanner();
      }

      async function readJson(res) {
        var text = await res.text();
        var data = {};
        if (text) {
          try { data = JSON.parse(text); } catch (e) { throw new Error(text.slice(0, 120)); }
        }
        if (!res.ok) {
          throw new Error(data.message || data.error || ('HTTP ' + res.status));
        }
        return data;
      }

      async function authFetch(url) {
        var sessionToken = readSession('session_token');
        var openid = readSession('wechat_openid');
        var sep = url.indexOf('?') === -1 ? '?' : '&';
        var finalUrl = url;
        if (sessionToken) {
          finalUrl = url + sep + 'session_token=' + encodeURIComponent(sessionToken);
        } else if (openid) {
          finalUrl = url + sep + 'openid=' + encodeURIComponent(openid);
        }
        return fetch(finalUrl);
      }

      async function exchangeCode(code) {
        setBannerBusy(true, '微信认证中...');
        showBanner('正在认证微信账号...');
        try {
          var res = await fetch(Config.API_BASE_URL + '/payment/oauth?code=' + encodeURIComponent(code));
          var data = await readJson(res);
          if (!data.openid || !data.session_token) {
            throw new Error(data.message || '认证失败');
          }
          writeSession('wechat_openid', data.openid);
          writeSession('session_token', data.session_token);
          clearOAuthParams();
          await loadAndApplyToken();
        } catch (e) {
          clearOAuthParams();
          removeSession(FILL_INTENT_KEY);
          bannerMode = 'prompt';
          setBannerBusy(false, '填入我的 Token');
          showBanner('认证失败：' + (e.message || '请重试'));
        }
      }

      async function loadAndApplyToken() {
        setBannerBusy(true, '加载 Token...');
        showBanner('正在读取你的 Token...');
        try {
          var res = await authFetch(Config.API_BASE_URL + '/payment/status?service=unlock');
          if (res.status === 401) {
            removeSession('wechat_openid');
            removeSession('session_token');
            writeSession(FILL_INTENT_KEY, '1');
            doOAuth();
            return;
          }
          var data = await res.json();
          if (!res.ok) {
            throw new Error(data.message || data.error || ('HTTP ' + res.status));
          }
          applyToken((data.token || '').trim());
        } catch (e) {
          bannerMode = 'prompt';
          setBannerBusy(false, '填入我的 Token');
          showBanner('读取 Token 失败：' + (e.message || '请稍后重试'));
        }
      }

      async function startFill() {
        removeSession(DISMISS_KEY);
        writeSession(FILL_INTENT_KEY, '1');
        if (isDebug()) {
          applyToken('debug_token_1234567890');
          return;
        }
        if (readSession('session_token') || readSession('wechat_openid')) {
          await loadAndApplyToken();
          return;
        }
        setBannerBusy(true, '跳转微信认证...');
        doOAuth();
      }

      function onPrimaryClick() {
        if (bannerMode === 'filled') {
          toggleReveal();
          return;
        }
        startFill();
      }

      function dismissBanner() {
        writeSession(DISMISS_KEY, '1');
        removeSession(FILL_INTENT_KEY);
        if (revealing) remaskExamples();
        hideBanner();
      }

      function bind() {
        if (startBtn) startBtn.addEventListener('click', onPrimaryClick);
        if (dismissBtn) dismissBtn.addEventListener('click', dismissBanner);
      }

      document.addEventListener('DOMContentLoaded', function () {
        bind();
        var params = new URLSearchParams(window.location.search);
        var code = params.get('code');
        var wantsFill = readSession(FILL_INTENT_KEY) === '1';
        var dismissed = readSession(DISMISS_KEY) === '1';

        if (isDebug()) {
          bannerMode = 'prompt';
          showBanner('调试模式：可一键填入示例 Token。');
          return;
        }

        if (!isWeChat()) {
          if (code) clearOAuthParams();
          return;
        }

        if (code && wantsFill) {
          exchangeCode(code);
          return;
        }

        if (code && !wantsFill) {
          clearOAuthParams();
        }

        if (!dismissed) {
          bannerMode = 'prompt';
          showBanner('检测到微信打开。可一键填入你的 Token 到下方示例（默认脱敏显示）。');
        }
      });
    })();

    // Keep wechat-bark tab active by default (no auto-switching needed)
  </script>
</body>

</html>
