重要事項:自 2024 年 11 月初起,資料移轉功能的 Ad Manager 儲存空間值區存取權將從 Google 群組遷移至新的 Ad Manager 使用者角色權限。
如要進一步瞭解遷移時程和後續步驟,請參閱「將資料移轉存取權從 Google 群組遷移至 Ad Manager 權限」。
Ad Manager 會運用 Google Cloud Storage 這項獨立的 Google 產品,來存放資料移轉報表和批次上傳目標對象 Cookie ID 的資料。
方法
您可以透過三種方式存取 Ad Manager Cloud Storage 值區。按複雜程度排列如下:
- 使用線上版:前往
https://console.developers.google.com/storage/gdfp-[Ad Manager 聯播網代碼]
。 - gsutil 是一個基於 Python 的指令列工具,可提供類似 Unix 的指令以便與儲存空間值區互動。系統會在背景自動處理值區驗證程序。
- Google Cloud Storage API 功能齊全,可用來控管儲存空間值區,只要透過 JSON 或符合 REST 樣式的 XML 網路介面 (XML RESTful) 就能使用。API 用戶端程式庫可用於許多熱門的程式設計環境,包括 Java、JavaScript、Python 和 Objective-C。如果您採用程式設計方式操控儲存空間值區,以便與 Google App Engine 應用程式或 Java 網路應用程式整合,就非常適合這個方法。
本文將詳細介紹 Google Cloud Storage API。線上版和 gsutil 存取權較容易管理,因此建議您先探索這些方法。Google Cloud Storage 開發人員網站提供了詳細資料。
管理 Ad Manager 儲存空間值區的存取權
新程序 (2024 年 11 月推出)
自 2024 年 11 月起,您可以開始將需要資料移轉儲存空間值區存取權的使用者,從 Google 群組遷移至新的 Ad Manager 使用者角色權限。根據預設,管理員角色的使用者可以存取儲存空間值區。如要將其他使用者新增至使用者角色,請為他們指派新的「查看資料移轉區塊」權限。進一步瞭解遷移作業。
目前程序 (2025 年 1 月前推出)
注意:建議您查看遷移階段,並在 2025 年 1 月前採取行動。
Ad Manager 使用的儲存空間值區包含在 Google 擁有的雲端儲存空間專案中。在 Google Developers Console 中,您自己的專案清單不會顯示 Ad Manager 儲存空間值區。
您需要與 Google 代表合作,設定依賴 Ad Manager 儲存空間值區的功能。Google 代表會提供 Google 群組,供您管理儲存空間值區。
如果您是現有 G Suite 群組的管理員,即可在啟用功能的過程中,將 G Suite Google 群組的名稱提供給您的代表。他們將與您合作,透過現有群組啟用依賴 Ad Manager 儲存空間值區的任何功能。
如果您管理多個可存取資料移轉功能的 Ad Manager 聯播網,則應將此資訊傳達給您的 Google 代表,以便整合聯播網管理作業。系統會使用一個群組來管理整個聯播網中的所有「資料移轉」值區。
使用 Google Cloud Storage API
如果您確定 API 存取方式最符合您的需求,我們建議您設定 Google Cloud Storage 服務帳戶。
設定 Google Cloud Storage 服務帳戶
透過 API 存取儲存空間值區時,建議您設定服務帳戶,而不是在使用者的環境中執行。服務帳戶會使用私密金鑰進行驗證 (而非動態產生的 OAuth 憑證),因此可簡化應用程式開發作業。如要設定服務帳戶:
-
建立一個新專案 (或選取一個現有專案) 做為應用程式的上層,然後點選進入專案。
-
(可選) 如果您打算將檔案從 Ad Manager 儲存空間值區複製到您自己的 Google Cloud Storage 帳戶,請按一下 [帳單和設定],為您的專案新增帳單來源。
-
建立新的用戶端 ID:
-
依序按一下 [API 和服務] > [憑證]。
-
按一下 [建立新的用戶端 ID]。
-
選取 [服務帳戶] 做為您的應用程式類型,然後按一下 [建立用戶端 ID]。
-
產生的電子郵件地址格式為
[unique-id]@developer.gserviceagccount.com
。複製並儲存電子郵件地址,以便加到您的 Google 群組。 -
按一下 [產生新的 P12 金鑰]。系統會將檔案儲存在您的電腦中。在您開發用來存取 API 的應用程式中使用這個金鑰,如以下程式碼範例所示。
-
- 將電子郵件地址加到您建立的 Google 群組,以管理對 Ad Manager 儲存空間值區的存取權限。請按一下 [直接新增成員],而不是透過「邀請」新增服務帳戶。如果您尚未取得所需權限,可以請 Google 群組管理員代表您新增地址。
Google 提供 Google Cloud Storage 的程式碼範例和程式庫。以下用來讀取 Ad Manager Cloud Storage 值區檔案的 Java 範例,說明您在設定服務帳戶時所設定的元件對於程式碼可能造成的影響:
-
專案名稱:Google Cloud Storage 專案的名稱。
-
服務帳戶的電子郵件地址:您產生的電子郵件。
-
.p12 金鑰檔案:您下載的檔案。
-
值區名稱:當您啟用依賴 Ad Manager 雲端儲存空間值區的功能時,Google 會提供這個名稱。
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.security.GeneralSecurityException; import java.util.Collections; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.storage.Storage; import com.google.api.services.storage.model.StorageObject; public class GcsApiTest { /** * 建立服務帳戶的專案名稱。 * * 此資訊顯示在 Google Developers Console 下。 */ private static final String PROJECT_NAME = "專案名稱"; /** * 服務帳戶的開發人員電子郵件地址。 * * 這個電子郵件是在您的 * Google Developers Console 中建立服務帳戶用戶端 ID 時產生, * 可以從「憑證」網頁取得。此電子郵件也必須新增到用來控制 * 儲存空間值區存取權的 Google 群組。 */ private static final String SERVICE_ACCOUNT_EMAIL = "服務帳戶的電子郵件地址"; /** * 用於儲存作業的值區。 * * 這個值區的名稱是由您的 * 帳戶管理員提供。它的名稱可能類似於「gdfp-12345678」或 *「gdfp_cookieupload_12345678」,具體取決於您使用的 Ad Manager 外掛程式。 */ private static final String BUCKET_NAME = "值區名稱"; /** * Google Cloud Storage OAuth 2.0 讀取/寫入範圍。這應該 * 對應到您的 Google Group 群組對 * 值區所擁有的存取權,而且您無法要求未授予 * 群組的存取權 (可能是 read_only)。 */ private static final String STORAGE_SCOPE = "https://www.googleapis.com/auth/devstorage.read_write"; /** * 提供值區存取權的 key.p12 檔案路徑。 * * 系統會在建立服務用戶端 ID 時建立這個檔案。如果您沒有 * 這個檔案,就必須從 Google Developers Console * 產生新的用戶端 p12 金鑰。 */ private static final String KEY_P12 = ".p12 金鑰檔案的路徑"; /** HTTP 傳輸。*/ private HttpTransport httpTransport; private Storage storage; // 建構函式,可設定憑證和儲存空間物件 public GcsApiTest() { File p12File = new File(KEY_P12); try { httpTransport = GoogleNetHttpTransport.newTrustedTransport(); GoogleCredential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(JacksonFactory.getDefaultInstance()) .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) .setServiceAccountScopes( Collections.singleton(STORAGE_SCOPE)) .setServiceAccountPrivateKeyFromP12File(p12File).build(); storage = new Storage.Builder(httpTransport, JacksonFactory.getDefaultInstance(), credential) .setApplicationName(PROJECT_NAME).build(); } catch (GeneralSecurityException | IOException e1) { e1.printStackTrace(); System.exit(1); } } /** * 傳回值區中第一個檔案名稱的方法。 * * @傳回檔案名稱;如果值區空白則傳回 null * @傳回 IOException */ public String GetFirstFile() throws IOException { Storage.Objects.List listObjects = storage.objects().list(BUCKET_NAME); listObjects.setMaxResults(5L); com.google.api.services.storage.model.Objects objects = listObjects .execute(); // empty bucket? if (null == objects.getItems() || objects.getItems().isEmpty()) { System.out.println("Bucket \"" + BUCKET_NAME + "\" empty or invalid."); return null; } StorageObject object = objects.getItems().get(0); System.out.println("First object in bucket: \"" + object.getName() + "\"."); return object.getName(); } /** * 從儲存空間值區下載指定檔案的方法 * * @參數檔案名稱 * 應下載檔案的名稱。 * @傳回 IOException */ public void DownloadFile(String filename) throws IOException { Storage.Objects.Get getObject = storage.objects().get(BUCKET_NAME, filename); OutputStream os = new FileOutputStream(filename, true); getObject.getMediaHttpDownloader().setDirectDownloadEnabled(true); getObject.executeMediaAndDownloadTo(os); System.out.println("File \"" + filename + "\" downloaded."); } /** * 執行不同測試的主要方法。 * * @param args */ public static void main(String[] args) { GcsApiTest gcsApiTest = new GcsApiTest(); try { String filename = gcsApiTest.GetFirstFile(); gcsApiTest.DownloadFile(filename); } catch (IOException e) { System.out.println(e.getMessage()); } } }
調節和並行連線
並行連線沒有預先定義的限制。但是為了避免濫用行為,Google 會限制資料移轉擷取請求。