Anyway to Promoted-tweet as using Ads-API's Token & Key made by the other account

ads

#1

Hi,

We’d like to know if we can promoted-tweet as using Ads-API’s Token & Key made by the other account.
Can we promoted-tweet from another account?
Tell us the way if we can do that.

Purpose:
To promoted-tweet through Ads-API from twitter account B, C or D, … (co-accounts)
(See the attachment PNG file.)

Current state:
Twitter account A (main account) can promoted-tweet through Ads-API.
But the other can’t.

Issue:
The Twitter permits only one ads-API access for each corp.
We’d like to promoted-tweet from co-accounts through Ads-API

Can we promoted-tweet from another account?
Tell us the way if we can do that.


We failed to create tweets depending on ads accounts
#2

Hi @dsds11843942 ,

See this FAQ page.

Basically, you can add additional Twitter account users to your Ads account. Let’s say you have 3 Ads accounts right now (A, B, and C) then you can add an admin Twitter user to each Ads account so that this admin Twitter user can make a request to all those Ads account, and can create tweet using as_user_id parameter. Does this make sense to you?

All you need is:

  1. have @username authenticate to your existing App
  2. add @username to each Ads account (A, B and C) as either Ad Manager or Account Administrator access level
  3. call Tweet API using @username's access token/secret with as_user_id parameter

Then, you can create a tweet on behalf of each Twitter account (A, B and C) from @username.

Best,
Shohei


#3

Thanks!

I will try.

Thank you,
DS


#4

Hi

We tried follows:

Our App ID allowed to access Ads API is 14599520.
We had both Twitter Account A and B authenticate to this app.

we added 900293798307037186 (=Twitter Account A user id) to Ads account B as Administrator access level.

POST

https://ads-api.twitter.com/4/accounts/18ce54sn9e8/tweet/&as_user_id=942666096250830848&card_uri=card%3A%2F%2F1087625682845220865&oauth_consumer_key=XXXXXXXX&oauth_nonce=XXXXXXXXX&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1548826160&oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_version=1.0&text=apiTest_ad003

//18ce54sn9e8 = Ads account B
//942666096250830848 = Twitter Account B user id
//900293798307037186 = Twitter Account A user id

and we got following message:

{"errors":[{"code":"UNAUTHORIZED_ACCESS","message":"User 900293798307037186 is not authorized to create tweets for user id 942666096250830848"}],"request":{"params":{"text":"apiTest_ad003","as_user_id":942666096250830848,"card_uri":"card:\/\/1087625682845220865","account_id":"18ce54sn9e8"}}}

Please tell us why we failed.

We have concerns about the fact that our Ads Account got ineligible to run Twitter Ads due to a policy violation because of executing many tests to develop with Ads API.
(In spite of this, we succeeded to create tweets under 18ce54kld5c(=ads account A) as 900293798307037186 using same test code so we don’t think this is the cause of our failure)

Thank you.


#5

@dsds11843942

Hmm, based on your POST request URI, it looks like you’re adding OAuth parameters to the URI. But I don’t think that’s necessary as we expect those parameters in request header (Authorization) rather than request URI parameter.


#6

We created another new account and succeeded to create tweets under this.

18ce54uldah = Ads account C
1034268182381453312 = Twitter Account C user id

Why did we failed with Ads account B (18ce54sn9e8)?

Thank you.


#7

@dsds11843942

こちらもう一度質問を確認させていただきますが、意図としては3つあるAds accountにそれぞれ共通のハンドルユーザーを追加し、Ads APIの権限を持つAppを通じてそれぞれのAds accountに対して操作を行いたいということだと思っています。合っていますか?

現在アカウントB(18ce54sn9e8)にはユーザーが追加されていないようですが、なにか試している途中でしょうか?アカウントCで上手くいったということなので、確実に同じApp、適切な認証情報をアカウントBの操作時に使っている事を再度ご確認ください。


#8

ご確認ありがとうございます。

はい、そちらの認識で相違ございません。

失礼いたしました。
他のテストのため、一時的にアカウントを外しておりました。

こちらが、18ce54sn9e8 でツイート投稿を行なおうとした際の結果です。

{"errors":[{"code":"UNAUTHORIZED_ACCESS","message":"User 900293798307037186 is not authorized to create tweets for user id 942666096250830848"}],"request":{"params":{}}}

こちらが、18ce54uldahでツイート投稿を行なおうとした際の結果です。

