# AIWK_PC www.instagram.com ai_read.md

## 현재 기준: v71

이 폴더의 `yjm_save_dialog_auto_enter_ws.py`는 local ws8771 bridge이다.

## v56/v57 Auto PY 흐름

- RTC 주도 자동 클릭 act:

```text
ig_rtc_auto_click_once
```

- 기존 호환 act:

```text
ig_auto_download_click
```

둘 다 내부적으로 `handle_ig_rtc_auto_click_once()`를 타고, RTC 모듈을 로드한다.

로드 대상:

```text
D:\_St\yjm_win2rtc\host\ig_auto_click_download.py
```

환경변수 `IG_RTC_ROOT` 또는 `YJM_RTC_ROOT`가 있으면 그 경로를 우선 사용한다.

## v57 로컬 메타/중복방지 방향

로컬 저장의 목적은 MySQL이 아니라 중복 다운로드 방지와 sort metric 변화 추적이다.

최종 목표 구조:

```text
상위폴더/<최종폴더명>.json
최종폴더/<filename_stem>.jpg
최종폴더/<filename_stem>.mp4
최종폴더/<filename_stem>.md5
```

v57에서 `ig_media_downloaded`는 다음을 준비한다.

- 다운로드 파일 hash 계산: md5, sha256
- `<filename_stem>.md5` JSON sidecar 생성/갱신
- 상위폴더 `<최종폴더명>.json` index 생성/갱신
- 기존 final folder 안에 있던 legacy `<최종폴더명>.json`도 조회 가능하게 유지

`.md5` sidecar는 JSON이고 jpg/mp4 같은 stem 세트를 `files` 안에 저장한다. `sort_history`에는 수집 시점별 views/likes/comments/reposts/ER를 누적할 수 있다.

## 로그

콘솔 verbose 로그에서 확인할 것:

```text
act=ig_rtc_auto_click_once
IG_RTC_AUTO plan rank=1 start=(x,y) click=(x,y)
IG_RTC_AUTO result ok=True rank=1 click=(x,y)
```

파일 로그:

```text
logs\ig_rtc_auto_click_once.jsonl
logs\ig_rtc_auto_click_once_result.jsonl
logs\ig_rtc_auto_click_once_error.jsonl
```

## 폐기 방향

- `domain_auto_start`는 기존 down.txt 자동시작용 noop이다.
- Instagram 사람식 자동 클릭 다운로드 경로에서는 사용하지 않는다.


## v58 RTC 흡수 시작

- `yjm_save_dialog_auto_enter_ws.py`는 `D:\_St\yjm_win2rtc\host\yjm_save_dialog_auto_enter_ws.py`에도 복사되었다.
- 새 권장 실행은 `D:\_St\yjm_win2rtc\run_instagram_auto.bat`이다.
- 이 domain 폴더의 `auto_start.bat`는 호환용으로 남기며 RTC runner를 호출한다.
- `IG_DOMAIN_DIR`/`AIWK_IG_DOMAIN_DIR`가 이 폴더를 가리키므로 config/log/down.txt 호환 데이터는 계속 여기 기준으로 남는다.
- `domain_auto_start`는 여전히 폐기/호환용 noop이며 사람식 자동 클릭에는 쓰지 않는다.

## v58 좌표계 로그

- `ig_rtc_auto_click_once` payload에는 `coordinate_probe`가 포함된다.
- 로그에서 확인할 문자열:
  - `IG_RTC_COORD`
  - `ig_rtc_coordinate_probe.jsonl`
  - `ig_rtc_auto_click_once.jsonl`

## v59 호환 메모
- 실행 주체는 RTC이나, 기존 domain 폴더 호환을 위해 ws8771 파일에도 `ig_rtc_hover_status`를 반영했다.
- hover/current/probe 로그는 domain runtime log_dir 기준으로 생성될 수 있다.

## v60 호환 메모

- 실행 주체는 RTC 폴더(`D:\_St\yjm_win2rtc`)가 우선이다.
- domain 폴더의 `auto_start.bat`는 호환용이며 echo on 유지.
- ws8771는 v60에서 `ig_rtc_browser_origin`을 받아 기준좌표 로그를 남긴다.
- hover/origin 통신은 main 직접 ws가 아니라 Extension background 경유로 들어와야 한다.


## v61 호환 메모

- RTC host와 domain 호환 ws 파일 모두 기준점 텍스트 표시 UI를 가진다.
- 기준점은 `ig_rtc_browser_origin`으로 들어오며, domain logs에 `ig_rtc_browser_origin*.json`이 남을 수 있다.
- 클릭은 hover OK 후 1~3초 랜덤 hold를 거친다. 빠른 반복은 금지한다.

## v62 호환 메모

- RTC host와 domain 호환 ws 파일 모두 FloatingApp 좌상단 삼각 기준점 마커를 가진다.
- 하단 기준점 텍스트는 현재 RTC 작은창 좌상단 screen absolute 좌표를 표시한다.
- 형식은 `기준점: x: 252 y: 0`이며 zoom은 표시하지 않는다.
- main의 `기준점` 드래그 버튼은 제거되었고 `적용`, `복사`만 남는다.


## v63 호환 메모

- domain 호환 ws 파일에도 hover schema `ig_hover_target_v63`과 Tkinter callback 예외 로거를 반영했다.
- 실행 주체는 계속 RTC 폴더가 우선이다.
- `content → background → ws8771`로 들어오는 hover none 전송량은 Extension v63에서 줄였다.
- Chrome zoom/devicePixelRatio가 1.00이 아니면 Extension side에서 자동 클릭을 차단한다.

주의:

- 이 폴더는 인스타 도메인 호환/로그/설정용으로 유지한다.
- 새 권장 실행은 계속 `D:\_St\yjm_win2rtc\run_instagram_auto.bat`이다.


