被夸啦哈哈哈
部分截圖#
要求 gpt 寫代碼的一些經驗(零基礎#
1. 耐心#
不要一直報錯或者跑不起來就放棄,真的,慢慢問,用心想,會有結果的!
2. 一定要明確你自己要幹什麼#
不要嫌麻煩,盡量清晰的描述你的訴求,用什麼語言,在哪裡用,要通過實現什麼,
比如我我是看了一個現成的檢測 ip 重啟的機器人腳本,但是並不適用寬帶多撥的環境,所以這就我最終想要的,ip 檢測重啟(多撥版)
而且,gpt 的特性就是,你給它越多,他給你越準確,於是我就給他了本來的腳本。如果你不需要在機器人特定環境中運行就完全忽略這一點,我之前已經問了一些關於 ip 檢測重啟的基礎知識,已經寫出了可以跑在終端的代碼,這個看個人需求。
這樣,GPT 就給我了一個接近答案 90% 的結果了,剩下就是修 bug 的過程。運行報錯直接複製粘貼給它。
3. 不要丟失自己的思考#
不要一直報錯就一直複製粘貼給 GPT 看,很多時候,它的邏輯本身就有問題,這個時候,就需要你自己去發現問題去尋找一個新的突破點,比如我這裡就遇到了一個檢測 ip 誤刪除的問題,原本代碼如下
/**
* @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% 可實現,現在只是缺乏成熟的交互,直接快進到腦機!
祝願大家都能實現想實現的東西。