#!/bin/bash
# Complete Campaign Workflow Test Script
# Tests all endpoints in the correct order
BASE_URL="https://linkedin-mcp-mocha.vercel.app"
# For local: BASE_URL="http://localhost:3001"
# Configuration
API_KEY="${API_KEY:-b01a98cddade43cac435ef18e6bf0ffe9937dd8fd2da7910b2b9c4b11284d471}"
CDP_URL="${CDP_URL:-http://localhost:9222}"
LI_AT_COOKIE="${LI_AT_COOKIE:-AQEDAUiUBbYE2sYaAAABmoIQvNMAAAGbtcnXplYAKod7E5OFRQgQA9uOWhap0xQd8EPjqu_OxKnXH8moZxIkj9lIj8z0FdTE60KU12vsiuvFaO2s9jGjL1wRvRJQNUGOgENukqFaNb7kbTx88B5EJ9Da}"
echo "======================================"
echo "π COMPLETE CAMPAIGN WORKFLOW TEST"
echo "======================================"
echo ""
# Helper function to pretty print JSON
pretty_json() {
python -m json.tool 2>/dev/null || cat
}
# Step 1: Connect Browser (Required for LinkedIn scraping)
echo "π‘ Step 1: Connecting to Chrome browser..."
echo "β οΈ Make sure Chrome is running with: chrome --remote-debugging-port=9222"
echo ""
CONNECT_RESULT=$(curl -s -X POST "$BASE_URL/api/browser/connect" \
-H "Content-Type: application/json" \
-d "{\"cdp_url\": \"$CDP_URL\"}")
echo "$CONNECT_RESULT" | pretty_json
echo ""
if echo "$CONNECT_RESULT" | grep -q '"success":false'; then
echo "β Browser connection failed - continuing with AI-only tests..."
SKIP_BROWSER=true
else
SKIP_BROWSER=false
# Step 1.5: Setup LinkedIn Session
echo "π Step 1.5: Setting up LinkedIn session..."
SESSION_RESULT=$(curl -s -X POST "$BASE_URL/api/session/setup" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"li_at_cookie\": \"$LI_AT_COOKIE\"
}")
echo "$SESSION_RESULT" | pretty_json
echo ""
fi
# Step 2: Analyze Product (Deep Analysis)
echo "π Step 2: Analyzing product/website (REAL PRODUCT: AmroPilot)..."
echo ""
PRODUCT_ANALYSIS=$(curl -s -X POST "$BASE_URL/api/products/analyze" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"name\": \"AmroPilot\",
\"website_url\": \"https://amropilot.com\",
\"description\": \"AmroPilot is an AI-powered content creation platform that generates human-like text. It helps content creators, marketers, and SEO professionals create engaging articles that rank, convert, and dominate search results. The platform uses advanced AI agents that understand search intent and optimize content for maximum visibility.\",
\"value_proposition\": \"Transform your content strategy with AI that understands search intent, creates engaging articles, and optimizes for maximum visibility. Generate content that bypasses AI detection and ranks on Google. No more guessing gameβjust intelligent content that works.\",
\"target_audience\": \"Content creators, SEO professionals, digital marketers, content marketing agencies, bloggers, online businesses, e-commerce stores, SaaS companies, marketing teams\"
}")
echo "$PRODUCT_ANALYSIS" | pretty_json
echo ""
PRODUCT_ID=$(echo "$PRODUCT_ANALYSIS" | python -c "import sys, json; data = json.load(sys.stdin); print(data.get('product', {}).get('id', ''))" 2>/dev/null)
PRODUCT_ANALYSIS_DATA=$(echo "$PRODUCT_ANALYSIS" | python -c "import sys, json; data = json.load(sys.stdin); print(json.dumps(data.get('analysis', {})))" 2>/dev/null)
if [ -z "$PRODUCT_ID" ] || [ "$PRODUCT_ID" == "None" ] || [ "$PRODUCT_ID" == "" ]; then
echo "β οΈ Using product analysis from response..."
PRODUCT_ANALYSIS_DATA='{"category": "SaaS", "target_market": "B2B Tech Companies"}'
fi
# Step 3: Generate ICP (Ideal Customer Profile)
echo "π― Step 3: Generating ICP based on product analysis..."
echo ""
ICP_RESULT=$(curl -s -X POST "$BASE_URL/api/icps/generate" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"product_id\": \"$PRODUCT_ID\"
}")
echo "$ICP_RESULT" | pretty_json
echo ""
ICP_ID=$(echo "$ICP_RESULT" | python -c "import sys, json; data = json.load(sys.stdin); print(data.get('icp', {}).get('id', ''))" 2>/dev/null)
ICP_SEARCH_CRITERIA=$(echo "$ICP_RESULT" | python -c "import sys, json; data = json.load(sys.stdin); print(json.dumps(data.get('icp_data', {}).get('search_criteria', {})))" 2>/dev/null)
if [ -z "$ICP_ID" ] || [ "$ICP_ID" == "None" ] || [ "$ICP_ID" == "" ]; then
echo "β οΈ Creating manual ICP..."
ICP_RESULT=$(curl -s -X POST "$BASE_URL/api/icps" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"product_id\": \"$PRODUCT_ID\",
\"name\": \"AI Startup CEOs from Australia\",
\"description\": \"CEOs and Founders of AI startups in Australia\",
\"search_criteria\": {
\"keywords\": \"AI Startup CEO OR Founder OR CTO\",
\"locations\": [\"Australia\"],
\"industries\": [\"Technology\"],
\"job_titles\": [\"CEO\", \"Founder\", \"CTO\"]
},
\"target_characteristics\": {
\"company_stage\": [\"Seed\", \"Series A\"],
\"employee_count\": \"1-50\"
}
}")
ICP_ID=$(echo "$ICP_RESULT" | python -c "import sys, json; data = json.load(sys.stdin); print(data.get('icp', {}).get('id', ''))" 2>/dev/null)
ICP_SEARCH_CRITERIA='{"keywords": "AI Startup CEO OR Founder", "locations": ["Australia"]}'
fi
echo "β
ICP ID: $ICP_ID"
echo ""
# Step 4: Discover Leads Based on ICP
if [ "$SKIP_BROWSER" = false ]; then
echo "π Step 4: Discovering leads based on ICP..."
echo ""
DISCOVER_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns/discover" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"icp_id\": \"$ICP_ID\",
\"icp_search_criteria\": $ICP_SEARCH_CRITERIA,
\"limit\": 10
}")
echo "$DISCOVER_RESULT" | pretty_json
echo ""
# Extract lead profile URLs
LEAD_PROFILES=$(echo "$DISCOVER_RESULT" | python -c "import sys, json; data = json.load(sys.stdin); leads = data.get('leads', []); print(' '.join([l.get('profile_url', '') for l in leads[:3] if l.get('profile_url')]))" 2>/dev/null)
else
echo "β οΈ Skipping lead discovery (browser not connected)"
LEAD_PROFILES="https://www.linkedin.com/in/test-ceo-1 https://www.linkedin.com/in/test-ceo-2"
fi
# Step 5: Create Campaign
echo "π Step 5: Creating campaign..."
echo ""
CAMPAIGN_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"product_id\": \"$PRODUCT_ID\",
\"icp_id\": \"$ICP_ID\",
\"name\": \"AI Startup CEOs Australia Campaign\",
\"description\": \"Outreach campaign targeting AI startup CEOs in Australia\",
\"leads_selected\": [],
\"settings\": {
\"max_messages_per_day\": 20,
\"delay_between_messages\": 300
}
}")
echo "$CAMPAIGN_RESULT" | pretty_json
echo ""
CAMPAIGN_ID=$(echo "$CAMPAIGN_RESULT" | python -c "import sys, json; data = json.load(sys.stdin); print(data.get('campaign', {}).get('id', ''))" 2>/dev/null)
if [ -z "$CAMPAIGN_ID" ] || [ "$CAMPAIGN_ID" == "None" ] || [ "$CAMPAIGN_ID" == "" ]; then
echo "β Campaign creation failed!"
exit 1
fi
echo "β
Campaign ID: $CAMPAIGN_ID"
echo ""
# Step 6: Generate Dynamic Sequence
echo "βοΈ Step 6: Generating dynamic follow-up sequence..."
echo ""
SEQUENCE_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns/$CAMPAIGN_ID/generate-sequence" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\"
}")
echo "$SEQUENCE_RESULT" | pretty_json
echo ""
# Step 7: Select Leads for Campaign
if [ -n "$LEAD_PROFILES" ]; then
echo "π₯ Step 7: Selecting leads for campaign..."
echo ""
LEAD_ARRAY=$(echo "$LEAD_PROFILES" | python -c "import sys; profiles = sys.stdin.read().strip().split(); print(','.join([f'\"{p}\"' for p in profiles]))" 2>/dev/null)
SELECT_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns/$CAMPAIGN_ID/leads/select" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\",
\"profile_urls\": [$LEAD_ARRAY]
}")
echo "$SELECT_RESULT" | pretty_json
echo ""
fi
# Step 8: Approve Campaign
echo "β
Step 8: Approving campaign..."
echo ""
APPROVE_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns/$CAMPAIGN_ID/approve" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\"
}")
echo "$APPROVE_RESULT" | pretty_json
echo ""
# Step 9: Start Campaign (Automated Processing Begins)
echo "π Step 9: Starting campaign (automated processing begins)..."
echo ""
START_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns/$CAMPAIGN_ID/start" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\"
}")
echo "$START_RESULT" | pretty_json
echo ""
# Step 10: Process Messages (Manual trigger if needed)
echo "π€ Step 10: Processing campaign messages (manual trigger)..."
echo ""
PROCESS_RESULT=$(curl -s -X POST "$BASE_URL/api/campaigns/$CAMPAIGN_ID/process" \
-H "Content-Type: application/json" \
-d "{
\"api_key\": \"$API_KEY\"
}")
echo "$PROCESS_RESULT" | pretty_json
echo ""
# Step 11: Get Campaign Analytics
echo "π Step 11: Getting campaign analytics..."
echo ""
ANALYTICS_RESULT=$(curl -s -X GET "$BASE_URL/api/campaigns/$CAMPAIGN_ID/analytics?api_key=$API_KEY")
echo "$ANALYTICS_RESULT" | pretty_json
echo ""
# Step 12: Get All Campaigns
echo "π Step 12: Getting all campaigns..."
echo ""
CAMPAIGNS_RESULT=$(curl -s -X GET "$BASE_URL/api/campaigns?api_key=$API_KEY")
echo "$CAMPAIGNS_RESULT" | pretty_json
echo ""
# Step 13: Get All Products
echo "ποΈ Step 13: Getting all products..."
echo ""
PRODUCTS_RESULT=$(curl -s -X GET "$BASE_URL/api/products?api_key=$API_KEY")
echo "$PRODUCTS_RESULT" | pretty_json
echo ""
# Step 14: Get All ICPs
echo "π― Step 14: Getting all ICPs..."
echo ""
ICPS_RESULT=$(curl -s -X GET "$BASE_URL/api/icps?api_key=$API_KEY")
echo "$ICPS_RESULT" | pretty_json
echo ""
# Summary
echo "======================================"
echo "β
WORKFLOW TEST COMPLETE!"
echo "======================================"
echo ""
echo "Campaign ID: $CAMPAIGN_ID"
echo "Product ID: $PRODUCT_ID"
echo "ICP ID: $ICP_ID"
echo ""
echo "Next steps:"
echo "1. Monitor campaign: GET $BASE_URL/api/campaigns/$CAMPAIGN_ID/analytics?api_key=$API_KEY"
echo "2. Process messages: POST $BASE_URL/api/campaigns/$CAMPAIGN_ID/process"
echo "3. Pause campaign: POST $BASE_URL/api/campaigns/$CAMPAIGN_ID/pause"
echo ""