{"request":{"params":{"text":"scheduled_test_20191128_20190204_created","scheduled_at":"2019-11-29T04:00:00Z","as_user_id":1034268182381453312,"card_uri":"card:\/\/1090860979380842498"}},"data":{"completed_at":null,"id_str":"1093772711543824384","text":"scheduled_test_20191128_20190204_created","user_id":"1034268182381453312","scheduled_status":"SCHEDULED","id":1093772711543824384,"media_ids":[],"nullcast":true,"created_at":"2019-02-08T07:25:10Z","scheduled_at":"2019-11-29T04:00:00Z","card_uri":"card:\/\/1090860979380842498","updated_at":"2019-02-08T07:25:10Z","tweet_id":null,"media_keys":[]}}

広告マネージャー上でも予約ツイートが投稿されていることを確認できました。

ご確認よろしくお願いいたします。


#9

@dsds11843942

Ads Manager UI上のアクセス権設定画面で、現在アカウント管理者になっているユーザーのアクセス権を編集し、上記のチェックをONにして試してください。 “Can compose promotable Tweets”


#10

ご教示ありがとうございます。

account

こちらで設定あっておりますでしょうか?
先述のエラー結果は、この設定で出たものになります。

ご確認よろしくお願いいたします。


#11

@dsds11843942
いえ、そのスクリーンショットは追加したユーザの方だと思いますが、
このAds accountのオーナーであるAccount administrator の方です。見たところすでに変更されたようですね。結果お待ちしております。


#12

account2
すみません、こちら、両方にツイート作成権限を許可した上で、
同様のエラーが出ております。

{"errors":[{"code":"UNAUTHORIZED_ACCESS","message":"User 900293798307037186 is not authorized to create tweets for user id 942666096250830848"}],"request":{"params":{}}}

念のため、user_id も改めて確認してみましたが、間違っておりませんでした。

ご確認よろしくお願いいたします。


#13

すみません、以前のコメントと重複しますが、こちら、広告アカウント自体が実施資格がないのが問題だったりしますでしょうか?


#14

@dsds11843942
切り分けのため、アカウントBの管理者アカウントの認証情報で直接同様のAPIを叩いた時にどうなるか確実いただけますでしょうか。


#15

ご教示ありがとうございます。
こちら、アカウントBの管理者アカウントにAds APIのついたアカウントがなく、
アカウントAのアプリに対してのOAuth認証による連携も予定がなかったため実装しておらず、
アカウントBの認証情報ではAds APIを叩くことはできません。

Ads 関係なく通常のツイートをテストするという認識で合っていますでしょうか?

理解不足で恐縮ですが、よろしくお願いいたします。


#16

@dsds11843942

そうですね、少々こちらもこれまでの話を踏まえて混乱しています…。

Ads 関係なく通常のツイートをテストするという認識で合っていますでしょうか?

いえ、違います。Ads APIによるツイートです。

こちら、アカウントBの管理者アカウントにAds APIのついたアカウントがなく、
アカウントAのアプリに対してのOAuth認証による連携も予定がなかったため実装しておらず、
アカウントBの認証情報ではAds APIを叩くことはできません。

twurl を使えばアカウントBの管理者アカウントをアプリに対して認証させることができるかと思います。twurl のインストールされた端末で、下記のコマンドを実行すればPINコードによるOAuth認証が可能です。(当該アプリの consumer key/secret を使う)

プロンプトで返されたURLに対してアカウントBの管理者アカウントでログインしてアクセスし、表示されているPINコードを待機状態のプロンプトに入力してください。その後、ローカルファイル(~/.twurlrc)にaccess token/secret が記録されているので、それを使うことができるかと思います。

$ twurl authorize --consumer-key ${key} --consumer-secret ${secret}

#17

お手数おかけしてすみません。
ご教示いただきありがとうございます。

予約ツイート投稿とプロモツイート投稿について、
両方問題なく行なえることを確認いたしました。

予約投稿

{"request":{"params":{"text":"scheduled_test_20191128_20190212_tes02_created","scheduled_at":"2019-11-29T04:00:00Z","as_user_id":942666096250830848,"card_uri":"card:\/\/1090860979380842498"}},"data":{"completed_at":null,"id_str":"1095173739518390272","text":"scheduled_test_20191128_20190212_tes02_created","user_id":"942666096250830848","scheduled_status":"SCHEDULED","id":1095173739518390272,"media_ids":[],"nullcast":true,"created_at":"2019-02-12T04:12:21Z","scheduled_at":"2019-11-29T04:00:00Z","card_uri":"card:\/\/1090860979380842498","updated_at":"2019-02-12T04:12:21Z","tweet_id":null,"media_keys":[]}}

プロモツイート

