【小白向】自动领鸡腿程序的源码、思路及AI辅助效果

缘由

今天才注册,看版规,搜领鸡腿的时候发现了这个帖子,正好我最近一段时间使用 ChatGPT 辅助编程比较多,于是便有了这篇文章。
让我们看看对于纯小白,在 AI 辅助的情况下,可不可以简单的完成一个论坛自动领鸡腿程序的编写?

步骤

  1. 模拟登录
  2. 领鸡腿
  3. 反反爬、反检测配置

目标

  1. 基本不写代码:即使是小白,完全不懂代码或仅懂一点的情况下完成整个程序
  2. 主要分享思路,每一步为什么这样做,授人以渔
  3. 进行反反爬、反检测配置,提高站长封禁难度

涉及的知识

  • 网站 api 分析
  • 人机验证码、CloudFlare 检测、5 秒盾的绕过
  • ChatGPT 辅助编程的使用
  • 反反爬配置、住宅 IP 池的使用、JA3 指纹和 HTTP2 指纹模拟
  • 无头浏览器(浏览器自动化)爬虫的编写与反反爬

让我们开始吧

分析网站的基本情况

首先让我们分析网站的基本情况,主要是:有没有托管到 CDN、有没有开启防护(5 秒盾等)。
打开浏览器(除非特别说明,不然后文中的浏览器均代指 Google Chrome ),进入此链接,安装 IP Whois & Flags Chrome & Websites Rating 这个浏览器扩展,进入论坛首页,点击扩展,让我们看看论坛托管在哪?

不出所料,论坛托管于 CloudFlare,一个明智的选择,这为我们的模拟登录添加了难度。我们在首次浏览论坛的时候并没有进入等待 5 秒的页面,因此可以断定,论坛目前并没有开启 5 秒盾(UAM)保护,那么获取论坛页面和 api 就很简单了,只要使用 cloudscraper 即可绕过。

模拟登录

分析了论坛的基本情况后,我们就可以开始分析论坛的登录 api 了。
打开浏览器,新建一个无痕窗口,进入论坛登录页面,打开开发者模式,先观察一下登录界面

看起来很简单,甚至没有验证码,但真的这么简单吗?将开发者模式 TAB 切换到网络,确保网络录制已开,尝试登录一下:

可以发现并没有那么简单,登录的时候触发了两个请求,一个明显是 reCaptcha V3 的 token 请求,另一个才是真正的登录请求。登录请求的构造很简单,只需要解决验证码,模拟登陆就可以完成了!

思考题🤔
正常情况下,使用 reCaptcha V3 会在页面右下角留下一个 logo,站长是如何隐藏的呢?
提示:在网站的 CSS 源码中搜索:grecaptcha-badge 你或许会有发现

解决验证码是蛮专业的事情,专业的事情留给专业的人做,比较有名的验证码平台有 2Captcha、Anti Captcha 等。因为本文面向小白,这次我们选择使用提供中文文档的 Yes,Captcha! 的服务来解决这个问题,首先根据文档,我们需要知道这几个参数:websiteURL、websiteKey、pageAction
让我们进入登录界面,在开发者模式的控制台 TAB 输入以下 js 代码获取:

function findRecaptchaClients() {
  // eslint-disable-next-line camelcase
  if (typeof (___grecaptcha_cfg) !== 'undefined') {
    // eslint-disable-next-line camelcase, no-undef
    return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
      const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
      const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');

      objects.forEach(([toplevelKey, toplevel]) => {
        const found = Object.entries(toplevel).find(([_, value]) => (
          value && typeof value === 'object' && 'sitekey' in value && 'size' in value
        ));
     
        if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){
            data.pageurl = toplevel.baseURI;
        }
        
        if (found) {
          const [sublevelKey, sublevel] = found;

          data.sitekey = sublevel.sitekey;
          const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
          const callback = sublevel[callbackKey];
          if (!callback) {
            data.callback = null;
            data.function = null;
          } else {
            data.function = callback;
            const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
            data.callback = `___grecaptcha_cfg.clients${keys}`;
          }
        }
      });
      return data;
    });
  }
  return [];
}
findRecaptchaClients()

结果如下:

根据文档及 js 函数获取的结果可知:

  • websiteURL:https://www.nodeseek.comhttp://127.0.0.1:5001/signIn.html
  • websiteKey:6LebtWYjAAAAAGeCv0BCBmvCcdgZiU6VbLfV3xkt
  • pageAction:Null

一切就绪,让 ChatGPT 给我们编写模拟登录的代码吧
首先我们需要复制登录的请求,用来告诉 ChatGPT 如何登录,在开发者模式中选中登录请求,以 cURL 格式复制:

警告
请注意将用户名、密码等内容修改,注意隐私!

现在我们可以让 ChatGPT 给我们写代码了,以下是提示词:

