{"url_pattern":"^https?://weixin\\.sogou\\.com(/.*)?$","site_name":"sogou","allowed_domains":["weixin.sogou.com"],"tools":[{"name":"sogou_weixin","description":"搜狗微信文章搜索","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search query"},"page":{"type":"string","description":"Page number (default 1)"}},"required":["query"]},"handler":"(params) => {\n  const run = async function(args) {\n\n      if (!args.query) return {error: 'Missing argument: query'};\n\n      const query = encodeURIComponent(args.query);\n      const page = parseInt(args.page) || 1;\n      const url = 'https://weixin.sogou.com/weixin?type=2&query=' + query + '&page=' + page;\n\n      const resp = await fetch(url, {credentials: 'include'});\n      if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Make sure a weixin.sogou.com tab is open.'};\n\n      const html = await resp.text();\n      const parser = new DOMParser();\n      const doc = parser.parseFromString(html, 'text/html');\n\n      // Check for anti-bot / verification page\n      if (html.includes('用户您好，您的访问过于频繁') || html.includes('请输入验证码')) {\n        return {error: 'Rate limited or CAPTCHA required', hint: 'Open weixin.sogou.com in the browser and complete the verification.'};\n      }\n\n      const items = doc.querySelectorAll('.news-list ul li, .news-box ul li, div[id^=\"sogou_vr_\"] ul li');\n      const results = [];\n\n      items.forEach(function(li, i) {\n        // Title & link\n        const titleEl = li.querySelector('h3 a') || li.querySelector('.txt-box h3 a') || li.querySelector('a[target=\"_blank\"]');\n        const title = titleEl ? titleEl.textContent.trim() : '';\n        const articleUrl = titleEl ? titleEl.getAttribute('href') : '';\n\n        // WeChat account name\n        const accountEl = li.querySelector('.s-p a, .account, .s2, a[data-z]');\n        const account = accountEl ? accountEl.textContent.trim() : '';\n\n        // Snippet / abstract\n        const snippetEl = li.querySelector('.txt-info, .s-p:not(:last-child), p.txt-info');\n        const snippet = snippetEl ? snippetEl.textContent.trim() : '';\n\n        // Timestamp\n        const timeEl = li.querySelector('.s2, .s-p .tim, span[class*=\"time\"], script');\n        let timeStr = '';\n        if (timeEl && timeEl.tagName === 'SCRIPT') {\n          // Sogou embeds timestamps via document.write in script tags\n          const m = timeEl.textContent.match(/timeConvert\\('(\\d+)'\\)/);\n          if (m) timeStr = new Date(parseInt(m[1]) * 1000).toISOString();\n        } else if (timeEl) {\n          timeStr = timeEl.textContent.trim();\n        }\n\n        // Image thumbnail\n        const imgEl = li.querySelector('img[src], img[data-src]');\n        const thumbnail = imgEl ? (imgEl.getAttribute('src') || imgEl.getAttribute('data-src')) : '';\n\n        if (title) {\n          results.push({\n            rank: i + 1,\n            title: title,\n            url: articleUrl ? (articleUrl.startsWith('http') ? articleUrl : 'https://weixin.sogou.com' + articleUrl) : '',\n            account: account,\n            snippet: snippet,\n            time: timeStr,\n            thumbnail: thumbnail\n          });\n        }\n      });\n\n      // Also try extracting from the newer layout if no results found\n      if (results.length === 0) {\n        const vrItems = doc.querySelectorAll('.vrwrap, .vr_item, [class*=\"result\"]');\n        vrItems.forEach(function(el, i) {\n          const titleEl = el.querySelector('h3 a, h4 a, a.title');\n          const title = titleEl ? titleEl.textContent.trim() : '';\n          const articleUrl = titleEl ? titleEl.getAttribute('href') : '';\n          const accountEl = el.querySelector('a[data-z], .account, .wx-rb');\n          const account = accountEl ? accountEl.textContent.trim() : '';\n          const snippetEl = el.querySelector('p, .txt-info, .desc');\n          const snippet = snippetEl ? snippetEl.textContent.trim() : '';\n\n          if (title) {\n            results.push({\n              rank: i + 1,\n              title: title,\n              url: articleUrl ? (articleUrl.startsWith('http') ? articleUrl : 'https://weixin.sogou.com' + articleUrl) : '',\n              account: account,\n              snippet: snippet\n            });\n          }\n        });\n      }\n\n      // Extract total count if available\n      const totalEl = doc.querySelector('.mun, #scd_num, #tool_tip span');\n      const totalText = totalEl ? totalEl.textContent.trim() : '';\n\n      return {\n        query: args.query,\n        page: page,\n        count: results.length,\n        total: totalText,\n        results: results\n      };\n  };\n  return run(params || {});\n}"}]}