app
[DEPRECATED] Chip Fetcher → adom-chip-fetcher
Public Made by Adomby adom
DEPRECATED — use adom/adom-chip-fetcher. No longer maintained.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
#!/bin/bash
# Captcha demo — explicit human-paced version.
# Replicates cf-ul-fast.sh phase-2's tile-click + verify but with sleep gaps so
# the recording captures (a) each tile getting a checkmark, (b) Verify being
# clicked, (c) green-check appearing, (d) form unlocking + download starting.
set -u
SESS="${CF_SESSION:-chip-fetcher-demo}"
TAB="tab-1"
URL="https://vendor.ultralibrarian.com/TI/embedded/?gpn=LM358&package=D&pin=8&sid=lit2ddb1769f694931cc606e8&c=1"
post_act() {
curl -s -X POST http://127.0.0.1:8780/api/activity \
-H "Content-Type: application/json" \
-d "{\"mpn\":\"$1\",\"stage\":\"$2\"}" > /dev/null
}
# 1. Navigate fresh + click I'm-not-a-robot
post_act LM358 "navigating UL embedded"
adom-desktop browser_navigate "{\"sessionId\":\"$SESS\",\"tabId\":\"$TAB\",\"url\":\"$URL\"}" >/dev/null 2>&1
sleep 5
# Pre-set the form (which CAD formats to download — needed for Submit later)
adom-desktop browser_eval "{\"sessionId\":\"$SESS\",\"tabId\":\"$TAB\",\"expr\":\"(()=>{var labels=['STEP','KiCAD v6+','Altium Designer','Fusion360 PCB']; var n=0; document.querySelectorAll('input[type=checkbox]').forEach(cb=>{var lbl=cb.labels?.[0]?.textContent.trim()||''; if(labels.indexOf(lbl)>=0){cb.checked=true; cb.dispatchEvent(new Event('change',{bubbles:true})); n++;}}); return n;})()\"}" >/dev/null 2>&1
# Click I'm-not-a-robot via trusted-click on its iframe checkbox
post_act LM358 "clicking I'm not a robot"
RECT=$(adom-desktop browser_eval "{\"sessionId\":\"$SESS\",\"tabId\":\"$TAB\",\"expr\":\"(()=>{var f=document.querySelector('iframe[src*=anchor]'); if(!f) return null; var r=f.getBoundingClientRect(); return JSON.stringify({x:Math.round(r.x+30),y:Math.round(r.y+r.height/2)});})()\"}" 2>/dev/null \
| python3 -c "import sys,json; r=json.load(sys.stdin).get('result'); print(r if isinstance(r,str) else '')")
CX=$(echo "$RECT" | python3 -c "import sys,json; d=json.loads(sys.stdin.read() or '{}'); print(d.get('x','0'))")
CY=$(echo "$RECT" | python3 -c "import sys,json; d=json.loads(sys.stdin.read() or '{}'); print(d.get('y','0'))")
echo " checkbox click at ($CX,$CY)"
adom-desktop browser_input_dispatch "{\"sessionId\":\"$SESS\",\"type\":\"click\",\"x\":$CX,\"y\":$CY}" >/dev/null 2>&1
sleep 3.5 # give grid time to render
# 2. Get current iframe rect (the bframe that holds the tile grid)
RECT=$(adom-desktop browser_eval "{\"sessionId\":\"$SESS\",\"tabId\":\"$TAB\",\"expr\":\"(()=>{var f=document.querySelector('iframe[src*=bframe]'); if(!f) return null; var r=f.getBoundingClientRect(); return JSON.stringify({x:Math.round(r.x),y:Math.round(r.y),w:Math.round(r.width),h:Math.round(r.height)});})()\"}" 2>/dev/null \
| python3 -c "import sys,json; r=json.load(sys.stdin).get('result'); print(r if isinstance(r,str) else '')")
IX=$(echo "$RECT" | python3 -c "import sys,json; print(json.loads(sys.stdin.read() or '{}').get('x','0'))")
IY=$(echo "$RECT" | python3 -c "import sys,json; print(json.loads(sys.stdin.read() or '{}').get('y','0'))")
IW=$(echo "$RECT" | python3 -c "import sys,json; print(json.loads(sys.stdin.read() or '{}').get('w','0'))")
IH=$(echo "$RECT" | python3 -c "import sys,json; print(json.loads(sys.stdin.read() or '{}').get('h','0'))")
echo " bframe rect: $IX $IY $IW $IH"
# 3. Click each tile in sequence WITH SLEEP between — checkmark appears between clicks
SIDE_PCT=0.027; HEADER_PCT=0.16; FOOTER_PCT=0.18
GRID_X0=$(python3 -c "print(int($IX + $IW * $SIDE_PCT))")
GRID_Y0=$(python3 -c "print(int($IY + $IH * $HEADER_PCT))")
GRID_W=$(python3 -c "print(int($IW * (1 - 2 * $SIDE_PCT)))")
GRID_H=$(python3 -c "print(int($IH * (1 - $HEADER_PCT - $FOOTER_PCT)))")
TW=$(python3 -c "print($GRID_W / 3)")
TH=$(python3 -c "print($GRID_H / 3)")
TILES=(1 2 8)
for T in "${TILES[@]}"; do
ROW=$(( (T - 1) / 3 ))
COL=$(( (T - 1) % 3 ))
X=$(python3 -c "print(int($GRID_X0 + ($COL + 0.5) * $TW))")
Y=$(python3 -c "print(int($GRID_Y0 + ($ROW + 0.5) * $TH))")
post_act LM358 "clicking motorcycle tile $T"
echo " tile $T at ($X,$Y)"
adom-desktop browser_input_dispatch "{\"sessionId\":\"$SESS\",\"type\":\"click\",\"x\":$X,\"y\":$Y}" >/dev/null 2>&1
sleep 1.6 # checkmark animates in ~700ms; gives clear visual gap between tiles
done
# 4. Click Verify
VX=$((IX + IW - 75))
VY=$((IY + IH - 40))
post_act LM358 "clicking Verify"
sleep 0.5
adom-desktop browser_input_dispatch "{\"sessionId\":\"$SESS\",\"type\":\"click\",\"x\":$VX,\"y\":$VY}" >/dev/null 2>&1
sleep 4 # captcha closes, green checkmark renders, token populates
# 5. Click the form's main Submit (download) button — atomic eval
post_act LM358 "captcha solved → submitting download"
adom-desktop browser_eval "{\"sessionId\":\"$SESS\",\"tabId\":\"$TAB\",\"expr\":\"(()=>{var btn=document.getElementById('SubmitLink')||document.querySelector('button[type=submit]'); if(btn){btn.removeAttribute('disabled'); btn.click(); return 'clicked: '+(btn.id||btn.textContent);} return 'no submit button';})()\"}" >/dev/null 2>&1
sleep 6 # 'Your Ultra Librarian download is being processed' page renders
post_act LM358 "download succeeded ✓"
sleep 2