Net::T...::Lite(3pm)

πŸ“¦
version 0.12008 Β· 4 versions
, in debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking

πŸ’– Net::T...::Lite πŸ’–

okay so bestie, welcome to the manual page for Net::T...::Lite(3pm) β€” User Contributed Perl Documentation. grab a boba, we're doing this πŸ§‹βœ¨


🌸 NAME 🌸

Net::Twitter::Lite β€” a perl interface to the Twitter API πŸ’…</pup>


⭐ VERSION ⭐

version 0.12008


πŸ›‘ STOP! πŸ›‘

bestie. pause. hold up. 🚨

You probably want Net::Twitter::Lite::WithAPIv1_1, which has support for Twitter API v1.1. that's the one you want, fr fr. But if you're using a service with an API compatible with Twitter's deprecated API v1, then you're in the right place. πŸ’«


✨ SYNOPSIS ✨

use Net::Twitter::Lite;

my $nt = Net::Twitter::Lite->new(
    username => $user,
    password => $password
    legacy_lists_api => 0,
);

my $result = eval { $nt->update('Hello, world!') };

eval {
    my $statuses = $nt->friends_timeline({ since_id => $high_water, count => 100 });
    for my $status ( @$statuses ) {
        print "$status->{created_at} <$status->{user}{screen_name}> $status->{text}\n";
    }
};
warn "$@\n" if $@;

look at that. clean. gorgeous. no cap. πŸ’…


πŸ¦‹ DESCRIPTION πŸ¦‹

This module provides a perl interface to the Twitter API v1. 🐦

It uses the same API definitions as Net::Twitter, but without the extra bells and whistles and without the additional dependencies. Same great taste, less filling. 😌✨

This module is related to, but is not part of the "Net::Twitter" distribution. Its API methods and API method documentation are generated from "Net::Twitter"'s internals. It exists for those who cannot, or prefer not to install Moose and its dependencies. (we get it, dependencies are a lot. we respect it. 🫢)

You should consider upgrading to "Net::Twitter" for additional functionality, finer grained control over features, backwards compatibility with older versions of "Net::Twitter", and additional error handling options. (iconic upgrade behaviour honestly πŸ‘‘)


πŸ’€ CLIENT CODE CHANGES REQUIRED πŸ’€

not me making you change your code, i'm so sorry bestie 😭 but it's necessary!!

πŸ“‹ Legacy Lists API

Twitter re-implemented the Lists API using new endpoints and semantics. For backwards compatibility, this version of "Net::Twitter::Lite" defaults to the deprecated, legacy endpoints and semantics. It issues a warning if the "legacy_lists_api" option to new is not provided. 🚨

To enable the new Lists endpoints and semantics, pass (legacy_lists_api = 0)> to "new". To disable the warning, and keep the backwards compatible endpoints and semantics, pass (legacy_lists_api = 1)> to "new". ✨

The "legacy_lists_api" option to "new" sets the default for all lists API method calls. You can override the default an each API call by passing a -legacy_lists_api option set to 1 or 0. πŸ’…

Support for "legacy_lists_api" option will be removed in a future version and the option to "new" will be silently ignored. (rip, but we move πŸ’€)

🌐 netrc option

The default "apiurl" changed in version 0.08006. The change should be transparent to client code, unless you're using the "netrc" option. If so, you'll need to either update the .netrc entry and change the "machine" value from "twitter.com" to "api.twitter.com", or set either the "netrc" or "netrc_machine" options to "twitter.com". (pick your fighter πŸ₯Š)

$nt = Net::Twitter::Lite->new(netrc_machine => 'twitter.com', netrc => 1);
# -or-
$nt = Net::Twitter::Lite->new(netrc => 'twitter.com');

πŸ” OAuth requires callback parameter

Beginning with version 0.03, it is necessary for web applications using OAuth authentication to pass the "callback" parameter to "get_authorization_url". this one's important!! In the absence of a callback parameter, when the user authorizes the application a PIN number is displayed rather than redirecting the user back to your site. πŸŽ€


🌈 MIGRATING FROM NET::TWITTER 2.x 🌈

If you are migrating from Net::Twitter 2.12 (or an earlier version), you may need to make some minor changes to your application code in order to user Net::Twitter::Lite successfully. (yes, "user". we said what we said. πŸ’…)

The primary difference is in error handling. Net::Twitter::Lite throws exceptions on error. It does not support the "get_error", "http_code", and "http_message" methods used in Net::Twitter 2.12 and prior versions. 🚨

Instead of

# DON'T!
my $friends = $nt->friends();
if ( $friends ) {
    # process $friends
}

wrap the API call in an eval block:

# DO!
my $friends = eval { $nt->friends() };
if ( $friends ) {
    # process $friends
}

Here's a much more complex example taken from application code using Net::Twitter 2.12:

# DON'T!
my $friends = $nt->friends();
if ( $friends ) {
    # process $friends
}
else {
    my $error = $nt->get_error;
    if ( ref $error ) {
        if ( ref($error) eq 'HASH' && exists $error->{error} ) {
            $error = $error->{error};
        }
        else {
            $error = 'Unexpected error type ' . ref($error);
        }
    }
    else {
        $error = $nt->http_code() . ": " . $nt->http_message;
    }
    warn "$error\n";
}

The Net::Twitter::Lite equivalent is:

# DO!
eval {
    my $friends = $nt->friends();
    # process $friends
};
warn "$@\n" if $@;
return;

In Net::Twitter::Lite, an error can always be treated as a string. See Net::Twitter::Lite::Error. she's iconic for that honestly πŸ‘‘ The HTTP Status Code and HTTP Message are both available. Rather than accessing them via the Net::Twitter::Lite instance, you access them via the Net::Twitter::Lite::Error instance thrown as an error. πŸ¦‹

For example:

