Files
signal-bot/README.md
T
james 3e3aba4157 Add Reddit video support
Reddit links now download and post like the other platforms.

Two changes were needed, not just the URL pattern:

- Regex: yt-dlp's Reddit extractor only matches /comments/ permalinks, so
  the app's /r/<sub>/s/<code> share links and redd.it / v.redd.it
  shortlinks are listed explicitly — they redirect to the canonical URL,
  which yt-dlp follows. Without them the link is silently dropped.

- Format selector: Reddit publishes video and audio as separate DASH/HLS
  streams with no muxed rendition, so every `best...` term failed and
  yt-dlp aborted with "Requested format is not available". Added a
  bv*+ba merge tail (and a bare bv* for silent videos) to the normal and
  /force selectors. Muxed hosts still resolve at the earlier terms, so
  YouTube/IG/TikTok/X selection is unchanged.

Posts with no video report "No media found", already in the silent list,
so ordinary Reddit links shared in chat draw no reply.
2026-08-14 05:00:16 -04:00

77 lines
3.4 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.
# signal-bot
A Signal group-chat bot that grabs videos from links people post (X/Twitter,
Instagram, YouTube, TikTok, Reddit) and posts them back into the chat, plus a
couple of toys for messing with the last video.
## What it does
- **Auto-download** — watches every group message for a supported link and
replies with the video. Powered by [yt-dlp](https://github.com/yt-dlp/yt-dlp).
Videos over 100 MB are auto re-encoded with ffmpeg to fit.
- **`/speed [n]`** — re-posts the last video sped up `n`× (default 2×), pitch-shifted
like tape. e.g. `/speed 4`, `/speed 0.5`.
- **`/rev`** — re-posts the last video reversed (audio too).
- **`/cookies`** (DM, admins only) — paste exported `.instagram.com` cookie lines
to refresh Instagram auth without touching the server.
Supported links: `x.com` / `twitter.com` (and `fxtwitter`/`vxtwitter`/`fixupx`
wrappers), `instagram.com/reel|p`, `youtube.com` / `youtu.be` / Shorts, TikTok,
and Reddit (`/comments/` permalinks, `/s/` app share links, `redd.it` and
`v.redd.it` shortlinks). Reddit posts with no video stay silent.
## How it's wired
```
Signal ──► signal-cli-rest-api (json-rpc, :8080) ──► bot.py (signalbot lib)
[docker-compose.yml] [systemd service]
│
yt-dlp + ffmpeg + cookies.txt
```
- `bot.py` connects to a [signal-cli-rest-api](https://github.com/bbernhard/signal-cli-rest-api)
daemon over a websocket in `json-rpc` mode.
- `docker-compose.yml` runs that daemon; the linked-account data lives in a
`./signal-cli-data` volume (gitignored — it holds private keys).
- `signal-bot.service.example` is the systemd unit that runs `bot.py`.
## Setup
1. **Run signal-cli-rest-api and link it as a device** to your Signal account:
```
docker compose up -d
```
Then link via the QR at `http://127.0.0.1:8080/v1/qrcodelink?device_name=bot`
(scan from Signal → Settings → Linked devices). Keep signal-cli up to date —
an out-of-date signal-cli silently stops receiving messages when Signal
changes its server protocol (`getServerGuid must not be null` in the logs);
`docker compose pull && docker compose up -d` fixes it.
2. **Python env:**
```
python3 -m venv venv
venv/bin/pip install -r requirements.txt
```
YouTube also needs **Node >= 22** on PATH (for `yt-dlp-ejs`'s challenge
solver). If your distro only ships an older Node, install a standalone Node 22+
and point `bot.py`'s `_NODE22` at it. Note: YouTube cookies are deliberately
withheld (`_cookie_args`) — sending account cookies forces yt-dlp onto a player
client whose media URLs 403; cookieless YouTube requests work.
3. **Cookies:** copy `cookies.txt.example` to `cookies.txt` and fill in real
exported cookies for the sites you want auth'd. (gitignored)
4. **Service:** copy `signal-bot.service.example` to `signal-bot.service`, set
your user / phone number / paths, install it:
```
sudo cp signal-bot.service /etc/systemd/system/
sudo systemctl enable --now signal-bot
```
## Notes
- The bot only acts in **group** chats (except `/cookies`, which is DM-only).
- Reply-targeting (e.g. "speed up *this* video") was intentionally dropped:
Signal Desktop strips quote metadata from synced transcripts, so `/speed` and
`/rev` always act on the last video seen in the group.