SSLに対応したlibcurlで、OpenAIへリクエストを送る。
#include <iostream> #include <fstream> #include <string> // libcurlを使うために必要 #define CURL_STATICLIB #include <curl/curl.h> // ssl対応したlibcurlに必要 #pragma comment(lib, "CRYPT32.LIB") #pragma comment(lib, "wldap32.lib" ) #pragma comment(lib, "Ws2_32.lib") // ssl対応したlibcurlに必要 #pragma comment(lib,"libcurl.lib") #pragma comment(lib,"libssl.lib") #pragma comment(lib,"libcrypto.lib") std::size_t WriteCallback( const char* in, std::size_t size, std::size_t num, std::string* out) { const std::size_t totalBytes(size * num); out->append(in, totalBytes); return totalBytes; } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// int main() { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // まず、OpenAI APIへアクセスするURLと、送信するデータを定義する // text-davinci-003 がモデル名。 const std::string url = "https://api.openai.com/v1/engines/text-davinci-003/completions"; // 送信するデータをjsonで記述。promptに指示を入れる。 const std::string data = R"( { "prompt":"Translate the following English text to Japanese Romaji: 'Hello, world'", "max_tokens":60 } )"; //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // ここからlibcurlの処理開始 CURL* curl = curl_easy_init(); if (!curl) { std::cerr << "Error: Failed to initialize libcurl." << std::endl; return false; } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // httpsの場合は、以下の設定が必要 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 1); curl_easy_setopt(curl, CURLOPT_CAINFO, R"(.\cacert.pem)"); curl_easy_setopt(curl, CURLOPT_CAPATH, R"(.\cacert.pem)"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L); //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // サーバー側からの返答を受け取る関数と受け取ったデータを保存する変数を渡す std::string response; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // OpenAI APIへのアクセスをするURLを設定 CURLcode res = curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_setopt() failed: %s\n", curl_easy_strerror(res)); return 1; } // sk-ABCDEFGHIJK1234567890 はAPIキー。これを自分のものに変える。 curl_slist* hs = NULL; hs = curl_slist_append(hs, "Content-Type: application/json"); hs = curl_slist_append(hs, "Authorization: Bearer sk-ABCDEFGHIJK1234567890"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hs); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 通信の実行 res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { // エラーの場合は、response_codeが200以外になる long response_code; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); if (response_code != 200) { std::wcout << "ERROR" << std::endl; } else { std::wcout << "SUCCESS" << std::endl; } // 成功の場合、responseには結果が入る。 // エラーの場合、responseにはエラーの原因などが入る。 std::cout << "HTTP Response code: " << response_code << std::endl; std::cout << "Response: " << response << std::endl; // utf8で受け取ったデータを、Shift-JISに変換して保存する std::ofstream ofs("response.txt"); ofs << response; ofs.close(); } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// curl_slist_free_all(hs); curl_easy_cleanup(curl); return 0; }
ローマ字と指定しているので、Konnichiwa, sekai という返答が返ってきている。