记录一次零基础GPT写脚本

被夸啦哈哈哈

部分截图

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

1. 耐心

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

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

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

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

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

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

3. 不要丢失自己的思考

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

Copy
/**
* @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。

于是我就问他咯

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

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

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

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

最后

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

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