Files
2026-08-06 12:38:23 +00:00

289 lines
6.9 KiB
Markdown

# Signal Spammer Auto-Removal
Automatically removes spammers from your Signal group chats when they message in a designated honeypot group.
## How It Works
1. You have a "honeypot" group that's clearly not for humans (e.g., "AI Bot Testing" or "System Messages")
2. Spammers join all your groups and message in every chat
3. When a spammer messages in the honeypot group, this script detects them
4. The script removes them from **all** groups you admin (except the honeypot)
5. You get a notification about the removal
The spammer never realizes they've been caught - they still see the honeypot group and think everything is working.
## Prerequisites
- **Java 25+** (required by signal-cli 0.14.x)
- **signal-cli 0.14.2+** (has the group member removal fix)
- **Python 3.9+**
- A Signal account registered with signal-cli
## Step 1: Install Java
signal-cli requires Java 25 or newer. Install OpenJDK:
**macOS (Homebrew):**
```bash
brew install openjdk@21
# or for Java 25+:
brew install openjdk
```
**Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install openjdk-21-jdk
```
**Verify:**
```bash
java --version
# Should show 21+
```
## Step 2: Install signal-cli
**Option A: Download release (recommended)**
```bash
# Download latest release (check https://github.com/AsamK/signal-cli/releases for current version)
cd /tmp
wget https://github.com/AsamK/signal-cli/releases/download/v0.14.5/signal-cli-0.14.5-Linux.tar.gz
# Extract
tar xf signal-cli-0.14.5-Linux.tar.gz
# Move to /opt
sudo mv signal-cli-0.14.5 /opt/signal-cli
# Add to PATH
echo 'export PATH="/opt/signal-cli:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
**Option B: macOS with Homebrew**
```bash
brew install signal-cli
```
**Option C: Build from source**
```bash
git clone https://github.com/AsamK/signal-cli.git
cd signal-cli
./gradlew installDist
# Binary will be in build/install/signal-cli/bin/signal-cli
```
## Step 3: Register signal-cli with Your Signal Account
**Important:** You need a phone number that can receive SMS or calls. This can be:
- Your main number (if you want to use your existing account)
- A secondary number (dedicated for this bot)
**Register:**
```bash
# Using your phone number
signal-cli -a +1234567890 register
# You'll receive an SMS with a verification code
signal-cli -a +1234567890 verify CODE_FROM_SMS
```
**Alternative - Link as secondary device:**
If you want to use your existing Signal account as a linked device:
```bash
signal-cli link
# Shows a URI - scan this QR code with your phone's Signal app
# Go to Signal Settings > Linked Devices > Link New Device
```
**Set a PIN (recommended):**
```bash
signal-cli -a +1234567890 setPin YOUR_PIN
```
## Step 4: Start signal-cli Daemon
The script communicates with signal-cli via its JSON-RPC HTTP interface.
```bash
# Start daemon on localhost:8080
signal-cli -a +1234567890 daemon --http=localhost:8080
```
**Keep this running.** You may want to run it as a systemd service:
```bash
# Create systemd service
sudo tee /etc/systemd/system/signal-cli.service << 'EOF'
[Unit]
Description=Signal CLI Daemon
After=network.target
[Service]
Type=simple
User=YOUR_USERNAME
ExecStart=/opt/signal-cli/bin/signal-cli -a +1234567890 daemon --http=localhost:8080
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Enable and start
sudo systemctl daemon-reload
sudo systemctl enable signal-cli
sudo systemctl start signal-cli
# Check status
sudo systemctl status signal-cli
```
## Step 5: Get Your Honeypot Group ID
1. Create the honeypot group in Signal (app or signal-cli)
2. Get the group's base64 ID:
```bash
signal-cli -a +1234567890 listGroups --output=json | jq '.[] | select(.name=="YOUR_HONEYPOT_GROUP_NAME") | .id'
```
Or list all groups:
```bash
signal-cli -a +1234567890 listGroups --output=json | jq '.[] | {name, id}'
```
## Step 6: Install Python Dependencies
```bash
cd /path/to/this/project
pip install -r requirements.txt
```
## Step 7: Configure
Edit `config.json`:
```json
{
"signal_cli_endpoint": "http://localhost:8080",
"account": "+1234567890",
"honeypot_group_id": "BASE64_GROUP_ID_FROM_STEP_5",
"notify_self_number": "+1234567890",
"excluded_groups": [],
"banned_list_path": "banned.json",
"log_file": "spam_remover.log"
}
```
**Configuration options:**
| Field | Description |
|-------|-------------|
| `signal_cli_endpoint` | URL where signal-cli daemon is running |
| `account` | Your signal-cli registered phone number |
| `honeypot_group_id` | Base64 ID of the honeypot group |
| `notify_self_number` | Phone number to receive removal notifications |
| `excluded_groups` | List of group IDs to never remove from (besides honeypot) |
| `banned_list_path` | Path to store banned spammers list |
| `log_file` | Path to log file |
## Step 8: Run
**Daemon mode (recommended):**
```bash
python spam_remover.py
```
This runs continuously, listening for messages in the honeypot group.
**Manual ban:**
```bash
python spam_remover.py --ban +1987654321
```
**Dry run (preview):**
```bash
python spam_remover.py --dry-run
```
**List banned:**
```bash
python spam_remover.py --list-banned
```
**Single check:**
```bash
python spam_remover.py --once
```
## Running as a Service
Create a systemd service for the spam remover:
```bash
sudo tee /etc/systemd/system/spam-remover.service << 'EOF'
[Unit]
Description=Signal Spammer Auto-Remover
After=network.target signal-cli.service
Requires=signal-cli.service
[Service]
Type=simple
User=YOUR_USERNAME
WorkingDirectory=/path/to/this/project
ExecStart=/usr/bin/python3 spam_remover.py
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable spam-remover
sudo systemctl start spam-remover
```
## Files Created
| File | Description |
|------|-------------|
| `spam_remover.py` | Main script |
| `config.json` | Configuration |
| `requirements.txt` | Python dependencies |
| `banned.json` | Auto-created, stores banned spammers |
| `spam_remover.log` | Auto-created, application logs |
## Troubleshooting
**signal-cli not connecting:**
```bash
# Check if daemon is running
curl http://localhost:8080/api/v1/check
# Check signal-cli status
systemctl status signal-cli
```
**Permission errors:**
- Ensure your account is admin of the groups you want to manage
- signal-cli can only remove members from groups where you have admin privileges
**Rate limiting:**
- Signal may rate-limit if you remove too many people too fast
- The script handles this automatically with retries
**Groups not showing:**
- Run `signal-cli -a +1234567890 listGroups` to verify groups are synced
- You may need to link your device first to sync existing groups
## Security Notes
- The honeypot group should look legitimate enough that spammers join but obvious enough that real users don't
- The `banned.json` file contains phone numbers - protect this file
- signal-cli registration requires a real phone number for SMS verification
- Running as a linked device means your primary device must stay online