Giter Site home page Giter Site logo

twitster's Introduction

Twitster

npm building workflow license alt text

A free and unlimited API for twitter.

Contents

Features

  • explore new tweets
  • search keyword inside tweets
  • search users
  • get and search tweets for single user
  • translate tweets

Installation

npm install twitster

Usage

Get-Tweets

to extract list of tweets:

Parameters

  • keyword - keyword or hashtag for your tweets list
  • options - optional parameters
    • options.nextPageToken - next page token for getting next page
    • options.page - page number for get get specific page
Basic example
var { findTopTweets } = require("twitster");

var listOfTweets = await findTopTweets("bitcoin");

console.log(listOfTweets);
Output
[{
  authorName: 'Airmass',
  authorBlueCheckMark: false,
  retweeted: 'Deniz.Hodl⚡🐂',
  tweetContent: 'All you need to know about investing in #Bitcoin.',
  hashtags: [ '#Bitcoin' ],
  commentCount: '1',
  likeCount: '5',
  retweetCount: '0',
  quoteCount: '0',
  tweetTime: '1m',
  tweetCreatedAt: 'Dec 31, 2022 · 9:43 AM UTC',
  tweetLink: '/IT_AIRmass/status/1609123005396819969#m',
  images: [],
  nextPageToken: 'scroll%3AthGAVUV0VFVBaAgLLF_8vg1CwWhMC8-a7O4NQsEnEVhIZ6FYCJehgEVVNFUjUBFQAVAAA%3D'
},
{
    authorName: 'Math Profesor',
    authorBlueCheckMark: false,
    tweetContent: 'absolut scarcity can only be achieved with #bitcoin',
    hashtags: [ '#bitcoin' ],
    commentCount: '0',
    likeCount: '0',
    retweetCount: '0',
    quoteCount: '0',
    tweetTime: '9s',
    tweetCreatedAt: 'Dec 31, 2022 · 9:44 AM UTC',
    tweetLink: '/MathProfesor/status/1609123389364371456#m',
    images: [
      'https://nitter.tiekoetter.com/pic/media%2FFnUar77WIAAwzdu.jpg%3Fname%3Dsmall%26format%3Dwebp'
    ],
    nextPageToken: 'scroll%3AthGAVUV0VFVBaAgLLF_8vg1CwWhMC8-a7O4NQsEnEVhIZ6FYCJehgEVVNFUjUBFQAVAAA%3D'
}];
Pagination example

if you want to get next page list you can use nextToken in previous request

var { findTopTweets } = require("twitster");

var listOfTweets = await findTopTweets("bitcoin", options = { nextPageToken: 'scroll%3AthGAVUV0VFVBaEgLPxirPi1CwWgICy8fTM4tQsEnEV8PF5FYCJehgEVVNFUjUBFRAVAAA%3D' });

console.log(listOfTweets);

if you want to get list by page number, need to set page in options

var { findTopTweets } = require("twitster");

var listOfTweets = await findTopTweets("bitcoin", options = { page: 2 });

console.log(listOfTweets);

Get-Tweet-Replies

to get replies for a single tweet

Parameters

  • link - tweet link get from Get-Tweets
  • options - optional parameters
    • options.nextPageToken - next page token for getting next page
Basic example
var { getTweetReplies } = require("twitster");

var listOfReplies = await getTweetReplies('IT_AIRmass/status/1609123005396819969#m');

console.log(listOfReplies);
Output
[{
    authorName: 'Islaay',
    authorBlueCheckMark: false,
    replyingTo: 'Replying to @IT_AIRmass',
    tweetContent: 'We have waited a long time for 2023... The implosion of the CT bera hivemind',
    hashtags: null,
    commentCount: '0',
    likeCount: '0',
    retweetCount: '0',
    quoteCount: '0',
    tweetTime: '1h',
    tweetCreatedAt: 'Dec 31, 2022 · 10:30 AM UTC',
    tweetLink: '/JIslaay/status/1609134888728563713#m',
    nextPageToken: 'LBlGgMDU6Z%2FF4NQsgICwlcv74NQsgsDU5fvp5dQsgICzlfaR7tQsJQYRAAA%3D#r'
  },
  {
    authorName: 'direwolf',
    authorBlueCheckMark: false,
    replyingTo: 'Replying to @IT_AIRmass',
    tweetContent: 'Based.',
    hashtags: null,
    commentCount: '0',
    likeCount: '0',
    retweetCount: '0',
    quoteCount: '0',
    tweetTime: '15m',
    tweetCreatedAt: 'Dec 31, 2022 · 11:43 AM UTC',
    tweetLink: '/direwol54352270/status/1609153167354126336#m',
    nextPageToken: 'LBlGgMDU6Z%2FF4NQsgICwlcv74NQsgsDU5fvp5dQsgICzlfaR7tQsJQYRAAA%3D#r'
}];
Pagination example

