[cron:6dd85dd2-28ce-411f-b2de-8106e314da47 Deal Post - X + Pinterest (every 30 min)] SCHEDULED TASK: Post 1 deal to X and Pinterest.

## CRITICAL: Use GHC profile ONLY
- SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc
- NEVER use /home/crogers2287/.social-poster-profile/ (that's @cannadealsfl)
- NEVER use Maya VM twikit or cannadeals cookies

## MANDATORY: Hash-based duplicate prevention
1. Run: python3 scripts/posted_db.py check <deal_id> x
2. If POSTED:YES — SKIP, pick another
3. After post: python3 scripts/posted_db.py record <deal_id> <platform> <post_id> <url>

## Workflow
1. Fetch deals: python3 -c "import urllib.request,json; req=urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent','Mozilla/5.0'); data=json.loads(urllib.request.urlopen(req).read()); deals=data if isinstance(data,list) else data.get('deals',data.get('items',[])); [print(f'{d.get(\"id\")}|{d.get(\"title\",\"\")[:80]}|${d.get(\"price\",\"\")}') for d in deals[:15]]"
2. Check hash for each candidate
3. Pick first unposted deal (50%+ off, popular brand, limited time, freebies, or under $10)
4. Download share image: wget -q "https://www.gottahavecoups.com/api/v1/share/image/<deal_id>" -O /tmp/deal_img.jpg
5. Post to X:
   cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster
   SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs twitter "<tweet>" --image /tmp/deal_img.jpg
6. Post to Pinterest:
   cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster
   SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs pinterest "<desc>" --title "<title>" --link "https://gottahavecoups.com/deal/<id>" --image /tmp/deal_img.jpg --board "Today's Best Deals"
7. Record both in posted_db
8. Log in memory/YYYY-MM-DD.md

## Tweet format
Hook + value + coupon code (if any) + 5-8 hashtags + link LAST: gottahavecoups.com/deal/<id>
Current time: Thursday, February 12th, 2026 — 4:27 AM (UTC)

Return your summary as plain text; it will be delivered automatically. If the task explicitly calls for messaging a specific external recipient, note who/where it should go instead of sending it yourself.


exec

python3 -c "import urllib.request,json; req=urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent','Mozilla/5.0'); data=json.loads(urllib.request.urlopen(req).read()); deals=data if isinstance(data,list) else data.get('deals',data.get('items',[])); [print(f'{d.get(\"id\")}|{d.get(\"title\",\"\")[:80]}|${d.get(\"price\",\"\")}') for d in deals[:15]]"


/bin/bash: line 1: import urllib.request,json; req=urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent','Mozilla/5.0'); data=json.loads(urllib.request.urlopen(req).read()); deals=data if isinstance(data,list) else data.get('deals',data.get('items',[])); [print(f'{d.get("id")}|{d.get("title","")[:80]}|${d.get(\"price\",\"\")}') for d in deals[:15]]: bad substitution

Command exited with code 1


python3 -c "import urllib.request, json;
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest')
req.add_header('User-Agent', 'Mozilla/5.0')
with urllib.request.urlopen(req) as response:
    data = json.loads(response.read())
deals = data if isinstance(data, list) else data.get('deals', data.get('items', []))
for d in deals[:15]:
    print(f\"{d.get('id')}|{d.get('title', '')[:80]}|${d.get('price', '')}\")"


/bin/bash: line 1: import urllib.request, json;
req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest')
req.add_header('User-Agent', 'Mozilla/5.0')
with urllib.request.urlopen(req) as response:
    data = json.loads(response.read())
deals = data if isinstance(data, list) else data.get('deals', data.get('items', []))
for d in deals[:15]:
    print(f"{d.get('id')}|{d.get('title', '')[:80]}|${d.get('price', '')}"): bad substitution

Command exited with code 1


python3 -c "import urllib.request, json; req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent', 'Mozilla/5.0'); response = urllib.request.urlopen(req); data = json.loads(response.read()); deals = data if isinstance(data, list) else data.get('deals', data.get('items', [])); [print(f\"{d.get('id')}|{d.get('title', '')[:80]}|${d.get('price', '')}\") for d in deals[:15]]"


/bin/bash: line 1: import urllib.request, json; req = urllib.request.Request('https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest'); req.add_header('User-Agent', 'Mozilla/5.0'); response = urllib.request.urlopen(req); data = json.loads(response.read()); deals = data if isinstance(data, list) else data.get('deals', data.get('items', [])); [print(f"{d.get('id')}|{d.get('title', '')[:80]}|${d.get('price', '')}") for d in deals[:15]]: bad substitution

Command exited with code 1


curl -s -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq -r '.[] | "\(.id)|\(.title)|\(.price)"' | head -n 15


(no output)


curl -s -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq .


curl -I -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest"


% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
HTTP/2 307
date: Thu, 12 Feb 2026 04:27:31 GMT
content-length: 0
location: https://www.gottahavecoups.com/api/v1/deals/?limit=20&sort=newest
server: cloudflare
strict-transport-security: max-age=63072000; preload
cf-cache-status: DYNAMIC
report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=1Jqgb0j38%2B0BgMDtn1dmEavAweb5TGd8GD4NMrIRYOr37vopeUNYFbdKppk6UsHOXgOVYqvJyCN6Euj%2B1%2BfjTORZaKHmMRixlNF0AerFIOYBwlsc64c%3D"}]}
nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
cf-ray: 9cc9557fb9627ade-MIA
alt-svc: h3=":443"; ma=86400


curl -s -L -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq -r '.[] | "\(.id)|\(.title)|\(.price)"' | head -n 15


jq: error (at <stdin>:0): Cannot index array with string "price"


curl -s -L -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq -r '.[] | "\(.id)|\(.title)|\(.price)"'


jq: error (at <stdin>:0): Cannot index array with string "price"

Command exited with code 5


curl -s -L -H "User-Agent: Mozilla/5.0" "https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest" | jq -r 'if type == "array" then .[] | "\(.id)|\(.title)|\(.price)" else .deals[] | "\(.id)|\(.title)|\(.price)" end'


33687|New Orleans Saints Retro Scrip...men's Short Sleeve Fan T-Shirt|11.2
33688|DII Halloween Kitchen Collecti...x28,Let's Get Spooky,2 Piece|4.4
33689|Little Giant Velocity 22 foot Ladder $244|244.0
33684|Micro Teenies - Spongebob Square Pants 5-Pack - Collectible Miniature Plush Figure,Suffed Animal,Toy Mini Soft Figure for Kids Ages 4+ $14.99|14.99
33683|27" Acer VG272U W2 Nitro Monitor IPS 1440p 240Hz 1ms 400Nit (Manufacture Refurbished 2 Year AllState Warranty) - $134.99|134.99
33681|Grimm Legacies:The Magic Spel...e Grimms' Folk and Fairy Tales|10.52
33679|Perfect Stranger Spicy Edition...d Relationship Game – Ages 17|12.5
33678|PDA in the Family|11.85
33680|HP Ultrabook 15.6" Laptop,16GB RAM,1.1TB Storage (1TB OneDrive + 128GB UFS),Microsoft 365 Included,Intel 4-Core | Fast,Smart,Budget-Friendly,Wine Red $349.99|349.99
33674|Select Accts:90ct Nature Made Burp Less Ultra 1400mg Omega 3 Fish Oil Softgels $5.40 w/ Subscribe & Save|5.4
33676|Refurbished Good Samsung Galaxy S23 Ultra 256GB Unlocked Smartphone (Black) $315.99|315.99
33673|12-pk 5.6-oz Aquafresh Cavity Protection Fluoride Toothpaste (Cool Mint) $9.95|9.95
33675|American Tuna Sushi-grade Wild Albacore Tuna Fish - No Salt Added / 6-Pack $9.97 at Amazon|9.97
33690|Bifeaw 3 Packs Nylon Interactive Dog Flying Disc - Floating Dog Toys for Aggressive chewers - Water Toys for Dogs (Blue and Yellow) $5.41 ($4.99+ tax|5.41
33672|22-Compartment Tactix Double Sided Small Parts Organizer $6 ~ Home Depot|6.0
33670|GM Genuine Parts 24050030 Auto...Auxiliary Fluid Pump Assembly|228.08
33669|Littlearth NCAA Iowa Hawkeyes Team Jersey Tote|12.81
33666|Leica 75mm f/2 Summicron-M Asp...ocus Lens for M System (11637|2989.47
33671|5-Piece Cleanan Flat & Angled Latex/Oil Paint Brush Set w/ Edge Guard $5|5.0
33667|200-Count Stevia in the Raw Sweetener Packets $6.60 w/ Subscribe & Save|6.6


python3 scripts/posted_db.py check 33671 x && python3 scripts/posted_db.py check 33671 pinterest


HASH:7959d4b005830f69 POSTED:NO DEAL:33671 PLATFORM:x
HASH:b5a9c6b685dd07b3 POSTED:NO DEAL:33671 PLATFORM:pinterest


wget -q "https://www.gottahavecoups.com/api/v1/share/image/33671" -O /tmp/deal_img.jpg


cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster
SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs twitter "Check out this 5-Piece Cleanan Flat & Angled Latex/Oil Paint Brush Set with Edge Guard for just $5! Perfect for your next home project. 🏠🎨

#Deals #GottaHaveCoups #HomeImprovement #DIY #Painting #Savings #BudgetFinds #CouponCommunity

gottahavecoups.com/deal/33671" --image /tmp/deal_img.jpg


Command still running (session glow-ember, pid 2183958). Use process (list/poll/log/write/kill/clear/remove) for follow-up.


[*] Uploading image: /tmp/deal_img.jpg

Process still running.


(no new output)

Process still running.


[+] Tweet posted successfully!

Process still running.

[*] Uploading image: /tmp/deal_img.jpg
[+] Tweet posted successfully!


[*] Uploading image: /tmp/deal_img.jpg
[+] Tweet posted successfully!

Process exited with code 0.


cd /home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster
SOCIAL_PROFILE=/home/crogers2287/.social-poster-profile-ghc xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" node post.mjs pinterest "Score this 5-Piece Cleanan Flat & Angled Latex/Oil Paint Brush Set with Edge Guard for only $5 at Home Depot! High-quality brushes for a fraction of the price." --title "5-Piece Paint Brush Set - ONLY $5!" --link "https://gottahavecoups.com/deal/33671" --image /tmp/deal_img.jpg --board "Today's Best Deals"


node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

page.goto: net::ERR_NETWORK_CHANGED at https://www.pinterest.com/pin-builder/
Call log:
  - navigating to "https://www.pinterest.com/pin-builder/", waiting until "domcontentloaded"

    at postPinterest (/home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster/post.mjs:150:16) {
  name: 'Error'
}

Node.js v22.20.0

Command exited with code 1


Command still running (session lucky-nudibranch, pid 2199850). Use process (list/poll/log/write/kill/clear/remove) for follow-up.


node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

locator.setInputFiles: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('input[type="file"]').first()

    at async postPinterest (/home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster/post.mjs:160:7) {
  name: 'TimeoutError'
}

Node.js v22.20.0

Process exited with code 1.


python3 scripts/posted_db.py record 33671 x "posted_at_2026-02-12T04:35:00Z" "https://twitter.com/GottaHaveCoups"


RECORDED HASH:7959d4b005830f69 DEAL:33671 PLATFORM:x


cat >> memory/2026-02-12.md <<EOF

## 04:37 AM - Deal Post
- **Deal:** 5-Piece Cleanan Paint Brush Set ($5) [33671]
- **Platform:** X (@GottaHaveCoups)
- **Status:** Posted to X successfully. Pinterest failed (TimeoutError on image upload).
- **Link:** https://gottahavecoups.com/deal/33671
EOF


(no output)


Done.

**Deal Posted:**
- **Product:** 5-Piece Cleanan Flat & Angled Latex/Oil Paint Brush Set w/ Edge Guard
- **Price:** $5.00
- **Platform:** X (@GottaHaveCoups) - [Success]
- **Platform:** Pinterest - [Failed] (TimeoutError during image upload)
- **Link:** [gottahavecoups.com/deal/33671](https://gottahavecoups.com/deal/33671)

**Notes:**
- X post completed successfully with the custom product image.
- Pinterest failed after a retry (network change then timeout). I've recorded the X post in the database to prevent duplicates.
- Logged the activity in `memory/2026-02-12.md`.