2018-03-11 21:05:25 +00:00
### description
2020-06-29 07:11:47 +00:00
![Node.js CI ](https://github.com/yogthos/mastodon-bot/workflows/Node.js%20CI/badge.svg )
2018-03-20 12:57:25 +00:00
the bot will post the timeline from the specified Twitter/Tumblr accounts and RSS feeds to Mastodon
2018-03-11 21:05:25 +00:00
2020-11-06 18:06:52 +00:00
[![NPM ](https://nodei.co/npm/mastodon-bot.png?compact=true )](https://www.npmjs.com/package/mastodon-bot)
2018-03-11 21:05:25 +00:00
### installation
2020-06-29 17:42:44 +00:00
1. prerequisits: should be installed: [Node.js ](https://nodejs.org/en/ ), npm
2. install mastodon-bot with: `sudo npm install mastodon-bot -g`
2020-12-29 22:00:42 +00:00
3. run with: `mastodon-bot <path to config>`
2020-06-29 16:47:55 +00:00
2018-03-11 21:05:25 +00:00
### usage
* create a Mastodon API key following the instructions [here ](https://tinysubversions.com/notes/mastodon-bot/ )
2019-11-29 11:25:03 +00:00
* create a Twitter API key following the instructions [here ](https://developer.twitter.com/en/docs/basics/authentication/guides/access-tokens )
2018-03-15 05:01:53 +00:00
* create a Tumblr API key following the instructions [here ](http://www.developerdrive.com/2014/05/how-to-get-started-with-the-tumblr-api-part-1/ )
2018-03-11 21:05:25 +00:00
* create a file called `config.edn` with the following contents:
2020-06-09 06:18:15 +00:00
**NOTE**: the bot checks the specified Mastodon account to see the timestamp of the last post, and only posts content
2018-11-21 06:05:47 +00:00
with later timestamps to avoid duplicate posts. On the first run the timestamp will default to current time.
2018-03-11 21:05:25 +00:00
```clojure
2020-05-30 15:14:49 +00:00
{:auth {;; add Twitter config to mirror Twitter accounts
:twitter {:consumer_key "XXXX"
:consumer_secret "XXXX"
:access_token_key "XXXX"
:access_token_secret "XXXX"}
:mastodon {:access_token "XXXX"
;; account number you see when you log in and go to your profile
;; e.g: https://mastodon.social/web/accounts/294795
:account-id "XXXX"
2020-06-08 17:47:04 +00:00
:api_url "https://botsin.space/api/v1/"}
:tumblr {:consumer_key "XXXX"
:consumer_secret "XXXX"
:token "XXXX"
:token_secret "XXXX"}}
2020-05-30 15:14:49 +00:00
2020-06-08 17:47:04 +00:00
:transform [{:source {:source-type :twitter
2020-05-29 13:54:32 +00:00
;; optional, defaults to false
:include-replies? false
;; optional, defaults to false
:include-rts? false
2020-05-29 20:16:23 +00:00
;; Replace Twitter links by Nitter
:nitter-urls? false
2020-05-29 13:54:32 +00:00
;; accounts you wish to mirror
:accounts ["arstechnica" "WIRED"]}
2020-06-08 18:44:25 +00:00
:target {:target-type :mastodon
2020-05-29 18:12:37 +00:00
;; optional flag specifying wether the name of the account
;; will be appended in the post, defaults to false
:append-screen-name? false
2020-05-29 19:13:43 +00:00
;; optional visibility flag: direct, private, unlisted, public
;; defaults to public
:visibility "unlisted"
2020-06-26 15:48:09 +00:00
;; optional boolean to mark content as sensitive. Defaults to true.
2020-05-29 19:19:43 +00:00
:sensitive? true
2020-05-29 19:32:41 +00:00
;; optional boolean defaults to false
;; only sources containing media will be posted when set to true
:media-only? true
2020-06-26 15:48:09 +00:00
;; optional limit for the post length. Defaults to 300.
2020-05-29 19:32:41 +00:00
:max-post-length 300
2020-06-26 15:48:09 +00:00
;; optional signature for posts. Defaults to "not present".
2020-05-29 21:31:11 +00:00
:signature "#newsbot"}
;; optionally try to resolve URLs in posts to skip URL shorteners
;; defaults to false
2020-05-30 12:49:47 +00:00
:resolve-urls? true
;; optional content filter regexes
;; any posts matching the regexes will be filtered out
:content-filters [".*bannedsite.*"]
;; optional keyword filter regexes
;; any posts not matching the regexes will be filtered out
2020-05-30 13:07:11 +00:00
:keyword-filters [".*clojure.*"]
2020-06-27 09:16:47 +00:00
;; optional replacements
;; When the strings on the left side of this map are encountered in the source,
;; they are replaced with the string on the right side of the map:
:replacements {
"@openSUSE" "@opensuse@fosstodon.org",
"@conservancy" "@conservancy@mastodon.technology"}}
2020-05-31 17:59:20 +00:00
2020-06-08 17:47:04 +00:00
{:source {:source-type :rss
2020-05-31 17:59:20 +00:00
;; add RSS config to follow feeds
:feeds [["Hacker News" "https://hnrss.org/newest"]
["r/Clojure" "https://www.reddit.com/r/clojure/.rss"]]}
2020-06-08 18:44:25 +00:00
:target {:target-type :mastodon
2020-06-08 17:47:04 +00:00
...}
:resolve-urls? ...}
{:source {:source-type :tumblr
;; optional limit for number of posts to retrieve, default: 5
:limit 10
:accounts ["cyberpunky.tumblr.com" "scipunk.tumblr.com"]
2020-06-08 18:44:25 +00:00
:target {:target-type :mastodon
2020-05-31 17:59:20 +00:00
...}
2020-06-08 18:44:25 +00:00
:resolve-urls? ...}}
2020-05-31 17:59:20 +00:00
]
2020-05-29 13:54:32 +00:00
}
2018-03-11 21:05:25 +00:00
```
2018-03-15 05:01:53 +00:00
2018-03-11 21:05:25 +00:00
* the bot looks for `config.edn` at its relative path by default, an alternative location can be specified either using the `MASTODON_BOT_CONFIG` environment variable or passing the path to config as an argument
2020-06-09 06:18:15 +00:00
* transformations have source `(s/def ::source-type #{:twitter :rss :tumblr})` und target `(s/def ::target-type #{:mastodon})` you can combine freely. Multiple transformations for same source-target combination are possible. Source and targets refer to the auth section for their credentials.
2020-12-29 22:00:42 +00:00
* install NPM modules: `npm install`
2020-06-27 17:51:48 +00:00
* compile: `npx shadow-cljs release app`
2020-02-27 22:12:07 +00:00
* run the bot: `npm start`
2018-03-11 21:05:25 +00:00
* to poll at intervals setup a cron job such as:
2020-02-27 22:12:07 +00:00
*/30 * * * * npm start /path/to/config.edn > /dev/null 2>& 1
2018-03-25 21:23:09 +00:00
## License
Copyright © 2018 Dmitri Sotnikov
Distributed under the [MIT License ](http://opensource.org/licenses/MIT ).