
wechat-cli는 개인 위챗 메시지를 주고받는 독립형 Go 터미널 클라이언트다. wechat을 실행해 터미널 인터페이스(TUI)를 열거나 개별 명령을 사용할 수 있다. 위챗 데스크톱 앱이나 브리지 서비스 없이 네이티브 프로토콜로 직접 연결하며, 기존 봇 백엔드는 --backend ilink로 계속 사용할 수 있다.
태블릿 로그인과 메시지 동기화는 시험 계정에서 테스트됐으며, 테스트 중 다른 클라이언트는 로그인 상태를 유지했다. 데스크톱 로그인은 다른 데스크톱 세션을 대체할 수 있다. 휴대전화 프로필은 QR 요청과 폴링 테스트를 통과했지만, 전체 휴대전화 로그인은 아직 테스트되지 않았고 기존 휴대전화 세션을 대체할 수 있다.
Go 1.25 이상이 필요하다. GitHub Actions는 amd64와 arm64용 Linux, macOS, Windows 바이너리와 체크섬을 제공한다. 빌드와 태블릿 로그인은 다음과 같이 시작할 수 있다.
go build -o bin/wechat .
# Scan the terminal QR and approve on your phone.
./bin/wechat --profile tablet login
./bin/wechat --profile tablet
--profile phone, --profile tablet, --profile desktop 중 하나를 선택한다. 프로필마다 인증 정보를 따로 보관한다. TUI는 선택한 프로필을 기억하며 Ctrl+P로 바꿀 수 있다. 기존 ~/.config/wechat-tablet 상태도 인식한다. 전역 플래그는 명령보다 앞에 써야 한다.
터미널 QR 코드는 명시적인 검정·흰색으로 표시한다. 서버에서 받은 PNG/JPEG QR 이미지는 터미널 블록으로 변환해 다시 그린다. login --qr login.png로 QR 이미지를 저장할 수도 있고, login --resume으로 만료되지 않은 로그인 시도를 이어갈 수 있다. 새 기기에서 필요한 휴대전화/LAN 인증 요청은 감지하지만 아직 구현하지 않았다.
TUI에서는 대화 목록이 계속 보이고 메시지 입력란에 포커스가 유지된다. 메시지에는 간결한 발신자·시간 표시와 들여쓴 줄바꿈을 적용한다. 고정 대화에는 PIN을 표시하며, 읽지 않은 메시지 수와 터미널 알림으로 새 메시지를 알린다. 대화를 화면에 표시하고 포커스를 둔 채 맨 아래까지 스크롤하면 읽음 상태를 보낸다.
- 대화 전환: 위쪽/아래쪽 화살표
- 메시지 스크롤: PgUp/PgDn
- 전송: Enter 또는 Ctrl+S
- 줄바꿈: Alt+Enter 또는 Ctrl+J
- 검색/새 대화: Ctrl+K/Ctrl+N
- 메시지 선택: 메시지 클릭
- 선택한 메시지에 답장(기본값은 가장 최근에 받은 메시지): Ctrl+R 또는 마우스 오른쪽 클릭
- 답장 취소: Ctrl+X
- 인용된 원문 보기: 인용 미리보기 클릭
- 링크 열기: 링크 또는 공유 링크 메시지 클릭
- 번역 표시/숨기기: Ctrl+T
- 첨부파일 다운로드/이미지 보기: Ctrl+O를 누른 뒤 항목을 선택하고 Enter
- 기기 프로필 선택: Ctrl+P
- 선택적 메시지 세부 정보 보기: Ctrl+E
- 새로고침/동기화 재시도: Alt+S
- 실패한 전송 복원: Ctrl+Y
- 도움말/종료: Ctrl+G/Ctrl+Q
번역은 별도 계정이나 API 키 없이 위챗의 인증된 서버 API를 사용한다. 기본 언어는 영어이며 tui --language zh_CN으로 바꿀 수 있다. 번역은 원문 아래에 표시하고 비공개로 캐시한다. 삭제된 메시지는 표시되지만 인용하거나 번역할 수 없다. 연락처 및 그룹 구성원 데이터가 있으면 이를 이용해 그룹 이름을 표시한다.
이미지는 터미널의 컬러 블록으로 렌더링한다. 이미지와 파일 다운로드는 지원하지만 음성·동영상 다운로드와 미디어 업로드는 구현되지 않았다. 원격 터미널에서 URL을 열려면 터미널이 Ctrl+클릭을 지원해야 할 수 있다. 인용 답장은 구현됐지만 실제 전송은 아직 테스트되지 않았다.
임시 저장 메시지는 대화별로 보관되며 전송하면 즉시 지워진다. 전송 실패 시 초안을 복원할 수 있다. 전송이 중단된 경우에는 전달 여부가 불확실할 수 있어 자동으로 다시 보내지 않는다.
명령줄과 메시지 보관
개별 명령으로 상태 확인, 동기화, 대화 기록 조회, 연락처 확인, 메시지 전송, 첨부파일 확인, 번역, 읽음 처리 등을 할 수 있다.
./bin/wechat status
./bin/wechat read --follow
./bin/wechat history --limit 50
./bin/wechat contacts
./bin/wechat send --to RECIPIENT_ID --text 'Hello!'
./bin/wechat send --to RECIPIENT_ID --text 'Reply' --reply-to MESSAGE_ID
./bin/wechat wait --timeout 60s --json
./bin/wechat wait --from RECIPIENT_ID --json
./bin/wechat attachment --id MESSAGE_ID --preview
./bin/wechat translate --text '你好,世界' --lang en
./bin/wechat translate --id MESSAGE_ID --lang en
./bin/wechat mark-read --to RECIPIENT_ID
./bin/wechat tui --offline
명령별 옵션은 --help로 확인할 수 있다. wait는 다음 새 수신 메시지를 반환하며 TUI와 함께 실행하면 TUI의 동기화 기록을 살핀다. 메시지를 읽는 프로세스가 없으면 wait가 직접 동기화한다. 제한 시간이 지나면 실패로 종료한다. read는 동기화 페이지를 가져오며 --follow를 지정하면 계속 폴링한다. read --json과 history는 메시지 하나를 JSON 한 줄로 출력한다.
초기 데스크톱·태블릿 동기화에서 기존 메시지가 반환됐지만, 이것만으로 모든 대화나 과거 메시지 전체에 접근할 수 있다고 볼 수는 없다. history는 이 CLI의 보관 자료만 읽는다. 휴대전화 마이그레이션·백업과 공식 데스크톱 데이터베이스 가져오기는 구현되지 않았다.
상태 관리와 프로토콜
상태는 기본적으로 Linux의 ~/.config/wechat-cli에 저장하며 XDG_CONFIG_HOME을 따른다. 네이티브 상태는 기존 iLink 상태와 분리된 native/ 하위 디렉터리에 둔다. 인증 정보와 승인 권한은 권한이 제한된 일반 텍스트 파일로 저장한다(디렉터리 0700, 파일 0600). 설정 디렉터리나 동기화 기록을 공유하지 말아야 한다.
알 수 없는 유형을 포함한 모든 동기화 명령은 커서를 확정하기 전에 native/batches/에 보관한다. history는 계정과 메시지 ID를 기준으로 중복 메시지를 제거한다. 커서 확정 뒤 출력이 중단되면 보관된 메시지를 history에서 복구할 수 있다. 파일은 원자적으로 기록하고 디스크에 동기화한다.
설정 디렉터리마다 동기화 읽기·로그인·로그아웃 프로세스는 하나만 실행할 수 있다. 읽기 프로세스와 동시에 메시지를 보낼 수 있으며, 계정 갱신은 순차 처리한다. 프로세스를 여러 개 실행해도 데스크톱 세션이 추가되지는 않는다.
# Global flags must precede the command.
./bin/wechat --config-dir ~/.config/wechat-work login
./bin/wechat --config-dir ~/.config/wechat-work read --follow
./bin/wechat logout
logout은 로컬 인증 정보와 커서는 삭제하지만 보관 기록은 유지한다. 기기 권한을 원격으로 취소하지 않으므로 휴대전화에서 관리해야 한다. 로그인 과정에서 대체된 데스크톱 세션도 복구하지 않는다.
Go 구현은 MMTLS 서버 서명과 암호화된 레코드를 검증한 뒤, 암호화된 네이티브 protobuf 호출로 QR 요청·폴링, 휴대전화 승인 인증, 동기화, 문자 메시지 전송을 처리한다. 프로필 조사에는 공식 Linux 4.1.13.26 클라이언트와 Android 8.0.79 APK를 사용했다. 서명 검증을 비활성화하는 옵션은 없다. 요청 알림 체크섬은 현재 0을 사용한다. 테스트한 서버는 QR, 인증, 동기화 요청을 받아들였지만 다른 계정이나 빌드와의 호환성은 확인되지 않았다.
네이티브 프로토콜 조사 자료에는 조사한 공식 바이너리, 경로 ID, 프로토콜 참조 자료와 실시간 검증의 한계가 정리돼 있다. 기존 봇 백엔드는 iLink 사용 안내에서 확인할 수 있다. 이 프로젝트는 독립 클라이언트이며 텐센트 공식 제품이 아니다.
go test -race ./...
go vet ./...
테스트는 인증된 전송 레코드, 암호화된 비즈니스 픽스처, 휴대전화 승인·인증 요청 처리, 커서 병합·초기화, 전송 영수증의 발신자 식별, 알 수 없는 동기화 페이로드 보관, 비공개 보관 권한, 재생 중복 제거, 봇 인증 정보와의 분리를 다룬다. 기존 iLink HTTP 및 QR 이미지·렌더링 테스트도 유지된다. 실시간 테스트에서는 데스크톱·태블릿 QR 로그인과 계정 동기화를 확인했고, 사용자가 승인한 태블릿 문자 메시지 한 건을 서버가 수락했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요