draftbit / twitter-lite

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

Media from Tweet lookup #195

Open raphaelsiz opened 2 years ago

raphaelsiz commented 2 years ago

So I'm trying to fetch Tweets and copy the text and media so that users can easily repost the Tweet (with attribution) in order to add alt text to images. I've figured out how to get the text and other tweet attributes, including media, but the media is only showing me the media keys which are absolutely not useful to me. Here's the curl request that was suggested by the Twitter v2 API calls tool:

curl "https://api.twitter.com/2/tweets/<ID>?tweet.fields=text,attachments&user.fields=username&media.fields=url" -H "Authorization: Bearer $BEARER_TOKEN"

So I took that and did this in the client:

const options = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({id})
};
let res = await fetch('/tweet',options)
let json = await res.json();

and this in the server:

app.post('/tweet',(req,res)=>{
  client.get("tweets",{ids:req.body.id, 'media.fields': 'url','tweet.fields':'attachments,text'}).then(r=>{
    res.json(r.data)
    console.log(r.data)
  }).catch(err=>{
    console.log(err)
    res.json({status: 'failure', reason: err.detail})
  })
});

Both in the server console.log and in the response json object sent back to the client, it was an object like this:

{
  attachments: {
    media_keys: [
      "3_<Tweet ID>"
    ]
  }
  id: "<Tweet ID>"
  text: "<Tweet text> <URL, presumably referring to the image, but that does not lead to anything>"
}

Is there a way to get the attachment urls? I also tried other media.fields and none of them worked. Is there no implementation of media.fields in this or am I just doing something wrong? (note, in case it wasn't clear by there being a media key returned, there is an image in the Tweet I looked up)