← back to Dw Vendor Mailer

cc_finish.py

56 lines

import sys, re, json, base64, time, pathlib, urllib.parse, urllib.request, urllib.error

arg = sys.argv[1] if len(sys.argv) > 1 else ""
# accept a full redirected URL or a bare code
m = re.search(r'[?&]code=([^&\s]+)', arg)
code = urllib.parse.unquote(m.group(1)) if m else arg.strip()
if not code:
    print("NO CODE provided"); sys.exit(1)

ENVP = pathlib.Path.home()/"Projects/secrets-manager/.env"
env = ENVP.read_text()
g = lambda k: (re.search(rf'^{k}=(.*)$', env, re.M).group(1).strip().strip('"').strip("'"))
CID, CSEC = g('CC_CLIENT_ID'), g('CC_CLIENT_SECRET')
REDIR = "https://localhost"
UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"

def post(url, data, headers, form=False):
    body = urllib.parse.urlencode(data).encode() if form else json.dumps(data).encode()
    req = urllib.request.Request(url, data=body, headers=headers, method="POST")
    try:
        r = urllib.request.urlopen(req, timeout=45); return r.status, r.read().decode()
    except urllib.error.HTTPError as e: return e.code, e.read().decode()

basic = base64.b64encode(f"{CID}:{CSEC}".encode()).decode()
st, body = post("https://authz.constantcontact.com/oauth2/default/v1/token",
    {"grant_type":"authorization_code","code":code,"redirect_uri":REDIR},
    {"Authorization":"Basic "+basic,"Content-Type":"application/x-www-form-urlencoded","User-Agent":UA,"Accept":"application/json"}, form=True)
if st != 200:
    print("CODE EXCHANGE FAILED", st, body[:400]); sys.exit(2)
tok = json.loads(body); AT = tok["access_token"]; NRT = tok.get("refresh_token")
if NRT:
    ENVP.write_text(re.sub(r'^CC_REFRESH_TOKEN=.*$', f'CC_REFRESH_TOKEN={NRT}', env, flags=re.M))
    print("new refresh token persisted (…%s)" % NRT[-6:])
print("access token acquired ✓")

html = pathlib.Path("mailer.html").read_text(encoding="utf-8")
payload = {"name":"New — The Houses We Represent "+time.strftime("%Y-%m-%d %H:%M"),
  "email_campaign_activities":[{"format_type":5,"from_name":"Designer Wallcoverings",
    "from_email":"steve@designerwallcoverings.com","reply_to_email":"info@designerwallcoverings.com",
    "subject":"New: The Houses We Represent — order any as a $4.25 sample","html_content":html,
    "physical_address_in_footer":{"address_line1":"15442 Ventura Blvd","city":"Sherman Oaks",
      "state_code":"CA","postal_code":"91403","country_code":"US","organization_name":"Designer Wallcoverings"}}]}
st, body = post("https://api.cc.email/v3/emails", payload,
    {"Authorization":"Bearer "+AT,"Content-Type":"application/json","Accept":"application/json","User-Agent":UA})
print("CREATE DRAFT status:", st)
try:
    j = json.loads(body)
    if st in (200,201):
        print("✓ DRAFT CREATED  campaign_id:", j.get("campaign_id"))
        for a in j.get("campaign_activities", []):
            print("   activity:", a.get("campaign_activity_id"), a.get("role"))
    else:
        print(body[:900])
except Exception:
    print(body[:900])