🤖 Как намутить ChatGPT-бота на Go с ключом OpenAI API

🤖 Как намутить ChatGPT-бота на Go с ключом OpenAI API

@k3ysupp0rt

Эта инструкция покажет, как за 5 минут запустить собственного Telegram-бота, который отвечает на сообщения с помощью модели gpt-4o-mini.


🔧 Что делает этот бот?

  • Принимает сообщения от пользователей в Telegram.
  • Отправляет запросы к OpenAI API (используется модель gpt-4o-mini).
  • Возвращает ответы от ChatGPT прямо в Telegram.
  • Поддерживает контекст (бот помнит, о чём вы говорили ранее).

🪛 Шаг 1: Установка Go и зависимостей

Установите Go (если ещё не установлен):

sudo apt install golang

Создайте рабочую папку:

mkdir chatgpt-telegram-bot && cd chatgpt-telegram-bot

Инициализируйте проект и установите библиотеки:

go mod init mybot
go get github.com/go-telegram-bot-api/telegram-bot-api
go get github.com/sashabaranov/go-openai

🧠 Шаг 2: Получение ключей

✅ Получение API-ключа OpenAI:

  1. Перейдите @gpt_keys_shop_bot.
  2. Нажмите /start и купите ключ.
Пример ключа
❗️ Внимание: использовать нужно полноценный Bearer-ключ, пример:
sk-... или sk-svcacct-...

🤖 Создание Telegram-бота:

  1. Откройте Telegram и найдите @BotFather.
  2. Команда /newbot → задайте имя и username (должен заканчиваться на bot).
  3. Получите токен формата: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

✍️ Шаг 3: Вставьте ключи в код

Создайте файл main.go и вставьте код:

package main

import (
 "context"
 "log"
 "os"

 tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
 openai "github.com/sashabaranov/go-openai"
)

const (
 OPENAI_API_KEY     = "ВАШ_OPENAI_API_KEY"
 TELEGRAM_BOT_TOKEN = "ВАШ_TELEGRAM_TOKEN"
)

func main() {
 log.SetOutput(os.Stdout)

 bot, err := tgbotapi.NewBotAPI(TELEGRAM_BOT_TOKEN)
 if err != nil {
  log.Panicf("Ошибка создания Telegram бота: %v", err)
 }

 bot.Debug = true
 log.Println("Авторизован как " + bot.Self.UserName)

 client := openai.NewClient(OPENAI_API_KEY)

 u := tgbotapi.NewUpdate(0)
 u.Timeout = 60

 updates, err := bot.GetUpdatesChan(u)
 if err != nil {
  log.Panic(err)
 }

 var conversationHistory []openai.ChatCompletionMessage

 for update := range updates {
  if update.Message == nil {
   continue
  }

  chatID := update.Message.Chat.ID
  messageText := update.Message.Text

  if update.Message.IsCommand() && update.Message.Command() == "start" {
   msg := tgbotapi.NewMessage(chatID, "Привет! Я бот, использующий OpenAI gpt-4o-mini. Задай мне вопрос!")
   bot.Send(msg)
   continue
  }

  log.Println("Отправка в OpenAI: " + messageText)

  conversationHistory = append(conversationHistory, openai.ChatCompletionMessage{
   Role:    "user",
   Content: messageText,
  })

  response, err := getOpenAIResponse(client, conversationHistory)
  if err != nil {
   log.Printf("Ошибка от OpenAI: %v", err)
   response = "Произошла ошибка при обращении к OpenAI."
  } else {
   conversationHistory = append(conversationHistory, openai.ChatCompletionMessage{
    Role:    "assistant",
    Content: response,
   })
  }

  msg := tgbotapi.NewMessage(chatID, response)
  bot.Send(msg)
 }
}

func getOpenAIResponse(client *openai.Client, history []openai.ChatCompletionMessage) (string, error) {
 ctx := context.Background()
 resp, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
  Model:               "gpt-4o-mini", // Можно изменить на gpt-3.5-turbo, gpt-4, gpt-4-turbo и т.д.
  Messages:            history,
  MaxTokens:           512,
 })
 if err != nil {
  return "", err
 }

 log.Println("Ответ OpenAI: " + resp.Choices[0].Message.Content)
 return resp.Choices[0].Message.Content, nil
}

🚀 Шаг 4: Запуск

Выполните в консоли:

go run main.go

Если всё настроено — бот начнёт слушать Telegram и отвечать на сообщения.


⚙️ Настройка модели

В строке:

Model: "gpt-4o-mini",

Ты можешь использовать любые из поддерживаемых моделей OpenAI:

gpt-3.5-turbo - быстрая и дешёвая

gpt-4-turbo - точная и мощная

gpt-4o или gpt-4o-mini новейшая и быстрая с мультимодальностью

🛟 Поддержка и дополнения

  • Для логирования запросов добавьте fmt.Println() или log.Println() в нужные места.
  • Для сохранения истории в файл можно использовать os.WriteFile.

Если нужна поддержка или готовый бот, пишите @k3ysupp0rt.

Report Page