見出し画像

Yahoo検索広告APIを使ってJavaでオフラインコンバージョンのアップロードをしてみる

会社のオフラインコンバージョンツールをYahoo検索広告に対応するのに調べたら、如何せんリファレンスが全く無かった。
オフラインコンバージョンのアップロードに成功したものを備忘録として書いておく。
Yahooの公式リファレンスはこちら

    /**
    * Yahoo検索広告へのコンバージョンデータアップロード
    * @param token アクセストークン
    * @param accountId アカウントID
    * @param csvFileName アップデートCSVファイル名
    * @param csvFilePath アップデートCSVファイルパス
    */
   private void uploadYahooConversionCSV(String token, String accountId, String csvFileName, String csvFilePath) {
       // URL
       String uploadURL = "https://ads-search.yahooapis.jp/api/v2/OfflineConversionService/upload"
               + "?accountId=" + accountId          // 各種アカウントID。確認はこちらから⇒https://promotionalads.business.yahoo.co.jp/biz/ss/accounts/#/
               + "&uploadType=NEW"                  // 新規の場合NEW。調整の場合はADJUSTMENT。
               + "&uploadFileName=" + csvFileName;
       HttpURLConnection connection = null;

       try {
           // アップロード先URL
           URL url = new URL(uploadURL);
           // コネクション取得
           connection = (HttpURLConnection) url.openConnection();
           // アップロードファイル
           FileInputStream file = new FileInputStream(csvFilePath);
           // バウンダリ
           String boundary = UUID.randomUUID().toString();

           // 送信Method設定(POST)
           connection.setRequestMethod("POST");
           // リクエストボディデータ書き込み許可
           connection.setDoOutput(true);
           // トークン設定
           connection.setRequestProperty("Authorization", "Bearer " + token);
           // acceptヘッダ
           connection.setRequestProperty("accept", "application/json");
           // multipart/form-data設定
           connection.setRequestProperty("Content-Type"
                   , "multipart/form-data; boundary=" + boundary);
           // コネクションを開く
           connection.connect();

           // リクエストボディの書き出し
           OutputStream out = connection.getOutputStream();
           out.write(("--" + boundary + "\\r\\n"
                   + "Content-Disposition: form-data; name=\"file\"; filename=\"" + csvFileName + "\""
                   + "\\r\\n"
                   + "Content-Type: application/octet-stream"
                   + "\\r\\n" + "\\r\\n")
                   .getBytes(StandardCharsets.UTF_8));
           byte[] buffer = new byte[128];
           int size = -1;
           while (-1 != (size = file.read(buffer))) {
               out.write(buffer, 0, size);
           }
           out.write(("\\r\\n" + "--" + boundary + "--" + "\\r\\n")
                   .getBytes(StandardCharsets.UTF_8));
           out.flush();
           file.close();

           // レスポンスの読み出し
           BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
           String inputLine;
           StringBuffer response = new StringBuffer();
           while ((inputLine = in.readLine()) != null) {
               response.append(inputLine);
           }
           in.close();
           if (LOG.isInfoEnabled()) {
               LOG.info("Sending 'POST' request to URL : " + url.toString());
               LOG.info("Response Code : " + connection.getResponseCode());
               LOG.info("Response Message : " + connection.getResponseMessage());
               LOG.info("Respose JSON : " + response.toString());
           }

       } catch(IOException e) {
           e.printStackTrace();
       } finally {
           connection.disconnect();
       }
   }

YahooAPIを使うには事前に登録しておく必要がある。
登録に関してはこちら
認証やアクセストークンの取得等はこちら


いいなと思ったら応援しよう!