Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions examples/draft_tweet.py
Original file line number Diff line number Diff line change
@@ -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()
39 changes: 39 additions & 0 deletions twitter_ads/creative.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}
Expand Down