diff --git a/README.md b/README.md new file mode 100644 index 0000000..46c8df1 --- /dev/null +++ b/README.md @@ -0,0 +1,163 @@ +# Readme +Danbooru Bot is a customizable, no frills image-posting bot for Pleroma. + +A live example can be viewed at [GNU/Yandere](https://yandere.cc/YandereLewdBot). + +Currently the bot will only run on Linux. I believe it should run on most distros but I have only tested it on Arch and Raspbian. + +## About +Danbooru Bot is designed to be simple to understand (from a technical perspective) and easy to modify/extend. It relies on GNU formatted hash files to configure and organize posts (from the GNU coreutils package): + +Danbooru Bot is licensed under GPLv3. See [LICENSE.txt](./LICENSE.txt). + +The bot is still in development and can easily be crashed by writing a poorly configured `cfg.py` file. It may also crash with encoding errors for files with non-unicode filenames. + +## Installing +To setup the python3 environment (for Arch Linux) run the following commands: +``` +sudo pacman -Syu +sudo pacman -S --needed python git +git clone 'https://git.yandere.cc/Anon/DanbooruBot.git' +cd DanbooruBot/ +python -m venv venv +source venv/bin/activate +pip install --upgrade pip +pip install -r requirements.txt +deactivate +cp -vn default/cfg.py src/ +./run.sh -h +``` +If everything worked correctly you should see usage information on Danbooru Bot. + +The ./run.sh file will automatically activate and deactivate the python virtual environment. You may want add a symlink to `/usr/local/bin` for convenience. + +``` +sudo ln -s "$(pwd)/run.sh" "/usr/local/bin/danbooruBot" +danbooruBot -h +``` + +For Debian or Ubuntu based distros I believe you need to change python with python3 for the package and command name `¯\_(ツ)_/¯` + +## Generating your OAuth Tokens +Before you can begin posting from the bot, you must first create an account on the instance of your choice, and then generate your OAuth tokens. + +To generate your tokens, run the following commands and follow the interactive prompts. +``` +cd .. +git clone 'https://git.yandere.cc/Anon/CreatePleromaApp.git' +ln -s "$(pwd)"/DanbooruBot/venv CreatePleromaApp/venv +ln -s "$(pwd)"/DanbooruBot/src/cfg.py CreatePleromaApp/src/cfg.py +cd CreatePleromaApp/ +./run.sh -c cfg +# Follow the interactive prompts. +``` + + +If you did everything correctly you should see `Success! :)` at the end of the terminal, as well as your credentials in the format below: +```text +settings_server = OrderedDict([ + "app_name": "app", + "api_base_url": "https://yandere.cc", + "client_id": "Long String of Text", + "client_secret": "Long String of Text", + "access_token": "Long String of Text" +]) + +settings_reminder = "09/20/2020 02:58PM" + +settings_encrypt = { + "encrypt": False, + "salt": "", +} +``` +If you used encryption, everything in the `settings_server` dictionary will be encrypted and you will have to enter your password every time you start the bot. Copy and paste these values from the terminal into your `src/cfg.py` file. **Make sure you paste over or delete the placeholder values with the same names.** + + +## Danbooru credentials +If you have an account with Danbooru, you can enter it below the `danbooru_backend` dictionary. It is not necessary to have an account unless you want to post images that are censored by default. + + +## Posting +To begin posting: + +- Start the bot with `./run.sh` + - Enter your password if you encrypted your OAuth tokens. + - If you symlinked the file in the [Installing](#installing) section you can simply run `danbooruBot` instead of changing directories and starting the bot with `./run.sh` +- If everything worked correctly, you should see your first image posted to your account. +- Hit Ctrl+C to stop the bot. +- Keep in mind that the bot's default visibility setting is set to unlisted for testing. You may want to update it to public. +- Read [docs/configuration.md](./docs/configuration.md) to customize the bot for your purposes. + +# Donate +XMR: 493HynLQA4z71b3j9ZDXRNQudpdFW8GxeBGD8ahRctKn97RRurMVd35DqVqdAdjv68TcXTJWUwm6ee81ujDXGcmtKFixwQk + +BAT: [Basic Attention Token](https://basicattentiontoken.org/) + +# Useful Tips +## Installing Screen +Most likely, you will want this bot to run over a long period of time. It is probably best to install the `screen` package for your distro so you don't have to have a terminal window constantly open (especially if you are running it from a remote machine such as a Raspberry Pi or server). +``` +sudo pacman -Syu +sudo pacman -S --needed screen + +# Screen cheatsheet +# To create a new screen session named 'danbooruBot' +screen -S danbooruBot +# To detach from the screen session +Ctrl+a d +# To reconnect to the screen session +screen -r danbooruBot +# List screen sessions +screen -ls +# Kill the screen session +Ctrl+a k y +# Scroll back +Ctrl+a ESC Page Up +# Cancel scroll back +ESC +``` + +## Quickly Create Configuration Files +Configuration files for Danbooru Bot are just python files. Because of this we can easily create multiple configurations by importing the main configuration file, and overriding the values we need. This is useful for creating holiday and debug configurations without needing to create a new configuration file from scratch. +``` +# Name: alt.py +# Post to an alt account using the exact same settings as the main configuration file +# Run with the following command: ./run.sh -c alt + +# cfg.py is the default configuration. +from cfg import * + +settings_server = OrderedDict([ + ("app_name", "generate from ./bin/create_app.py"), + ("api_base_url", "generate from ./bin/create_app.py"), + ("client_id", "generate from ./bin/create_app.py"), + ("client_secret", "generate from ./bin/create_app.py"), + ("access_token", "generate from ./bin/create_app.py") +]) + +settings_reminder = "generate from ./bin/create_app.py" + +settings_encrypt = { + "encrypt": False, + "salt": "generate from ./bin/create_app.py" +} + +# Uncommenting the below might be useful if your alt is used for debugging and testing +# settings_behavior["visibility"] = "private" +# settings_behavior["debug"] = True +``` + +``` +# Name: xmas.py +# An xmas themed config file! +# Run with the following command: ./run.sh -c xmas + +# cfg.py is the default configuration. +from cfg import * + +# Prepend '#Merry #Christmas' to the beginning of the first line in each post +for setting in settings_post: + if len(setting["message"]) and issubclass(type(setting["message"][0]), str): + new_msg = "#Merry #Christmas {}".format(setting["message"][0]) + setting["message"] = (new_msg,) + setting["message"][1:] +``` diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..1aea9d4 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,100 @@ +# Configuration +Danbooru Bot uses regular python files to configure posts. The default configuration is `cfg.py` + +Included in the file is a [helper function](#setting_post) to quickly configure posts. These are located at the top of the configuration file. + +Below is a detailed description of each parameter in the configuration file. + +## setting_server +Paste the generated credentials from `create_app.py` in the fields below. + +**`app_name:`** The name of the application. + +**`api_base_url:`** The URL of the instance. + +**`client_id:`** The client ID generated by `create_app.py` + +**`client_secret:`** The client secret generated by `create_app.py` + +**`access_token:`** The client token generated by `create_app.py` + +**NOTE:** If you enabled encryption when generating your tokens, the above should be long strings of seemingly incoherent text. + +## settings_reminder +A setting to remind the user to regenerate their OAuth tokens + +**`settings_reminder:`** A date and time, formatted as `settings_time["long_date_format"]`. Used to remind the user to regenerate their OAuth tokens. + +## settings_encrypt +Paste the generated credentials from `create_app.py` in the fields below. + +**`encrypt:`** If encryption is enabled this should be set to `True` + +**`salt:`** The salt value generated by `create_app.py` + +## settings_credentials +If a back end supports or requires an account to use their api, the credentials for your account input here, and used by the back end. This is not required unless you have a premium account from Danbooru. + +## settings_behavior +This is the main configuration setting for the bot. + +**`max_size:`** (Not implemented yet) The max upload size (in bytes). Files that are over will be excluded from posting. Set this to `None` if there is no limit (not recommended). If you find that the bot is continuously attempting to repost a post that is failing, and the connection is timing out, it usually signifies that you are attempting to upload a large file over a slow connection and getting dropped from the server. Reducing this value should fix the issue. + +**`visibility:`** The visibility of the post ('public', 'unlisted', 'private', or 'direct'). + +**`feature_set:`** The feature set of the instance you are connecting to ('mainline', 'fedibird', or 'pleroma'). **This bot has only been tested with 'pleroma'.** + +**`sleep_seconds:`** The time between posts (in seconds) + +**`uploads_per_post:`** The number of times the bot should post after `sleep_seconds` + +**`retry_seconds:`** The time the bot should wait before attempting to re-upload a post that failed (in seconds). This value is ignored if the bot experiences a FileNotFoundError (the file was deleted after the bot was started) or encounters a 413 error (file upload size is too large). In either of the two cases the bot will continue posting the next image in the list. + +**`content_type:`** The content type of the post ('text/plain' (default), 'text/markdown', 'text/html', 'text/bbcode'). **This bot has only been tested with `'text/plain'` and `'text/markdown'`**. + +**`content_newline:`** The newline character or string. This will be inserted between each line in the message. If `content_type` is `'text/plain'`, this value should be `'\n'`. If `content_type` is `'text/markdown'` you may need to experiment. On some instances the default `'\n'` works, on others you may need to change this to `'
'`. + +**`post_image_link:`** If set to `True` this will insert a direct media link at the end of the message for each media file uploaded. If `content_type` is `'text\markdown'` it will make the link actionable, otherwise it will simply be a plain text html link. Some instances add this link automatically, in which case this should be set to `False`. See `content_newline` and `content_type` to correctly configure actionable links. + +**`post_random:`** Shuffle all items in `master_list` so that they post in random order. + +**`tmp_dir:`** The temporary directory to use if `atomic_saving` is set to `True`. The default location is `/tmp`. + +**`debug:`** Set this to true for testing. This will prevent Danbooru Bot from logging into the mastodon instance and asking for your encryption password (meaning that nothing will actually get posted to your account, but it will still do everything else). + +## settings_time +Time localization settings. + +**`time_format:`** This is used to schedule posts using the `-t` switch. Referenced in `set_pretimer_hour()` + +**`time_format_seconds:`** Unused. Should be the same as `time_format` but with a resolution in seconds. + +**`date_format:`** This is used to schedule posts using the `-d` switch. Referenced in `set_pretimer_day()` + +**`long_date_format:`** Time and date format. `settings_encrypt["reminder"]` Should be in this format. Referenced in `print_header_stats()` and `_sanity_warnings()` + +**`long_date_seconds_format:`** Unused. Should be the same as `long_date_format` but with a resolution in seconds. + +**`long_date_week:`** The same as `long_date_format` but with the day of the week specified. Referenced in `print_header_stats()` + +## settings_post +Configure Danbooru Bot profiles. Use the `setup_profile()` function to set profiles up in a single line. + +# Setting Up Profiles +Each profile in `settings_post` contains a dictionary with the below keywords. Use the `setup_profile()` function with the same parameter names to setup posts in a single line. + +Below is an explanation of each keyword: + +* **`name:`** String value. The name of the profile. This is mainly used to help you identify what profile is being applied to posts. This information is printed by the bot, but is otherwise unused. + +* **`backend`** String value. The backend to use to download images. See danbooru_backend.py for an example. + +* **`banned_tags:`** Tuple of strings. Posts that contain these tags will not be uploaded. + +* **`tags:`** String value. Tags for the bot to search for. **NOTE:** Danbooru will only search for a single tag at a time. Adding more will cause the post to fail, and the bot to skip over it. + +* **`message:`** String value. The body of the post when a *safe* image is selected. + +* **`message_nsfw:`** String value. The body of the post when a *nsfw* image is selected. + +* **`force_nsfw:`**: If set to `True`, the profile will only post nsfw images. If set to `False` only safe images will be selected. If set to `None` the bot could post either safe or nsfw images.