Co-authored-by: funkemunky <30784509+funkemunky@users.noreply.github.com>
9.4 KiB
Webhook Integration Guide
This document explains how to configure and use the webhook feature in AntiVPN to receive notifications when a player is detected using a VPN.
Overview
When a player is detected using a VPN or connecting from a blocked country, AntiVPN can send an HTTP POST request to a configured webhook URL with detailed information about the detection. AntiVPN supports Discord, Slack, and generic webhook formats.
Configuration
Add the following configuration to your config.yml:
webhooks:
# Enable/disable webhook notifications
enabled: false
# The webhook URL to send POST requests to when a VPN is detected
url: ''
# Webhook format type: 'discord', 'slack', or 'generic'
# - discord: Formats payload for Discord webhooks with rich embeds (default)
# - slack: Formats payload for Slack webhooks
# - generic: Sends raw JSON payload (for custom integrations)
format: 'discord'
# Optional: Set to true to include authentication header (Authorization: Bearer <token>)
useAuthentication: false
# The authentication token to use when useAuthentication is true
# Security Note: Token is stored in plaintext. Ensure proper file permissions on this file.
authToken: ''
# Timeout in seconds for webhook requests (default: 5)
timeout: 5
Configuration Options
- enabled: Set to
trueto enable webhook notifications - url: The complete URL where webhook POST requests will be sent
- format: The webhook format type (
discord,slack, orgeneric) - useAuthentication: Set to
trueto include anAuthorization: Bearer <token>header - authToken: The authentication token to use (only used when
useAuthenticationis true) - timeout: Connection and read timeout in seconds (default: 5)
Webhook Formats
Discord Format (format: 'discord')
Discord webhooks receive rich embeds with color-coded alerts and organized fields. This is the recommended and default format for Discord webhooks.
Example Discord Payload:
{
"embeds": [{
"title": "🚫 VPN/Proxy Detection",
"description": "A player attempted to join using a VPN/proxy or from a blocked country.",
"color": 15158332,
"fields": [
{
"name": "Player",
"value": "ExamplePlayer",
"inline": true
},
{
"name": "UUID",
"value": "550e8400-e29b-41d4-a716-446655440000",
"inline": true
},
{
"name": "IP Address",
"value": "192.0.2.1",
"inline": true
},
{
"name": "Country",
"value": "United States (US)",
"inline": true
},
{
"name": "City",
"value": "New York",
"inline": true
},
{
"name": "ISP",
"value": "Example ISP",
"inline": true
},
{
"name": "ASN",
"value": "AS12345",
"inline": true
},
{
"name": "Detection Method",
"value": "Blacklist",
"inline": true
},
{
"name": "Proxy Status",
"value": "✓ Detected",
"inline": true
}
],
"timestamp": "2024-02-04T12:00:00.000Z",
"footer": {
"text": "AntiVPN Detection System"
}
}]
}
Features:
- Color coding: Red for proxy detections, Orange for country blocks
- Rich embeds with organized fields
- Timestamp included
- All detection information in one message
Slack Format (format: 'slack')
Slack webhooks receive simple text messages with Slack markdown formatting.
Example Slack Payload:
{
"text": "*VPN/Proxy Detection Alert*\nPlayer: ExamplePlayer\nIP: 192.0.2.1\nCountry: United States (US)\nCity: New York\nISP: Example ISP\nMethod: Blacklist\n"
}
Features:
- Simple text format with markdown
- All essential information included
- Works with standard Slack incoming webhooks
Generic Format (format: 'generic')
Generic webhooks receive the raw JSON structure for custom integrations.
Example Generic Payload:
{
"event": "vpn_detected",
"timestamp": 1707022000000,
"resultType": "DENIED_PROXY",
"player": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "ExamplePlayer",
"ip": "192.0.2.1"
},
"detection": {
"isProxy": true,
"countryCode": "US",
"countryName": "United States",
"city": "New York",
"isp": "Example ISP",
"asn": "AS12345",
"method": "Blacklist"
}
}
Features:
- Complete JSON structure
- All fields included
- Best for custom backend integrations
Payload Field Reference (Generic Format)
- event: Always set to
"vpn_detected" - timestamp: Unix timestamp in milliseconds when the detection occurred
- resultType: The type of detection result. Possible values:
"DENIED_PROXY": Player is using a VPN/proxy"DENIED_COUNTRY": Player is connecting from a blocked country
- player: Player information
- uuid: Player's Minecraft UUID
- name: Player's username
- ip: Player's IP address
- detection: VPN detection details
- isProxy: Boolean indicating if a VPN/proxy was detected
- countryCode: ISO country code (e.g., "US", "GB")
- countryName: Full country name
- city: City name
- isp: Internet Service Provider name
- asn: Autonomous System Number
- method: Detection method used (e.g., "Blacklist", "Datacenter")
Example Configurations
Discord Webhook
webhooks:
enabled: true
url: 'https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN'
format: 'discord'
useAuthentication: false
authToken: ''
timeout: 5
Note: With format: 'discord', AntiVPN will automatically format the webhook payload with rich embeds that Discord understands natively. No proxy service is needed!
Slack Webhook
webhooks:
enabled: true
url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
format: 'slack'
useAuthentication: false
authToken: ''
timeout: 5
Custom Backend with Authentication
webhooks:
enabled: true
url: 'https://your-server.com/api/vpn-alerts'
format: 'generic'
useAuthentication: true
authToken: 'your-secret-token-here'
timeout: 10
Local Development Server
webhooks:
enabled: true
url: 'http://localhost:8080/webhooks/vpn'
format: 'generic'
useAuthentication: false
authToken: ''
timeout: 5
Testing Your Webhook
Using the Test Server
A simple Python test server is available to verify webhook functionality:
#!/usr/bin/env python3
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime
class WebhookHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers.get('Content-Length', 0))
body = self.rfile.read(content_length).decode('utf-8')
print(f"\nWebhook received at {datetime.now().isoformat()}")
print("Payload:", json.dumps(json.loads(body), indent=2))
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(b'{"status": "received"}')
if __name__ == '__main__':
server = HTTPServer(('localhost', 8080), WebhookHandler)
print("Test server running on http://localhost:8080")
server.serve_forever()
- Save the above script as
test_server.py - Run it:
python3 test_server.py - Configure AntiVPN to use
http://localhost:8080as the webhook URL - The server will display incoming webhooks in the console
Security Considerations
- HTTPS: Always use HTTPS URLs in production to encrypt webhook data in transit
- Authentication: Enable authentication to prevent unauthorized webhook receivers from impersonating your endpoint
- Token Storage: The authentication token is stored in plaintext in
config.yml. Ensure proper file system permissions (e.g.,chmod 600 config.yml) - IP Whitelisting: Consider implementing IP whitelisting on your webhook endpoint to only accept requests from your Minecraft server
- Rate Limiting: Implement rate limiting on your webhook endpoint to prevent abuse
Troubleshooting
Webhook Not Firing
- Verify
enabled: truein configuration - Check that
urlis properly set and accessible - Look for error messages in server logs
- Verify network connectivity from your Minecraft server to the webhook URL
Authentication Failures
- Verify
useAuthenticationandauthTokenare properly configured - Check that your webhook endpoint expects the
Authorization: Bearer <token>header format - Review webhook endpoint logs for authentication errors
Timeout Errors
- Increase the
timeoutvalue in configuration - Verify your webhook endpoint responds quickly (within timeout period)
- Check network latency between Minecraft server and webhook endpoint
Common Use Cases
Log Aggregation
Send webhook data to a log aggregation service like Splunk, ELK, or Datadog for analysis and alerting.
Discord/Slack Notifications
Use a webhook proxy service to format and forward alerts to Discord or Slack channels.
Automated Banning
Integrate with your server management system to automatically apply additional penalties to detected players.
Analytics
Store webhook data in a database for analytics on VPN usage patterns, geographic distribution, and ISP trends.
Compliance Logging
Maintain an audit trail of VPN detections for compliance and security purposes.