في إعلانات Google API، يتم إجراء التحديثات باستخدام قناع حقل. يسرد قناع الحقول جميع الحقول التي تنوي تغييرها مع التحديث، وسيتم تجاهل أي حقول محددة غير موجودة في قناع الحقل، حتى إذا تم إرسالها إلى الخادم.
مساعد قناع الحقل
الطريقة الموصى بها لإنشاء أقنعة الحقل هي استخدام وظيفة مساعد field_mask
المضمنة في حزمة google.api_core
. ويقبل كائنين نموذجيَين
ويعرض كائن قناع حقل مع حقل list
يحتوي على جميع
الحقول المختلفة بين الكائنين.
إذا تم تمرير None
كمعلمة أولى، فستتضمن قائمة قناع الحقل جميع الحقول على كائن البروتوكول الأولي الثاني الذي لم يتم تعيينه على قيمته التلقائية.
بعد إنشاء كائن قناع الحقل، يجب نسخه إلى كائن العملية الذي سيتم إرساله إلى الخادم:
في ما يلي مثال لتحديث حملة:
from google.api_core import protobuf_helpers
from google.ads.googleads.client import GoogleAdsClient
# Retrieve a GoogleAdsClient instance.
client = GoogleAdsClient.load_from_storage()
# Create a new campaign operation.
campaign_operation = client.get_type('CampaignOperation')
# Retrieve a new campaign object from its update field.
campaign = campaign_operation.update
# Mutate the campaign.
campaign.network_settings.target_search_network.value = False
# Create a field mask using the updated campaign.
# The field_mask helper is only compatible with raw protobuf message
# instances, which we can access using the ._pb attribute.
field_mask = protobuf_helpers.field_mask(None, campaign._pb)
# Copy the field_mask onto the operation's update_mask field.
client.copy_from(campaign_operation.update_mask, field_mask)
أولاً، ننشئ كائن CampaignOperation فارغًا. ثم يتم بعد ذلك تعيين
كائن حملة فارغ منه. بعد ذلك، نحدِّث كائن الحملة وننشئ قناعًا جديدًا للحقل، بمقارنته بـ None
، ما سيؤدي إلى إنشاء قائمة قناع للحقول تحتوي فقط على الحقل network_settings.target_search_network
الذي تم تغييره.
في ما يلي مثال لتحديث حملة حالية. نفترض هنا أنّ النص البرمجي قد تمّ توفير معلَمة resource_name
في اسم مورد صالح لحملة وcustomer_id
صالحة:
import proto
from google.api_core import protobuf_helpers
from google.ads.googleads.client import GoogleAdsClient
# Retrieve a GoogleAdsClient instance.
client = GoogleAdsClient.load_from_storage()
# Retrieve an instance of the GoogleAdsService.
googleads_service = client.get_service('GoogleAdsService')
# Search query to retrieve campaign.
query = f"""
SELECT
campaign.network_settings.target_search_network,
campaign.resource_name
FROM campaign
WHERE campaign.resource_name = {resource_name}"""
# Submit a query to retrieve a campaign instance.
response = googleads_service.search_stream(customer_id=customer_id, query=query)
# Iterate over results to retrieve the campaign.
for batch in response:
for row in batch.results:
initial_campaign = row.campaign
# Create a new campaign operation.
campaign_operation = client.get_type('CampaignOperation')
# Set the copied campaign object to a variable for easy reference.
updated_campaign = campaign_operation.update
# Copy the retrieved campaign into the new campaign.
# Here we use the proto.Message.copy_from method because of its simple
# compatibility with the protobuf message instances, which are wrapped
# by the proto-plus library.
proto.Message.copy_from(updated_campaign, initial_campaign)
# Mutate the new campaign.
updated_campaign.network_settings.target_search_network = False
# Create a field mask using the updated campaign.
field_mask = protobuf_helpers.field_mask(
initial_campaign._pb, updated_campaign._pb
)
# Copy the field mask onto the operation's update_mask field.
# Note that the client's copy_from method is designed to work with both native
# messages and messages wrapped by proto-plus, so it works here for the
# update_mask, even though it's an instance of the native message class
# google.protobuf.field_mask_pb2.FieldMask.
client.copy_from(campaign_operation.update_mask, field_mask)
باستخدام هذه الاستراتيجية، سيشارك updated_campaign
جميع الحقول نفسها التي تم
استردادها من initial_campaign
من واجهة برمجة التطبيقات، وهي تحديدًا اسم المورد.
سيُعلمك قناع الحقل الذي تم إنشاؤه لواجهة برمجة التطبيقات بأنّه يجب تغيير الحقل network_settings.target_search_network
فقط.