/
CheshirCa
/
AI_Transl
Обзор
Документация
Войти
/
CheshirCa
/
AI_Transl
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
Set_api_key.pb
145 строк
8 KB
Anton Kovalev
Add files via upload
12 сен 2025, 12:48
Не верифицирован
12 сен 2025, 12:48
bb94057
Код
Авторство
О чём код?
; Указываем компилятору, что все переменные должны быть объявлены явно (хорошая практика) EnableExplicit #WINDOW_WIDTH = 400 #WINDOW_HEIGHT = 100 #MAIN_WINDOW = 0 Procedure.s GetEnvironmentVar(key.s) ; Получение переменной окружения с помощью WinAPI Protected size = 255 ; Буфер для значения переменной Protected value.s = Space(size) ; Создаем строку-буфер заданного размера Protected result = GetEnvironmentVariable_(key, @value, size) ; Вызов WinAPI If result > 0 ; Если функция вернула положительное значение (длина данных) ProcedureReturn PeekS(@value, result) ; Возвращаем строку нужной длины EndIf ProcedureReturn "" ; В случае ошибки возвращаем пустую строку EndProcedure Procedure SetEnvironmentVar(key.s, value.s) ; Установка переменной окружения через реестр (для текущего пользователя) Protected regPath.s = "Environment" ; Раздел реестра для переменных окружения пользователя Protected regKey.i ; Хэндл (дескриптор) открытого ключа реестра ; Пытаемся создать/открыть ключ в реестре If RegCreateKey_(#HKEY_CURRENT_USER, @regPath, @regKey) = #ERROR_SUCCESS ; Если успешно, записываем значение (строку) по имени переменной (key) RegSetValueEx_(regKey, key, 0, #REG_SZ, @value, Len(value) * SizeOf(Character) + 1) RegCloseKey_(regKey) ; Закрываем ключ реестра ; КРИТИЧЕСКИ ВАЖНО: Уведомляем систему об изменении переменных окружения. ; Без этого изменения не будут видны большинству программ до перезагрузки. SendMessageTimeout_(#HWND_BROADCAST, #WM_SETTINGCHANGE, 0, @"Environment", 0, 1000, #Null) ProcedureReturn #True ; Возвращаем успех EndIf ProcedureReturn #False ; Возвращаем неудачу, если не удалось открыть реестр EndProcedure Procedure.s ValidateApiKey(key.s) ; Простая проверка формата ключа (обычно начинается с AIza и имеет длину около 40 символов) If Len(key) < 30 Or Left(key, 4) <> "AIza" ProcedureReturn "Неверный формат ключа. Ключ должен начинаться с AIza и быть длиннее 30 символов." EndIf ; Дополнительная проверка через простой HTTP запрос к API Gemini ; Запрашиваем список моделей с использованием предоставленного ключа Protected httpRequest = HTTPRequest(#PB_HTTP_Get, "https://generativelanguage.googleapis.com/v1/models?key=" + key) If httpRequest ; Если запрос удалось инициализировать Protected statusCode.s = HTTPInfo(httpRequest, #PB_HTTP_StatusCode) ; Получаем HTTP-статус ответа FinishHTTP(httpRequest) ; Закрываем соединение If statusCode = "200" ; Код 200 = OK, ключ действителен ProcedureReturn "OK" Else ; Любой другой код (403 - Forbidden, 404 - Not Found и т.д.) означает проблему с ключом ProcedureReturn "Ключ не прошел проверку. HTTP ошибка: " + statusCode EndIf Else ProcedureReturn "Не удалось проверить ключ (проблемы с сетью)" ; Запрос не смог выполниться EndIf EndProcedure ; Основная процедура, вызываемая при нажатии кнопки "Прописать" Procedure SaveApiKey() Protected key.s = GetGadgetText(0) ; Получаем текст из поля ввода (StringGadget с ID 0) Protected validation.s = ValidateApiKey(key) ; Проверяем ключ If validation = "OK" ; Если проверка прошла успешно If SetEnvironmentVar("GEMINI_API_KEY", key) ; Пытаемся сохранить в окружение MessageRequester("Успех", "API ключ успешно сохранен в переменную окружения GEMINI_API_KEY!") End ; Завершаем работу программы Else MessageRequester("Ошибка", "Не удалось сохранить переменную окружения.") EndIf Else ; Если проверка не прошла, показываем ошибку валидации MessageRequester("Ошибка валидации", validation) EndIf EndProcedure ; ===== НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ ===== If OpenWindow(#MAIN_WINDOW, 0, 0, 400, 100, "Установка API ключа Gemini", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ; Проверяем, не установлен ли уже ключ в системе Global existingKey.s = GetEnvironmentVar("GEMINI_API_KEY") Global initialText.s If existingKey <> "" initialText = existingKey ; Если ключ есть, подставляем его Else initialText = "вставьте сюда ваш API ключ от GEMINI" ; Если нет, показываем подсказку EndIf ; Создаем элементы интерфейса TextGadget(#PB_Any, 10, 15, 100, 20, "API ключ Gemini:") ; Текстовая метка StringGadget(0, 120, 10, 180, 25, initialText) ; Поле для ввода ключа (ID=0) ; UX-улучшение: если ключ уже есть, выделяем его текст для удобства замены If existingKey <> "" SetGadgetState(0, 0) ; Устанавливаем курсор в начало SendMessage_(GadgetID(0), #EM_SETSEL, 0, -1) ; Выделяем весь текст (WinAPI) EndIf ; Кнопка для сохранения ButtonGadget(1, 310, 10, 80, 25, "Прописать") ; Главный цикл обработки событий Repeat Select WaitWindowEvent() Case #PB_Event_CloseWindow ; Если нажали крестик End ; Завершаем программу Case #PB_Event_Gadget ; Если нажали на гаджет с ID=1 (нашу кнопку) и это было левое нажатие мыши If EventGadget() = 1 And EventType() = #PB_EventType_LeftClick SaveApiKey() ; Вызываем процедуру сохранения EndIf EndSelect ForEver EndIf End ; Конец программы ; IDE Options = PureBasic 6.21 (Windows - x86) ; CursorPosition = 3 ; Folding = - ; Optimizer ; EnableThread ; EnableXP ; DPIAware ; UseIcon = Set_api_key.ico ; Executable = Set_api_key.exe ; IncludeVersionInfo ; VersionField0 = 0,0,0,8 ; VersionField1 = 0,0,0,1 ; VersionField2 = STAR SPb ltd ; VersionField3 = AI Transl API Key ; VersionField4 = 1 ; VersionField5 = 1 ; VersionField6 = Main EXE File ; VersionField7 = Set_api_key.exe ; VersionField8 = Set_api_key.exe ; VersionField9 = Anton Kovalev (c) 2025 ; VersionField13 = ants@starspb.ru ; VersionField14 = http://www.starspb.ru ; VersionField17 = 0419 Russian