赛博禅心 05月15日 00:52
踩坑与经验:我在评论区,发了 1262 个激活码
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文分享了作者在公众号评论区发放激活码时遇到的问题与解决方案。作者最初尝试手动和通过他人回复的方式,均因微信的隐藏规则而失败。最终,作者编写了JavaScript脚本,实现了自动翻页、回复评论、填入激活码并发送的功能,成功向1262位用户发放了激活码。文章总结了经验教训,并提供了脚本的使用方法,供有类似需求的读者参考。

💡 作者最初设想通过公众号的评论区管理规则来实现激活码的发放,但由于管理员无法设置灵活的回复规则而受阻。

⚠️ 首次尝试人工发放激活码,但因系统将大量相似的回复内容判定为垃圾信息并隐藏,导致用户无法收到激活码。

🧐 作者发现微信的评论区规则:管理员回复且未公开,只有评论者本人可见,导致通过他人回复激活码的方式无效。

💻 为了解决问题,作者编写了JavaScript脚本,该脚本能够自动翻页、逐条回复评论、填入激活码并发送。脚本成功发放了1262个激活码,解决了手动发放的困境。

原创 金色传说大聪明 2025-04-25 22:41 广东

附:可用脚本

 

上周五,我发了篇文章:

《Fellou:AI 的「组团打工」时代,由中国团队揭幕》

文章中我承诺:
当天留言的朋友,都可以拿到邀请码

很快留言破千

按计划,周一的时候,Fellou 的朋友,会通过「评论回复」的方式发码

在这个过程中,我踩了很多坑,也摸索出如何「自动回复评论区」的方法。

最终,今天用脚本,成功在评论区发放激活码 1262 个

教训与经验,在此分享


最初设想

在公众号里,管理员是可以设置评论区的显示/隐藏规则。

对于留言和回复规则,管理员可以设定

于是,我有了这样一个方案:

周五当天的评论
公开评论 + 公开回复
周六及之后的评论
评论隐藏 + 回复隐藏
到了周一
Fellou 的小伙伴开始逐条回复

设想中,这样做就可以确保:
只有评论者本人能看到激活码


第一次踩坑

激活码,是人工手发的,一共发了四天

周四总算发完,我松了口气,问了几位朋友:“你们收到激活码了吗?”

结果清一色回复:没有

我当场傻眼。

后台一查,好家伙:系统把所有回复标成垃圾信息,全部隐藏了。

回复被标成了垃圾

想一下也合理:每条评论内容都是“随机字符”,数量巨大,确实太像广告。


尝试用脚本解决

既然是系统折叠的,那我就自己拉出来!

我以前学过点前端知识,配合 ChatGPT 写了个小脚本,把这些评论批量点开,恢复可见。

代码大概长这样

脚本运行,评论被逐条放了出来。

分为两步:展开评论、放出隐藏

这下,我以为这回总没问题了。


第二次踩坑

周五,我又去问了一轮:“现在收到激活码了吗?”

依然:没有

我更迷惑了,只能逐一比对后台数据,终于发现微信的一个奇妙规则:

回复者是管理员 + 设置为公开
→ 所有人可见

回复者是管理员 + 设置为未公开
→ 只有评论者本人可见

回复者是非管理员 + 设置为公开
→ 所有人可见

回复者是非管理员 + 设置为不公开
→ 没人能看见

也就是说,我之前让小伙伴帮忙发激活码——完全无效


最终方案:用脚本发码

为了确保能送到,我自己写了一个脚本,模拟以我的名义进行自动回复。

这个脚本可以做到:

    • 自动翻页;
    • 逐条评论点击“回复”;
    • 自动填入激活码;
    • 回车发送。

代码如下:

