https://github.com/waldner/twitter-lib
Shell library to do Twitter API calls
https://github.com/waldner/twitter-lib
bash shell twitter twitter-api
Last synced: 5 months ago
JSON representation
Shell library to do Twitter API calls
- Host: GitHub
- URL: https://github.com/waldner/twitter-lib
- Owner: waldner
- License: gpl-3.0
- Created: 2018-03-29T10:48:24.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2022-11-22T12:14:05.000Z (about 3 years ago)
- Last Synced: 2025-03-31T02:18:57.913Z (10 months ago)
- Topics: bash, shell, twitter, twitter-api
- Language: Shell
- Size: 19.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# twitter-lib
Shell library to do Twitter API calls
### What's this?
This is a barebones implementation of Twitter API [OAuth signing](https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html) and [request sending](https://developer.twitter.com/en/docs/basics/authentication/guides/authorizing-a-request). It's a shell library that uses only **`bash`** and basic utilities. It can be used as a starting point to implement more complex Twitter application logics.
## Dependencies
The only dependencies needed are [**`bash`**](https://www.gnu.org/software/bash/), [**`curl`**](https://curl.haxx.se/), **`awk`** (any version should work), [**`openssl`**](https://www.openssl.org/) for the crypto part, **`sort`** and GNU **`date`**.
## Installation
No special installation needed. Just put **`twitter-lib.sh`** wherever you want. You have to know the location because you'll have to source it in your script.
## Getting started
- You need a [Twitter developer account](https://developer.twitter.com/) to use the API.
- Create an application in your [Twitter apps control panel](https://apps.twitter.com). Name it whatever you want, and use a made-up return URL (eg, http://localhost/). It's not used here, but it has to be present.
- Go to "Keys and Access Tokens" and get the following values: "Consumer Key (API Key)", "Consumer Secret (API Secret)" from the "Application Settings" section, and "Access Token" and "Access Token Secret" from the "Your Access Token" section.
- Source **`twitter-lib.sh`** in your script
- Implement a function called **`tt_get_userdef_credentials`** that sets the following environment variables with the corresponding values from your application: **`tt_lib['oauth_consumer_key']`**, **`tt_lib['oauth_consumer_secret']`**, **` tt_lib['oauth_token']`**, **`tt_lib['oauth_token_secret']`**. You can also optionally set **`tt_lib['user_agent']`** with the name of your app if you want, this will be set in API requests.
- Call **`tt_do_call`** with the appropriate values to start using the API. See below for examples.
## Logging
Sourcing the library gives you access to a very rudimentary log function called `tt_log`. Its arguments are a log level (one of DEBUG, INFO, NOTICE, WARNING, ERROR) and the message to log. You can use this function to log your application messages together with those coming from the library. By default, the library detects automatically whether to log to file or to stdout (if stdout is not a terminal, log to file; otherwise log to stdout). This allows eg running from cron without getting output, but still being able to manually run on the command line and see the messages. The log destination can however be forced. The minimum logging level can also be configured, or logging can be turned off altogether. See code below for examples.
## Internals
All the library setting are stored in a global associative array called **`tt_lib[]`**
After each file API function invocation, the three variables **`tt_lib['last_http_headers']`**, **`tt_lib['last_http_body']`** and **`tt_lib['last_http_code']`** contain what their name says, so they can be inspected in your code for extra control.
**`tt_do_call`** computes OAuth credentials for the request and ends up calling **`tt_do_curl`** with appropriate arguments.
## Sample code
Note: you might not be able to perform certain API calls, depending on the permission you assigned to your application.
Arguments to **`tt_do_call`** are: HTTP method, URL, arguments, in this order. See [the API reference](https://developer.twitter.com/en/docs/api-reference-index) for available API calls.
```
#!/bin/bash
# you must implement this function with the right values
tt_get_userdef_credentials(){
tt_lib['oauth_consumer_key']="xxxxxxxxxx"
tt_lib['oauth_consumer_secret']="yyyyyyyyyyyyyyy"
tt_lib['oauth_token']="zzzzzzzzzzzzzzzzzzzz"
tt_lib['oauth_token_secret']="wwwwwwwwwwwwwwwwwwwww"
tt_lib['user_agent']="My Super Twitter App/1.0" # optional
}
. /path/to/twitter-lib.sh
# OPTIONAL: configure logging
# tt_set_log_level DEBUG # valid values: DEBUG, INFO, NOTICE, WARNING], ERROR
# tt_set_logging_enabled 1 # valid values: 0 = logging disabled, anything else = enabled
# tt_set_log_destination file # valid values: file = log to file, stdout = log to stdout (doh!)
# default file: /tmp/tt_YYYY-MM-DD_hh:mm:ss.log
############### Get user information
user_id="123456789"
tt_do_call GET "https://api.twitter.com/1.1/users/show.json" "user_id=${user_id}" "include_entities=false"
if [ $? -ne 0 ]; then
# Error preventing the call from being made
tt_log ERROR Terminating
exit 1
fi
if [ "${tt_lib['last_http_code']}" != "200" ]; then
tt_log ERROR "Error getting user details"
# inspect ${tt_lib['last_http_headers']}, ${tt_lib['last_http_body']} etc
else
user_name=$(jq -r '.name' <<< "${tt_lib['last_http_body']}")
user_screen_name=$(jq -r '.screen_name' <<< "${tt_lib['last_http_body']}")
user_description=$(jq -r '.description' <<< "${tt_lib['last_http_body']}")
user_followers=$(jq -r '.followers_count' <<< "${tt_lib['last_http_body']}")
# etc.
fi
############### Publish a tweet
tweet_text="This is a tweet submitted via the API."
tt_do_call POST "https://api.twitter.com/1.1/statuses/update.json" "status=${tweet_text}"
if [ $? -ne 0 ]; then
# Error preventing the call from being made
tt_log ERROR Terminating
exit 1
fi
if [ "${tt_lib['last_http_code']}" != "200" ]; then
tt_log ERROR "Error submitting tweet"
# inspect ${tt_lib['last_http_headers']}, ${tt_lib['last_http_body']} etc
else
tweet_id=$(jq -r '.id_str' <<< "${tt_lib['last_http_body']}")
# etc.
fi
############### Get user timeline
# Error checking omitted for brevity
user_id="123456789"
tweet_count=100
tt_do_call GET "https://api.twitter.com/1.1/statuses/user_timeline.json" "user_id=${user_id}" "count=${tweet_count}"
# print all tweets
while IFS= read -r tweet; do
jq -r '.text' <<< "$tweet"
echo "----------"
done < <(jq -c '.[]' <<< "${tt_lib['last_http_body']}")
# ...more API calls here...
```