if you want to get next page list you can use nextToken in previous request

var { getTweetReplies } = require("twitster");

const listOfReplies = await getTweetReplies('direwol54352270/status/1609153167354126336#m',  options = { nextPageToken: 'LBlGgMDU6Z%2FF4NQsgICwlcv74NQsgsDU5fvp5dQsgICzlfaR7tQsJQYRAAA%3D#r' });

console.log(listOfReplies);

Search-Users

to search users and get list of them:

Parameters

  • username - username or full name
  • options - optional parameters
    • options.nextPageToken - next page token for getting next page
Basic example
var { findUsers } = require("twitster");

var listOfUsers = await findUsers("messi");

console.log(listOfUsers);
Output
[{
    fullName: 'Lionel Messi Fan Club',
    username: '@LMessifanclub',
    bioInfo: 'A must follow for a true Messi fan! Watch videos about Leo on our YouTube channel! Be with us, be Messified!',
    link: '/LMessifanclub',
    nextPageToken: 'DAAFCgABFlTaB7l__z8LAAIAAADwRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUJRUkRUSVZZRmZRQUFBQUFBQVBEODJsQUFBQUFEOFZpYTRBQUFBQVVzRHJ4QUFBQUFBQTl2OU9DeldVenB2WEFBQVRCWDl0QmRXZ0F4R09ac0JWMTlBQkFBQUFBR0Naa2pvVWp1VzZ4eGZBQmdBQUFBQ3Q2anBNQUFBQUFBTUVHeTBBQUFBQXFkNytlQUFBQUFDMnZSUnRBQUFBQUVJZVRlNFAzUHJzTGRSd0FBQUFBQUEyYkY4Y0RrY0ZscFFXd0FBU3NtM1YrVll3QVFBQUFBQmMvbTJXAAA'
  },
  {
    fullName: 'Leo Messi',
    username: '@leomessiprivate',
    bioInfo: 'Jugador del PSG. 🇨🇵',
    link: '/leomessiprivate',
    nextPageToken: 'DAAFCgABFlTaB7l__z8LAAIAAADwRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUJRUkRUSVZZRmZRQUFBQUFBQVBEODJsQUFBQUFEOFZpYTRBQUFBQVVzRHJ4QUFBQUFBQTl2OU9DeldVenB2WEFBQVRCWDl0QmRXZ0F4R09ac0JWMTlBQkFBQUFBR0Naa2pvVWp1VzZ4eGZBQmdBQUFBQ3Q2anBNQUFBQUFBTUVHeTBBQUFBQXFkNytlQUFBQUFDMnZSUnRBQUFBQUVJZVRlNFAzUHJzTGRSd0FBQUFBQUEyYkY4Y0RrY0ZscFFXd0FBU3NtM1YrVll3QVFBQUFBQmMvbTJXAAA'
}];
Pagination example

if you want to get next page list you can use nextToken in previous request

var { findUsers } = require("twitster");

var listOfUsers = await findUsers("messi", options = { nextPageToken: 'DAAFCgABFlTaB7l__z8LAAIAAADwRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUJRUkRUSVZZRmZRQUFBQUFBQVBEODJsQUFBQUFEOFZpYTRBQUFBQVVzRHJ4QUFBQUFBQTl2OU9DeldVenB2WEFBQVRCWDl0QmRXZ0F4R09ac0JWMTlBQkFBQUFBR0Naa2pvVWp1VzZ4eGZBQmdBQUFBQ3Q2anBNQUFBQUFBTUVHeTBBQUFBQXFkNytlQUFBQUFDMnZSUnRBQUFBQUVJZVRlNFAzUHJzTGRSd0FBQUFBQUEyYkY4Y0RrY0ZscFFXd0FBU3NtM1YrVll3QVFBQUFBQmMvbTJXAAA' });

console.log(listOfUsers);

Get-User-Detail

to get detail of user

Parameters

  • username - username or full name
  • options - optional parameters
    • options.nextPageToken - next page token for getting next page
    • options.filter - keyword to add filter tweets
Basic example
var { getUserDetail } = require("twitster");

var detailOfUser = await getUserDetail("Bitcoin");

