A Twitter to Mastodon copy bot written in Rust It: * copies the content (text) of the original Tweet * dereferences the links * gets every attach media (photo, video or gif) If any of the last steps failed, the Toot gets published with the exact same text as the Tweet. # Usage First up, create a configuration file (default path is `/usr/local/etc/scootaloo.toml`). It will look like this: ``` [scootaloo] last_tweet_path="/usr/local/etc/last_tweet" ## file containing the last tweet id received, must be writable cache_path="/tmp/scootaloo" ## a dir where the temporary files will be download, must be writeable [twitter] username="NintendojoFR" ## User Timeline to copy ## Consumer/Access key for Twitter (can be generated at https://developer.twitter.com/en/apps) consumer_key="MYCONSUMERKEY" consumer_secret="MYCONSUMERSECRET" access_key="MYACCESSKEY" access_secret="MYACCESSSECRET" ``` Then run the command with the `register` subcommand: ``` scootaloo register --host https://m.nintendojo.fr ``` This will give you the end of the TOML file. It will look like this: ``` [mastodon] base = "https://m.nintendojo.fr" client_id = "MYCLIENTID" client_secret = "MYCLIENTSECRET" redirect = "urn:ietf:wg:oauth:2.0:oob" token = "MYTOKEN" ``` You can then run the application via `cron` for example. Here is the generic usage: ``` USAGE: scootaloo [OPTIONS] [SUBCOMMAND] FLAGS: -h, --help Prints help information -V, --version Prints version information OPTIONS: -c, --config TOML config file for scootaloo (default /usr/local/etc/scootaloo.toml) SUBCOMMANDS: help Prints this message or the help of the given subcommand(s) register Command to register to a Mastodon Instance ``` # Quirks Scootaloo does not respect the spam limits imposed by Mastodon: it will make a 429 error if too much Tweets are converted to Toots in a short amount of time (and it will not recover from it). By default, it gets the last 200 tweets from the user timeline (which is a lot!). It is recommended to put a Tweet number into the `last_tweet` file before copying an old account. Oh and everything is sync (and not async) so this does not run at a blazing speed…