NOMO.asia

2023년 7월 3일 코멘트 추가 - 현재 Afreehp 관련 코드는 동작하지 않는 듯합니다.

Twip-Toonation-Afreehp-Parser-Example

이전에 Twitch Play 개발 중, 시청자들의 도네이션 금액이 일정 금액이 되는 경우 무언가 피드백을 주기 위한 용도로 투네이션(Toonation) 의 도네이션 알림을 파싱하는 코드를 Nodejs 로 작성한 적이 있었다. 누군가 후원을 하면 이를 파싱하여 인식하고 채널 내에서만 사용 가능한 가상의 포인트로 리워드를 주었는데, 시청자들이 채팅을 통해 이 포인트를 사용하여 게임에 직접 참여하거나 이것저것을 재미있는 것들을 할 수 있게 하려는 목적이었다.

이와 유사하게, 최근 자신만의 Twitch Play 를 만드려는 어떤 분의 부탁으로 투네이션(Toonation), 트윕(Twip), 아프리카 도우미(Afreeca Helper) 의 도네이션 알림을 파싱하는 Nodejs 코드를 작성하게 되었다. 아프리카도우미를 파싱한 이유는 한 번의 파싱으로 Twitch Bit, Youtube Superchat, Afreeca 별풍선 후원 내역을 모두 가져오기 위함이다(물론 Youtube 와 Twitch 의 경우 각 플랫폼에서 제공하는 API를 사용하여 직접 해도 된다). 여기에 Twip 과 Toonation 을 더하면 현재 대한민국에서 주로 사용되는 거의 모든 후원 플랫폼의 도네이션 알림을 파싱할 수 있게 된다.

만약 이러한 것에 관심이 있는 사람이라면 Github 에 Nodejs 로 작성된 예제 코드를 공개해두었으므로 다음의 링크에서 확인하면 된다. 2021년 6월 9일을 기준으로 정상 동작한다. https://github.com/nomomo/Twip-Toonation-Afreehp-Parser-Example

이를 바탕으로 Twip, Toonation, Twitch, Youtube, Afreeca 를 아우르는 통합 도네이션 알림 서비스도 만들 수 있을 것 같긴 하다. 모든 UI를 새롭게 만들어도 되고, 만약 가능하다면 플랫폼을 하나 정해서 알림 테스트 메시지로 위장한 다른 플랫폼의 도네이션 메시지를 보내는 방식으로도 구현할 수 있을 듯하지...만 이렇게 하면 안 되겠지 😓.

How to use

git clone, npm install 후 index.js 파일을 열어, 아래 이미지에 나와있는 settings 의 alertbox_url 을 자신의 Afreeca helper, Twip, Toonation 의 Alert Box URL 으로 수정하면 된다. 당연히 Alertbox URL 을 모르는 다른 방송인의 도네이션 내역을 파싱하는 것은 불가능하다.

만약 사용하지 않을 플랫폼이 있다면 use 를 false 로 바꿔주면 된다.

코드를 실행하고 후원 관리자 페이지에서 알림 테스트를 실행하여 콘솔에 찍히는 응답을 확인하면 된다. 플랫폼 별로 응답 형태가 다르므로 필요에 따라 응답을 가공하는 것은 직접 해야한다.

정식 제공되는 API 가 아니라서 간혹 응답 형태가 바뀌는 경우가 있다. 이 때마다 예제 코드를 다시 수정하기 귀찮아서 응답을 동일 포맷으로 변환하는 것 까지는 코딩해두지 않았다.

파싱 핵심 포인트

Afreeca helper

  • Socket.IO
  • Socket.IO v2.x 서버를 사용하므로 Client 도 v2.x 버전을 사용해야 함. (Client v3.x 는 Server v2.x 에 연결할 수 없기 때문. 반대로 Client v2.x 로 Server v3.x 에 연결하는 것은 가능하다.)
  • Alertbox url 로부터 idx 값 파싱 필요
  • Socket.IO 연결 후, idx 값을 emit 하는 순간부터 본인 Alert box 의 알림을 가져올 수 있음

Twip

  • WebSocket
  • Alert box url 로부터 token, version 값 파싱 필요
  • 일정 주기(약 20~30초) 간격으로 ping 에 해당하는 메시지를 보내야 연결이 종료되지 않음

Toonation

  • WebSocket
  • Alertbox url 로부터 payload 값 파싱 필요
  • 일정 주기(약 12초) 간격으로 ping 을 보내야 연결이 강제 종료되지 않음