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 誤刪除的問題,原本代碼如下

/**
 * @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% 可實現,現在只是缺乏成熟的交互,直接快進到腦機!

祝願大家都能實現想實現的東西。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。