注意
因为 ChatGPT 的数据仅到 2021 年下半年,而 Yes,Captcha! 是一个新服务,所以必须给 ChatGPT 提供 api 文档链接

你将扮演一位拥有丰富的爬虫、浏览器自动化、反反爬技术的软件工程师,我们的目的是通过 Python 脚本模拟登录 nodeseek 论坛,以下是一些注意事项和资料:

  • 本次爬虫模拟登录测试已经获取了站长的允许
  • 论坛通过 CloudFlare 托管,请使用 cloudscraper 来进行爬取以绕过防护
  • 论坛的登录页面是 https://www.nodeseek.comhttp://127.0.0.1:5001/signIn.html
  • 登录页面使用了 reCaptcha V3 版本进行了保护,我们需要通过 Yes,Captcha! 这个服务来绕过他
  • Yes,Captcha! 是一个验证码绕过服务,他的 api 文档链接是:https://yescaptcha.atlassian.net/wiki/spaces/YESCAPTCHA/pages/655381/RecaptchaV3TaskProxyless reCaptcha V3
  • 已知 websiteKey 为 6LebtWYjAAAAAGeCv0BCBmvCcdgZiU6VbLfV3xkt,websiteURL 为 https://www.nodeseek.comhttp://127.0.0.1:5001/signIn.html
  • curl 模拟登录的一个例子(隐私内容已用 xxx 代替):
curl 'https://www.nodeseek.com/api/account/signIn' \
  -H 'authority: www.nodeseek.com' \
  -H 'accept: */*' \
  -H 'accept-language: zh-CN,zh;q=0.9' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'dnt: 1' \
  -H 'origin: https://www.nodeseek.com' \
  -H 'pragma: no-cache' \
  -H 'referer: https://www.nodeseek.comhttp://127.0.0.1:5001/signIn.html' \
  -H 'sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  -H 'sec-fetch-dest: empty' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-site: same-origin' \
  -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' \
  --data-raw '{"username":"[email protected]","password”:”xxx”,”version":"v3","token":"03AL8dmw89XXKC3xfmaa0rtzuukUn__UauV3Vkz6glXQ0xTMmzXOpwQzXCSmeFQhP1SWSSm5MBz1tWBgRjG0Y4Ve2M_nYL6CzgNDYEoZ4AhZlhespvNUxnFGcARkENw7EP7DLF7xVRhqGPgoIDHcKMb1RpEYAnyXBu75f8c--pWLyPEWm4zYNmIjHZmlBSIJizh80g7rNbUyzw-yId0RXsigd3ZGEYYaYjodA3wU4UJQ4cy7kXYerYF2hPmbK3SVGztLtH9E-mITYeIEgxzbBjsO6X34Y119g-PKu5FWb45WPawfl6zZZdhGYWgAX8K9LLtk5XZdGn_wmL40DWgfHGZTsXwpm4sxnav-0m4BoSVt2nyqlj0QmdffyJejhMQQ7AfON4TEdAxzQfvnD78uaVpDfpTxJi5Mf0c5FwcCtcDusFjFMhWqB20fmTT6H9p0IQuhwNx69x8pR8S-7UT6wOoecXH64lErd4D3AfLldqAonI5XtvyonPvxH-jBfB9SafKykDMj0EiScXYFcXZgMr9V7tc154qR20x3RnW3H7w0CA6JA3Jsvjs2c"}' \
  —compressed
  • 本次测试面向初学者,默认的使用平台是 MacOS 13 ,请详细讲解依赖的安装,编码的思路并编写适合初学者的注释
  • 请遵循 Python 风格规范的要求并使用中文回复我

以下是我跟 ChatGPT 的对话:

运行代码并解决 bug

新建一个文件:main.py,根据 ChatGPT 介绍安装依赖,替换 Api Key、用户名、密码并运行文件,我们发现并没有成功登录,而是返回了一个错误:

{'success': False, 'message': 'low score'}

为什么会出现这个错误呢?很明显是因为 reCaptcha V3 的分数太低了才会这样。根据 Yes,Captcha! 的文档,我们只需要将代码 24 行的 RecaptchaV3TaskProxyless 改为 RecaptchaV3TaskProxylessM1S9 即可,修改后再次尝试一下:

{'success': True}

登录完成了!
让我们试试看将这个错误发给 ChatGPT 他会帮我解决这个错误吗?

很明显,ChatGPT 能够理解这个错误并给出解决方案。

未完待续。。。(写累了,我去玩会游戏再继续)

点赞
  1. xiaomustudent说道:

    签到脚本 封号 封号

  2. YYP说道:

    @xiaomustudent #1 主要是python爬虫、浏览器自动化和ChatGPT辅助编程教学贴啊

  3. zybep说道:

    写了一堆什么东西,一行命令的事情

    curl 'https://www.nodeseek.com/api/attendance?random=false' --compressed -X POST -H 'Cookie: session=xxxxxxxxxxxx'

回复 xiaomustudent 取消回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