Added Mullvad_Account_Expiry_Notifier project
This commit is contained in:
parent
e7b97e1b5a
commit
e76649adad
63
Mullvad/Mullvad_Account_Expiry_Notifier/README.md
Normal file
63
Mullvad/Mullvad_Account_Expiry_Notifier/README.md
Normal file
@ -0,0 +1,63 @@
|
||||
# Mullvad Account Expiry Notifier
|
||||
|
||||
## # Features
|
||||
|
||||
* Reads 16-digit account numbers from a file (accounts.txt).
|
||||
* Fetches expiration dates from the Mullvad API.
|
||||
* Sends alerts to a specified Discord webhook if an account is nearing expiration.
|
||||
* Ensures valid account numbers and handles API response errors gracefully.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- A valid accounts.txt file containing Mullvad account numbers (one per line).
|
||||
- A Discord webhook URL for notifications.
|
||||
- Required dependencies: curl, jq, and date.
|
||||
|
||||
### Installation
|
||||
|
||||
Ensure the script has execution permissions:
|
||||
|
||||
```
|
||||
chmod +x check_mullvad_account_expiry.sh
|
||||
|
||||
```
|
||||
### Usage
|
||||
|
||||
Create a file named accounts.txt and list Mullvad account numbers:
|
||||
|
||||
```
|
||||
1234567890123456
|
||||
9876543210987654
|
||||
```
|
||||
|
||||
Set your Discord webhook URL in the script:
|
||||
|
||||
```
|
||||
DISCORD_WEBHOOK_URL="your_discord_webhook_url"
|
||||
```
|
||||
|
||||
Run the script:
|
||||
|
||||
```
|
||||
./check_mullvad_account_expiry.sh
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
- TXT_FILE: The file containing Mullvad account numbers (default: accounts.txt).
|
||||
|
||||
- DAYS_THRESHOLD: Number of days before expiry to trigger an alert (default: 14).
|
||||
|
||||
- DISCORD_WEBHOOK_URL: The webhook URL to send alerts to Discord.
|
||||
|
||||
#### Example Output
|
||||
|
||||
Account 1234567890123456 expires in 10 days.
|
||||
Sending Discord notification...
|
||||
Account 9876543210987654 expires in 20 days.
|
||||
|
||||
### Notes
|
||||
|
||||
Ensure the accounts.txt file contains only valid 16-digit Mullvad account numbers.
|
||||
The script adds a small delay between API requests to prevent rate-limiting.
|
||||
Modify DAYS_THRESHOLD to adjust the notification period.
|
||||
@ -0,0 +1,87 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Configuration
|
||||
TXT_FILE="accounts.txt" # File containing 16-digit account numbers
|
||||
DAYS_THRESHOLD=14 # Number of days before expiry to trigger alert
|
||||
DISCORD_WEBHOOK_URL="your_discord_webhook_url"
|
||||
|
||||
# Function to send a Discord notification
|
||||
send_discord_notification() {
|
||||
local account_id="$1"
|
||||
local expiry="$2"
|
||||
local message="Account $account_id is expiring soon! Expiry date: $expiry"
|
||||
|
||||
curl -H "Content-Type: application/json" -X POST --data @- "$DISCORD_WEBHOOK_URL" <<EOF
|
||||
{
|
||||
"content": "",
|
||||
"embeds": [
|
||||
{
|
||||
"title": "Mullvad Account Alert - $account_id",
|
||||
"description": "Mullvad account $account_id is due to expire.",
|
||||
"url": "https://mullvad.net/en/account",
|
||||
"color": 16755968,
|
||||
"fields": [
|
||||
{
|
||||
"name": "Days until Expiry:",
|
||||
"value": "$days_until_expiry"
|
||||
},
|
||||
{
|
||||
"name": "Expiry Date:",
|
||||
"value": "$expiry"
|
||||
}
|
||||
],
|
||||
"footer": {
|
||||
"text": "Mullvad Account URL: https://mullvad.net/en/account"
|
||||
}
|
||||
}
|
||||
],
|
||||
"attachments": []
|
||||
}
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
# Read each line in the text file
|
||||
while IFS= read -r account_id; do
|
||||
# Validate account_id (ensure it's a 16-digit number)
|
||||
if [[ ! "$account_id" =~ ^[0-9]{16}$ ]]; then
|
||||
echo "Skipping invalid account ID: $account_id"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Fetch account details with error handling
|
||||
response=$(curl -s --fail "https://api.mullvad.net/public/accounts/v1/$account_id")
|
||||
|
||||
# Check if response is valid JSON and not empty
|
||||
if [[ -z "$response" ]] || ! echo "$response" | jq empty > /dev/null 2>&1; then
|
||||
echo "Invalid response for account $account_id"
|
||||
continue
|
||||
fi
|
||||
|
||||
expiry=$(echo "$response" | jq -r '.expiry')
|
||||
|
||||
# Check if expiry field is valid
|
||||
if [[ "$expiry" == "null" || -z "$expiry" ]]; then
|
||||
echo "No expiry date found for account $account_id"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Convert expiry date to epoch time
|
||||
expiry_epoch=$(date -d "$expiry" +%s)
|
||||
current_epoch=$(date +%s)
|
||||
|
||||
# Calculate days until expiry
|
||||
days_until_expiry=$(( (expiry_epoch - current_epoch) / 86400 ))
|
||||
|
||||
echo "Account $account_id expires in $days_until_expiry days."
|
||||
|
||||
# Trigger alert if expiry is within the threshold
|
||||
if (( days_until_expiry <= DAYS_THRESHOLD )); then
|
||||
send_discord_notification "$account_id" "$expiry"
|
||||
fi
|
||||
|
||||
# Small delay to prevent API rate limits
|
||||
sleep 1
|
||||
|
||||
done < "$TXT_FILE"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user