From 8c0d1d6d6de8138b33877a136886b57067a7194f Mon Sep 17 00:00:00 2001 From: smaeda-ks Date: Sat, 22 Jun 2019 08:07:00 +0900 Subject: [PATCH] Add Draft Tweets support --- examples/draft_tweet.py | 53 +++++++++++++++++++++++++++++++++++++++++ twitter_ads/creative.py | 39 ++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 examples/draft_tweet.py diff --git a/examples/draft_tweet.py b/examples/draft_tweet.py new file mode 100644 index 0000000..96ec796 --- /dev/null +++ b/examples/draft_tweet.py @@ -0,0 +1,53 @@ +from twitter_ads.client import Client +from twitter_ads.campaign import Tweet +from twitter_ads.creative import DraftTweet + + +CONSUMER_KEY = 'your consumer key' +CONSUMER_SECRET = 'your consumer secret' +ACCESS_TOKEN = 'user access token' +ACCESS_TOKEN_SECRET = 'user access token secret' +ACCOUNT_ID = 'ads account id' + +# initialize the client +client = Client(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) + +# load the advertiser account instance +account = client.accounts(ACCOUNT_ID) + +# fetch draft tweets from a given account +tweets = DraftTweet.all(account) +for tweet in tweets: + print(tweet.id_str) + print(tweet.text) + +# create a new draft tweet +draft_tweet = DraftTweet(account) +draft_tweet.text = 'draft tweet - new' +draft_tweet = draft_tweet.save() +print(draft_tweet.id_str) +print(draft_tweet.text) + +# fetch single draft tweet metadata +tweet_id = draft_tweet.id_str +draft_tweet = draft_tweet.load(account, tweet_id) +print(draft_tweet.id_str) +print(draft_tweet.text) + +# update (PUT) metadata +draft_tweet.text = 'draft tweet - update' +draft_tweet = draft_tweet.save() +print(draft_tweet.id_str) +print(draft_tweet.text) + +# preview draft tweet of current instance (send notification) +draft_tweet.preview() +# or, specify any draft_tweet_id +# draft_tweet.preview(draft_tweet_id='1142020720651673600') + +# create a nullcasted tweet using draft tweet metadata +tweet = Tweet.create(account, text=draft_tweet.text) +print(tweet) + +# delete draft tweet +# draft_tweet.delete() diff --git a/twitter_ads/creative.py b/twitter_ads/creative.py index 4487de4..3027974 100644 --- a/twitter_ads/creative.py +++ b/twitter_ads/creative.py @@ -355,6 +355,45 @@ def preview(self): resource_property(ScheduledTweet, 'text') +class DraftTweet(Resource, Persistence): + + PROPERTIES = {} + + RESOURCE_COLLECTION = '/' + API_VERSION + '/accounts/{account_id}/draft_tweets' + RESOURCE = '/' + API_VERSION + '/accounts/{account_id}/draft_tweets/{id}' + PREVIEW = '/' + API_VERSION + '/accounts/{account_id}/draft_tweets/preview/{id}' + + def preview(self, draft_tweet_id=None): + """ + Preview a Draft Tweet on a mobile device. + """ + if not (draft_tweet_id is None): + resource = self.PREVIEW.format(account_id=self.account.id, id=draft_tweet_id) + elif self.id: + resource = self.PREVIEW.format(account_id=self.account.id, id=self.id) + else: + raise AttributeError("object has no 'draft_tweet_id' to preview") + + response = Request(self.account.client, 'post', resource).perform() + return response.body + + +# draft tweet properties +# read-only +resource_property(DraftTweet, 'id', read_only=True) +resource_property(DraftTweet, 'id_str', read_only=True) +resource_property(DraftTweet, 'media_keys', readonly=True, transform=TRANSFORM.LIST) +resource_property(DraftTweet, 'created_at', read_only=True, transform=TRANSFORM.TIME) +resource_property(DraftTweet, 'updated_at', readonly=True, transform=TRANSFORM.TIME) +resource_property(DraftTweet, 'user_id', read_only=True) +# writable +resource_property(DraftTweet, 'as_user_id') +resource_property(DraftTweet, 'card_uri') +resource_property(DraftTweet, 'media_ids', transform=TRANSFORM.LIST) +resource_property(DraftTweet, 'nullcast', transform=TRANSFORM.BOOL) +resource_property(DraftTweet, 'text') + + class MediaLibrary(Resource, Persistence): PROPERTIES = {}