console.log(detailOfUser);
Output
{
  profileInfo: {
    fullName: 'Bitcoin',
    username: '@Bitcoin',
    bio: "Bitcoin is an open source censorship-resistant peer-to-peer immutable network. Trackable digital gold. Don't trust; verify. Not your keys; not your coins.",
    location: 'Worldwide',
    website: 'bitcoin.org/bitcoin.pdf',
    joinDate: ' Joined August 2011',
    tweetCounts: '24,551',
    following: '26',
    follower: '5,685,033',
    likes: '2,928'
  },
  tweets: [
     {
      authorName: 'Bitcoin',
      authorBlueCheckMark: false,
      pinnedTweet: false,
      tweetContent: 'Can they prove that they did not? That is jut their attestation. 😱',
      hashtags: null,
      commentCount: '78',
      likeCount: '230',
      retweetCount: '0',
      quoteCount: '4',
      tweetTime: 'Dec 21',
      tweetCreatedAt: 'Dec 21, 2022 · 5:25 PM UTC',
      tweetLink: '/Bitcoin/status/1605615442134855680#m',
      images: [
      'https://nitter.tiekoetter.com/pic/media%2FFnUar77WIAAwzdu.jpg%3Fname%3Dsmall%26format%3Dwebp'
      ],
      nextPageToken: 'HBaAwK3pqsnovSwAAA%3D%3D'
    },
    {
      authorName: 'Bitcoin',
      authorBlueCheckMark: false,
      pinnedTweet: false,
      tweetContent: '',
      hashtags: null,
      commentCount: '290',
      likeCount: '2,344',
      retweetCount: '0',
      quoteCount: '67',
      videoCount: '176,680',
      tweetTime: 'Dec 19',
      tweetCreatedAt: 'Dec 19, 2022 · 3:29 PM UTC',
      tweetLink: '/Bitcoin/status/1604861594160070656#m',
      images: [],
      nextPageToken: 'HBaAwK3pqsnovSwAAA%3D%3D'
    }
  ]
}
Pagination example

if you want to get next page list you can use nextToken in previous request

var { getUserDetail } = require("twitster");

var detailOfUser = await getUserDetail("Bitcoin", options = { nextPageToken: 'HBaAwK3pqsnovSwAAA%3D%3D' });

console.log(detailOfUser);
Filter example

add filter and limit result of user tweets

var { getUserDetail } = require("twitster");

var detailOfUser = await getUserDetail("Bitcoin", options = { filter: 'doge' });

console.log(detailOfUser);
output
{
  profileInfo: {
    fullName: 'Bitcoin',
    username: '@Bitcoin',
    bio: "Bitcoin is an open source censorship-resistant peer-to-peer immutable network. Trackable digital gold. Don't trust; verify. Not your keys; not your coins.",
    location: 'Worldwide',
    website: 'bitcoin.org/bitcoin.pdf',
    joinDate: ' Joined August 2011',
    tweetCounts: '24,551',
    following: '26',
    follower: '5,685,122',
    likes: '2,928'
  },
  tweets: [
    {
      authorName: 'Bitcoin',
      authorBlueCheckMark: false,
      pinnedTweet: false,
      tweetContent: 'Because DOGE is an altcoin. Bitcoin (BCH) is the oldest and most established cryptocurrency.',
      hashtags: null,
      commentCount: '4',
      likeCount: '6',
      retweetCount: '0',
      quoteCount: '0',
      tweetTime: '4 May 2018',
      tweetCreatedAt: 'May 4, 2018 · 5:24 PM UTC',
      tweetLink: '/Bitcoin/status/992454950524403712#m'
    },
    {
      authorName: 'Bitcoin',
      authorBlueCheckMark: false,
      pinnedTweet: false,
      tweetContent: '"Chap slapped in @Dogecoin crap app flap" - Great headline by @theregister theregister.co.uk/2015/06/29…',
      hashtags: null,
      commentCount: '0',
      likeCount: '2',
      retweetCount: '0',
      quoteCount: '0',
      tweetTime: '4 Jul 2015',
      tweetCreatedAt: 'Jul 4, 2015 · 7:22 PM UTC',
      tweetLink: '/Bitcoin/status/617413100791308289#m'
    }
]}

Translate tweets

for extract translated tweets just add language inside options
find your language code from here

const { findTopTweets } = require('twitster');

var translatedTweets = await findTopTweets("bitcoin", options = { language: 'de' });
console.log(translatedTweets);

Output

