В этой статье я, простой рабочий, расскажу о chatgpt. Поговорим о кодинге и деплое на Яндекс.Облако. Формат: логи моей переписки с chatgpt + мои комментарии
Идея
Прежде всего, хочу представиться. Меня зовут Вася, и я уже создавал своих личных помощников - биржевых ботов[^1^], которые работали с API[^2^] Тинькофф Инвестиций[^3^]. Допустим, один из моих ботов автоматически покупал по 1000 долларов каждые две недели (сразу после получения зарплаты и аванса). Другой бот размещал эти средства в долларовые облигации[^4^] или инвестиционные фонды.
Однако, сейчас это всё потеряло актуальность, и мне захотелось сделать что-то новое. Моя новая цель — создание бота для регулярной покупки китайских юаней[^5^]. Я решил начать с нуля, не опираясь на мои старые боты. Более того, мне захотелось опробовать современные технологии, такие как система Яндекс Функций[^6^] и поддержка разработки chatgpt[^7^].
- [^1^]: Биржевой бот - это программный продукт, который автоматически выполняет операции на бирже согласно заранее заданным правилам.
- [^2^]: API (Application Programming Interface) - набор готовых классов, процедур, функций, структур данных, принятых для работы с некими системами.
- [^3^]: Тинькофф Инвестиции - платформа для инвестирования от российского банка Тинькофф.
- [^4^]: ОФЗ (облигации федерального займа) - это государственные обязательства России, выпускаемые в рублях или иностранной валюте.
- [^5^]: Юань (CNY) - валюта Китайской Народной Республики.
- [^6^]: Яндекс Функции - это облачная платформа для развертывания функций, написанных на разных языках программирования. С помощью Яндекс Функций разработчики могут писать код, не заботясь о серверах и инфраструктуре.
- [^7^]: Chatgpt - это набор технологий для разработки программ, использующих искусственный интеллект (AI) для имитации естественных разговоров с человеческими пользователями.
Создание биржевого бота шаг за шагом
- Идея - я придумал новую идею для своего следующего бота.
- Репозиторий[^8^] - создал репозиторий для хранения кода нового бота.
- Токены - получение токенов[^9^] для доступа к API и совершения операций с валютой.
- Кодирование - написал код бота, определив логику его действий и совершаемых операций.
- Вновый бот для работы в режиме реального времени, с помощью системы Яндекс Функций.
- [^8^]: Репозиторий - это место для хранения и управления программным кодом, контролирующее изменения и версии различных частей кода.
- [^9^]: Токен - специальный ключ, выдаваемый системой, который предоставляет боту доступ к API и возможность совершения операций на бирже.
Написание кода
Дальше я приведу просто логи моего общения с chatgpt. В этот раз я не писал код сам. И даже не настраивал окружение. Я просто задавал вопросы и правл ошибки
You
Есть такое описание апи:
{ "figi": "string", "quantity": "string", "price": { "nano": 6, "units": "units" }, "direction": "ORDER_DIRECTION_UNSPECIFIED", "accountId": "string", "orderType": "ORDER_TYPE_UNSPECIFIED", "orderId": "string", "instrumentId": "string" }
Урл для запроса: https://sandbox-invest-public-api.tinkoff.ru/rest/tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder
Надо написать функцию на nodejs, которая выполнит запрос. Авторизационный токен возьмет из параметров окружения.
Figi: BBG0013HRTL0 quantity: 100 direction: ORDER_DIRECTION_BUY Остальные поля не заполняем
ChatGPT
Для выполнения запроса в Node.js, вы можете использовать библиотеку axios. Установите её с помощью команды:
npm install axiosbashCopyInsertNew
Затем создайте функцию для выполнения запроса. Вам нужно установить заголовок Authorization со значением токена из переменных окружения. Также укажите необходимые параметры запроса. Вот пример функции:
const axios = require('axios');
async function postOrder() {
const token = process.env.AUTH_TOKEN;
const url = 'https://sandbox-invest-public-api.tinkoff.ru/rest/tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder';
const data = {
figi: 'BBG0013HRTL0',
quantity: '100',
direction: 'ORDER_DIRECTION_BUY'
};
try {
const response = await axios.post(url, data, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
console.log(response.data);
} catch (error) {
console.error('Error posting order:', error.message);
}
}
postOrder();
Пожалуйста, убедитесь, что авторизационный токен установлен в переменных окружения перед выполнением функции.
You
Перепиши на тайп скрипте
ChatGPT
Для переписывания функции на TypeScript, сначала установите axios и его типы:
npm install axios
npm install --save-dev @types/axiosbashCopyInsertNew
Затем создайте файл postOrder.ts и напишите функцию с использованием TypeScript:
import axios, { AxiosResponse } from 'axios';
interface PostOrderResponse {
// Здесь определите структуру вашего ответа API, если это необходимо
}
async function postOrder(): Promise {
const token: string = process.env.AUTH_TOKEN!;
const url: string = 'https://sandbox-invest-public-api.tinkoff.ru/rest/tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder';
const data: object = {
figi: 'BBG0013HRTL0',
quantity: '100',
direction: 'ORDER_DIRECTION_BUY'
};
try {
const response: AxiosResponse = await axios.post(url, data, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
console.log(response.data);
} catch (error: unknown) {
if (error instanceof Error) {
console.error('Error posting order:', error.message);
}
}
}
postOrder();typescriptCopyInsertNew
Убедитесь, что TypeScript компилирует ваш код без ошибок, выполнив команду tsc (если tsc установлен глобально) или npx tsc (если tsc установлен локально). После успешной компиляции запустите скомпилированный JavaScript файл с помощью Node.js.
You
Напиши package.json, который может запустить этот код
ChatGpt
Создайте файл package.json в корне вашего проекта и добавьте следующее содержимое:
{
"name": "tinkoff-api",
"version": "1.0.0",
"description": "Node.js / TypeScript app to interact with Tinkoff API",
"main": "dist/postOrder.js",
"scripts": {
"build": "tsc",
"start": "node dist/postOrder.js",
"dev": "tsc && node dist/postOrder.js"
},
"dependencies": {
"axios": "^0.25.0"
},
"devDependencies": {
"@types/axios": "^0.14.0",
"typescript": "^4.6.2"
}
}
Данный файл содержит информацию о вашем проекте и зависимости, а также добавляет несколько npm скриптов для сборки и запуска вашего кода:
- build: собирает ваш TypeScript код с помощью компилятора TypeScript (tsc).
- start: запускает собранное приложение с помощью Node.js.
- dev: компилирует и запускает ваше приложение.
Теперь вы можете запустить свой код, выполнив следующие команды:
npm install
npm run dev
Это установит зависимости и запустит ваш код после компиляции TypeScript.
You
Как мне положить токен переменную окружения. Чтоб он всегда был доступен локально
ChatGPT
Чтобы сохранить токен в переменной окружения и сделать его доступным локально для вашего приложения, вы можете использовать файл .env. Для этого установите пакет dotenv:
npm install dotenvbashCopyInsertNew
Создайте файл .env в корне вашего проекта и добавьте токен в нём:
AUTH_TOKEN=your_token_hereiniCopyInsertNew
Замените your_token_here на ваш реальный токен.
Теперь, в начале файла postOrder.ts, импортируйте и активируйте dotenv:
import dotenv from 'dotenv';
dotenv.config();
// Остальной код
Это загрузит содержимое файла .env в process.env Node.js, сделав токен доступным в вашем приложении. Обратите внимание, что файл .env должен быть добавлен в ваш .gitignore, чтобы случайно не раз
По итогу этого общения у меня был готовый код и инструкции по запуску. Но как задеплоить? Пара простых вопросов и код исполняется в облаке
You
Как создать Cloud Functions в яндекс облаке, которая будет - брать код из гитхаб - выполнять его по расписанию
ChatGPT
Для создания Cloud Functions в Яндекс.Облаке, которая будет брать код из GitHub и запускаться по расписанию, выполните следующие шаги:
1. Создайте функцию в Яндекс.Облаке
- Создайте новый сервисный аккаунт и получите его ключ.
- Создайте новую функцию в "Управление функциями".
2. Настройте исходный код из Github
- В вашем репозитории GitHub создайте zip-архив с кодом функции. Обязательно добавьте файл index.js и укажите имя экспортируемой функции в поле entrypoint.
exports.handler = async (event, context) => {
// Здесь ваш код
};javascriptCopyInsertNew
- В "Управление функциями" Яндекс.Облаке выберите опцию "Загрузить из файла" и загрузите ваш ZIP-архив.
3. Настройте триггер на основе расписания
- В разделе "Триггеры" Яндекс.Облака создайте новый триггер.
- Выберите функцию, созданную на шаге 1, в качестве обработчика событий.
Теперь ваша функция будет автоматически запускаться в соответствии с заданным расписанием.
Имейте в виду, что Cloud Functions в Яндекс.Облаке не имеют непосредственной интеграции с GitHub. Если вы хотите автоматически обновлять исходный код функции в облаке при обновлении репозитория, рассмотрите использование инструмента CI/CD для автоматической загрузки файлов.
Ага, все понятно. Но надо делать архив. Надо бы, конечно, научиться его делать в azure pipline или где-то еще. Но сейчас лень. Спрошу, как его делать. Непросто, но удалось добиться правильного ответа
You
У меня есть такая структуру файлов: dist/index.js, package.json, package-lock.json Надо запаковать это в плоский архив одной командой на маке. Архив положи в корень под название ycf.zip
ChatGPT
Для того чтобы создать архив на macOS, вы можете использовать команду zip в терминале. Вот пример команды, которая создаст архив с названием ycf.zip и положит его в корень проекта:
zip -r ycf.zip dist/index.js package.json package-lock.jsonbashCopyInsertNew
Объяснение:
- zip: команда для создания архива
- -r: ключ для рекурсивного добавления файлов и папок в архив
- ycf.zip: имя создаваемого архива
- dist/index.js, package.json, package-lock.json: файлы и папки, которые нужно добавить в архив
You
Папку dist надо раскрыть. Чтоб в результирующем архиве был плоский список
ChatGPT
Чтобы создать плоский архив, где содержимое папки dist будет раскрыто, используйте следующую команду:
zip ycf.zip dist/* package.json package-lock.jsonbashCopyInsertNew
Объяснение:
- zip: команда для создания архива
- ycf.zip: имя создаваемого архива
- dist/*: раскрытие содержимого папки dist, чтобы добавить все файлы в плоский список
- package.json, package-lock.json: файлы, которые нужно добавить в архив
You
Файлы из папки dist должны подняться на уровень выше
ChatGPT
Для того чтобы поднять файлы из папки dist на уровень выше и создать плоский архив, нужно использовать команду find вместе с zip:
find dist -mindepth 1 -type f -exec zip ycf.zip {} package.json package-lock.json \; -exec mv ycf.zip ../ \;bashCopyInsertNew
Объяснение:
- find: команда для поиска файлов и папок
- dist: имя папки, из которой нужно выбрать файлы
- -mindepth 1: пропуск папки dist и выбор только ее содержимого
- -type f: выбор только файлов, не папок
- -exec: выполнение команды zip для каждого найденного файла
- ycf.zip: имя создаваемого архива
- {} package.json package-lock.json: фигурные скобки являются плейсхолдером для найденных файлов, а package.json и package-lock.json добавляются каждому архиву
- \;: завершение команды exec
- -exec mv ycf.zip ../ \;: перемещение архива на уровень выше в структуре директорий
Обратите внимание, что данная команда создаст архив с файлами из папки dist без сохранения директории папки.
Итак, вся работа завершена. Код написан, собран в архив и загружен в систему Яндекс Функций. Теперь остается лишь настроить триггеры[^10^], чтобы активировать работу бота.
После всех этих этапов, теперь каждый будний день на моем счету автоматически приобретается 100 юаней. Миссия выполнена, и мой новый биржевой бот успешно олицетворяет идею использования современных технологий для упрощения финансовых операций.
[^10^]: Триггеры - это принципы работы функций, которые определены пользователем и срабатывают при наступлении определённых условий, в данном случае – активация бота в определенное время для автоматической покупки валюты.