腾讯域名拦截查询 在线工具核心JS实现

简介: 本工具专注腾讯系域名拦截检测,支持QQ/微信双通道查询。输入域名后,自动规范化(补协议、去空格、结构校验),调用对应API获取拦截状态,并统一映射为可读语义(如“已拦截”“白名单”“安全”)。前端渲染基于标准化结果模型,确保逻辑清晰、扩展性强。

这篇文章只讲功能层 JavaScript/TypeScript 实现,围绕“输入一个域名,得到拦截状态”这个主题展开。

工具有两条查询通道(第三方接口):

  • QQ通道:https://cgi.urlsec.qq.com/index.php?m=check&a=gw_check&callback=url_query&url={url}&ticket={ticket}&randstr={randstr}&_={timestamp}
  • 微信通道:https://cgi.urlsec.qq.com/index.php?m=url&a=validUrl&url={url}

在线工具网址:https://see-tool.com/tencent-domain-block-query
工具截图:
工具截图.png

1. 输入规范化是第一道关口

这个工具不直接信任用户输入,而是统一走 normalizeInput

const normalizeInput = (value) => {
   
  const rawValue = String(value || '').trim()
  if (!rawValue) return ''

  const cleaned = rawValue.replace(/\s+/g, '')
  const withProtocol = /^https?:\/\//i.test(cleaned) ? cleaned : `http://${
     cleaned}`

  try {
   
    const url = new URL(withProtocol)
    if (!['http:', 'https:'].includes(url.protocol)) return ''
    return url.toString()
  } catch {
   
    return ''
  }
}

这里做了三件关键事:去空白、补协议、用 URL 做结构化校验。后续所有请求都只使用规范化后的值。

2. 查询动作编排

点击查询时,动作顺序是固定的:

  1. 判空
  2. 规范化
  3. 清理旧结果
  4. 标记查询通道
  5. 进入对应通道请求
const startQqQuery = () => {
   
  if (!input.value.trim()) {
   
    errorMessage.value = '请输入要查询的域名'
    return
  }

  const normalized = normalizeInput(input.value)
  if (!normalized) {
   
    errorMessage.value = '请输入有效的网址'
    return
  }

  input.value = normalized
  errorMessage.value = ''
  resultData.value = null
  lastQueryType.value = 'qq'
  submitQqQuery(normalized, ticket, randstr)
}

const startWeChatQuery = () => {
   
  if (!input.value.trim()) {
   
    errorMessage.value = '请输入要查询的域名'
    return
  }

  const normalized = normalizeInput(input.value)
  if (!normalized) {
   
    errorMessage.value = '请输入有效的网址'
    return
  }

  input.value = normalized
  errorMessage.value = ''
  resultData.value = null
  lastQueryType.value = 'wx'
  submitWeChatQuery(normalized, captchaPayload)
}

这一层不做网络请求细节,只负责把交互状态整理干净。

3. 请求提交与异常回传

真正请求在 submit 函数里,统一处理 loading、异常捕获和结果写入。两条通道分别请求不同第三方 API。

const submitQqQuery = async (url, ticket, randstr) => {
   
  loading.value = true
  errorMessage.value = ''

  try {
   
    const apiUrl = `https://cgi.urlsec.qq.com/index.php?m=check&a=gw_check&callback=url_query&url=${
     encodeURIComponent(
      url
    )}&ticket=${
     encodeURIComponent(ticket)}&randstr=${
     encodeURIComponent(randstr)}&_=${
     Date.now()}123`

    const response = await fetch(apiUrl, {
   
      method: 'GET',
      headers: {
   
        Referer: 'https://urlsec.qq.com/check.html',
        'User-Agent':
          'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        Accept: 'application/json',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        Connection: 'close'
      }
    })

    const text = await response.text()
    const data = parseJsonp(text)
    if (!data || data.reCode !== 0 || !data.data?.results) {
   
      throw new Error(data?.data || '查询失败')
    }

    resultData.value = buildQqResult(url, data.data.results)
  } catch (error) {
   
    errorMessage.value = error?.message || '查询失败'
  } finally {
   
    loading.value = false
  }
}

const submitWeChatQuery = async (url, captchaPayload) => {
   
  loading.value = true
  errorMessage.value = ''

  try {
   
    const apiUrl = `https://cgi.urlsec.qq.com/index.php?m=url&a=validUrl&url=${
     encodeURIComponent(url)}`

    const response = await fetch(apiUrl, {
   
      method: 'GET',
      headers: {
   
        Referer: 'https://urlsec.qq.com/check.html',
        'User-Agent':
          'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        Accept: 'application/json',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        Connection: 'close'
      }
    })

    const text = await response.text()
    const data = JSON.parse(text)
    const isBlocked = data.data === 'ok'

    resultData.value = {
   
      url,
      status: {
   
        type: isBlocked ? 'wechat_blocked' : 'wechat_safe'
      }
    }
  } catch (error) {
   
    errorMessage.value = error?.message || '查询失败'
  } finally {
   
    loading.value = false
  }
}

前端只认统一的返回结构:{ status: 'ok', data: ... }

4. 服务端 URL 清洗与请求拦截

服务端入口先拦截无效请求,再代理到上游接口:

const normalizeUrl = (input: string) => {
   
  const rawValue = String(input || '').trim()
  if (!rawValue) return ''

  const cleaned = rawValue.replace(/\s+/g, '')
  const withProtocol = /^https?:\/\//i.test(cleaned) ? cleaned : `http://${
     cleaned}`

  try {
   
    const target = new URL(withProtocol)
    if (!['http:', 'https:'].includes(target.protocol)) return ''
    return target.toString()
  } catch {
   
    return ''
  }
}

if (!url) {
   
  setResponseStatus(event, 400)
  return {
    status: 'error', message: 'Invalid url' }
}

这样可以保证前后端都执行相同的输入约束,避免脏数据直接进入上游请求。

5. QQ通道:JSONP 解析与状态映射

QQ通道第三方接口:https://cgi.urlsec.qq.com/index.php?m=check&a=gw_check&callback=url_query&url={url}&ticket={ticket}&randstr={randstr}&_={timestamp}

QQ通道返回的是 JSONP,不是纯 JSON,所以先解包:

const parseJsonp = (jsonpStr: string) => {
   
  const match = jsonpStr.match(/url_query\((.+)\)/)
  if (match && match[1]) {
   
    try {
   
      return JSON.parse(match[1])
    } catch {
   
      return null
    }
  }
  return null
}

拿到对象后,再把复杂字段折叠成前端可消费的数据模型:

if (result.whitetype === 3 || result.whitetype === 4) {
   
  data.status.type = 'whitelist'
} else if (result.whitetype === 2) {
   
  data.status.type = 'blocked'
  data.status.wordingTitle = result.WordingTitle || ''
  data.status.wording = result.Wording || ''
} else if (result.whitetype === 1) {
   
  if (result.eviltype === 2800 || result.eviltype === 2804) {
   
    data.status.type = 'qq_blocked'
  } else if (result.eviltype && result.eviltype !== 0) {
   
    data.status.type = 'other_blocked'
    data.status.evilType = result.eviltype
  } else {
   
    data.status.type = 'safe'
  }
}

这一步的重点不是“原样透传”,而是“转成稳定业务语义”。

6. 微信通道:返回值压平

微信通道第三方接口:https://cgi.urlsec.qq.com/index.php?m=url&a=validUrl&url={url}

微信查询通道返回结构更简单,核心逻辑就是把上游标记转成统一状态:

const isBlocked = data.data === 'ok'

return {
   
  status: 'ok',
  data: {
   
    url,
    status: {
   
      type: isBlocked ? 'wechat_blocked' : 'wechat_safe'
    }
  }
}

两条通道虽然来源不同,但最终都对齐到 data.status.type,前端渲染就能复用同一套逻辑。

7. 结果渲染:从对象到行数据

页面不直接硬编码每一行,而是先把结果对象转换成 resultRows

const resultRows = computed(() => {
   
  const data = resultData.value
  if (!data) return []

  const rows = []
  const addRow = (key, label, value, extra = {
   }) => {
   
    if (value === undefined || value === null || value === '') return
    rows.push({
    key, label, value, ...extra })
  }

  addRow('url', '检测地址', data.url)
  addRow('status', '检测结果', statusText.value, {
    isStatus: true, toneClass: statusTone.value })

  if (data.status?.wordingTitle) addRow('reasonTitle', '原因标题', data.status.wordingTitle)
  if (data.status?.wording) addRow('reasonDetail', '原因详情', data.status.wording)

  return rows
})

这种“先标准化、再渲染”的模式,能让字段增减时只改一处映射逻辑。

到这里,核心链路就是:输入标准化 → 查询编排 → 服务端映射 → 统一结果模型 → 页面渲染。

目录
相关文章
|
1月前
|
人工智能 安全 JavaScript
喂饭级图文教程!阿里云部署OpenClaw+免费API配置+必装Skills清单及常见问题解答
熬夜部署完OpenClaw,满心期待迎来全能AI管家,结果发现它只会聊天——查股票不行、刷小红书不行、盯邮件也不行。这不是模型的问题,而是没给它装“技能包”(Skills)。正如参考文章所言,OpenClaw本体像刚买的智能手机,Skills就是让它“开窍”的App,装对了才能真正替你干活。
1782 4
|
1月前
|
数据采集 Linux API
2026年OpenClaw(Clawdbot)部署保姆级图文指南:免费API配置与新手常见问题解决
OpenClaw(Clawdbot)作为一款具备长期记忆与个性化能力的AI助手,凭借爬虫、数据分析、自动化操作等功能成为高效的工作辅助工具,但其本地部署过程中存在的环境配置、网络限制、模型对接等问题,让零基础新手望而却步。2026年针对这一问题,本文整理了阿里云、MacOS、Linux、Windows11多平台的OpenClaw本地部署完整步骤,同时包含阿里云百炼免费大模型API配置方法,并对部署和使用中的常见问题逐一解答,让新手也能零门槛实现OpenClaw的本地搭建与功能使用。
894 8
|
16天前
|
JavaScript
ASCII艺术字生成 在线工具分享
一款基于Vue开发的在线ASCII艺术字生成工具,无需安装,输入文字即可秒变个性艺术字。支持多字体、自定义宽度,适用于昵称、标题、文案等场景,操作极简,零门槛上手。
189 6
|
1月前
|
人工智能 Linux API
保姆级教程:OpenClaw阿里云、MacOS、Linux、Windows11部署+百炼API配置+集成截图Skill及避坑指南
OpenClaw(原Clawdbot)作为一款开源的AI自动化代理工具,凭借自然语言驱动的任务执行能力,成为提升工作效率的核心工具,但其本地部署的环境配置、大模型对接难题,以及默认仅支持文字交互的视觉盲区,让零基础新手难以发挥其全部能力。2026年针对这些痛点,本文整理了阿里云、MacOS、Linux、Windows11多平台的OpenClaw本地部署完整步骤,详解阿里云百炼免费大模型API配置方法,同时带来能解决AI视觉盲区的Screenshot技能集成教程,并对部署和使用中的常见问题逐一解答,让新手也能零门槛实现OpenClaw的全功能使用。
1183 14
|
1月前
|
人工智能 API 数据安全/隐私保护
OpenClaw(“小龙虾”)保姆级教程:3分钟阿里云/本地部署+API配置+5个必装Skill及常见问题解答
2026年,OpenClaw(曾用名Clawdbot)以“GitHub星标之王”的姿态席卷开源圈,但其基础功能仅能满足简单对话需求。对新手而言,真正解锁其生产力价值的关键,在于安装适配场景的Skill(技能插件)——如同给天才宝宝搭配乐高组件,装上信息检索Skill就能实时洞察世界,配上办公管理Skill就能变身金牌秘书,组合使用更能实现“搜索-提炼-创作”全流程自动化。
1490 6
|
2月前
|
人工智能 JavaScript 数据可视化
保姆级教程:OpenClaw(Clawdbot)阿里云及Windows本地部署方案,与本地Ollama配置指南
在AI智能体快速普及的2026年,OpenClaw(前身为Clawdbot)凭借开源免费、可自托管、系统级权限控制的核心优势,成为个人与轻量团队打造专属AI助手的首选工具,其GitHub星标已飙升至18万+,登顶多个开源榜单。Ollama作为目前最受开发者欢迎的本地大模型运行工具,GitHub星标突破16万,支持480+开源模型一键部署,二者组合可实现“本地推理+本地执行”的全闭环,彻底摆脱对云端大模型的依赖,确保数据隐私安全且无网络依赖。
3520 2
|
2月前
|
JavaScript
网页源代码查看 在线工具分享
一款基于Vue 3的在线网页源码查看工具,无需安装,支持PC/手机访问。可快速查看HTML源码、提取纯文本、抓取链接、分析表单,并提供User-Agent等进阶参数设置,操作简洁、响应迅速,适合内容校对与页面排查。
1760 5
|
2月前
|
分布式计算 JavaScript 前端开发
MD5在线加密 核心JS实现
本工具基于纯JS实现MD5在线加密,支持文本/文件输入,统一转为字节序列后计算MD5。兼容text/base64/hex等多种格式解析,输出可选hex(含空格分隔)、base64及大小写切换,文件支持分片读取与进度显示。
370 1
|
3月前
|
自然语言处理 算法 Unix
Vue3时间戳转换器实现方案
这是一个功能全面的时间戳转换工具,支持秒/毫秒级时间戳与日期的双向转换、实时时间戳显示、多时区切换、年周日计算及相对时间展示,界面简洁,操作便捷。
168 5