[
  {
    id: '4937c6d261',
    authorName: 'marvinFrancois',
    authorBlueCheckMark: false,
    tweetContent: '#Bitcoin ist bereit für einen riesigen Bullenlauf.',
    hashtags: [ '#Bitcoin' ],
    commentCount: '0',
    likeCount: '0',
    retweetCount: '0',
    quoteCount: '0',
    tweetTime: '8s',
    tweetCreatedAt: 'Jan 5, 2023 · 8:49 PM UTC',
    tweetLink: '/marviinFrancois/status/1611102551893594115#m',
    nextPageToken: 'scroll%3AthGAVUV0VFVBaWwL6R2s7k2ywWgIDQzbnQ5NssEnEV8IV6FYCJehgEVVNFUjUBFQAVAAA%3D',
    originalTweet: '#Bitcoin    is ready for a huge bull run.'
  },
  {
    id: 'f9d902908f',
    authorName: 'Guy Swann ⚡️',
    authorBlueCheckMark: false,
    retweeted: 'thee junior class prezzy ✨',
    tweetContent: 'Es ist die grundlegende Natur und das Design von #Bitcoin, die den FTX-Betrug unweigerlich zum Scheitern verurteilt und schnell demoliert haben, als es klar wurde.\n' +
      '\n' +
      'Und aus dem gleichen Grund ist #Bitcoin unsere einzige Chance, den globalen Geldbetrug zu korrigieren.',
    hashtags: [ '#Bitcoin', '#Bitcoin' ],
    commentCount: '0',
    likeCount: '38',
    retweetCount: '0',
    quoteCount: '0',
    tweetTime: '14 Dec 2022',
    tweetCreatedAt: 'Dec 14, 2022 · 6:45 PM UTC',
    tweetLink: '/TheGuySwann/status/1603098882627567618#m',
    nextPageToken: 'scroll%3AthGAVUV0VFVBaWwL6R2s7k2ywWgIDQzbnQ5NssEnEV8IV6FYCJehgEVVNFUjUBFQAVAAA%3D',
    originalTweet: 'It is the fundamental nature & design of #Bitcoin that made the FTX fraud inevitably doomed to fail & quickly demolished when it became clear.\n' +
      '\n' +
      'And it’s the same reason why #Bitcoin is our only shot at correcting the global monetary scam.'
  }
]

Support

Contributors

Pull requests are always welcome! Please base pull requests against the main branch and follow the contributing guide.

if your pull requests makes documentation changes, please update readme file.

License

This project is licensed under the terms of the MIT license

twitster's People

Contributors

pariazar avatar dependabot[bot] avatar

Stargazers

Mohammad Parsa avatar KIWI avatar  avatar Ettore Ongaro avatar Max Porter avatar Daomon avatar Amos Ayomide avatar

Watchers

 avatar

twitster's Issues

Feature Request

Cool project but tweet image is not available

When i view the post originally on twitter, an image is attached to the tweet, please can you add that to the output array too 🙏

{
  profileInfo: {
    fullName: 'Sky Sports Premier League',
    username: '@SkySportsPL',
    bio: 'The official account for the Sky Sports Premier League channel',
    location: 'London',
    website: 'skysports.com/premier-league',
    joinDate: ' Joined July 2012',
    tweetCounts: '206,149',
    following: '3',
    follower: '108,430',
    likes: '322'
  },
  tweets: [
    {
      authorName: 'Sky Sports Premier League',
      authorBlueCheckMark: false,
      pinnedTweet: false,
      tweetContent: 'Who will be the next Everton manager? 💭',
      hashtags: null,
      commentCount: '222',
      likeCount: '833',
      retweetCount: '0',
      quoteCount: '45',
      tweetTime: '21m',
      tweetCreatedAt: 'Jan 23, 2023 · 4:00 PM UTC',
      tweetLink: '/SkySportsPL/status/161768000#m',
      nextPageToken: 'HBaAgLDhoozO8SwAAA%3D%3D'
    }... ```

[FR] Lookup usernames by ID

Before the great API muskening, I used /1.1/users/lookup.json?user_id= with a comma-separated list of user IDs to verify that all the accounts I'd been scraping the tweets of still had the same usernames and their accounts weren't suspended/deleted.

v2's API locks this feature behind the $100/month tier, which led me to seek an alternative.

Twitster doesn't seem to do any user ID retrieval at all though, even in the profileInfo JSON.

It seems intents still works, so I think the best thing to do is programmatically determine where URLs like https://twitter.com/intent/user?user_id=357312062 will redirect to while downloading as little data as possible. (It redirects to https://twitter.com/intent/user?screen_name=Bitcoin for the record.)

So, my request is two-pronged: please start including user IDs in the metadata wherever possible, and please add a function to retrieve usernames by ID. I would love it accepted multiple arguments for a group of users like I did before, but I'll be happy even if I have to call the function multiple times through forEach or something.

For reference, here's the ID of a suspended account: 169686021 (kanyewest)
And here's the ID of a deleted account: 284602545 (WhoopiGoldberg)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.