{"data":{"created_at":"Tue Feb 12 04:13:25 +0000 2019","id":1095174006779461633,"id_str":"1095174006779461633","text":"\u30c6\u30b9\u30c8\u30c4\u30a4\u30fc\u30c8withWeb\u30b5\u30a4\u30c8\u30ab\u30fc\u30c9A20190212_test02API","truncated":false,"entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"source":"\u003ca href=\"https:\/\/XXXXXX.jp\" rel=\"nofollow\"\u003eXXXXXX6\u003c\/a\u003e","in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":942666096250830848,"id_str":"942666096250830848","name":"test2","screen_name":"xxxx_xx","location":null,"url":null,"description":null,"protected":false,"followers_count":0,"friends_count":0,"listed_count":0,"created_at":"Mon Dec 18 08:01:26 +0000 2017","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":0,"lang":"ja","contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"F5F8FA","profile_background_image_url":null,"profile_background_image_url_https":null,"profile_background_tile":false,"profile_image_url":"http:\/\/abs.twimg.com\/sticky\/default_profile_images\/default_profile_normal.png","profile_image_url_https":"https:\/\/abs.twimg.com\/sticky\/default_profile_images\/default_profile_normal.png","profile_link_color":"1DA1F2","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null,"translator_type":"none"},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"favorited":false,"retweeted":false,"possibly_sensitive":false,"scopes":{"followers":false},"card":{"name":"promo_website","url":"card:\/\/993289489328975874","card_type_url":"http:\/\/card-type-url-is-deprecated.invalid","binding_values":{"website_shortened_url":{"type":"STRING","string_value":"https:\/\/t.co\/9xEEO20HSG"},"_forward_card_height_":{"type":"STRING","string_value":"140"},"vanity_url":{"type":"STRING","string_value":"www.XXXXXX.co.jp"},"website_dest_url":{"type":"STRING","string_value":"http:\/\/www.XXXXXX.co.jp"},"website_url":{"type":"STRING","string_value":"http:\/\/www.XXXXXX.co.jp"},"title":{"type":"STRING","string_value":"apiTestTitle"},"promo_image_small":{"type":"IMAGE","image_value":{"url":"https:\/\/pbs.twimg.com\/media\/DcjfUuCVAAAza9R.jpg","width":800,"height":418,"alt":null}},"promo_image":{"type":"IMAGE","image_value":{"url":"https:\/\/pbs.twimg.com\/media\/DcjfUuCVAAAza9R.jpg","width":800,"height":418,"alt":null}},"promo_image_large":{"type":"IMAGE","image_value":{"url":"https:\/\/pbs.twimg.com\/media\/DcjfUuCVAAAza9R.jpg","width":800,"height":418,"alt":null}},"promo_image_x_large":{"type":"IMAGE","image_value":{"url":"https:\/\/pbs.twimg.com\/media\/DcjfUuCVAAAza9R.jpg","width":800,"height":418,"alt":null}},"promo_image_color":{"type":"IMAGE_COLOR","image_color_value":{"palette":[{"percentage":100.0,"rgb":{"red":0,"green":163,"blue":232}}]}},"card_url":{"type":"STRING","string_value":"https:\/\/twitter.com","scribe_key":"card_url"}}},"lang":"ja"},"request":{"params":{"text":"\u30C6\u30B9\u30C8\u30C4\u30A4\u30FC\u30C8withWeb\u30B5\u30A4\u30C8\u30AB\u30FC\u30C9A20190212_test02API","as_user_id":942666096250830848,"card_uri":"card:\/\/993289489328975874","account_id":"18ce54sn9e8"}}}

よろしくお願いいたします。


#18

すみません、説明が欠けておりましたが、こちら、ご教示いただいたtwurl を利用した際の結果となります。

トークンをアカウントAのものにすると、依然下記エラーとなります。

{"errors":[{"code":"UNAUTHORIZED_ACCESS","message":"User 900293798307037186 is not authorized to create tweets for user id 942666096250830848"}],"request":{"params":{"text":"\u30C6\u30B9\u30C8\u30C4\u30A4\u30FC\u30C8withWeb\u30B5\u30A4\u30C8\u30AB\u30FC\u30C9A20190212_test02API","as_user_id":942666096250830848,"card_uri":"card:\/\/993289489328975874","account_id":"18ce54sn9e8"}}}

よろしくお願いいたします。


#20

TwitterアカウントAのトークン再発行結果

AdsAPIのアプリのトークンを使い、
TwitterアカウントAのトークンを

$ twurl authorize --consumer-key ${key} --consumer-secret ${secret}

で発行してみたのですが、
https://developer.twitter.com/en/apps/
で確認できるのと同じtoken&secretが生成されてしまいました。

このAppのAds APIの権限はDevelopステータスなのですが、
まだトークン発行は5未満の段階でございます。