# DO!
eval {
   my $friends = $nt->friends();
   # process $friends
};
if ( my $error = $@ ) {
    if ( blessed $error && $error->isa("Net::Twitter::Lite::Error)
         && $error->code() == 502 ) {
        $error = "Fail Whale!";
    }
    warn "$error\n";
}

the fail whale mention... a classic. we love a throwback. πŸ‹πŸ’œ

🚫 Unsupported Net::Twitter 2.12 options to "new"

Net::Twitter::Lite does not support the following Net::Twitter 2.12 options to "new". It silently ignores them. (silence. ominous. we love it. 😭)

  • no_fallback β€” If Net::Twitter::Lite is unable to create an instance of the class specified in the "useragent_class" option to "new", it dies, rather than falling back to an LWP::UserAgent object. You really don't want a failure to create the "useragent_class" you specified to go unnoticed. (ngl, fair. a silent fallback is giving sneaky. πŸ™ˆ)
  • twittervision β€” Net::Twitter::Lite does not support the TwitterVision API. Use Net::Twitter, instead, if you need it. πŸ’…
  • skip_arg_validation β€” Net::Twitter::Lite does not API parameter validation. This is a feature. ✨ If Twitter adds a new option to an API method, you can use it immediately by passing it in the HASH ref to the API call.

Net::Twitter::Lite relies on Twitter to validate its own parameters. An appropriate exception will be thrown if Twitter reports a parameter error. 🚨

  • die_on_validation β€” See "skip_arg_validation". If Twitter returns an bad parameter error, an appropriate exception will be thrown. (same energy, different name bestie πŸ’…)
  • arrayref_on_error β€” This option allowed the following idiom in Net::Twitter 2.12:
# DON'T!
for my $friend ( @{ $nt->friends() } ) {
   # process $friend
}

The equivalent Net::Twitter::Lite code is:

# DO!
eval {
    for my $friend ( @{ $nt->friends() } ) {
        # process $friend
    }
};

🚫 Unsupported Net::Twitter 2.12 methods

  • clone β€” The "clone" method was added to Net::Twitter 2.x to allow safe error handling in an environment where concurrent requests are handled, for example, when using LWP::UserAgent::POE as the "useragent_class". Since Net::Twitter::Lite throws exceptions instead of stashing them in the Net::Twitter::Lite instance, it is safe in a current request environment, obviating the need for "clone". (no clone needed, we're built different πŸ’…βœ¨)
  • get_error
  • http_code
  • http_message β€” These methods are replaced by Net::Twitter::Lite::Error. An instance of that class is thrown errors are encountered. (she said what she said. 😌)

okay that's part 1 bestie, there's more coming so don't go anywhere 🫢✨

✨ METHODS AND ARGUMENTS ✨

🌸 new 🌸

This constructs a Net::Twitter::Lite object. It takes several named parameters, and bestie, all of them are optional. Slay.

  • username β€” the screen name or email used to authenticate with Twitter. Use this option for Basic Authentication, only.
  • password β€” the password used to authenticate with Twitter. Use this option for Basic Authentication, only.
  • consumer_key β€” a string containing the OAuth consumer key provided by Twitter when an application is registered. Use this option for OAuth authentication, only.
  • consumer_secret β€” a string containing the OAuth consumer secret. Use this option for OAuth authentication, only. the OAuth trait is included.
  • oauth_urls β€” a HASH ref of URLs to be used with OAuth authentication. Defaults to:
  {
      request_token_url => "http://twitter.com/oauth/request_token",
      authorization_url => "http://twitter.com/oauth/authorize",
      access_token_url  => "http://twitter.com/oauth/access_token",
      xauth_url         => "https://twitter.com/oauth/access_token",
  }
  • clientname β€” the value for the X-Twitter-Client-Name HTTP header. It defaults to Perl Net::Twitter::Lite.
  • clientver β€” the value for the X-Twitter-Client-Version HTTP header. It defaults to current version of the Net::Twitter::Lite module.
  • clienturl β€” the value for the X-Twitter-Client-URL HTTP header. It defaults to the search.cpan.org page for the Net::Twitter::Lite distribution.
  • useragent_class β€” the LWP::UserAgent compatible class used internally by Net::Twitter::Lite. It defaults to LWP::UserAgent. For POE based applications, consider using LWP::UserAgent::POE.
  • useragent_args β€” an HASH ref of arguments to pass to constructor of the class specified with useragent_class, above. It defaults to {} (an empty HASH ref).
  • useragent β€” the value for User-Agent HTTP header. It defaults to Net::Twitter::Lite/0.11002 (Perl).
  • source β€” the value used in the source parameter of API method calls. It is currently only used in the update method in the REST API. It defaults to twitterpm. This results in the text "from Net::Twitter" rather than "from web" for status messages posted from Net::Twitter::Lite when displayed via the Twitter web interface. The value for this parameter is provided by Twitter when a Twitter application is registered. See http://apiwiki.twitter.com/FAQ#HowdoIget%E2%80%9CfromMyApp%E2%80%9DappendedtoupdatessentfrommyAPIapplication.
  • apiurl β€” the URL for the Twitter API. This defaults to http://twitter.com.
  • identica β€” if set to 1 (or any value that evaluates to true), apiurl defaults to http://identi.ca/api.
  • ssl β€” if set to 1, an SSL connection will be used for all API calls. Defaults to 0.
  • netrc β€” (Optional) Sets the machine key to look up in .netrc to obtain credentials. If set to 1, Net::Twitter::Lite will use the value of the netrc_machine option (below).
  # in .netrc
  machine api.twitter.com
    login YOUR_TWITTER_USER_NAME
    password YOUR_TWITTER_PASSWORD
  machine semifor.twitter.com
    login semifor
    password SUPERSECRET

  # in your perl program
  $nt = Net::Twitter::Lite->new(netrc => 1);
  $nt = Net::Twitter::Lite->new(netrc => 'semifor.twitter.com');
  • netrc_machine β€” (Optional) Sets the machine entry to look up in .netrc when <netrc = 1>> is used. Defaults to api.twitter.com.
  • legacy_lists_api β€” if set to 1, this option enables backwards compatibility by using the now deprecated endpoints and semantics for lists API methods. If set to 0, the new endpoints and semantics will be used. Only the new lists API methods are documented here.

If you do not provide this option to new a warning is issued. Support for this option and the legacy lists API methods will be removed in a future version.

  • wrap_result β€” (Optional) If set to 1, this option will return an Net::Twitter::Lite::WrapResult object, which provides both the Twitter API result and the HTTP::Response object for the API call. See Net::Twitter::Lite::WrapResult for details.

πŸ’… BASIC AUTHENTICATION METHODS πŸ’…

credentials($username, $password)

Set the credentials for Basic Authentication. This is helpful for managing multiple accounts. multi-account girlies, this one's for you 🫢


πŸ” OAUTH METHODS πŸ”

authorized

Whether the client has the necessary credentials to be authorized.

Note that the credentials may be wrong and so the request may fail. 😭 Having the keys does not mean the door opens, bestie.

request_access_token

Returns list including the access token, access token secret, user_id, and screen_name for this user. Takes a HASH of arguments. The verifier argument is required. See "OAUTH EXAMPLES".

The user must have authorized this app at the url given by get_authorization_url first.

For desktop applications, the Twitter authorization page will present the user with a PIN number. Prompt the user for the PIN number, and pass it as the verifier argument to request_access_token.

Returns the access token and access token secret but also sets them internally so that after calling this method, you can immediately call API methods requiring authentication. it literally hands you the keys and unlocks the door in one go, periodt.

get_authorization_url(callback => $callback_url)

Get the URL used to authorize the user. Returns a URI object. For web applications, pass your applications callback URL as the callback parameter. No arguments are required for desktop applications (callback defaults to oob, out-of-band).

get_authentication_url(callback => $callback_url)

Get the URL used to authenticate the user with "Sign in with Twitter" authentication flow. Returns a URI object. For web applications, pass your applications callback URL as the callback parameter. No arguments are required for desktop applications (callback defaults to oob, out-of-band).

xauth($username, $password)

Exchanges a username and password for OAuth tokens. Your application must be approved for XAuth access by Twitter for this method to work. Twitter does not grant XAuth access for web applications except for a brief period of time to allow them to switch form Basic authentication to OAuth authentication.

access_token

Get or set the access token.

access_token_secret

Get or set the access token secret.

request_token

Get or set the request token.

request_token_secret

Get or set the request token secret.

access_token_url

Get or set the access_token URL.

authentication_url

Get or set the authentication URL.

authorization_url

Get or set the authorization URL.

request_token_url

Get or set the request_token URL.

xauth_url

Get or set the XAuth access token request URL.


🌈 API METHODS AND ARGUMENTS 🌈

Most Twitter API methods take parameters. All Net::Twitter::Lite API methods will accept a HASH ref of named parameters as specified in the Twitter API documentation. For convenience, many Net::Twitter::Lite methods accept simple positional arguments as documented, below. The positional parameter passing style is optional; you can always use the named parameters in a hash ref if you prefer.

For example, the REST API method update has one required parameter, status. You can call update with a HASH ref argument:

  $nt->update({ status => 'Hello world!' });

Or, you can use the convenient form:

  $nt->update('Hello world!');

The update method also has an optional parameter, in_reply_to_status_id. To use it, you must use the HASH ref form:

  $nt->update({ status => 'Hello world!', in_reply_to_status_id => $reply_to });

Convenience form is provided for the required parameters of all API methods. So, these two calls are equivalent:

  $nt->friendship_exists({ user_a => $fred, user_b => $barney });
  $nt->friendship_exists($fred, $barney);

Many API methods have aliases. You can use the API method name, or any of its aliases, as you prefer. For example, these calls are all equivalent:

  $nt->friendship_exists($fred, $barney);
  $nt->relationship_exists($fred, $barney);
  $nt->follows($fred, $barney);

Aliases support both the HASH ref and convenient forms:

  $nt->follows({ user_a => $fred, user_b => $barney });

Methods that support the page parameter expect page numbers > 0. Twitter silently ignores invalid page values. So { page => 0 } produces the same result as { page => 1 }.

In addition to the arguments specified for each API method described below, an additional authenticate parameter can be passed. To request an Authorization header, pass authenticated => 1; to suppress an authentication header, pass authentication => 0. Even if requested, an Authorization header will not be added if there are no user credentials (username and password for Basic Authentication; access tokens for OAuth).

This is probably only useful for the rate_limit_status method in the REST API, since it returns different values for an authenticated and a non-authenticated call.


πŸ¦‹ REST API Methods πŸ¦‹

Several of these methods accept a user ID as the id parameter. The user ID can be either a screen name, or the users numeric ID. To disambiguate, use the screen_name or user_id parameters, instead.

For example, These calls are equivalent:

  $nt->create_friend('perl_api');    # screen name
  $nt->create_friend(1564061);       # numeric ID
  $nt->create_friend({ id => 'perl_api' });
  $nt->create_friend({ screen_name => 'perl_api' });
  $nt->create_friend({ user_id     => 1564061 });
However user_id 911 and screen_name 911 are separate Twitter accounts. These calls are NOT equivalent:
  $nt->create_friend(911); # interpreted as screen name
  $nt->create_friend({ user_id => 911 }); # screen name: richellis

Whenever the id parameter is required and user_id and screen_name are also parameters, using any one of them satisfies the requirement. any of the three, pick your fighter, requirement met. πŸ’…

account_settings

Parameters: none Required: none

This one hands you back the current trend, geo and sleep time information for the authenticating user ✨ All three, one cute little bundle, no cap πŸŽ€

  • Returns: HashRef

account_totals

  • Parameters: none
  • Required: none

Bestie, this is the receipts method πŸ’… It returns the current count of friends, followers, updates (statuses) and favorites of the authenticating user. Four lil numbers, one hashref, zero drama ✨

  • Returns: HashRef

add_list_member

  • Parameters: list_id, slug, user_id, screen_name, owner_screen_name, owner_id
  • Required: none

Adds a member to a list 🫢 The authenticated user must own the list to be able to add members to it β€” no sneaking randos onto somebody else's list, okay? 🚫

Heads up: lists can't have more than 500 members πŸ’€ So if it's full, it's full.
  • Returns: User

add_place

add_place(name, contained_within, token, lat, long)
  • Parameters: name, contained_within, token, lat, long, attribute:street_address, callback
  • Required: name, contained_within, token, lat, long

Creates a new place object at the given latitude and longitude πŸŒπŸ“

Before creating a place you need to query similar_places with the latitude, longitude and name of the place you wish to create πŸ” That query will return an array of places which are similar to the one you wish to create, and a token. If the place you wish to create isn't in the returned array, you can use that token with this method to create a new one πŸ”‘

  • Returns: Place

all_subscriptions

  • alias: all_lists
  • alias: list_subscriptions
  • Parameters: user_id, screen_name, count, cursor
  • Required: none

Returns all lists the authenticating or specified user subscribes to, including their own πŸ’– The user is specified using the user_id or screen_name parameters. If no user is given, the authenticating user is used β€” so by default it's you, main character energy πŸ‘‘

  • Returns: ArrayRef[List]

block_exists

block_exists(id)
  • Parameters: id, user_id, screen_name, include_entities
  • Required: id

Tells you if the authenticating user is blocking a target user πŸ‘€ It will return the blocked user's object if a block exists, and error with HTTP 404 response code otherwise. So sometimes the 404 is the answer, iykyk πŸ’€

  • Returns: BasicUser

blocking

  • Parameters: page, include_entities
  • Required: none

Returns an array of user objects that the authenticating user is blocking 🚫 The whole block list, but make it objects.

  • Returns: ArrayRef[BasicUser]

blocking_ids

  • Parameters: none
  • Required: none

Returns an array of numeric user ids the authenticating user is blocking πŸ”’ Just the numbers, no fluff, we love efficiency.

  • Returns: ArrayRef[Int]

contributees

  • Parameters: user_id, screen_name, include_entities, skip_satus
  • Required: none

Returns an array of users that the specified user can contribute to 🫢

  • Returns: ArrayRef[User]

contributors

  • Parameters: user_id, screen_name, include_entities, skip_satus
  • Required: none

Returns an array of users who can contribute to the specified account πŸ’« (Yes, the other direction of contributees. They're twins.)

  • Returns: ArrayRef[User]

create_block

create_block(id)
  • Parameters: id, user_id, screen_name, include_entities
  • Required: id

Blocks the user specified in the ID parameter as the authenticating user 🚫 Returns the blocked user when successful. You can find out more about blocking in the Twitter Support Knowledge Base πŸ“š

  • Returns: BasicUser

create_favorite

create_favorite(id)
  • Parameters: id, include_entities
  • Required: id

Favorites the status specified in the ID parameter as the authenticating user πŸ’– Returns the favorite status when successful ✨ It's giving… liking a post, but the API version.

  • Returns: Status

create_friend

create_friend(id)
  • alias: follow_new
  • Parameters: id, user_id, screen_name, follow, include_entities
  • Required: id

Befriends the user specified in the ID parameter as the authenticating user 🫢 Returns the befriended user when successful. Returns a string describing the failure condition when unsuccessful 😭 So check what you actually got back, bestie β€” success and failure don't look the same here.

  • Returns: BasicUser

create_list

  • Parameters: list_id, slug, name, mode, description, owner_screen_name, owner_id
  • Required: none

Creates a new list for the authenticated user πŸ“

Note: you can't create more than 20 lists per account πŸ’€ Choose wisely.
  • Returns: List

create_saved_search(query)
  • Parameters: query
  • Required: query

Creates a saved search for the authenticated user πŸ”

  • Returns: SavedSearch

delete_list

  • Parameters: owner_screen_name, owner_id, list_id, slug
  • Required: none

Deletes the specified list πŸ—‘οΈ The authenticated user must own the list to be able to destroy it β€” your list, your rules, periodt πŸ’…

  • Returns: List

delete_list_member

  • alias: remove_list_member
  • Parameters: list_id, slug, user_id, screen_name, owner_screen_name, owner_id
  • Required: none

Removes the specified member from the list πŸ‘‹ The authenticated user must be the list's owner to remove members from the list.

  • Returns: User

destroy_block

destroy_block(id)
  • Parameters: id, user_id, screen_name
  • Required: id

Un-blocks the user specified in the ID parameter as the authenticating user ✨ Returns the un-blocked user when successful πŸ•ŠοΈ Forgiveness era.

  • Returns: BasicUser

destroy_direct_message

destroy_direct_message(id)
  • Parameters: id, include_entities
  • Required: id

Destroys the direct message specified in the required ID parameter πŸ’Œ The authenticating user must be the recipient of the specified direct message β€” so you can only nuke DMs that were sent to you, not ones you sent. Rules are rules.

  • Returns: DirectMessage

destroy_favorite

destroy_favorite(id)
  • Parameters: id, include_entities
  • Required: id

Un-favorites the status specified in the ID parameter as the authenticating user πŸ’” Returns the un-favorited status.

  • Returns: Status

destroy_friend

destroy_friend(id)
  • alias: unfollow
  • Parameters: id, user_id, screen_name, include_entities
  • Required: id

Discontinues friendship with the user specified in the ID parameter as the authenticating user πŸ’” Returns the un-friended user when successful. Returns a string describing the failure condition when unsuccessful 😭 Same deal as create_friend β€” always vibe check your return value.

  • Returns: BasicUser

destroy_saved_search(id)
  • Parameters: id
  • Required: id

Destroys a saved search πŸ’₯ The search, specified by id, must be owned by the authenticating user β€” no deleting other people's searches, bestie.

  • Returns: SavedSearch

destroy_status

destroy_status(id)
  • Parameters: id, trim_user, include_entities
  • Required: id

Destroys the status specified by the required ID parameter πŸ’€ The authenticating user must be the author of the specified status. Your tweets, your delete button πŸ—‘οΈ

  • Returns: Status

direct_messages

direct_messages(include_entities)
  • Parameters: since_id, max_id, count, page, include_entities
  • Required: include_entities

Returns a list of the 20 most recent direct messages sent to the authenticating user, including detailed information about the sending and recipient users πŸ’Œ The full tea, with both sides of the convo.

  • Returns: ArrayRef[DirectMessage]

disable_notifications

disable_notifications(id)
  • Parameters: id, screen_name, include_entities
  • Required: id

Disables notifications for updates from the specified user to the authenticating user πŸ”• Returns the specified user when successful. Peace and quiet era.

  • Returns: BasicUser

enable_notifications

enable_notifications(id)
  • Parameters: id, screen_name, include_entities
  • Required: id

Enables notifications for updates from the specified user to the authenticating user πŸ”” Returns the specified user when successful. Now you'll know.

  • Returns: BasicUser

end_session

  • Parameters: none
  • Required: none

Ends the session of the authenticating user, returning a null cookie πŸͺ Use this method to sign users out of client-facing applications like widgets πŸ‘‹ Bye bestie!

  • Returns: Error

favorites

  • Parameters: id, page, include_entities
  • Required: none

Returns the 20 most recent favorite statuses for the authenticating user or user specified by the ID parameter πŸ’– Twenty lil liked posts, served fresh.

  • Returns: ArrayRef[Status]

followers_ids

followers_ids(id)
  • Parameters: id, user_id, screen_name, cursor
  • Required: id

Returns a reference to an array of numeric IDs for every user following the specified user πŸ”’

The order of the IDs may change from call to call 😭 So don't build anything that depends on it, okay?

To obtain the screen names, pass the arrayref to lookup_users ✨

Use the optional cursor parameter to retrieve IDs in pages of 5000. When the cursor parameter is used, the return value is a reference to a hash with keys previous_cursor, next_cursor, and ids. The value of ids is a reference to an array of IDS of the user's followers. Set the optional cursor parameter to -1 to get the first page of IDs. Set it to the prior return's value of previous_cursor or next_cursor to page forward or backwards. When there are no prior pages, the value of previous_cursor will be 0. When there are no subsequent pages, the value of next_cursor will be 0.

  • Returns: HashRef|ArrayRef[Int]

friends_ids

friends_ids(id)
  • alias: following_ids
  • Parameters: id, user_id, screen_name, cursor
  • Required: id

Returns a reference to an array of numeric IDs for every user followed by the specified user πŸ”’

The order of the IDs is reverse chronological ⏳ (different from followers_ids, don't get them twisted)

Use the optional cursor parameter to retrieve IDs in pages of 5000. When the cursor parameter is used, the return value is a reference to a hash with keys previous_cursor, next_cursor, and ids. The value of ids is a reference to an array of IDS of the user's friends. Set the optional cursor parameter to -1 to get the first page of IDs. Set it to the prior return's value of previous_cursor or next_cursor to page forward or backwards. When there are no prior pages, the value of previous_cursor will be 0. When there are no subsequent pages, the value of next_cursor will be 0.

  • Returns: HashRef|ArrayRef[Int]

friendship_exists

friendship_exists(user_a, user_b)
  • alias: relationship_exists
  • alias: follows
  • Parameters: user_id_a, user_id_b, screen_name_a, screen_name_b, user_a, user_b
  • Required: user_a, user_b

Tests for the existence of friendship between two users 🫢 Will return true if user_a follows user_b, otherwise will return false.

⚠️ Use of user_a and user_b is deprecated πŸ’€ It has been preserved for backwards compatibility, and is used for the two-argument positional form:
$nt->friendship_exists($user_a, $user_b);

Instead, bestie, use one of the named argument forms:

$nt->friendship_exists({ user_id_a => $id1, user_id_b => $id2 });
$nt->friendship_exists({ screen_name_a => $name1, screen_name_b => $name2 });

Honestly? Consider using show_friendship instead. πŸ‘€

Returns: Bool


friendships_incoming

friendships_incoming(cursor)

Parameters: cursor Required: cursor

Hands you back a HASH ref with an array of numeric IDs chilling in the ids element β€” one for every user who has a pending request to follow the authenticating user. ✨

Returns: HashRef

friendships_outgoing

friendships_outgoing(cursor)

Parameters: cursor Required: cursor

Same energy, opposite direction: a HASH ref with an array of numeric IDs in the ids element for every protected user that the authenticating user has a pending follow request out to. 🫢

Returns: HashRef

geo_id

geo_id(id)

Parameters: id Required: id

Returns the deets of a place that came back from the reverse_geocode method. πŸ—ΊοΈ

Returns: HashRef

Parameters: lat, long, query, ip, granularity, accuracy, max_results, contained_within, attribute:street_address, callback Required: none

Okay so this one searches for places that can be attached to a statuses/update. Give it a latitude + longitude pair, an IP address, or a name, and it'll return a list of all the valid places that can be used as the place_id when you update a status. πŸ“

Conceptually the flow is: make a query from the user's location, get a list of places back, have the user validate the location they're actually at, and then send that location's ID along with a call to statuses/update.

This is the recommended method for finding places that can be attached to statuses/update. Unlike geo/reverse_geocode, which is raw data access, this endpoint can potentially re-order places with regards to the user who's authenticated. It's also the preferred approach for interactive place matching with the user. πŸ’…

Returns: HashRef

get_configuration

Parameters: none Required: none

Returns the current configuration Twitter is running with β€” that includes the twitter.com slugs that are not usernames, the maximum photo resolutions, and the t.co URL lengths. βš™οΈ

It is recommended that applications request this endpoint when they're loaded β€” but no more than once a day, bestie. Once. A. Day.

Returns: HashRef

get_languages

Parameters: none Required: none

Returns the list of languages Twitter supports, along with their ISO 639-1 code. That ISO 639-1 code is the two-letter value you'd use if you include lang in any of your requests. 🌈

Returns: ArrayRef[Lanugage]

get_list

Parameters: list_id, slug, owner_screen_name, owner_id Required: none

Returns the specified list. Private lists will only show up if the authenticated user owns the specified list. πŸ”’

Returns: List

get_lists

alias: list_lists

Parameters: user_id, screen_name, cursor Required: none

Returns the lists of the specified (or authenticated) user. Private lists get included if the authenticated user is the same as the user whose lists are being returned. πŸ‘‘

Returns: Hashref

get_privacy_policy

Parameters: none Required: none

Returns Twitter's privacy policy.

Returns: HashRef

get_tos

Parameters: none Required: none

Returns the Twitter Terms of Service. Just so we're clear β€” these are not the same as the Developer Rules of the Road. πŸ“œ

Returns: HashRef

home_timeline

Parameters: since_id, max_id, count, page, skip_user, exclude_replies, contributor_details, include_rts, include_entities, trim_user, include_my_retweet Required: none

Returns the 20 most recent statuses β€” retweets included β€” posted by the authenticating user and that user's friends. This is the API equivalent of /timeline/home on the Web. 🏠

Returns: ArrayRef[Status]

is_list_member

Parameters: owner_screen_name, owner_id, list_id, slug, user_id, screen_name, include_entities, skip_status Required: none

Checks if the specified user is a member of the specified list. Returns the user, or undef. πŸ•΅οΈ

Returns: Maybe[User]

is_list_subscriber

alias: is_subscribed_list

Parameters: owner_screen_name, owner_id, list_id, slug, user_id, screen_name, include_entities, skip_status Required: none

Checks if the specified user is a subscriber of the specified list (yes, that's a different thing from being a member, bestie). Returns the user, or undef.

Returns: Maybe[User]

list_members

Parameters: list_id, slug, owner_screen_name, owner_id, cursor, include_entities, skip_status Required: none

Returns the members of the specified list. Private list members will only be shown if the authenticated user owns the specified list. πŸ”

Returns: Hashref

list_memberships

Parameters: user_id, screen_name, cursor, filter_to_owned_lists Required: none

Returns the lists the specified user has been added to. If user_id or screen_name aren't provided, you get the memberships for the authenticating user instead. ✨

Returns: Hashref

list_statuses

Parameters: list_id, slug, owner_screen_name, owner_id, since_id, max_id, per_page, page, include_entities, include_rts Required: none

Returns the tweet timeline for members of the specified list. Historically retweets weren't available in list timeline responses, but you can now use the include_rts=true parameter to additionally receive retweet objects. πŸ”

Returns: ArrayRef[Status]

list_subscribers

Parameters: list_id, slug, owner_screen_name, owner_id, cursor, include_entities, skip_status Required: none

Returns the subscribers of the specified list. Private list subscribers will only be shown if the authenticated user owns the specified list. πŸ‘€

Returns: Hashref

lookup_friendships

Parameters: user_id, screen_name Required: none

Returns the relationship of the authenticating user to the comma-separated list β€” or ARRAY ref β€” of up to 100 screen_names or user_ids you provide. Values for connections can be: following, following_requested, followed_by, none. Requires authentication. πŸ”‘

Returns: ArrayRef

lookup_users

Parameters: user_id, screen_name, include_entities Required: none

Returns up to 100 users' worth of extended information, specified by either ID, screen name, or a combination of the two. The author's most recent status gets returned inline (if the authenticating user has permission, obviously). This method is rate limited to 1000 calls per hour. ⏳

This method will accept user IDs or screen names as either a comma-delimited string, or as an ARRAY ref. It'll also accept arguments in the normal HASHREF form or as a simple list of named arguments. So basically any of these forms are acceptable, bestie:

$nt->lookup_users({ user_id => '1234,6543,3333' });
$nt->lookup_users(user_id => '1234,6543,3333');
$nt->lookup_users({ user_id => [ 1234, 6543, 3333 ] });
$nt->lookup_users({ screen_name => 'fred,barney,wilma' });
$nt->lookup_users(screen_name => ['fred', 'barney', 'wilma']);

$nt->lookup_users(
    screen_name => ['fred', 'barney' ],
    user_id     => '4321,6789',
);

Returns: ArrayRef[User]

members_create_all

alias: add_list_members

Parameters: list_id, slug, owner_screen_name, owner_id Required: none

Adds multiple members to a list by specifying a reference to an array, or a comma-separated list, of member ids or screen names. The authenticated user must own the list to be able to add members to it. Heads up: lists can't have more than 500 members, and you're limited to adding up to 100 members to a list at a time with this method. πŸŽ€

Returns: List

members_destroy_all

alias: remove_list_members

Parameters: list_id, slug, user_id, screen_name, owner_screen_name, owner_id Required: none

Removes multiple members from a list by specifying a reference to an array of member ids or screen names, or a string of comma-separated user ids or screen names. The authenticated user must own the list to be able to remove members from it. Again: lists can't have more than 500 members, and you're limited to removing up to 100 members from a list at a time with this method. πŸ’…

Please note that there can be issues with lists that rapidly remove and add memberships. Take care when using these methods such that you are not too rapidly switching between removals and adds on the same list. Like, chill, okay? The API is watching. πŸ’€

Returns: List

mentions

alias: replies

Parameters: since_id, max_id, count, page, trim_user, include_rts, include_entities Required: none

Returns the 20 most recent mentions β€” that's statuses containing @username β€” for the authenticating user. πŸ“£

Returns: ArrayRef[Status]

new_direct_message

new_direct_message(user, text)

Parameters: user, text, screen_name, user_id, include_entities Required: user, text

Sends a new direct message to the specified user from the authenticating user. Requires both the user and text parameters. Returns the sent message when it works. And in order to support numeric screen names, the screen_name or user_id parameters may be used instead of user. πŸ’Œ

Returns: DirectMessage

no_retweet_ids

Parameters: none Required: none

Returns an ARRAY ref of user IDs for which the authenticating user does not want to receive retweets. πŸš«πŸ”

Returns: ArrayRef[UserIDs]

public_timeline

Parameters: skip_user, trim_user, include_entities Required: none

Returns the 20 most recent statuses from non-protected users who have set a custom user icon. Does not require authentication. Note that the public timeline is cached for 60 seconds, so requesting it more often than that is literally a waste of resources, bestie. πŸ™ˆ

If user credentials are provided, public_timeline calls are authenticated, so they count against the authenticated user's rate limit. Use ->public_timeline({ authenticate => 0 }) to make an unauthenticated call, which will count against the calling IP address' rate limit instead. 🧠

Returns: ArrayRef[Status]

rate_limit_status

Parameters: none Required: none

...so</p> that's the number of API requests you've still got left in the current hour, before you hit the wall. Vibe check your quota, bestie. πŸ’…

Want to force an unauthenticated call? Do ->rate_limit_status({ authenticate => 0 }) and it'll hand you the status for the IP address instead of the authenticated user. (Heads up: if you're a web app, that's the server's IP address, not the person's. iykyk 🌈)

Returns: RateLimitStatus


related_results(id)

  • Parameters: id
  • Required: id

If it's available, this gives you back an array of replies and mentions tied to the status you picked. No cap though β€” there is no guarantee there'll be any replies or mentions in the response at all. 😭 This one is only for users who have access to #newtwitter. Requires authentication.

Returns: ArrayRef[Status]


πŸŽ€ report_spam πŸŽ€

report_spam(id)

  • Parameters: id, user_id, screen_name, include_entities
  • Required: id

The user you point at with id gets blocked by the authenticated user and reported as a spammer. πŸ’€ Get 'em.

Returns: User


πŸ¦‹ retweet πŸ¦‹

retweet(id)

  • Parameters: id, include_entities, trim_user
  • Required: id

Retweets a tweet, periodt. You gotta pass the id parameter of the tweet you're retweeting. Returns the original tweet with retweet details embedded inside it. 🫢

Returns: Status


🌸 retweeted_by 🌸

retweeted_by(id)

  • Parameters: id, count, page, trim_user, include_entities
  • Required: id

Returns up to 100 users who retweeted the status identified by id.

Returns: ArrayRef[User]


πŸ’… retweeted_by_ids πŸ’…

retweeted_by_ids(id)

  • Parameters: id, count, page, trim_user, include_entities
  • Required: id

Returns the IDs of up to 100 users who retweeted the status identified by id.

Returns: ArrayRef[User]


✨ retweeted_by_me ✨

  • Parameters: since_id, max_id, count, page, trim_user, include_entities
  • Required: none

Returns the 20 most recent retweets posted by the authenticating user. Main character behaviour, honestly. πŸ‘‘

Returns: ArrayRef[Status]


πŸŽ€ retweeted_by_user πŸŽ€

retweeted_by_user(id)

  • Parameters: id, user_id, screen_name
  • Required: id

Returns the 20 most recent retweets posted by the user you specify. You pick the user with the user_id or screen_name parameters. It's literally the same as retweeted_by_me, except you get to choose whose retweets you're looking at. Does not require authentication β€” unless the user is protected.

Returns: ArrayRef


πŸ¦‹ retweeted_to_me πŸ¦‹

  • Parameters: since_id, max_id, count, page
  • Required: none

Returns the 20 most recent retweets posted by the authenticating user's friends. Your lil circle. 🫢

Returns: ArrayRef[Status]


🌸 retweeted_to_user 🌸

retweeted_to_user(id)

  • Parameters: id, user_id, screen_name
  • Required: id

Returns the 20 most recent retweets posted by the users that your specified user follows. You pick the user with user_id or screen_name. It's literally identical to retweeted_to_me, except you choose the user to peek at. Does not require authentication β€” unless the user is protected.

Returns: ArrayRef


πŸ’… retweets πŸ’…

retweets(id)

  • Parameters: id, count, trim_user, include_entities
  • Required: id

Returns up to 100 of the first retweets of a given tweet.

Returns: Arrayref[Status]


⭐ retweets_of_me ⭐

retweets_of_me alias: retweeted_of_me

  • Parameters: since_id, max_id, count, page, trim_user, include_entities
  • Required: none

Returns the 20 most recent tweets of the authenticated user that other people have retweeted. The way your faves ate. 😭

Returns: ArrayRef[Status]


🌈 reverse_geocode 🌈

reverse_geocode(lat, long)

  • Parameters: lat, long, accuracy, granularity, max_results
  • Required: lat, long

Search for places β€” cities and neighborhoods β€” that can be attached to a statuses/update. Give it a latitude and a longitude, and it returns a list of every valid place you can use as a place_id when updating a status. Conceptually: you query from the user's location, get back a list of places, have the user validate where they actually are, then send that location's ID up with a call to statuses/update. πŸ—ΊοΈ

There are multiple granularities of places that can come back β€” "neighborhoods", "cities", etc. At this time, only United States data is available through this method.

  • lat β€” Required. The latitude to query about. Valid ranges are -90.0 to +90.0 (North is positive), inclusive.
  • long β€” Required. The longitude to query about. Valid ranges are -180.0 to +180.0 (East is positive), inclusive.
  • accuracy β€” Optional. A hint on the "region" in which to search. If it's a number, then it's a radius in meters β€” but it can also take a string suffixed with ft to specify feet. If you don't pass it in, it's assumed to be 0m. If it's coming from a device, in practice this value is whatever accuracy the device has measuring its location (whether that's from a GPS, WiFi triangulation, etc.).
  • granularity β€” Optional. The minimal granularity of data to return. If you don't pass it in, "neighborhood" is assumed. "city" can also be passed.
  • max_results β€” Optional. A hint as to the number of results to return. This does not guarantee that the number of results returned will equal max_results β€” instead it informs how many "nearby" results to return. Ideally you only pass in the number of places you intend to display to the user here.

Returns: HashRef


πŸŽ€ saved_searches πŸŽ€

  • Parameters: none
  • Required: none

Returns the authenticated user's saved search queries.

Returns: ArrayRef[SavedSearch]


πŸ’– sent_direct_messages πŸ’–

  • Parameters: since_id, max_id, page, count, include_entities
  • Required: none

Returns a list of the 20 most recent direct messages sent by the authenticating user, including detailed info about the sending and recipient users. πŸ‘€

Returns: ArrayRef[DirectMessage]


πŸ¦‹ show_direct_message πŸ¦‹

show_direct_message(id)

  • Parameters: id, include_entities
  • Required: id

Returns a single direct message, specified by an id parameter. Like the direct_messages request, this method includes the user objects of the sender and the recipient. Requires authentication.

Returns: HashRef


🌸 show_friendship 🌸

show_friendship(id) alias: show_relationship

  • Parameters: source_id, source_screen_name, target_id, target_id_name
  • Required: id

Returns detailed info about the relationship between two users. πŸ’ž

Returns: Relationship


show_saved_search(id)

  • Parameters: id
  • Required: id

Retrieve the data for a saved search, by id, owned by the authenticating user.

Returns: SavedSearch


✨ show_status ✨

show_status(id)

  • Parameters: id, trim_user, include_entities
  • Required: id

Returns a single status, specified by the id parameter. The status's author gets returned inline, right there with it.

Returns: Status


πŸŽ€ show_user πŸŽ€

show_user(id)

  • Parameters: id, screen_name, include_entities
  • Required: id

Returns extended info for a given user, specified by ID or screen name per the required id parameter. This info includes design settings, so third party developers can theme their widgets according to a given user's preferences. You must be properly authenticated to request the page of a protected user.

Returns: ExtendedUser


🌈 similar_places 🌈

similar_places(lat, long, name)

  • Parameters: lat, long, name, contained_within, attribute:street_address, callback
  • Required: lat, long, name

Locates places near the given coordinates which are similar in name.

Conceptually you'd use this to get a list of known places to choose from first. Then, if the place you want doesn't exist, you make a request to add_place to create a new one. ✨

The token contained in the response is the token you need in order to be able to create a new place. πŸ”‘

Returns: HashRef


πŸ’– subscribe_list πŸ’–

  • Parameters: owner_screen_name, owner_id, list_id, slug
  • Required: none

Subscribes the authenticated user to the specified list. Slay. πŸ’…

Returns: List


πŸ¦‹ subscriptions πŸ¦‹

  • Parameters: user_id, screen_name, count, cursor
  • Required: none

Obtain a collection of the lists the specified user is subscribed to β€” 20 lists per page by default. Does not include the user's own lists.

Returns: ArrayRef[List]


🌸 suggestion_categories 🌸

  • Parameters: none
  • Required: none

Returns the list of suggested user categories. The category slug can be used in the user_suggestions API method to get the users in that category. Does not require authentication.

Returns: ArrayRef


⭐ test ⭐

  • Parameters: none
  • Required: none

Returns the string "ok" status code. Baby's first API call, fr fr. 🍼

Returns: Str


  • Parameters: lat, long
  • Required: none

Returns the locations with trending topic info. The response is an array of "locations" that encode the location's WOEID (a Yahoo! Where On Earth ID, http://developer.yahoo.com/geo/geoplanet/) plus some other human-readable info like the location's canonical name and country.

When the optional lat and long parameters are passed, the available trend locations get sorted by distance from that location, nearest to farthest.

Use the WOEID returned in the location object to query trends for a specific location. 🌍

Returns: ArrayRef[Location]


trends_current trends_current(exclude)

  • Parameters: exclude
  • Required: none

Returns the current top ten trending topics on Twitter. The response includes the time of the request, the name of each trending topic, and the query used on the Twitter Search results page for that topic. πŸ”₯

Returns: HashRef


  • Parameters: date, exclude
  • Required: none

Returns the top 20 trending topics for each hour in a given day. πŸ“†

Returns: HashRef


trends_location(woeid)

  • Parameters: woeid
  • Required: woeid

okay so this one hands you back the top 10 trending topics for one specific location ✨ and the response is an array of trend objects β€” each one encodes the name of the trending topic, the query parameter you can use to search for that topic on Search, and the direct URL you can fire at Search. It's cached for five minutes, so bestie, please don't be querying these endpoints faster than once every five minutes, it's giving desperate πŸ’€. You can also get global trends info out of this API by using a WOEID of 1.

Returns: ArrayRef[Trend]


Parameters: date, exclude Required: none

Gives you the top 30 trending topics for each day in a given week. That's it, that's the whole vibe.

Returns: HashRef


unsubscribe_list πŸšͺ

Parameters: list_id, slug, owner_screen_name, owner_id Required: none

Unsubscribes the authenticated user from the specified list. Bye bye list πŸ‘‹

Returns: List


update

update(status) πŸ“

Parameters: status, lat, long, place_id, display_coordinates, in_reply_to_status_id, trim_user, include_entities Required: status

Updates the authenticating user's status. Requires the status parameter to be specified. And listen β€” a status update with text identical to the authenticating user's current status will just be ignored. Twitter said no duplicates, we've all been there πŸ™ˆ.

  • status β€” Required. The text of your status update. URL encode as necessary. Statuses over 140 characters will cause a 403 error to be returned from the API. Not a vibe, keep it short.
  • in_reply_to_status_id β€” Optional. The ID of an existing status that the update is in reply to.
    • Note: This parameter will be ignored unless the author of the tweet this parameter references is mentioned within the status text. Therefore, you must include @username, where username is the author of the referenced tweet, within the update.
  • lat β€” Optional. The location's latitude that this tweet refers to. The valid ranges for latitude is -90.0 to +90.0 (North is positive) inclusive. This parameter will be ignored if outside that range, if it is not a number, if geo_enabled is disabled, or if there not a corresponding long parameter with this tweet.
  • long β€” Optional. The location's longitude that this tweet refers to. The valid ranges for longitude is -180.0 to +180.0 (East is positive) inclusive. This parameter will be ignored if outside that range, if it is not a number, if geo_enabled is disabled, or if there not a corresponding lat parameter with this tweet.
  • place_id β€” Optional. The place to attach to this status update. Valid place_ids can be found by querying reverse_geocode.
  • display_coordinates β€” Optional. By default, geo-tweets will have their coordinates exposed in the status object (to remain backwards compatible with existing API applications). To turn off the display of the precise latitude and longitude (but keep the contextual location information), pass "display_coordinates =" 0> on the status update.

Returns: Status


update_delivery_device

update_delivery_device(device) πŸ“±

Parameters: device Required: device

Sets which device Twitter delivers updates to for the authenticating user. Sending none as the device parameter will disable IM or SMS updates. Silence is golden, honestly πŸŽ€

Returns: BasicUser


update_friendship

update_friendship(id) 🀝

Parameters: id, user_id, screen_name, device, retweets Required: id

Lets you enable or disable retweets and device notifications from the specified user. All other values are assumed to be false. Requires authentication.

Returns: HashRef


update_list πŸ“‹

Parameters: list_id, slug, name, mode, description, owner_screen_name, owner_id Required: none

Updates the specified list. The authenticated user must own the list to be able to update it β€” no touching other people's lists, main character energy only πŸ”₯

Returns: List


update_profile πŸ’–

Parameters: name, email, url, location, description, include_entities Required: none

Sets values that users are able to set under the "Account" tab of their settings page. Only the parameters you specify will be updated; so like, to only update the "name" attribute, only include that parameter in your request. Selective editing, we love to see it ✨

Returns: ExtendedUser


update_profile_background_image

update_profile_background_image(image) πŸ–ΌοΈ

Parameters: image, use Required: image

Updates the authenticating user's profile background image. The "image" parameter must be an arrayref with the same interpretation as the "image" parameter in the update_profile_image method. The "use" parameter lets you specify whether to use the uploaded profile background or not. See that method's documentation for details πŸ‘€

Returns: ExtendedUser


update_profile_colors 🌈

Parameters: profile_background_color, profile_text_color, profile_link_color, profile_sidebar_fill_color, profile_sidebar_border_color Required: none

Sets one or more hex values that control the color scheme of the authenticating user's profile page on twitter.com. These values are also returned in the /users/show API method. It's giving aesthetic customization and honestly? obsessed πŸ’…

Returns: ExtendedUser


update_profile_image

update_profile_image(image) 🫢

Parameters: image Required: image

Updates the authenticating user's profile image. The "image" parameter is an arrayref with the following interpretation:

[ $file ]
[ $file, $filename ]
[ $file, $filename, Content_Type => $mime_type ]
[ undef, $filename, Content_Type => $mime_type, Content => $raw_image_data ]

The first value of the array ($file) is the name of a file to open. The second value ($filename) is the name given to Twitter for the file. If $filename is not provided, the basename portion of $file is used. If $mime_type is not provided, it will be provided automatically using LWP::MediaTypes::guess_media_type().

$raw_image_data can be provided, rather than opening a file, by passing undef as the first array value.

Returns: ExtendedUser


update_with_media

update_with_media(status, media) 🎬

Parameters: status, media[], possibly_sensitive, in_reply_to_status_id, lat, long, place_id, display_coordinates Required: status, media

Updates the authenticating user's status and attaches media for upload. Two things at once, multitasking queen πŸ‘‘

The media[] parameter is an arrayref with the following interpretation:

[ $file ]
[ $file, $filename ]
[ $file, $filename, Content_Type => $mime_type ]
[ undef, $filename, Content_Type => $mime_type, Content => $raw_image_data ]

The first value of the array ($file) is the name of a file to open. The second value ($filename) is the name given to Twitter for the file. If $filename is not provided, the basename portion of $file is used. If $mime_type is not provided, it will be provided automatically using LWP::MediaTypes::guess_media_type().

$raw_image_data can be provided, rather than opening a file, by passing undef as the first array value.

Heads up bestie: the Tweet text will be rewritten to include the media URL(s), which will reduce the number of characters allowed in the Tweet text. If the URL(s) cannot be appended without text truncation, the tweet will be rejected and this method will return an HTTP 403 error. 😭

Returns: Status


user_suggestions

user_suggestions(category)

alias: follow_suggestions πŸ‘―

Parameters: category, lang Required: category

Access the users in a given category of the Twitter suggested user list and return their most recent status if they are not a protected user. Currently supported values for optional parameter "lang" are "en", "fr", "de", "es", "it". Does not require authentication β€” no login needed, we love a freebie πŸŽ€

Returns: ArrayRef


user_timeline πŸ•°οΈ

Parameters: id, user_id, screen_name, since_id, max_id, count, page, skip_user, trim_user, include_entities, include_rts Required: none

Returns the 20 most recent statuses posted from the authenticating user. It's also possible to request another user's timeline via the id parameter. This is the equivalent of the Web /archive page for your own user, or the profile page for a third party. Scrolling but make it API πŸ¦‹

Returns: ArrayRef[Status]


users_search(q)

alias: find_people

alias: search_users πŸ”Ž

Parameters: q, per_page, page, include_entities Required: q

Run a search for users similar to the Find People button on Twitter.com; the same results returned by people search on Twitter.com will be returned by using this API (about being listed in the People Search). It is only possible to retrieve the first 1000 matches from this API. That's the whole cap, periodt.

Returns: ArrayRef[Users]


verify_credentials

verify_credentials(include_entities) βœ…

Parameters: include_entities Required: none

Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful; returns a 401 status code and an error message if not. Use this method to test if supplied user credentials are valid. It's the vibe check for your login πŸ’œ

Returns: ExtendedUser


✨ Search API Methods ✨

search(q) πŸ”

Parameters: q, callback, lang, locale, rpp, page, since_id, until, geocode, show_user, result_type Required: q

Returns a HASH reference with some meta-data about the query including the "next_page", "refresh_url", and "max_id". The statuses are returned in "results". To iterate over the results, use something similar to:

my $r = $nt->search($searh_term);
for my $status ( @{$r->{results}} ) {
    print "$status->{text}\n";
}

Returns: HashRef

πŸ’₯ ERROR HANDLING πŸ’₯

okay bestie listen up, because this part is important. when Net::Twitter::Lite hits a Twitter API error or a network error, it throws a Net::Twitter::Lite::Error object. like, it just dies on you. rude? maybe. but catchable!

so you catch and process those exceptions with eval blocks and by checking $@:

eval {
    my $statuses = $nt->friends_timeline(); # this might die!

    for my $status ( @$statuses ) {
        #...
    }
};
if ( $@ ) {
    # friends_timeline encountered an error

    if ( blessed $@ && $@->isa('Net::Twitter::Lite::Error' ) {
        #... use the thrown error obj
        warn $@->error;
    }
    else {
        # something bad happened!
        die $@;
    }
}

iconic. ✨

and here's the cute part: Net::Twitter::Lite::Error stringifies to something reasonable, so if you don't need the detailed error tea, you can literally just treat $@ as a plain string:

eval { $nt->update($status) };
if ( $@ ) {
    warn "update failed because: $@\n";
}

that's it. that's the whole vibe. 🫢


πŸ” AUTHENTICATION πŸ”

Net::Twitter::Lite currently supports both Basic Authentication and OAuth. which one you get is decided by the options you pass to new or by using the credentials method. and heads up β€” an error will be thrown if you provide options for both strategies. pick a lane bestie, you can't do both. πŸ’…

BASIC AUTHENTICATION

to use Basic Authentication, pass the username and password options to new, or call credentials to set them. when Basic Authentication is in play, the Authorization header gets set on every single authenticated API call. no cap.

OAUTH AUTHENTICATION

to use OAuth authentication, pass the consumer_key and consumer_secret options to new.

Net::OAuth::Simple must be installed in order to use OAuth, and an error will be thrown if OAuth is attempted without it. Net::Twitter::Lite does not require Net::OAuth::Simple, which is what makes OAuth an optional feature. πŸŽ€

OAUTH EXAMPLES

see the examples directory included in this distribution for full working examples using OAuth. πŸ¦‹

here's how to authorize users as a desktop app mode:

use Net::Twitter::Lite;

my $nt = Net::Twitter::Lite->new(
    consumer_key    => "YOUR-CONSUMER-KEY",
    consumer_secret => "YOUR-CONSUMER-SECRET",
);

# You'll save the token and secret in cookie, config file or session database
my($access_token, $access_token_secret) = restore_tokens();
if ($access_token && $access_token_secret) {
    $nt->access_token($access_token);
    $nt->access_token_secret($access_token_secret);
}

unless ( $nt->authorized ) {
    # The client is not yet authorized: Do it now
    print "Authorize this app at ", $nt->get_authorization_url, " and enter the PIN#\n";

    my $pin = <STDIN>; # wait for input
    chomp $pin;

    my($access_token, $access_token_secret, $user_id, $screen_name) =
        $nt->request_access_token(verifier => $pin);
    save_tokens($access_token, $access_token_secret); # if necessary
}

# Everything's ready

✨ slay. everything's ready, bestie. go tweet.


now in a web application mode, you need to save the oauth_token and oauth_token_secret somewhere when you redirect the user to the OAuth authorization URL. don't forget. that's the whole trick. πŸ™ˆ

sub twitter_authorize : Local {
    my($self, $c) = @_;

    my $nt = Net::Twitter::Lite->new(%param);
    my $url = $nt->get_authorization_url(callback => $callbackurl);

    $c->response->cookies->{oauth} = {
        value => {
            token => $nt->request_token,
            token_secret => $nt->request_token_secret,
        },
    };

    $c->response->redirect($url);
}

and when the user comes back, you'll reset those request token and secret to upgrade the request token to access token:

sub twitter_auth_callback : Local {
    my($self, $c) = @_;

    my %cookie = $c->request->cookies->{oauth}->value;

    my $nt = Net::Twitter::Lite->new(%param);
    $nt->request_token($cookie{token});
    $nt->request_token_secret($cookie{token_secret});
    my $verifier = $c->req->param->{oauth_verifier};

    my($access_token, $access_token_secret, $user_id, $screen_name) =
        $nt->request_access_token(verifier => $verifier);

    # Save $access_token and $access_token_secret in the database associated with $c->user
}

later on, you can retrieve and reset those access token and secret before calling any Twitter API methods:

sub make_tweet : Local {
    my($self, $c) = @_;

    my($access_token, $access_token_secret) = ...;

    my $nt = Net::Twitter::Lite->new(%param);
    $nt->access_token($access_token);
    $nt->access_token_secret($access_token_secret);

    # Now you can call any Net::Twitter::Lite API methods on $nt
    my $status = $c->req->param('status');
    my $res = $nt->update({ status => $status });
}

the way that this flow just works β€” chef's kiss. πŸ‘‘


πŸ‘€ SEE ALSO πŸ‘€

  • Net::Twitter::Lite::WithAPIv1_1 β€” with support for Twitter API v1.1 πŸ”₯
  • Net::Twitter::Lite::Error β€” the Net::Twitter::Lite exception object. your bestie when things go sideways.
  • <http://apiwiki.twitter.com/Twitter-API-Documentation> β€” this is the official Twitter API documentation. it describes the methods and their parameters in more detail and may be more current than the documentation provided with this module. (iykyk πŸ“š)
  • LWP::UserAgent::POE β€” this LWP::UserAgent compatible class can be used in POE based application along with Net::Twitter::Lite to provide concurrent, non-blocking requests. fancy!! ✨

πŸ†˜ SUPPORT πŸ†˜

please report bugs to bug-net-twitter@rt.cpan.org, or through the web interface at <https://rt.cpan.org/Dist/Display.html?Queue=Net-Twitter>. do it, they want to know πŸ›

join the Net::Twitter IRC channel at <irc://irc.perl.org/net-twitter>. πŸ’¬

follow perl_api: <http://twitter.com/perl_api>. 🐦

track Net::Twitter::Lite development at <http://github.com/semifor/net-twitter-lite>. ⭐


πŸ‘‘ AUTHOR πŸ‘‘

Marc Mims <marc@questright.com>

🌈 CONTRIBUTORS 🌈

Chris Page <chris@starforge.co.uk>

πŸ“œ LICENSE πŸ“œ

Copyright (c) 2013 Marc Mims

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


and that's a wrap on the whole page bestie!! πŸ’– this one's perl v5.34.0, dated 2022-06-16, straight from the Net::T...::Lite(3pm) manpage. go forth and tweet responsibly, mwah πŸŽ€βœ¨πŸ¦‹

πŸ“¦ where this page comes from