## v66 메모: Main 패널 눈 아이콘 접기 + 원본 인스타 파일명 기반 로컬 메타

- Main 오른쪽 패널은 `눈` 토글 버튼으로 접고 펼칠 수 있다.
  - 펼침 상태에서도 상단에 토글 버튼이 보인다.
  - 접힘 상태에서는 눈 버튼 1개만 남긴다.
  - 상태는 `localStorage["IGBLUE/main_panel_collapsed"]`에 저장한다.
- 다운로드 파일명은 기본적으로 `계정_다운첫로드시각_오리지날인스타파일명.ext` 형식으로 생성한다.
  - `다운첫로드시각`은 해당 계정/shortcode/original filename 조합이 처음 로컬 관리 대상으로 잡힌 시각이며 이후 유지한다.
  - `오리지날인스타파일명`은 CDN URL path의 마지막 파일명에서 확장자를 제거한 값이다.
- `.md5` JSON sidecar와 상위 폴더 JSON에 다음을 저장한다.
  - `first_loaded_at`, `first_loaded_stamp`
  - `instagram_original_filename`, `instagram_original_filename_with_ext`, `instagram_original_ext`
  - `stable_identity.priority = sha256 > md5 > shortcode > media_id > instagram_original_filename > media_url > filename`
  - `sort_history[]`에 캡처 시점별 views/likes/comments/reposts/ER/rank/original filename 누적
- 주의: 인스타 원본 파일명은 중요한 관리키로 넣지만, 단독 유일키로만 믿지 않고 hash/shortcode/media_id와 함께 본다.



## v68 호환 메모: RTC 상태창은 host 기준

- v68의 작은 상태창 1줄 UI와 `_`/`ㅁ` 접기/펼치기 구현은 `D:\_St\yjm_win2rtc\host\yjm_save_dialog_auto_enter_ws.py` 기준이다.
- 위치/접힘/크기 저장은 레지스트리가 아니라 `D:\_St\yjm_win2rtc\host\yjm_save_dialog_auto_enter_config.json`에 저장된다.
- 이 domain 폴더는 기존 호환/로그/설정 보존용으로 유지한다. 새 실행은 계속 `D:\_St\yjm_win2rtc\run_instagram_auto.bat`를 우선한다.


## v70 메모: RTC 꺼짐 시 수동 다운로드 차단

- RTC/ws8771이 꺼진 상태에서 수동 다운로드를 허용하면 로컬 index/.md5 중복관리가 깨질 수 있으므로 다운로드를 막는다.
- background는 `IGBLUE_RTC_STATUS`로 ws8771 상태를 확인하고, 실패 상태를 짧게 캐시해 hover/origin 전송이 WebSocket 접속 실패를 반복하지 않게 한다.
- Main 화면은 RTC가 꺼져 있으면 DEV에 `RTC 꺼짐 / 다운로드 불가`를 표시하고 다운로드 버튼을 `RTC OFF` 잠금 상태로 표시한다.
- 다운로드 클릭 시 RTC가 연결되어 있지 않으면 `chrome.downloads.download`를 호출하지 않고 즉시 차단한다.
- RTC가 켜져 있을 때만 수동 다운로드 → 저장 완료 → `ig_media_downloaded` → .md5/index 갱신 흐름을 허용한다.
- 목적은 이미 받은 파일의 중복 다운로드를 막고, 로컬 관리 기준을 항상 유지하는 것이다.

### v70 추가: 다운로드 전 로컬 중복 확인

- RTC 연결 상태에서 수동 다운로드를 누르면 먼저 `ig_media_exists`로 로컬 index를 확인한다.
- 같은 `sha256/md5/original filename/file_name` 계열이 이미 있으면 다운로드를 시작하지 않고 `이미 완료`로 표시한다.
- v70에서는 shortcode 매칭을 뒤로 미뤘으나, v71에서 이 판단은 폐기한다. 이제 asset-level 중복 판단은 `shortcode + asset_kind + media_index`를 우선한다.
- 다운로드 완료 또는 이미 완료 응답은 Main 버튼에 `완료` 상태로 표시된다.


## v71 메모: shortcode 고정 파일명 + 중복 기준 확정

- 사용자가 최종 확정한 원칙을 기준으로 한다. 추측으로 변경하지 않는다.
- `shortcode`는 인스타 게시물/릴스의 짧고 고정적인 핵심 식별자이므로 파일명에서 절대 제거하지 않는다.
- 다운로드 파일 stem은 다음 형식으로 고정한다.

```text
인스타어카운트_수집시각_No000_shortcode
예: explore_20260628_144008_No003_DZe75vWvd3U
```

- 저장 파일 세트:

```text
<stem>.mp4
<stem>.jpg
<stem>.md5
```

- `수집시각`은 현재 로컬에서 처음 수집/다운로드 관리 대상으로 잡힌 시각이다.
- `No000`은 당시 sort rank 기록용이며 중복키가 아니다.
- 중복 다운로드 1차 기준은 `shortcode + asset_kind + media_index` 이다.
  - 일반 게시물/릴스는 `media_index=0`이다.
  - jpg와 mp4는 같은 shortcode를 공유하지만 asset_kind가 다르므로 각각 1개씩 허용된다.
- CDN filename은 파일명에 붙이지 않는다. `instagram_original_filename*` 필드로 `.md5`와 상위 JSON에 보관한다.
- md5/sha256은 파일명에 넣지 않고 `.md5` 내부와 상위 JSON에 기록한다.
- v70에서 있던 “shortcode 단독 매칭을 뒤로 미룬다”는 판단은 폐기한다. v71부터는 `shortcode + asset_kind + media_index`가 로컬 중복 방지의 우선키다.
