作为一位深谙网站运营之道的专家,我很乐意为您详细阐述如何在AnQiCMS模板中,既能便捷又能相对安全地调用QQ联系号码,并将其转化为用户友好的点击链接。这不仅能提升用户体验,也兼顾了信息保护。


在AnQiCMS模板中单独且安全地调用QQ联系号码并生成点击链接

在现代网站运营中,提供便捷的联系方式是提升用户体验、促进业务转化的关键一环。QQ作为国内常用的即时通讯工具,其联系功能被广泛应用于企业网站。AnQiCMS作为一个高效的内容管理系统,提供了灵活的模板标签,让我们能够轻松地集成此类功能。然而,在实现便捷的同时,我们也需要考虑如何保护这些信息,避免被恶意爬虫轻易抓取。

接下来,我们将分步骤详细探讨如何在AnQiCMS模板中实现这一需求。

第一步:在AnQiCMS后台配置QQ联系号码

首先,您需要确保QQ号码已经在AnQiCMS后台正确配置。AnQiCMS提供了一个专门的“联系方式设置”模块,用于统一管理网站的各类联系信息。

您可以在后台导航菜单中找到 “后台设置”,然后选择 “联系方式设置”。进入该页面后,您会看到预设的联系方式字段,其中就包含“联系QQ”这一项。请在这里准确填写您的QQ号码。如果默认字段不足以满足您的需求,AnQiCMS还支持自定义参数设置,但对于QQ号码,通常默认的“QQ”字段就足够了。

重要提示: 确保您填写的QQ号码是公开的、可用于联系的,并且已开启了QQ的临时会话功能,否则用户点击后可能无法正常发起会话。

第二步:在AnQiCMS模板中调用QQ号码

AnQiCMS的模板系统采用类似Django的标签语法,使得数据调用直观而强大。要调用后台配置的QQ号码,我们可以使用内置的contact标签。

contact标签专门用于获取后台“联系方式设置”中的各项数据。它的基本用法是通过name参数指定要获取的字段。对于QQ号码,字段名称即为QQ

例如,您可以在模板中这样直接获取QQ号码:

{# 直接调用后台配置的QQ号码 #}
{% contact with name="QQ" %}

或者,更推荐的做法是将其赋值给一个变量,以便后续更灵活地使用和处理:

{# 将QQ号码赋值给一个变量contactQQ #}
{% contact contactQQ with name="QQ" %}{{ contactQQ }}

此时,{{ contactQQ }} 将会输出您在后台填写的QQ号码。

第三步:安全考量——避免直接暴露QQ号码

虽然上述方法能够成功获取并显示QQ号码,但将其直接以纯文本形式显示在HTML源代码中,会增加被垃圾邮件机器人或数据爬虫抓取的风险。这些爬虫会扫描网页源代码,收集联系信息用于发送垃圾邮件或进行其他骚扰行为。

为了在提供便捷性的同时增加一层保护,我们建议采用JavaScript来动态生成QQ链接,从而避免QQ号码在页面加载时直接以可识别的格式出现在HTML源代码中。

第四步:通过JavaScript动态生成可点击的QQ聊天链接

核心思路是:在HTML中只放置一个占位符元素,然后利用JavaScript获取QQ号码并构造出可点击的QQ聊天链接,最后将这个链接动态插入到占位符中。这样,即使简单的爬虫抓取了页面的HTML源代码,也无法直接获取到完整的QQ号码和点击链接。

QQ聊天链接的通用格式通常是 tencent://message/?uin=您的QQ号码&site=&menu=yesqqwpa://im/chat?qq=您的QQ号码。前者更为通用。

以下是实现此功能的模板代码片段,您可以将其放置在AnQiCMS模板文件的<body>标签内部的适当位置,例如页脚或侧边栏:

{# HTML占位符:用于显示QQ联系链接,初始可以是空的或者带有加载提示 #}
<div id="qq-contact-container">
    <span>正在加载QQ联系...</span>
</div>

<script>
    document.addEventListener('DOMContentLoaded', function() {
        // 1. 从AnQiCMS模板标签中获取QQ号码,并赋值给JavaScript变量
        // 这里的 {% contact contactQQ with name="QQ" %}{{ contactQQ }}{% endcontact %} 
        // 确保输出的QQ号码是纯数字,没有额外的HTML标签。
        // 如果您希望更安全,也可以将这个QQ号码在后端进行Base64编码,然后在JS中解码。
        const rawQqNumber = "{% contact contactQQ with name='QQ' %}{{ contactQQ }}{% endcontact %}";
        const qqNumber = rawQqNumber.trim(); // 清除可能存在的空白字符

        const qqContactContainer = document.getElementById('qq-contact-container');

        if (qqNumber) {
            // 2. 构造QQ聊天链接
            const qqLink = `tencent://message/?uin=${qqNumber}&site=&menu=yes`;

            // 3. 创建a标签元素,并设置属性
            const qqAnchor = document.createElement('a');
            qqAnchor.href = qqLink;
            qqAnchor.target = '_blank'; // 新窗口打开
            qqAnchor.rel = 'noopener noreferrer'; // 增强安全性
            qqAnchor.title = '点击通过QQ与我联系';
            qqAnchor.textContent = `QQ:${qqNumber}`; // 显示QQ号码,但实际链接是JS生成的

            // 4. 将生成的链接插入到占位符中
            qqContactContainer.innerHTML = ''; // 清除加载提示
            qqContactContainer.appendChild(qqAnchor);
        } else {
            qqContactContainer.innerHTML = '<span>QQ联系方式暂无</span>';
        }
    });
</script>

代码解析:

  1. {% contact contactQQ with name='QQ' %}{{ contactQQ }}{% endcontact %}: 这是AnQiCMS模板标签,用于将后台配置的QQ号码获取并直接输出为纯文本,嵌入到JavaScript字符串中。注意{% endcontact %}是必要的,即使它在示例中看起来是空的,但它确保了标签的正确闭合。
  2. document.addEventListener('DOMContentLoaded', function() { ... });: 确保DOM完全加载后再执行JavaScript,避免操作不存在的元素。
  3. rawQqNumber.trim(): 对获取到的QQ号码进行修剪,去除可能存在的首尾空白字符,确保号码纯净。
  4. tencent://message/?uin=${qqNumber}&site=&menu=yes: 这是用于在QQ中发起临时会话的标准URL协议。
  5. document.createElement('a'): 通过JavaScript创建<a>标签元素,而不是直接在HTML中写入。
  6. target='_blank', rel='noopener noreferrer': 这些属性是Web开发中的**实践。_blank让链接在新窗口打开,noopener noreferrer则提高了安全性,防止新打开的页面利用window.opener访问您的原始页面,这对于防止钓鱼攻击非常重要。
  7. qqAnchor.textContent = \QQ:${qqNumber}`;`: 设置链接的显示文本,告知用户这是QQ联系方式。
  8. qqContactContainer.innerHTML = ''; qqContactContainer.appendChild(qqAnchor);: 清空占位符内容,并将动态生成的<a>标签添加到页面中。

通过这种方式,QQ号码不会以静态HTML链接的形式暴露,而是由客户端JavaScript在页面加载完成后动态创建。这能有效抵御大部分非JS解析的爬虫抓取。

第五步:测试与维护

在部署到线上环境之前,请务必在不同的浏览器和设备上进行测试,确保QQ链接能够正常点击并唤起QQ客户端发起会话。同时,清空AnQiCMS的系统缓存和浏览器缓存也是一个好习惯,以确保您看到的是最新修改后的效果。

如果您的网站启用了多站点管理功能,并且不同站点需要调用不同的QQ号码,您可以在contact标签中添加siteId参数来指定站点ID,例如 {% contact contactQQ with name='QQ' siteId='2' %}


常见问题 (FAQ)

1