(async () => {
  const activationCodes = ["激活码1", "激活码2", "激活码3", "激活码4"...];
  let currentCodeIndex = 0;

  const makeReplyText = (code) => `
你的激活码是:${code},祝使用愉快!

非常抱歉,在之前发码过程中,系统检测到大量相似内容,后半段的发送被误判为垃圾信息,导致激活码未能正常送达。我在整理后台时发现了这个问题,特地补发给你。

为了避免将来错过推送,建议将本账号「星标」置顶,这样即使推送量较大,也能第一时间收到通知,也欢迎推荐本账号给身边的朋友,感谢支持!

「赛博禅心」是我个人运营的 AI 行业垂直媒体,面向 AI 从业者、产业研究者,以及一级/二级市场关注者,专注于提供准确、及时、深度的行业资讯。
「赛博禅心」有一定的行业背景,也是目前国内唯一受邀参与 OpenAI 发布活动的中文媒体,常以首发稿的方式,供给第0手内容。
`.trim();

  async function processPage() {
    const replyButtons = Array.from(document.querySelectorAll(
      '#commentlist .comment-list__item-opr .icon-reply'
    ));

    for (let i = 0; i < replyButtons.length; i++) {
      if (currentCodeIndex >= activationCodes.length) {
        console.warn(`❌ 激活码已发完,停止于第 ${i + 1} 条评论`);
        return false;
      }

      const replyBtn = replyButtons[i];
      const activationCode = activationCodes[currentCodeIndex];

      const container = replyBtn.closest('#commentlist > div > div');
      if (!container) continue;

      const siblings = Array.from(container.parentNode.children);
      console.log(`🔄 正在处理第 ${nthIndex} 条评论 / 激活码 ${currentCodeIndex + 1}:${activationCode}`);
      const nthIndex = siblings.indexOf(container) + 1;

      // 点击回复按钮
      if (typeof replyBtn.click === 'function') {
        replyBtn.click();
      }

      // 等待输入框出现
      let editor = null;
      for (let t = 0; t < 30; t++) { // 最多等3秒
        await new Promise(r => setTimeout(r, 100));
        editor = document.querySelector(
          `#commentlist > div > div:nth-child(${nthIndex}) > div.comment-reply-box .ProseMirror`
        );
        if (editor && getComputedStyle(editor).display !== 'none') break;
      }

      if (!editor) {
        console.warn(`⚠️ 第 ${nthIndex} 条评论未找到输入框,跳过`);
        continue;
      }

      // 清空旧内容(避免上次残留)
      editor.focus();
      editor.innerHTML = "";
      await new Promise(r => setTimeout(r, 100));

      // 输入新的激活码文本
      document.execCommand('insertText', false, makeReplyText(activationCode));
      console.log(`✅ 已发放:${activationCode}`);

      // 等待 0.1 秒,确保输入框内容稳定
      await new Promise(r => setTimeout(r, 100));

      // 再次确认内容是否正确(确保不是空白)
      if (!editor.innerText.includes(activationCode)) {
        console.error(`❌ 输入异常,激活码 ${activationCode} 内容未写入,重试此评论`);
        continue; // 不前进激活码索引,重新处理这条评论
      }

      // 发送(回车)
      const enterEvent = new KeyboardEvent('keydown', {
        bubbles: true,
        cancelable: true,
        key: 'Enter',
        code: 'Enter',
        keyCode: 13,
        which: 13
      });
      editor.dispatchEvent(enterEvent);

      console.log(`✅ 第 ${nthIndex} 条评论已发送`);

      // 成功发送后才移动到下一个激活码
      currentCodeIndex++;

      // 评论间隔
      await new Promise(r => setTimeout(r, 2000));
    }

    return true;
  }

  async function goToNextPage() {
    const navLinks = document.querySelectorAll(
      '#app > div.weui-desktop-layout__main__bd > section > div.comment-list-wrp > div.weui-desktop-pagination > span.weui-desktop-pagination__nav > a'
    );
    const nextBtn = Array.from(navLinks).find(a => a.innerText.includes('下一页') || a.getAttribute('title')?.includes('下一页'));

    if (nextBtn && typeof nextBtn.click === 'function') {
      nextBtn.click();
      console.log('➡️ 翻到下一页...');
      await new Promise(r => setTimeout(r, 3000));
      return true;
    }

    return false;
  }

  while (true) {
    const continueTask = await processPage();
    if (!continueTask) break;

    const hasNext = await goToNextPage();
    if (!hasNext) {
      console.log('📄 已无下一页,任务结束');
      break;
    }
  }

  console.log(`🎉 激活码发放任务完成,总共成功发放 ${currentCodeIndex} 个`);
})();

脚本写完是下午五点半。

方法和之前一样,F12 打开调试,运行。

很好,我在微信通知里,收到了回复。

点进去之后,是原评论区

理论上,3 秒发一个,1 小时能跑完。

但中途调试还是花了点时间,最终在晚上八点左右才正式发完。


你也想这样发码?

其实也不难:

    1. 打开公众号后台的评论管理;
    2. 按下 F12 进入控制台;
    3. 粘贴脚本,把激活码列表填进去;
    4. 运行脚本即可,程序会自动处理每条评论。
切换到这个页面,粘贴即可,记得改代码

教训 & 收获

教训

发生上面的事情,问题在我:

    • 没意识到激活码在形式上像垃圾信息;
    • 规则想得太乐观,没有提前测试或核实;
    • 没有第一时间跟用户确认收码情况,导致问题持续了几天。

收获

希望我的教训,成为大家的收获

    • 评论区是一个非常好用的精准回复渠道;
    • 只要是管理员,就可以通过 JS 脚本,来高效完成批量回复;
    • 可以请程序员朋友,或者 AI 可以帮你从 0 写出能跑通的脚本;

 


阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

公众号 评论区 激活码 脚本 自动化
相关文章