hvac-kia-content/test_mailchimp_api.py
Ben Reed daab901e35 refactor: Update naming convention from hvacknowitall to hkia
Major Changes:
- Updated all code references from hvacknowitall/hvacnkowitall to hkia
- Renamed all existing markdown files to use hkia_ prefix
- Updated configuration files, scrapers, and production scripts
- Modified systemd service descriptions to use HKIA
- Changed NAS sync path to /mnt/nas/hkia

Files Updated:
- 20+ source files updated with new naming convention
- 34 markdown files renamed to hkia_* format
- All ScraperConfig brand_name parameters now use 'hkia'
- Documentation updated to reflect new naming

Rationale:
- Shorter, cleaner filenames
- Consistent branding across all outputs
- Easier to type and reference
- Maintains same functionality with improved naming

Next Steps:
- Deploy updated services to production
- Update any external references to old naming
- Monitor scrapers to ensure proper operation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-19 13:35:23 -03:00

154 lines
No EOL
5.5 KiB
Python

#!/usr/bin/env python3
"""
Proof of concept for MailChimp API integration
Fetches campaigns from "Bi-Weekly Newsletter" folder with metrics
"""
import os
import requests
from datetime import datetime
from dotenv import load_dotenv
import json
# Load environment variables
load_dotenv()
def test_mailchimp_api():
"""Test MailChimp API connection and fetch campaigns"""
api_key = os.getenv('MAILCHIMP_API_KEY')
server = os.getenv('MAILCHIMP_SERVER_PREFIX', 'us10')
if not api_key:
print("❌ No MailChimp API key found in .env")
return
# MailChimp API base URL
base_url = f"https://{server}.api.mailchimp.com/3.0"
# Auth header
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
print("🔍 Testing MailChimp API Connection...")
print(f"Server: {server}")
print("-" * 60)
# Step 1: Test connection with ping endpoint
try:
response = requests.get(f"{base_url}/ping", headers=headers)
if response.status_code == 200:
print("✅ API connection successful!")
else:
print(f"❌ API connection failed: {response.status_code}")
print(response.text)
return
except Exception as e:
print(f"❌ Connection error: {e}")
return
# Step 2: Get campaign folders to find "Bi-Weekly Newsletter"
print("\n📁 Fetching campaign folders...")
try:
response = requests.get(
f"{base_url}/campaign-folders",
headers=headers,
params={'count': 100}
)
if response.status_code == 200:
folders_data = response.json()
print(f"Found {folders_data.get('total_items', 0)} folders")
# Find the Bi-Weekly Newsletter folder
target_folder_id = None
for folder in folders_data.get('folders', []):
print(f" - {folder['name']} (ID: {folder['id']})")
if folder['name'] == "Bi-Weekly Newsletter":
target_folder_id = folder['id']
print(f" ✅ Found target folder!")
if not target_folder_id:
print("\n⚠️ 'Bi-Weekly Newsletter' folder not found")
print("Fetching all campaigns instead...")
else:
print(f"❌ Failed to fetch folders: {response.status_code}")
target_folder_id = None
except Exception as e:
print(f"❌ Error fetching folders: {e}")
target_folder_id = None
# Step 3: Fetch campaigns
print("\n📊 Fetching campaigns...")
try:
params = {
'count': 10, # Get first 10 campaigns
'status': 'sent', # Only sent campaigns
'sort_field': 'send_time',
'sort_dir': 'DESC'
}
if target_folder_id:
params['folder_id'] = target_folder_id
response = requests.get(
f"{base_url}/campaigns",
headers=headers,
params=params
)
if response.status_code == 200:
campaigns_data = response.json()
campaigns = campaigns_data.get('campaigns', [])
print(f"Found {len(campaigns)} campaigns")
print("-" * 60)
# Display campaign details
for i, campaign in enumerate(campaigns[:5], 1): # Show first 5
print(f"\n📧 Campaign {i}:")
print(f" Subject: {campaign.get('settings', {}).get('subject_line', 'N/A')}")
print(f" Sent: {campaign.get('send_time', 'N/A')}")
print(f" Status: {campaign.get('status', 'N/A')}")
# Get detailed report for this campaign
report_response = requests.get(
f"{base_url}/reports/{campaign['id']}",
headers=headers
)
if report_response.status_code == 200:
report = report_response.json()
print(f" 📈 Metrics:")
print(f" - Emails Sent: {report.get('emails_sent', 0)}")
print(f" - Opens: {report.get('opens', {}).get('unique_opens', 0)} ({report.get('opens', {}).get('open_rate', 0)*100:.1f}%)")
print(f" - Clicks: {report.get('clicks', {}).get('unique_clicks', 0)} ({report.get('clicks', {}).get('click_rate', 0)*100:.1f}%)")
print(f" - Unsubscribes: {report.get('unsubscribed', 0)}")
# Get campaign content (first 200 chars)
content_response = requests.get(
f"{base_url}/campaigns/{campaign['id']}/content",
headers=headers
)
if content_response.status_code == 200:
content = content_response.json()
plain_text = content.get('plain_text', '')
if plain_text:
preview = plain_text[:200].replace('\n', ' ')
print(f" 📝 Content Preview: {preview}...")
else:
print(f"❌ Failed to fetch campaigns: {response.status_code}")
print(response.text)
except Exception as e:
print(f"❌ Error fetching campaigns: {e}")
print("\n" + "=" * 60)
print("MailChimp API test complete!")
if __name__ == "__main__":
test_mailchimp_api()