Hello YotonTie, this is script i am using for fetching keywords with labels.
Thank for looking into my problem.
authentication process code which i found in bing python example.
from process.scripts.bing_auth_helper import *
from bingads.authorization import *
my Models
from remote.models import AdvertisingAccounts, CampaignsDetails, AdGroupDetails, KeywordDetails
import environ
from django.core.exceptions import FieldError, ObjectDoesNotExist
from suds import WebFault
from process.log_message import *
import logging
my Models
from process.models import Log, Process
import sys
from django.db import connection, OperationalError
env = environ.Env()
reading .env file
environ.Env.read_env()
def get_labels(campaign_service, keywordId):
keyword_associated_lables = campaign_service.GetLabelAssociationsByEntityIds(
EntityIds={'long': [keywordId]}, EntityType="Keyword")
associated_label_ids = []
associated_label_names = []
for associated_label in keyword_associated_lables.LabelAssociations:
for label in associated_label[1]:
associated_label_ids.append(label.LabelId)
get_labels_by_ids_response = campaign_service.GetLabelsByIds(
LabelIds={'long': associated_label_ids}
)
for data_object in get_labels_by_ids_response.Labels['Label']:
associated_label_names.append(data_object.Name)
return ','.join(associated_label_names)
def get_keywords(adgroup, log_id):
campaign = CampaignsDetails.objects.filter(
id=adgroup.Campaign_id).select_related('Account').using('remote_staging')
account_id = campaign[0].Account.account_id
# print(campaign.query)
# print("account_id=%s" % (account_id))
# print("adgroup ID=%s" % (adgroup.Adgroup_Id))
created = 0
updated = 0
total = 0
# return_additional_fields = 'AdGroupType'
authorization_data = AuthorizationData(
account_id=account_id,
customer_id=None,
developer_token=env('DEVELOPER_TOKEN'),
authentication=None,
)
campaign_service = ServiceClient(
service='CampaignManagementService',
version=13,
authorization_data=authorization_data,
environment=env('ENVIRONMENT'),
)
try:
authenticate(authorization_data)
keywords = campaign_service.GetKeywordsByAdGroupId(
AdGroupId=adgroup.Adgroup_Id)
if keywords != "":
for keyword in keywords.Keyword:
total = total+1
keyword_id = keyword.Id
keyword_name = keyword.Text
keyword_status = keyword.Status
keyword_matchtype = keyword.MatchType
lbl_names = get_labels(campaign_service, keyword_id)
print("%s Keyword found for Keyword ID %s" %
(keyword_name, keyword_id))
print("%s Keyword found" % (total))
print("Keyword id=%s Name=%s Status=%s Match Type=%s labels=%s" %
(keyword.Id, keyword.Text, keyword.Status, keyword.MatchType, lbl_names))
try:
keyword_details = KeywordDetails.objects.filter(
Adgroup_id=adgroup.id, Keyword_Id=keyword_id
).using('remote_staging')
except FieldError as e:
saveLog(log_id=log_id, status=Log.Statuses.FAILURE,
log_message=e)
sys.exit()
if keyword_details.count() != 0:
if(keyword_details[0].Name != keyword_name or keyword_details[0].Match_Type != keyword_matchtype or keyword_details[0].Status != keyword_status):
print("updating Bing Keywords %s" % (keyword_name))
keyword_details.update(
Name=keyword_name,
Match_Type=keyword_matchtype,
Status=keyword_status,
Labels=lbl_names,
)
updated = updated + 1
else:
# insert
print('inserting Bing Keywords' + keyword_name)
try:
newKeyword = KeywordDetails(
Keyword_Id=keyword_id,
Name=keyword_name,
Match_Type=keyword_matchtype,
Status=keyword_status,
Labels=lbl_names,
Adgroup_id=adgroup.id,
)
newKeyword.save(using='remote_staging')
created = created + 1
except OperationalError:
print(connection.queries[-1])
except Exception as e:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
print(template.format(type(e).name, e.args))
else:
print("No Keywords found for Adgroup ID %s" % (adgroup.Adgroup_Id))
return [created, total, updated]
except WebFault as ex:
print(ex)
except Exception as ex:
print(ex)
def run_keyword_task(log_id=0):
created = 0
updated = 0
total = 0
message = []
logProcessStarted(log_id)
adgroups = AdGroupDetails.objects.filter(
Campaign__Account__source="bing_ads_search", Campaign__Account__isActive=1).distinct().using('remote_staging')
\# print(adgroups.query)
for adgroup in adgroups:
\# print(adgroup.Adgroup_Id)
\# print(adgroup.Campaign_id)
try:
print("Fetching Bing Keywords for Adgroup ID=%s" %
(adgroup.Adgroup_Id))
stats = get_keywords(adgroup, log_id)
if stats != False:
created += stats[0]
total += stats[1]
updated += stats[2]
logProcessStats(log_id, created, total, updated)
except ValueError:
message.append("ValueError in Account '%s' " %
(adgroup.Adgroup_Id))
saveLog(log_id=log_id, status=Log.Statuses.RUNNING,
log_message="ValueError in Account '%s' " % (adgroup.Adgroup_Id))
except KeyboardInterrupt:
saveLog(log_id=log_id, status=Log.Statuses.FAILURE,
log_message="Forcefully Stopped")
sys.exit()
except Exception as e:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
msg = template.format(type(e).__name__, e.args)
log_message = msg + \
"Bing Keywords:Error in Adgroup ID '%s' " % (
adgroup.Adgroup_Id)
message.append(log_message)
pass
if len(message) == 0:
logProcessFinished(log_id)
elif len(message) > 0:
message.append("Success with some errors")
log_msg = ','.join(message)[0:244]
saveLog(log_id=log_id, status=Log.Statuses.FAILURE,
log_message=log_msg)
print("Bing Keywords Process Finished")