draftbit / twitter-lite

A tiny, full-featured, flexible client / server library for the Twitter API
https://npm.im/twitter-lite
MIT License
794 stars 95 forks source link

POST to the Cards endpoint fails #181

Open andrewjmeier opened 3 years ago

andrewjmeier commented 3 years ago

The Cards endpoint (https://developer.twitter.com/en/docs/twitter-ads-api/creatives/api-reference/cards) appears to be another that requires a JSON body instead of url encoded data.

twurl -H "https://ads-api.twitter.com" "/10/accounts/xyz/cards" -X POST -d '{"name":"SHOJO_1080x1080_002.mp4","components":[{"type":"MEDIA","media_key":"xyz"},{"type":"BUTTON","label":{"type":"ENUM","value":"INSTALL"},"destination":{"type":"APP","country_code":"JP","googleplay_app_id":"jp.intense.ganache","iphone_app_id":"1291823197"}}]}' -A 'Content-Type: application/json'

Here's an example twurl with a working request. (You'll need to include your account ID in the path and a valid media_key.)

andrewjmeier commented 3 years ago
const JSON_ENDPOINTS = [
  /direct_messages\/events\/new/,
  /direct_messages\/welcome_messages\/new/,
  /direct_messages\/welcome_messages\/rules\/new/,
  /media\/metadata\/create/,
  /collections\/entries\/curate/,
  /accounts\/[^\/]+\/cards$/,
];

function isJSONEndpoint(resource) {
  const endpoint = JSON_ENDPOINTS.find((endpoint) => {
    return endpoint.test(resource)
  })

  return !!endpoint
}

Swapping the JSON_ENDPOINTS to be an array of regexes might do the trick. Happy to open a PR