①再発行したTwitterアカウントAのトークンを利用したツイート投稿テスト結果

念のため、この TwitterアカウントA(広告アカウント紐付け済み)のトークンを用いて、
改めてテストを行なってみたところ、下記のような結果となりました。

アカウントA(元々TwitterアカウントAで作成した広告アカウント)

{"request":{"params":{"text":"scheduled_test_20191128_20190212_tes02_created","scheduled_at":"2019-11-29T04:00:00Z","as_user_id":900293798307037186,"card_uri":"card:\/\/1090860979380842498"}},"data":{"completed_at":null,"id_str":"1095571081753030657","text":"scheduled_test_20191128_20190212_tes02_created","user_id":"900293798307037186","scheduled_status":"SCHEDULED","id":1095571081753030657,"media_ids":[],"nullcast":true,"created_at":"2019-02-13T06:31:15Z","scheduled_at":"2019-11-29T04:00:00Z","card_uri":"card:\/\/1090860979380842498","updated_at":"2019-02-13T06:31:15Z","tweet_id":null,"media_keys":[]}}

アカウントB(Twitter広告の実施資格剥奪中)

{"errors":[{"code":"UNAUTHORIZED_ACCESS","message":"User 900293798307037186 is not authorized to create tweets for user id 942666096250830848"}],"request":{"params":{}}}

アカウントC(ほぼほぼ未使用状態のアカウント)

{"request":{"params":{"text":"scheduled_test_20191128_20190212_tes02_created","scheduled_at":"2019-11-29T04:00:00Z","as_user_id":1034268182381453312,"card_uri":"card:\/\/1090860979380842498"}},"data":{"completed_at":null,"id_str":"1095573558980370432","text":"scheduled_test_20191128_20190212_tes02_created","user_id":"1034268182381453312","scheduled_status":"SCHEDULED","id":1095573558980370432,"media_ids":[],"nullcast":true,"created_at":"2019-02-13T06:41:05Z","scheduled_at":"2019-11-29T04:00:00Z","card_uri":"card:\/\/1090860979380842498","updated_at":"2019-02-13T06:41:05Z","tweet_id":null,"media_keys":[]}}

アカウントD(Twitter広告の実施資格剥奪中)

{"errors":[{"code":"UNAUTHORIZED_ACCESS","message":"User 900293798307037186 is not authorized to create tweets for user id 788902113518587904"}],"request":{"params":{}}}

②OAuthで発行したトークンを利用したツイート投稿テスト結果

念のため、広告アカウントBと同じ結果となった広告アカウントDについて、
先日のTwitterアカウントB同様、TwitterアカウントD自身のトークンをTwurlを用いて発行、
ツイート投稿をおこなってみたところ、広告アカウントBと同様、問題なく投稿が行なえました。

アカウントD(Twitter広告の実施資格剥奪中) OAuthで発行したトークン使用

{"request":{"params":{"text":"scheduled_test_20191128_20190213_tes02_created","scheduled_at":"2019-11-29T04:00:00Z","as_user_id":788902113518587904,"card_uri":"card:\/\/1090860979380842498"}},"data":{"completed_at":null,"id_str":"1095574352379076608","text":"scheduled_test_20191128_20190213_tes02_created","user_id":"788902113518587904","scheduled_status":"SCHEDULED","id":1095574352379076608,"media_ids":[],"nullcast":true,"created_at":"2019-02-13T06:44:15Z","scheduled_at":"2019-11-29T04:00:00Z","card_uri":"card:\/\/1090860979380842498","updated_at":"2019-02-13T06:44:15Z","tweet_id":null,"media_keys":[]}}

結果より

ドキュメントの確認漏れでしたら恐縮ですが、
これらの結果より、広告実施資格のないTwitter広告アカウントについては、
本人自身以外からはツイート投稿できない仕様なのかと考えたのですが、いかがでしょうか?

テスト手順

なお、テスト手順としましては、下記の通りとなります。

  1. Twurlでトークン発行
  2. 1.で発行したトークンを用いて、今までと同様のJavaのテストコードにてツイート投稿テスト

よろしくお願いいたします。


#21

@dsds11843942 さん

すみません、最初の方で伝えてもらっていた部分を すっかり見逃していました。
今現在アカウントのステータスが"REJECTED"になっていたんですね。

であれば、仰るようにまずはそこを直さない限りやろうとしている操作は難しいと思います。エラーの理由についてもそれが原因であるかと思います。
Ads Manager の UI に表示されている警告メッセージからコンタクトページへ飛べるかと思いますが、そちらから解除の申請を出してみてください。

以上、よろしくお願いいたします。

前田