pipedream
pipedream copied to clipboard
[BUG] Twitter actions are using camelCase instead of snake_case
Describe the bug
It appears the mediaIds prop is using camel case in the Create Tweet action here:
https://github.com/PipedreamHQ/pipedream/blob/23144807af52ffb2512fe3c064e6ae76cc7c0eae/components/twitter/twitter.app.mjs#L308
However, the Twitter API is expecting snake_case like media_ids.
I believe this is causing problems with users trying to create Tweets.
To Reproduce Steps to reproduce the behavior:
- Use this code step to attempt to generate a media_id for associating with a Tweet:
import axios from 'axios';
import { axios as platformAxios } from '@pipedream/platform';
// To use previous step data, pass the `steps` object to the run() function
export default defineComponent({
props: {
twitter: {
type: 'app',
app: 'twitter'
},
url: {
type: 'string',
label: "Photo URL",
description: 'Full URL to the image to download then upload to a Tweet',
},
media_type: {
type: 'string',
label: "Media Type",
description: 'The MIME type of the media being uploaded. See https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-init'
}
},
async run({ steps, $ }) {
// Data we need to make the Twitter API request
const oauthSignerUri = this.twitter.$auth.oauth_signer_uri
const token = {
key: this.twitter.$auth.oauth_access_token,
secret: this.twitter.$auth.oauth_refresh_token,
}
const signConfig = {
token,
oauthSignerUri
}
// Download image, base64 encode it, then upload the media to Twitter
const imageResponse = await axios({
url: this.url,
method: "GET",
responseType: "arraybuffer"
})
const file = Buffer.from(imageResponse.data, 'binary')
const total_bytes = file.length
const base64EncodedFile = file.toString('base64')
const media_type = this.media_type;
// First, tell Twitter the type of file you're uploading, how big it is, etc.
// https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-init
const mediaUploadInitRequest = {
method: 'POST',
data: '',
url: "https://upload.twitter.com/1.1/media/upload.json",
params: {
command: "INIT",
total_bytes,
media_type,
}
}
// Twitter returns a media_id_string that we use to upload the file,
// and to reference it in future steps
const uploadMediaInitResponse = await platformAxios($, mediaUploadInitRequest, signConfig)
$.export('uploadMediaInitResponse', uploadMediaInitResponse);
const mediaIdString = uploadMediaInitResponse.media_id_string;
$.export('mediaIdString', mediaIdString);
// Split the file into chunks, APPEND each chunk
const splitStringRe = new RegExp('.{1,' + 1000 + '}', 'g');
const chunks = base64EncodedFile.match(splitStringRe);
for (const [segment_index, media_data] of chunks.entries()) {
console.log(`Processing chunk ${segment_index}`)
// APPEND file content in chunks
// See https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-append
const mediaUploadAppendRequest = {
method: 'POST',
data: '',
url: "https://upload.twitter.com/1.1/media/upload.json",
params: {
command: "APPEND",
media_id: this.mediaIdString,
segment_index,
media_data,
}
}
await platformAxios($, mediaUploadAppendRequest, signConfig)
}
// Finally, tell Twitter we're done uploading
// https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-finalize
const mediaUploadFinalizeRequest = {
method: 'POST',
data: '',
url: "https://upload.twitter.com/1.1/media/upload.json",
params: {
command: "FINALIZE",
media_id: mediaIdString,
}
}
await platformAxios($, mediaUploadFinalizeRequest, signConfig)
},
})
- Attempt to associate that image with a Create Tweet action and include that media ID in the
mediaIdsprop. - See that no image is uploaded to the tweet.
Expected behavior I expect to be able to use all Twitter props.
Screenshots
Please see this public thread for additional information: https://pipedream.com/community/t/advice-for-uploading-media-to-twitter-in-v2/2866/9
Additional context
See this official Twitter tutorial for uploading images and sending them in tweets:
https://developer.twitter.com/en/docs/tutorials/uploading-media