Bot to retrieve tweets from a Twitter feed and post them under a Mastodon account.
Go to file
2022-12-21 09:41:59 +01:00
.gitignore Merge branch 'susbt' 2022-12-11 11:15:50 +01:00
CHANGELOG.md Merge branch 'susbt' 2022-12-11 11:15:50 +01:00
default.toml Added missing default.toml 2022-12-11 22:51:43 +01:00
LICENSE Added database cleanup (untested) 2022-09-15 19:58:17 +02:00
README.md Updated README 2022-12-11 22:54:11 +01:00
twoot.py Removed match for python < 3.10 2022-12-21 09:41:59 +01:00

Twoot

Twoot is a python script that mirrors tweets from a twitter account to a Mastodon account. It is simple to set-up on a local machine, configurable and feature-rich.

UPDATE 11 DEC 2022 VERSION 3.1 HOTFIX

  • Added missing default.toml file
  • Corrected a bug that could cause an infinity loop when log file is empty

VERSION 3.0 brings some important changes and new features:

  • Only potentially breaking change: If you are using a version of python < 3.11 you need to install the tomli module
  • Twoot can be configured with a config file in TOML format. Check default.toml for details
  • Domain susbtitution can be configured in the config file to replace links to Twitter, Youtube and Reddit domains with alternatives (e.g. Nitter, Invidious and teddit respectively)
  • A footer line can be specified in the config file that gets added to all toots (with e.g. tags)
  • Added option to not add reference to "Original tweet" at the bottom of toots
  • A password must be provided with -p on the command-line for the first run only. After that it is no longer required.
  • The verbosity of logging messages can be set in the config file with log_level=.
  • Config file option log_days = specifies how long to keep log messages in file. Older messages are deleted.

Previous updates can be found in CHANGELOG.

Features

  • Fetch timeline of given user from twitter.com (through nitter instance)
  • Scrape html and format tweets for post on mastodon
  • Emojis supported
  • Upload images from tweet to Mastodon
  • Optionally upload videos from tweet to Mastodon
  • Specify maximum age of tweet to be considered
  • Specify minimum delay before considering a tweet for upload
  • Remember tweets already tooted to prevent double posting
  • Optionally post reply-to tweets on the mastodon account
  • Optionally ignore retweets
  • Allows rate-limiting posts to Mastodon instance
  • Removal of redirections (e.g. reveal destination of short URLs)
  • Removal of trackers from URLs
  • Domain substitution for Twitter, Youtube and Reddit domains (e.g. Nitter, Invidious and teddit respectively)
  • Optional footer line to add tags at bottom of toot

Usage

twoot.py [-h] [-f <.toml config file>] [-t <twitter account>] [-i <mastodon instance>]
         [-m <mastodon account>] [-p <mastodon password>] [-r] [-s] [-l] [-u] [-v] [-o]
         [-a <max age in days)>] [-d <min delay (in mins>] [-c <max # of toots to post>]

Arguments

Assuming that the Twitter handle is @SuperDuperBot and the Mastodon account is sd@example.com on instance masto.space:

Switch Description Example Required
-f path of .toml file with configuration SuperDuper.toml No
-t twitter account name without '@' SuperDuper If no config file
-i Mastodon instance domain name masto.space If no config file
-m Mastodon username sd@example.com If no config file
-p Mastodon password my_Sup3r-S4f3*pw Once at first run
-v Upload videos to Mastodon N/A No
-o Do not add "Original tweet" line N/A No
-r Post reply-to tweets (ignored by default) N/A No
-s Skip retweets (posted by default) N/A No
-l Remove link redirections N/A No
-u Remove trackers from URLs N/A No
-a Max. age of tweet to post (in days) 5 No
-d Min. age before posting new tweet (in minutes) 15 No
-c Max number of toots allowed to post (cap) 1 No

Notes

Password

A password must be provided for the first run only. Once twoot has connected successfully to the Mastodon host, an access token is saved in a .secret file named after the mastodon account, and a password is no longer necessary (command-line switch -p is not longer required).

Config file

A default.toml file is provided to be used as template. If -f is used to specify a config file to use, all the other command-line parameters are ignored, except -p (password) if provided.

-l will follow every link included in the tweet and replace them with the url that the resource is directly dowmnloaded from (if applicable). e.g. bit.ly/xxyyyzz -> example.com Every link visit can take up to 5 sec (timeout) therefore this option will slow down tweet processing.

If you are interested by tracker removal (-u) you should also select redirection removal as trackers are often hidden behind the redirection of a short URL.

Uploading videos

When using the -v switch consider:

  • whether the copyright of the content that you want to cross-post allows it
  • the storage / transfer limitations of the Mastodon instance that you are posting to
  • the upstream bandwidth that you may consume on your internet connection

Rate control

Default max age is 1 day. Decimal values are OK.

Default min delay is 0 minutes.

No limitation is applied to the number of toots uploaded if -c is not specified.

Installation

Make sure python3 is installed.

Twoot depends on beautifulsoup4 and Mastodon.py python modules. Additionally, if you are using a version of python < 3.11 you also need to install the tomli module.

Only If you plan to download videos with the -v switch, are the additional dependencies required:

  • Python module youtube-dl2
  • ffmpeg (installed with the package manager of your distribution)
pip install beautifulsoup4 Mastodon.py youtube-dl2

In your user folder, execute git clone https://gitlab.com/jeancf/twoot.git to clone repo with twoot.py script.

Add command line to crontab. For example, to run every 15 minutes starting at minute 1 of every hour and process the tweets posted in the last 5 days but at least 15 minutes ago:

1-59/15 * * * * /path/to/twoot.py -t SuperDuper -i masto.space -m sd@example.com -p my_Sup3r-S4f3*pw -a 5 -d 15

Examples

Twoot is known to be used for the following feeds (older first):

Background

I started twoot when tootbotstopped working. Tootbot relied on RSS feeds from https://twitrss.methat broke when Twitter refreshed their web UI in July 2019.