ব্রাউজার প্রাইভেসি প্রক্সি এবং IP সুরক্ষা সেটিংস Google Ad Manager-এ থার্ড-পার্টি বিজ্ঞাপনের অনুরোধে ক্লায়েন্ট IP অ্যাড্রেস মাস্ক করতে পারে। মাস্ক করা IP অ্যাড্রেস ভৌগোলিক টার্গেটিংয়ের নির্ভুলতা এবং বিজ্ঞাপনের প্রাসঙ্গিকতা কমাতে পারে। আপনার ওয়েব সার্ভার বা কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) ফার্স্ট-পার্টি প্রসঙ্গে ব্যবহারকারীর সাথে ইন্টার্যাক্ট করে বলে, আপনার সার্ভার ব্যবহারকারীর আনমাস্ক করা IP অ্যাড্রেস পায়।
প্রকাশকের প্রদান করা IP ফিচারের মাধ্যমে আপনি নিজের সার্ভারে ব্যবহারকারীর আনমাস্ক করা IPv4 বা IPv6 অ্যাড্রেস ক্যাপচার করতে, হাইব্রিড পাবলিক কী এনক্রিপশন (HPKE) ব্যবহার করে অ্যাড্রেস এনক্রিপ্ট করতে এবং ক্লায়েন্টে Google প্রকাশক ট্যাগে (GPT) এনক্রিপ্ট করা পেলোড পাস করতে পারবেন।
এই পৃষ্ঠায় GPT-এর সাথে প্রকাশকের দেওয়া IP ইন্টিগ্রেট করার বিষয়ে আলোচনা করা হয়েছে।
সার্ভার-সাইড ওয়ার্কফ্লো প্রয়োগ করা
ব্রাউজারে থার্ড-পার্টি স্ক্রিপ্টের কাছে ব্যবহারকারীর প্লেইনটেক্সট IP অ্যাড্রেস প্রকাশ করা এড়াতে, আপনার ওয়েব সার্ভার বা CDN এজ ওয়ার্কারে নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- সব IP ক্যাপচার করুন।
- পাবলিক কী ফেচ করুন।
- HPKE এনক্রিপশন পারফর্ম করুন।
ক্লায়েন্ট IP অ্যাড্রেস ক্যাপচার করা
আপনার ওয়েব সার্ভার বা CDN-এ ইনকামিং পৃষ্ঠা অনুরোধ থেকে ক্লায়েন্টের আনমাস্ক করা IPv4 বা IPv6 অ্যাড্রেস এক্সট্র্যাক্ট করুন:
- সরাসরি কানেকশন: ইনকামিং HTTP কানেকশনের রিমোট সকেট অ্যাড্রেস পড়ুন।
- CDN, লোড ব্যালেন্সার বা রিভার্স প্রক্সির পিছনে: আপনার বিশ্বস্ত এজ প্রক্সি থেকে ক্লায়েন্ট IP হেডার
পড়ুন, যেমন
X-Forwarded-Forহেডার বা CDN-নির্দিষ্ট ক্লায়েন্ট IP হেডার। আপনার প্রক্সি ইনফ্রাস্ট্রাকচার যে ফরওয়ার্ডিং হেডার যোগ বা ওভাররাইড করে, শুধুমাত্র সেটিই বিশ্বাস করুন।X-Forwarded-Forহেডারে কমা দিয়ে আলাদা করা একাধিক অ্যাড্রেস থাকলে, বিশ্বস্ত এজ প্রক্সি যে ক্লায়েন্ট IP যোগ করেছে সেটি বেছে নিন।
Ad Manager-এ নিম্নলিখিত ঠিকানা কাজ করে:
- IPv4, যেমন,
203.0.113.42। - IPv6, যেমন,
2001:db8::8a2e:370:7334।
পোর্ট নম্বর, ব্র্যাকেট, CIDR প্রিফিক্স বা আশেপাশের হোয়াইটস্পেস ছাড়া শুধুমাত্র IP অ্যাড্রেস স্ট্রিং পাস করুন।
পাবলিক কী ফেচ ও ক্যাশে করা
Google, অ্যাক্টিভ HPKE এনক্রিপশন কী, RFC 8037 JSON Web Key Set (JWKS) হিসেবে নিম্নলিখিত এন্ডপয়েন্টে প্রকাশ করে:
https://www.gstatic.com/real-ip/ip_enc_key.json
এই এন্ডপয়েন্টে GET অনুরোধ করলে একটি JSON অবজেক্ট পাওয়া যায়, যার keys অ্যারেতে
একটি চালু থাকা কী অবজেক্ট থাকে। ক্লায়েন্ট IP অ্যাড্রেস এনক্রিপ্ট করতে, সেই অবজেক্টের x
প্রপার্টিতে 'কী' ব্যবহার করুন।
নিচের উদাহরণটি সর্বজনীন কী ফেচ করে এবং সফল হলে x প্রপার্টি এক্সট্র্যাক্ট করে
এবং ব্যর্থ হলে ব্যতিক্রম থ্রো করে:
Java
private static final String KEY_ENDPOINT_URL = "https://www.gstatic.com/real-ip/ip_enc_key.json";
/**
* Fetches the active X25519 public key from Google's key endpoint.
*
* <p>In production, cache the returned public key in memory and refresh it at least once every 24
* hours rather than fetching it on every incoming request.
*
* @return The unpadded Base64URL-encoded 32-byte X25519 public key ('x').
*/
public static String fetchPublicKey() throws IOException, InterruptedException {
return fetchPublicKey(KEY_ENDPOINT_URL);
}
public static String fetchPublicKey(String endpointUrl) throws IOException, InterruptedException {
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build();
HttpRequest request =
HttpRequest.newBuilder()
.uri(URI.create(endpointUrl))
.timeout(Duration.ofSeconds(5))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() < 200 || response.statusCode() >= 300) {
throw new IOException("Failed to fetch public key, HTTP status: " + response.statusCode());
}
JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject();
JsonArray keys = json.getAsJsonArray("keys");
if (keys == null || keys.isEmpty()) {
throw new IOException("No keys found in response from " + endpointUrl);
}
JsonObject keyObj = keys.get(0).getAsJsonObject();
if (!keyObj.has("x")) {
throw new IOException("Key payload missing 'x' property: " + keyObj);
}
return keyObj.get("x").getAsString();
}
Python
KEY_ENDPOINT_URL = "https://www.gstatic.com/real-ip/ip_enc_key.json"
def fetch_public_key(url: str = KEY_ENDPOINT_URL) -> str:
"""Fetches the active X25519 public key from Google's key endpoint.
In production, cache the returned public key in memory and refresh it at
least once every 24 hours rather than fetching it on every incoming request.
Args:
url: URL of the public key endpoint.
Returns:
The unpadded Base64URL-encoded 32-byte X25519 public key ('x').
"""
with urllib.request.urlopen(url, timeout=5) as response:
data = json.loads(response.read().decode("utf-8"))
keys = data.get("keys", [])
if not keys:
raise ValueError(f"No keys found in response from {url}")
key_payload = keys[0].get("x")
if not key_payload:
raise ValueError(f"Key payload missing 'x' property: {keys[0]}")
return key_payload
জাভাস্ক্রিপ্ট
const KEY_ENDPOINT_URL = 'https://www.gstatic.com/real-ip/ip_enc_key.json';
/**
* Fetches the active X25519 public key from Google's key endpoint.
*
* In production, cache the returned public key in memory and refresh it at
* least once every 24 hours rather than fetching it on every incoming request.
*
* @param {string=} url URL of the public key endpoint.
* @return {!Promise<string>} The unpadded Base64URL-encoded 32-byte X25519
* public key ('x').
*/
async function fetchPublicKey(url = KEY_ENDPOINT_URL) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(
`Failed to fetch public key, HTTP status: ${response.status}`,
);
}
const data = await response.json();
if (!data.keys || data.keys.length === 0) {
throw new Error(`No keys found in response from ${url}`);
}
const keyPayload = data.keys[0].x;
if (!keyPayload) {
throw new Error(
`Key payload missing 'x' property: ${JSON.stringify(data.keys[0])}`,
);
}
return keyPayload;
}
TypeScript
const KEY_ENDPOINT_URL = 'https://www.gstatic.com/real-ip/ip_enc_key.json';
interface JwkKey {
kty?: string;
crv?: string;
x?: string;
kid?: string;
}
interface KeyEndpointResponse {
keys?: JwkKey[];
}
/**
* Fetches the active X25519 public key from Google's key endpoint.
*
* In production, cache the returned public key in memory and refresh it at
* least once every 24 hours rather than fetching it on every incoming request.
*
* @param url URL of the public key endpoint.
* @return The unpadded Base64URL-encoded 32-byte X25519 public key ('x').
*/
export async function fetchPublicKey(
url: string = KEY_ENDPOINT_URL,
): Promise<string> {
const response = await fetch(url);
if (!response.ok) {
throw new Error(
`Failed to fetch public key, HTTP status: ${response.status}`,
);
}
const data = (await response.json()) as KeyEndpointResponse;
if (!data.keys || data.keys.length === 0) {
throw new Error(`No keys found in response from ${url}`);
}
const keyPayload = data.keys[0].x;
if (!keyPayload) {
throw new Error(
`Key payload missing 'x' property: ${JSON.stringify(data.keys[0])}`,
);
}
return keyPayload;
}
সফল হলে, উত্তরে keys অ্যারে অন্তর্ভুক্ত থাকে, যাতে x প্রপার্টি সহ
একটি কী অবজেক্ট থাকে:
{
"keys": [
{
"kty": "OKP",
"crv": "X25519",
"x": "7bws5TIHOUrcJNofEubW3DPW8zR9EtjFNLm_Grv98TA",
"kid": "EZMLFw"
}
]
}
নিম্নলিখিত সারণীতে keys
অ্যারের মূল অবজেক্টের প্রপার্টি বর্ণনা করা হয়েছে:
| প্রপার্টি | বিবরণ |
|---|---|
crv |
এলিপ্টিক কার্ভ শনাক্তকারী। সবসময় X25519। |
kid |
আনপ্যাডেড base64url-এনকোডেড কী আইডেন্টিফায়ার, যা Google কী রোটেট করলে পরিবর্তিত হয়। |
kty |
'কী'-এর ধরন। সবসময় OKP (অক্টেট কী পেয়ার)। |
x |
এনক্রিপশনের জন্য ব্যবহৃত আনপ্যাডেড base64url-এনকোড করা ৩২-বাইট র X25519 সর্বজনীন কী। |
আপনার সার্ভারের মেমরিতে ফেচ করা পাবলিক কী ক্যাশে করুন এবং প্রতি ২৪ ঘণ্টায় অন্তত একবার বা HTTP Cache-Control
রেসপন্স হেডার অনুযায়ী আরও তাড়াতাড়ি কী রিফ্রেশ করুন। প্রতিটি ইনকামিং পৃষ্ঠা অনুরোধে পাবলিক কী ফেচ করবেন না।
Google রোটেট করা ব্যক্তিগত কী রেখে দেয়। কী রোটেশনের সময়, আগের ২৪ ঘণ্টায় ক্যাশে করা পাবলিক কী দিয়ে এনক্রিপ্ট করা পে-লোড নির্বিঘ্নে ডিক্রিপ্ট করা চালিয়ে যাওয়া হয়।
IP অ্যাড্রেস এনক্রিপ্ট করা
HPKE (RFC 9180) এবং ডিকোড করা ৩২-বাইট X25519 সর্বজনীন কী, x,
যা সর্বজনীন কী ফেচ ও ক্যাশে করুন থেকে পাওয়া গেছে, ব্যবহার করে ক্লায়েন্টের IP অ্যাড্রেস স্ট্রিংয়ের UTF-8 বাইট রিপ্রেজেন্টেশন এনক্রিপ্ট করুন।
নিম্নলিখিত উদাহরণটি একটি IP অ্যাড্রেস স্ট্রিং এনক্রিপ্ট করে:
Java
এই উদাহরণে Tink (com.google.crypto.tink:tink 1.16.0 বা
তার পরবর্তী ভার্সন) ব্যবহার করা হয়েছে:
static {
try {
HybridConfig.register();
} catch (GeneralSecurityException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* Encrypts an IP address using HPKE (DHKEM(X25519, HKDF-SHA256), HKDF-SHA256, AES-256-GCM).
*
* @param pubXB64Url Base64URL-encoded 32-byte X25519 public key ('x').
* @param ipStr Plaintext IPv4 or IPv6 address string (for example, "203.0.113.42").
* @return Unpadded Base64URL-encoded payload (enc || ciphertext).
*/
@AccessesPartialKey
public static String encryptIp(String pubXB64Url, String ipStr) throws GeneralSecurityException {
// 1. Decode the 32-byte X25519 public key 'x' from Base64URL.
byte[] pubBytes = Base64.getUrlDecoder().decode(pubXB64Url);
if (pubBytes.length != 32) {
throw new IllegalArgumentException(
"Public key must be exactly 32 bytes, got " + pubBytes.length);
}
// 2. Configure HPKE parameters (DHKEM_X25519_HKDF_SHA256, HKDF_SHA256,
// AES_256_GCM, NO_PREFIX).
HpkeParameters parameters =
HpkeParameters.builder()
.setKemId(HpkeParameters.KemId.DHKEM_X25519_HKDF_SHA256)
.setKdfId(HpkeParameters.KdfId.HKDF_SHA256)
.setAeadId(HpkeParameters.AeadId.AES_256_GCM)
.setVariant(HpkeParameters.Variant.NO_PREFIX)
.build();
HpkePublicKey publicKey =
HpkePublicKey.create(parameters, Bytes.copyFrom(pubBytes), /* idRequirement= */ null);
// 3. Encrypt the UTF-8 IP address bytes. With Variant.NO_PREFIX, Tink
// outputs raw (enc || ciphertext_with_tag).
KeysetHandle handle =
KeysetHandle.newBuilder()
.addEntry(KeysetHandle.importKey(publicKey).withRandomId().makePrimary())
.build();
HybridEncrypt encryptor = handle.getPrimitive(RegistryConfiguration.get(), HybridEncrypt.class);
byte[] payload =
encryptor.encrypt(ipStr.getBytes(StandardCharsets.UTF_8), /* contextInfo= */ new byte[0]);
// 4. Return unpadded Base64URL-encoded payload.
return Base64.getUrlEncoder().withoutPadding().encodeToString(payload);
}
Python
এই উদাহরণে pyhpke ব্যবহার করা হয়েছে:
def encrypt_ip(pub_x_b64url: str, ip_str: str) -> str:
"""Encrypts an IP address using HPKE (RFC 9180).
Args:
pub_x_b64url: Base64URL-encoded 32-byte X25519 public key ('x').
ip_str: Plaintext IPv4 or IPv6 address string (for example, "203.0.113.42").
Returns:
Unpadded Base64URL-encoded payload (enc || ciphertext).
"""
# 1. Decode the 32-byte X25519 public key 'x' from Base64URL.
pub_bytes = base64.urlsafe_b64decode(
pub_x_b64url + "=" * (-len(pub_x_b64url) % 4)
)
if len(pub_bytes) != 32:
raise ValueError(
f"Public key must be exactly 32 bytes, got {len(pub_bytes)}"
)
# 2. Configure HPKE cipher suite (DHKEM_X25519_HKDF_SHA256, HKDF_SHA256,
# AES256_GCM).
suite = CipherSuite.new(
KEMId.DHKEM_X25519_HKDF_SHA256, KDFId.HKDF_SHA256, AEADId.AES256_GCM
)
public_key = suite.kem.deserialize_public_key(pub_bytes)
# 3. Create a fresh sender context per encryption (you may cache 'suite' and
# 'public_key', but never reuse 'sender' across multiple seal() calls) and
# package (enc || ciphertext).
enc, sender = suite.create_sender_context(public_key)
ciphertext = sender.seal(ip_str.encode("utf-8"))
# 4. Return unpadded Base64URL-encoded payload.
return base64.urlsafe_b64encode(enc + ciphertext).decode("utf-8").rstrip("=")
জাভাস্ক্রিপ্ট
এই উদাহরণে @hpke/core ব্যবহার করা হয়েছে:
/**
* Encrypts an IP address using HPKE (RFC 9180).
*
* @param {string} pubXB64Url Base64URL-encoded 32-byte X25519 public key ('x').
* @param {string} ipStr Plaintext IPv4 or IPv6 address string (for example,
* "203.0.113.42").
* @return {!Promise<string>} Unpadded Base64URL-encoded payload
* (enc || ciphertext).
*/
async function encryptIp(pubXB64Url, ipStr) {
// 1. Decode the 32-byte X25519 public key 'x' from Base64URL.
const pubBytes = Buffer.from(pubXB64Url, 'base64url');
if (pubBytes.length !== 32) {
throw new Error(
`Public key must be exactly 32 bytes, got ${pubBytes.length}`,
);
}
// 2. Configure HPKE cipher suite (DHKEM_X25519_HKDF_SHA256, HKDF_SHA256,
// AES_256_GCM).
const suite = new CipherSuite({
kem: new DhkemX25519HkdfSha256(),
kdf: new HkdfSha256(),
aead: new Aes256Gcm(),
});
const rawPubKey = new Uint8Array(pubBytes).buffer;
const publicKey = await suite.kem.importKey('raw', rawPubKey, true);
// 3. Encrypt the UTF-8 IP address bytes and package (enc || ciphertext).
const plaintext = new Uint8Array(Buffer.from(ipStr, 'utf8')).buffer;
const {enc, ct} = await suite.seal(
{recipientPublicKey: publicKey},
plaintext,
);
// 4. Return unpadded Base64URL-encoded payload.
return Buffer.concat([Buffer.from(enc), Buffer.from(ct)]).toString(
'base64url',
);
}
TypeScript
এই উদাহরণে @hpke/core ব্যবহার করা হয়েছে:
/**
* Encrypts an IP address using HPKE (RFC 9180).
*
* @param pubXB64Url Base64URL-encoded 32-byte X25519 public key ('x').
* @param ipStr Plaintext IPv4 or IPv6 address string (for example,
* "203.0.113.42").
* @return Unpadded Base64URL-encoded payload (enc || ciphertext).
*/
export async function encryptIp(
pubXB64Url: string,
ipStr: string,
): Promise<string> {
// 1. Decode the 32-byte X25519 public key 'x' from Base64URL.
const pubBytes = Buffer.from(pubXB64Url, 'base64url');
if (pubBytes.length !== 32) {
throw new Error(
`Public key must be exactly 32 bytes, got ${pubBytes.length}`,
);
}
// 2. Configure HPKE cipher suite (DHKEM_X25519_HKDF_SHA256, HKDF_SHA256,
// AES_256_GCM).
const suite = new CipherSuite({
kem: new DhkemX25519HkdfSha256(),
kdf: new HkdfSha256(),
aead: new Aes256Gcm(),
});
const rawPubKey = new Uint8Array(pubBytes).buffer;
const publicKey = await suite.kem.importKey('raw', rawPubKey, true);
// 3. Encrypt the UTF-8 IP address bytes and package (enc || ciphertext).
const plaintext = new Uint8Array(Buffer.from(ipStr, 'utf8')).buffer;
const {enc, ct} = await suite.seal(
{recipientPublicKey: publicKey},
plaintext,
);
// 4. Return unpadded Base64URL-encoded payload.
return Buffer.concat([Buffer.from(enc), Buffer.from(ct)]).toString(
'base64url',
);
}
নিম্নলিখিত সাইফার স্যুট ও প্যারামিটার সহ আপনার HPKE লাইব্রেরি কনফিগার করুন:
| প্যারামিটার | ভ্যালু |
|---|---|
| কী এনক্যাপসুলেশন মেকানিজম (KEM) | DHKEM(X25519, HKDF-SHA256) (0x0020) |
| কী ডেরিভেশন ফাংশন (KDF) | HKDF-SHA256 (0x0001) |
| অ্যাসোসিয়েটেড ডেটা সহ যাচাইকৃত এনক্রিপশন (AEAD) | AES-256-GCM (0x0002) |
| মোড | বেস (0x00) |
অ্যাপ্লিকেশন সংক্রান্ত তথ্য (info) |
খালি ("") |
সংশ্লিষ্ট ডেটা (aad) |
খালি ("") |
এনক্রিপ্ট করা আউটপুটকে ৩২-বাইট এনক্যাপসুলেট করা ক্ষণস্থায়ী সর্বজনীন কী, enc এবং AEAD সাইফারটেক্সটের র-কনক্যাটেনেশন হিসেবে ফর্ম্যাট করুন, যার মধ্যে ১৬-বাইট GCM যাচাইকরণ ট্যাগ অন্তর্ভুক্ত থাকবে, কোনও Tink বা কাস্টম হেডার প্রিফিক্স থাকবে না। ফলাফলটি একটি আনপ্যাডেড base64url স্ট্রিং হিসেবে এনকোড করুন।
একটি নতুন ক্ষণস্থায়ী কী পেয়ার সহ প্রতিটি পে-লোডকে একটি স্বতন্ত্র সিঙ্গেল-শট HPKE মেসেজ হিসেবে এনক্রিপ্ট করুন। আপনার HPKE লাইব্রেরি স্টেটফুল প্রেরক প্রসঙ্গ ব্যবহার করলে, একাধিক মেসেজ জুড়ে এটি আবার ব্যবহার করার পরিবর্তে প্রতিটি এনক্রিপশনের জন্য একটি নতুন প্রসঙ্গ তৈরি করুন। প্রতি পৃষ্ঠা অনুরোধের জন্য ক্লায়েন্ট IP অ্যাড্রেস এনক্রিপ্ট করুন অথবা অল্প সময়ের জন্য (TTL) প্রতি IP অ্যাড্রেসের জন্য base64url সাইফারটেক্সট স্ট্রিং ক্যাশে করুন।
ক্লায়েন্ট-সাইড ওয়ার্কফ্লো প্রয়োগ করা
আপনার সার্ভার এনক্রিপ্ট করা base64url IP পে-লোড তৈরি করার পরে, বিজ্ঞাপনের অনুরোধ করার আগে ক্লায়েন্টের GPT-তে পে-লোড পাস করুন।
GPT-তে এনক্রিপ্ট করা IP পাস করা
PageSettingsConfig-এ ipAddress প্রপার্টি ব্যবহার করে
googletag.setConfig পদ্ধতিতে এনক্রিপ্ট করা IP স্ট্রিং
পাস করুন।
নিম্নলিখিত উদাহরণটি পরিষেবা চালু করার এবং একটি বিজ্ঞাপন স্লট দেখানোর আগে
googletag.setConfig পদ্ধতিতে সার্ভার-জেনারেটেড এনক্রিপ্ট করা IP পেলোড
যোগ করে:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Publisher-provided IP example</title>
<script src="https://securepubads.g.doubleclick.net/tag/js/gpt.js" crossorigin="anonymous" async></script>
<script>
window.googletag = window.googletag || {cmd: []};
// Inject the base64url-encoded encrypted IP generated by your server.
const encryptedClientIp = 'ENCRYPTED_IP_PAYLOAD';
googletag.cmd.push(function() {
// Configure the encrypted IP before enabling services.
googletag.setConfig({
ipAddress: encryptedClientIp,
});
googletag
.defineSlot('/6355419/Travel/Europe/France/Paris', [300, 250], 'banner-ad')
.addService(googletag.pubads());
googletag.enableServices();
});
</script>
</head>
<body>
<div id="banner-ad" style="width: 300px; height: 250px;"></div>
<script>
googletag.cmd.push(function() {
googletag.display('banner-ad');
});
</script>
</body>
</html>আপনার সার্ভার থেকে তৈরি করা আনপ্যাডেড
base64url-এনকোডেড স্ট্রিং দিয়ে ENCRYPTED_IP_PAYLOAD প্রতিস্থাপন করুন।
পৃষ্ঠায় আগে কনফিগার করা IP অ্যাড্রেস মুছে দিতে, ipAddress
প্রপার্টি null ভ্যালুতে সেট করুন:
googletag.setConfig({ ipAddress: null });
ইন্টিগ্রেশন যাচাই করুন
GPT আপনার এনক্রিপ্ট করা IP পেলোড পাঠায় এবং Ad Manager পেলোড ডিক্রিপ্ট করে কিনা তা যাচাই করতে, আপনার ব্রাউজারের ডেভেলপার টুল এবং Google Publisher Console ব্যবহার করুন:
ব্রাউজার ডেভেলপার টুল
- আপনার ব্রাউজারের ডেভেলপার টুল খুলুন।
- নেটওয়ার্ক ট্যাব বেছে নিন।
/gampad/ads-এ বিজ্ঞাপনের অনুরোধের জন্য ফিল্টার করুন।- অনুরোধের URL-এ খালি নয় এমন
ipsকোয়েরি প্যারামিটার আছে কিনা তা কনফার্ম করুন। বিজ্ঞাপনের অনুরোধ পাঠানোর আগে GPTipAddressভ্যালু আরও এনকোড করে, তাইipsপ্যারামিটার আপনার এনক্রিপ্ট করা স্ট্রিংয়ের সাথে হুবহু মেলে না।
Google প্রকাশকের কনসোল
- কনসোল খুলতে, Google Publisher Console গাইডে উল্লেখ করা ধাপগুলি অনুসরণ করুন।
- পৃষ্ঠার অনুরোধ ট্যাব বেছে নিন।
কোনও
ipAddressসতর্কতা দেখানো হচ্ছে না তা কনফার্ম করুন। পে-লোডে কোনও সমস্যা থাকলে, কনসোল নিম্নলিখিত সতর্কতার মধ্যে কোনও একটি লগ করে:ipAddressপ্রপার্টিতে পাস করা ভ্যালু যদি ৬৭ থেকে ১২৪ অক্ষরের মধ্যে সঠিক base64 বা base64url স্ট্রিং না হয়, তাহলে GPT ভ্যালুটি উপেক্ষা করে, বিজ্ঞাপনের অনুরোধ থেকেipsপ্যারামিটার বাদ দেয় এবং নিম্নলিখিত সতর্কতা লগ করে:Invalid value encountered when calling: googletag.setConfig: {"ipAddress":"..."}. (string) ... was found at PageSettingsConfig.ipAddress. Invalid IP address format.Ad Manager যদি প্রদত্ত IP পেলোড ডিক্রিপ্ট করতে না পারে, অথবা ডিক্রিপ্ট করা প্লেইনটেক্সট যদি কোনও বৈধ IPv4 বা IPv6 অ্যাড্রেস না হয়, তাহলে কনসোল নিম্নলিখিত সতর্কতা লগ করে এবং নেটওয়ার্ক অনুরোধ IP অ্যাড্রেসে ফিরে যায়:
Decryption failed on the provided encrypted client IP (supplied via googletag.setConfig({ipAddress: ...})).