Частный API Близнецов ⇐ IOS
-
Гость
Частный API Близнецов
У меня возникли проблемы с доступом к конечным точкам частного API с помощью Swift. Я пытался использовать Python, поскольку у меня достаточно опыта и я могу получать данные из API. Я не уверен, что происходит. В документации Gemini API нет реализации Swift, поэтому разобраться в нем довольно сложно. Я также пытался использовать ChatGPT, но проблема осталась.
func ignoreNonce() -> String { let timestamp = String(Int(Date().timeIntervalSince1970 * 1000)) // Получаем текущую временную метку в миллисекундах let uniqueId = UUID().uuidString // Генерируем уникальный идентификатор // Объединяем метку времени и уникальный идентификатор для создания nonce пусть nonce = отметка времени + уникальный идентификатор вернуть одноразовый номер } funcsignPayload(полезная нагрузка: String, secret: String) -> String { if let payloadData = payload.data(using: .utf8), let secretData = secret.data(using: .utf8) { результат var = [UInt8](повторение: 0, количество: Int(CC_SHA384_DIGEST_LENGTH)) payloadData.withUnsafeBytes { payloadPtr в secretData.withUnsafeBytes { secretPtr в CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA384), secretPtr.baseAddress, secretData.count, payloadPtr.baseAddress, payloadData.count, &result) } } пусть подписьДанные = Данные (результат) let Signature = SignatureData.map { String(format: "%02x", $0) }.joined() возвратная подпись } еще { возвращаться "" } } func base64Encode (полезная нагрузка: строка) -> строка? { если let payloadData = payload.data(using: .utf8) { вернуть payloadData.base64EncodedString() } вернуть ноль } пусть apiKey = MyAPIKEY пусть apiSecret = MYAPISecret let baseUrl = "https://api.gemini.com/v1/notionalbalances/usd" пусть конечная точка = "/v1/notionalbalances/usd" пусть аккаунт = "основной" func PerformAPICall() асинхронные броски -> Crypto { пусть URL = URL (строка: baseUrl)! пусть nonce = генерироватьNonce() let payload = "\(nonce)+\(конечная точка)+\(учетная запись)" // let payload = "["request": "/v1/notionalbalances/usd", "nonce" : nonce, "account" : "primary"]" // let payload = """ // { // "запрос": "/v1/notionalbalances/usd", // "нонс": "\(нонс)", // "аккаунт": "\(аккаунт)" // } // """ пусть подпись = SignPayload (полезная нагрузка: полезная нагрузка, секрет: apiSecret) запрос вар = URLRequest (url:url) request.httpMethod = "POST" request.setValue("text/plain", forHTTPHeaderField: "Content-Type") request.setValue("0", forHTTPHeaderField: "Content-Length") request.setValue(apiKey, forHTTPHeaderField: "X-GEMINI-APIKEY") request.setValue(base64Encode(payload: payload), forHTTPHeaderField: "X-GEMINI-PAYLOAD") request.setValue(подпись, forHTTPHeaderField: "X-GEMINI-SIGNATURE") request.setValue("без кэша", forHTTPHeaderField: "Cache-Control") // request.setValue(generateNonce(), forHTTPHeaderField: "nonce") let (данные, ответ) = попробуйте дождаться URLSession.shared.data(from: url) если let httpResponse = ответ как? HTTPURLResponse { print("Код состояния: \(httpResponse.statusCode)") print("Заголовки ответов: \(httpResponse.allHeaderFields)") } пусть оболочка = попробуйте JSONDecoder().decode(Crypto.self, from: data) возвратная обертка } Задача { var crypto = попробуйте дождаться выполненияAPICall() } Я постоянно получаю эту ошибку:
Код состояния: 404 Заголовки ответов: [AnyHashable("Vary"): Origin, AnyHashable("Content-Length"): 111, AnyHashable("Server"): nginx, AnyHashable("Content-Type"): application/json, AnyHashable("Date) "): суббота, 30 сентября 2023 г., 16:21:07 GMT]
У меня возникли проблемы с доступом к конечным точкам частного API с помощью Swift. Я пытался использовать Python, поскольку у меня достаточно опыта и я могу получать данные из API. Я не уверен, что происходит. В документации Gemini API нет реализации Swift, поэтому разобраться в нем довольно сложно. Я также пытался использовать ChatGPT, но проблема осталась.
func ignoreNonce() -> String { let timestamp = String(Int(Date().timeIntervalSince1970 * 1000)) // Получаем текущую временную метку в миллисекундах let uniqueId = UUID().uuidString // Генерируем уникальный идентификатор // Объединяем метку времени и уникальный идентификатор для создания nonce пусть nonce = отметка времени + уникальный идентификатор вернуть одноразовый номер } funcsignPayload(полезная нагрузка: String, secret: String) -> String { if let payloadData = payload.data(using: .utf8), let secretData = secret.data(using: .utf8) { результат var = [UInt8](повторение: 0, количество: Int(CC_SHA384_DIGEST_LENGTH)) payloadData.withUnsafeBytes { payloadPtr в secretData.withUnsafeBytes { secretPtr в CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA384), secretPtr.baseAddress, secretData.count, payloadPtr.baseAddress, payloadData.count, &result) } } пусть подписьДанные = Данные (результат) let Signature = SignatureData.map { String(format: "%02x", $0) }.joined() возвратная подпись } еще { возвращаться "" } } func base64Encode (полезная нагрузка: строка) -> строка? { если let payloadData = payload.data(using: .utf8) { вернуть payloadData.base64EncodedString() } вернуть ноль } пусть apiKey = MyAPIKEY пусть apiSecret = MYAPISecret let baseUrl = "https://api.gemini.com/v1/notionalbalances/usd" пусть конечная точка = "/v1/notionalbalances/usd" пусть аккаунт = "основной" func PerformAPICall() асинхронные броски -> Crypto { пусть URL = URL (строка: baseUrl)! пусть nonce = генерироватьNonce() let payload = "\(nonce)+\(конечная точка)+\(учетная запись)" // let payload = "["request": "/v1/notionalbalances/usd", "nonce" : nonce, "account" : "primary"]" // let payload = """ // { // "запрос": "/v1/notionalbalances/usd", // "нонс": "\(нонс)", // "аккаунт": "\(аккаунт)" // } // """ пусть подпись = SignPayload (полезная нагрузка: полезная нагрузка, секрет: apiSecret) запрос вар = URLRequest (url:url) request.httpMethod = "POST" request.setValue("text/plain", forHTTPHeaderField: "Content-Type") request.setValue("0", forHTTPHeaderField: "Content-Length") request.setValue(apiKey, forHTTPHeaderField: "X-GEMINI-APIKEY") request.setValue(base64Encode(payload: payload), forHTTPHeaderField: "X-GEMINI-PAYLOAD") request.setValue(подпись, forHTTPHeaderField: "X-GEMINI-SIGNATURE") request.setValue("без кэша", forHTTPHeaderField: "Cache-Control") // request.setValue(generateNonce(), forHTTPHeaderField: "nonce") let (данные, ответ) = попробуйте дождаться URLSession.shared.data(from: url) если let httpResponse = ответ как? HTTPURLResponse { print("Код состояния: \(httpResponse.statusCode)") print("Заголовки ответов: \(httpResponse.allHeaderFields)") } пусть оболочка = попробуйте JSONDecoder().decode(Crypto.self, from: data) возвратная обертка } Задача { var crypto = попробуйте дождаться выполненияAPICall() } Я постоянно получаю эту ошибку:
Код состояния: 404 Заголовки ответов: [AnyHashable("Vary"): Origin, AnyHashable("Content-Length"): 111, AnyHashable("Server"): nginx, AnyHashable("Content-Type"): application/json, AnyHashable("Date) "): суббота, 30 сентября 2023 г., 16:21:07 GMT]
Мобильная версия