[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 — 10:57 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'); data = json.loads(urllib.request.urlopen(req).read()); items = data.get('items', []); [print(f'{d.get(\"id\")}|{d.get(\"title\")[:80]}|${d.get(\"price\")}') for d in items[: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()); items = data.get('items', []); [print(f'{d.get("id")}|{d.get("title")[:80]}|${d.get(\"price\")}') for d in items[: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 '.items[] | "\(.id)|\(.title)|\(.price)"' | head -n 15


(no output)


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


* Host www.gottahavecoups.com:443 was resolved.
* IPv6: 2606:4700:3037::6815:441e, 2606:4700:3033::ac43:b9d7
* IPv4: 172.67.185.215, 104.21.68.30
*   Trying 172.67.185.215:443...
* Connected to www.gottahavecoups.com (172.67.185.215) port 443
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [2548 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [79 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519 / id-ecPublicKey
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=gottahavecoups.com
*  start date: Jan 24 01:17:46 2026 GMT
*  expire date: Apr 24 02:16:10 2026 GMT
*  subjectAltName: host "www.gottahavecoups.com" matched cert's "*.gottahavecoups.com"
*  issuer: C=US; O=Google Trust Services; CN=WE1
*  SSL certificate verify ok.
*   Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
*   Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
*   Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
} [5 bytes data]
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://www.gottahavecoups.com/api/v1/deals?limit=20&sort=newest
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: www.gottahavecoups.com]
* [HTTP/2] [1] [:path: /api/v1/deals?limit=20&sort=newest]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [user-agent: Mozilla/5.0]
} [5 bytes data]
> GET /api/v1/deals?limit=20&sort=newest HTTP/2
> Host: www.gottahavecoups.com
> Accept: */*
> User-Agent: Mozilla/5.0
>
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [230 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [230 bytes data]
* old SSL session ID is stale, removing
{ [5 bytes data]
< HTTP/2 307
< date: Thu, 12 Feb 2026 10:57:28 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
< nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
< report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=qyezgWhT1NTQXF8X8i4GeQXeVrup%2BytAsjgLBqlU8SfB4EiXFI%2FD%2FilcunlsHChadLY7dE7t%2Bm9s1rkkzvwadRl%2B7pzVGmZ60AM5M37MdKfsLLCuIu8%3D"}]}
< cf-ray: 9ccb90b96f557450-MIA
< alt-svc: h3=":443"; ma=86400
<
* Connection #0 to host www.gottahavecoups.com left intact


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


jq: error (at <stdin>:0): Cannot iterate over null (null)


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


{
  "deals": [
    {
      "title": "I Believe in Healing:Real Sto...m the Bible,History and Today",
      "description": "Amazon price drop:I Believe in Healing:Real Sto...m the Bible,History and Today - down 93.40% ($14.00) to $0.99 from $14.99",
      "price": 0.99,
      "original_price": 14.99,
      "discount_percentage": 93,
      "deal_url": "https://camelcamelcamel.com/product/B00LA9GP7M",
      "affiliate_link": "https://www.amazon.com/dp/B00LA9GP7M?tag=chelseaschn0b-20",
      "coupon_code": null,
      "image_url": "https://images-na.ssl-images-amazon.com/images/P/B00LA9GP7M.01._SCLZZZZZZZ_SX500_.jpg",
      "thumbnail_url": null,
      "category_id": 8,
      "store_name": "Amazon",
      "brand": null,
      "retailer_links": null,
      "id": 33792,
      "quality_score": 7.0,
      "source": "Amazon",


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


33792|I Believe in Healing:Real Sto...m the Bible,History and Today|0.99
33793|Entenmann’s Minis Apple Snack...of Apple Pies,12 oz,6 Count|3.49
33787|Humble Crew Supersized Toy Sto...ies - Modern Toy Bins for Kids|42.24
33788|AMWAN Nordic Style Slub Chenil...s Pets Sofa Protector 71"x134|30.69
33783|A Tribe Called Quest Anthology (2-LP Vinyl + MP3) $16.49 + Free Shipping w/ Prime or on $35|16.49
33784|Green Toys Recycling Truck (Green) - BPA Free,Phthalates Free $11.96 + Free Shipping w/ Prime or on $35|11.96
33785|40L Gym Bag w/ Shoe and Wet Compartment $18.49 at checkout|18.49
33791|YMMV,in-store,28 piece DIABLO Bi-Metal Reciprocating Saw Blade Set (28-Piece),$7.50|7.5
33781|Sweetcrispy Ergonomic Desk Cha...ith Flip-up Armrests,Dark Grey|76.47
33782|8" Care Bears Badtz-Maru Dressed As Grumpy Bear Plush Toy $5.20|5.2
33779|3.24* | 6" Winco Stainless Steel Strainer at Amazon|3.24
33776|Jamba Five Restaurant $15 eGift Cards ($75 Value) - $54.99|15.0
33769|AMWAN Simple Solid Universal C...fa Couch with Tassel,71"x134|32.51
33773|6.90 | Monoprice Single Mode Fiber Optic Cable - LC to LC,9/125 Type,Duplex,UL Rated,2.0mm Outer Diameter,5 Meter,Yellow at Amazon|6.9
33789|Refurb:Acer Chromebook 514 Laptop:14" FHD Touch,i3-N305,8GB RAM,512GB SSD $178 + Free Shipping|178.0


33792: HASH:235f32f5caffb870 POSTED:NO DEAL:33792 PLATFORM:x
33793: HASH:620c828eedab074c POSTED:NO DEAL:33793 PLATFORM:x
33787: HASH:76e268df9196c408 POSTED:NO DEAL:33787 PLATFORM:x
33788: HASH:f7482f394cd568e8 POSTED:NO DEAL:33788 PLATFORM:x
33783: HASH:4424bd1b3ad0990e POSTED:NO DEAL:33783 PLATFORM:x
33784: HASH:0e2c3f487b7e9198 POSTED:NO DEAL:33784 PLATFORM:x
33785: HASH:c76aaa910baf606e POSTED:NO DEAL:33785 PLATFORM:x
33791: HASH:b9ac53192d05e343 POSTED:NO DEAL:33791 PLATFORM:x
33781: HASH:33a17bdee6623dfb POSTED:NO DEAL:33781 PLATFORM:x
33782: HASH:5e2f0cdabbec035a POSTED:YES DEAL:33782 PLATFORM:x

Command exited with code 1


wget -q "https://www.gottahavecoups.com/api/v1/share/image/33784" -O /tmp/deal_img.jpg && ls -lh /tmp/deal_img.jpg


-rw-rw-r-- 1 crogers2287 crogers2287 53K Feb 12 10:57 /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 "♻ Toy truck alert! Green Toys Recycling Truck is only $11.96!

✅ BPA & Phthalate free
✅ Made from recycled plastic
✅ Tough, durable, and dishwasher safe

Grab it here: gottahavecoups.com/deal/33784

#GreenToys #Deals #AmazonDeals #EcoFriendly #ToyDeals #Savings #GottaHaveCoups" --image /tmp/deal_img.jpg


Command still running (session kind-bison, pid 2488181). 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.


[*] Uploading image: /tmp/deal_img.jpg
node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

locator.click: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('[data-testid="tweetButton"]')
    - locator resolved to <button role="button" type="button" data-testid="tweetButton" class="css-175oi2r r-sdzlij r-1phboty r-rs99b7 r-lrvibr r-1cwvpvk r-2yi16 r-1qi8awa r-3pj75a r-1loqt21 r-o7ynqc r-6416eg r-1ny4l3l">…</button>
  - attempting click action
    2 × waiting for element to be visible, enabled and stable
      - element is visible, enabled and stable
      - scrolling into view if needed
      - done scrolling
      -

 from
…
 subtree intercepts pointer events
    - retrying click action
    - waiting 20ms
    2 × waiting for element to be visible, enabled and stable
      - element is visible, enabled and stable
      - scrolling into view if needed
      - done scrolling
      -

 from
…
 subtree intercepts pointer events
    - retrying click action
      - waiting 100ms
    58 × waiting for element to be visible, enabled and stable
       - element is visible, enabled and stable
       - scrolling into view if needed
       - done scrolling
       -

 from
…
 subtree intercepts pointer events
     - retrying click action
       - waiting 500ms

    at postTwitter (/home/crogers2287/openclaw-workspaces/cannadeals-marketing/skills/social-poster/post.mjs:104:19) {
  name: 'TimeoutError'
}

Node.js v22.20.0

Process exited with code 1.


Command still running (session crisp-willow, pid 2506259). Use process (list/poll/log/write/kill/clear/remove) for follow-up.


You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit.
* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 1000000, model: gemini-3-flash
Please retry in 49.800029905s.

Learn more about Gemini API quotas


You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit.
* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 1000000, model: gemini-3-flash
Please retry in 47.503349762s.

Learn more about Gemini API quotas


You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit.
* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 1000000, model: gemini-3-flash
Please retry in 43.212941022s.

Learn more about Gemini API quotas


[openclaw] missing tool result in session history; inserted synthetic error result for transcript repair.