149 lines
4.2 KiB
Markdown
149 lines
4.2 KiB
Markdown
# 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 it’s 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
|