mu_cat

mu_cat

github

记录一次零基础GPT写脚本

被夸啦哈哈哈

image-20230412152758657

部分截图#

image-20230412152741284

image-20230413233141284

要求 gpt 写代码的一些经验(零基础#

1. 耐心#

不要一直报错或者跑不起来就放弃,真的,慢慢问,用心想,会有结果的!

2. 一定要明确你自己要干什么#

不要嫌麻烦,尽量清晰的描述你的诉求,用什么语言,在哪里用,要通过实现什么,

比如我我是看了一个现成的检测 ip 重启的机器人脚本,但是并不适用宽带多拨的环境,所以这就我最终想要的,ip 检测重启(多拨版)

而且,gpt 的特性就是,你给它越多,他给你越准确,于是我就给他了本来的脚本。如果你不需要在机器人特定环境中运行就完全忽略这一点,我之前已经问了一些关于 ip 检测重启的基础知识,已经写出了可以跑在终端的代码,这个看个人需求。

image-20230413233744033

这样,GPT 就给我了一个接近答案 90% 的结果了,剩下就是修 bug 的过程。运行报错直接复制粘贴给它。

3. 不要丢失自己的思考#

不要一直报错就一直复制粘贴给 GPT 看,很多时候,它的逻辑本身就有问题,这个时候,就需要你自己去发现问题去寻找一个新的突破点,比如我这里就遇到了一个检测 ip 误删除的问题,原本代码如下

/**
 * @author muzi
 * @name ip变动重启bncr以及docker
 * @origin muzi
 * @version 1.0.5
 * @description ip变动重启for双拨
 * @rule ^ip$
 * @priority 1000
 * @admin true
 * @public false
 * @disable false
 * @cron 0 *\/5 * * * *
 */
const axios = require('axios');
const AmTool = require('./mod/AmTool');
const sysDB = new BncrDB('system');
const { exec } = require('child_process');
async function getPublicIp() {
  try {
    const response = await axios.get('https://ip.useragentinfo.com/json', { timeout: 10000 }); // 设置 10 秒超时
    const data = response.data;
    return data.ip;
  } catch (error) {
    console.error('获取公共IP地址时发生错误:', error);
    return null;
  }
}
function restartContainer(containerNameOrId) {
  exec(`docker restart ${containerNameOrId}`, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error restarting container: ${error}`);
    } else {
      console.log(`Container restarted: ${stdout}`);
    }
  });
}
module.exports = async s => {
  const v4DB = (await sysDB.get('publicIpv4')) || [];
  const lastCheckedIp = (await sysDB.get('lastCheckedIp')) || '';
  const nowV4ip = await getPublicIp();
  
  if (nowV4ip === null) {
    // 获取 IP 失败,不执行后续操作
    return;
  }
  let logs = `上次ip:${(lastCheckedIp && AmTool.Masking(lastCheckedIp, 5, 6)) || '空'}\n`;
  logs += `本次ip:${(nowV4ip && AmTool.Masking(nowV4ip, 5, 6)) || '空'}\n`;
  let open = false;

  if (!v4DB.includes(nowV4ip)) {
    if (v4DB.length >= 2) {
      logs += '进行bncr与docker重启...';
      open = true;
      // 删除旧的 IP 地址
      v4DB.shift();
      // 重启指定的 Docker 容器,旨在解决ws反向链接假死
      restartContainer('go-cqhttp');
    }
    // 保存新的 IP 地址
    v4DB.push(nowV4ip);
    await sysDB.set('publicIpv4', v4DB);
    await sysDB.set('lastCheckedIp', nowV4ip);
  }

  await s.reply(logs);
  open && (s.getFrom() === 'cron' ? sysMethod.inline('重启') : s.inlineSugar('重启'));
};

在这里有一个bug就是,

一次 ip 变动导致两次重启,在双拨环境中,存在两个 ip,如果脚本已经通过 ip 检测获取两个 ip,a,b,a 在前 b 在后,当 ip 变化时,比如 b 变成了 c,脚本便会执行数据库内数据变为 b,c,并执行重启,但是,c 由 b 变化而来,所以脚本再次检测到没有变化的 a 时,又会判断为 ip 变化而执行重启,数据库才变为正常的 c,a。

于是我就问他咯

image-20230413234553770

这个回答给我弄蒙了,这是什么什么,额外的判断,没关系吧,我不懂这个 if 循环所以继续问

image-20230413234700816

在我思考之后,这真的不可行,我觉得不可行,我想不通。我就质问它!

image-20230413234749703

这里始终没有解决 bug 的源因,就是在这,我开窍了,bug 产生的原因就是误删除的 ip,ip 被误删除了所以才会再次被判断为新 ip 并导致代码成立并运行,这个时候我就组织语言告诉了它我的看法,并且让他翻译成代码,在这种情况下,百分百成立!

image-20230413235038874

最后,他还嘴硬!明明是我解决了问题,一句道歉都没有!

最后#

自然编程,100% 可实现,现在只是缺乏成熟的交互,直接快进到脑机!

祝愿大家都能实现想实现的东西。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。