Files
furry_giffer_bot_mastodon/README.md
2026-01-09 20:41:47 +03:00

149 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# furry_giffer_bot_mastodon
**EN:** A Mastodon mention-bot that replies with animated media from **Furbooru** (Philomena API).
It tries to upload a GIF first (with size fallbacks) and, if your Mastodon instance rejects GIFs (e.g. resolution limits), it automatically converts GIF → **MP4** and uploads that instead.
For NSFW requests it posts with **CW + spoiler** and marks media as sensitive.
Works on **Windows** and Linux.
**RU:** Бот для Mastodon, который отвечает на упоминания и прикрепляет анимированное медиа из **Furbooru** (Philomena API).
Сначала пробует залить GIF (с фолбэком на меньшие версии), а если инстанс отклоняет GIF (например из-за лимитов на разрешение) — автоматически конвертирует GIF → **MP4** и заливает MP4.
Для NSFW-запросов постит с **CW + спойлером** и отмечает медиа как sensitive.
Работает на **Windows** и Linux.
---
## Features / Возможности
- Reply to mentions: `@giffer cute fluffy tail`
- Multi-tag queries: spaces/commas, quotes, negative tags
- `cute fluffy tail``cute, fluffy, tail`
- `"rainbow dash" -gore`
- `nsfw` keyword enables NSFW mode:
- posts with `spoiler_text="NSFW"` and `sensitive=True`
- uses NSFW filter_id if configured
- Furbooru search for **animated GIF** via Philomena API
- Real upload to Mastodon
- Waits for media processing (prevents 422 “processing not finished”)
- GIF upload fallbacks: full → large → medium → small → thumb
- If GIF rejected by instance: **auto-convert to MP4**
- Auto ALT text from Furbooru tags
- Rate-limit protection:
- per-user cooldown
- global token bucket
- Persistent state (prevents replying twice after restart):
- saves last seen notification id + processed status ids
- Logs to console + rotating file
---
## Requirements / Требования
- Python 3.10+ recommended
- Mastodon access token with permission to read notifications & post statuses/media
- Optional: `ffmpeg` (or `imageio-ffmpeg` for bundled ffmpeg)
---
## Install / Установка
### Windows (PowerShell or CMD)
```bat
py -m pip install --upgrade pip
py -m pip install Mastodon.py requests imageio-ffmpeg
````
### Linux/macOS
```bash
python3 -m pip install --upgrade pip
python3 -m pip install Mastodon.py requests imageio-ffmpeg
```
> If you already have system `ffmpeg`, you can skip `imageio-ffmpeg`, but its recommended for Windows.
---
## Configuration / Настройка
Create `config.env` next to the script:
```env
MASTODON_BASE_URL=https://bronyfurry.com
MASTODON_ACCESS_TOKEN=YOUR_TOKEN_HERE
FURBOORU_BASE_URL=https://furbooru.org
# FURBOORU_API_KEY=OPTIONAL
# SAFE_FILTER_ID=OPTIONAL
# NSFW_FILTER_ID=OPTIONAL
# Optional runtime tuning:
CHECK_INTERVAL=30
USER_COOLDOWN_SEC=20
GLOBAL_RATE_PER_SEC=1.0
GLOBAL_BURST=3
LOG_LEVEL=INFO
LOG_FILE=giffer.log
STATE_FILE=giffer_state.json
PROCESSED_CACHE_MAX=800
# Network tuning (Windows-safe defaults):
CONNECT_TIMEOUT=5
READ_TIMEOUT=20
DOWNLOAD_TIMEOUT=40
SOCKET_DEFAULT_TIMEOUT=25
MASTO_CALL_TIMEOUT=25
MEDIA_PROCESS_MAX_WAIT=60
# NSFW posts visibility:
NSFW_VISIBILITY=public
```
---
## Run / Запуск
```bash
python giffer_bot.py
```
The bot will continuously poll mentions and respond.
---
## Usage / Использование
Mention the bot with tags:
* `@giffer cute`
* `@giffer cute fluffy tail`
* `@giffer "rainbow dash" -gore`
* `@giffer nsfw latex`
NSFW mode is triggered if the word `nsfw` is present anywhere in the mention content.
The reply will include an **original source link** (Furbooru page).
---
## Files / Файлы
* `giffer_bot.py` — bot source code
* `config.env` — configuration (not committed)
* `giffer.log` — log file (rotating)
* `giffer_state.json` — saved state to avoid double replies
---
## Notes / Примечания
* If the bot starts replying to old mentions again, make sure `STATE_FILE` is not deleted.
* Some Mastodon instances reject large GIFs. This is expected; the bot will try smaller representations and then MP4 fallback.
---
## License / Лицензия
MIT License