기계 학습을 통해 Animal Crossing 캐릭터가 제스처에 반응하도록 만들기



개요



제스처를 학습하기 위해 GoogleTeachable Machine의 모델을 훈련함으로써 우리는 손을 휘두르거나 얼굴을 만들어 해당 반응 명령을 Animal Crossing의 API에 보낼 수 있습니다.

리버스 엔지니어링 Animal Crossing의 API



전화의 NSO 앱을 사용하면 게임에 반응 명령을 보낼 수 있습니다. mitmproxy 이라는 도구를 사용하여 전화에서 어떤 요청이 전송되는지 알 수 있고 반응 명령을 시뮬레이션할 수 있습니다.

brew install mitmproxy

또는 pip install mitmproxy를 사용하십시오.

mitmproxy 실행



mitmproxy

또는 웹 인터페이스를 선호하는 경우 mitmweb을 실행하십시오.

mitmweb

휴대 전화에 mitmproxy 인증서를 설치하십시오.



휴대폰이 컴퓨터와 같은 인터넷에 연결된 상태에서 http://mitm.it/을 방문하여 인증서를 설치합니다. 전화기의 인터넷 설정에서 컴퓨터의 IP 주소를 가리키는 수동 프록시를 추가하십시오.

Mac에서 IP 주소 확인하기



수동 프록시 설정



http://mitm.it에서 인증서 다운로드



정보 > 인증서 신뢰 설정 > 인증서 활성화


Nintendo Switch 앱을 통해 요청 보내기



이제 폰에서 NSO 앱을 실행하고 동물의숲 앱으로 놀아보세요. mitmproxy 터미널을 통해 들어오는 휴대폰의 요청 데이터가 표시되어야 합니다. 전화에서 반응을 보내 반응 요청 형식을 찾을 수 있습니다.





메시징 및 반응에 대한 요청 엔드포인트는 api/sd/v1/messages입니다. 그것을 클릭하면 이 게시물 요청의 쿠키와 양식 데이터를 볼 수 있습니다.



게시물 데이터는 다음과 같습니다.

{
  "body": "Smiling",
  "type": "emoticon"
}

Tip: Press q in the mitmproxy terminal to return to the request list.



제가 수집한 반응 유형은 다음과 같습니다: Hello, Greeting, HappyFlower, Negative, Apologize, Aha, QuestionMark...



List of Reaction Values

Note: I don't have all the reactions in my game right now. It would be great if anyone could provide the other reaction values!


닌텐도 스위치 API에 액세스하기



Nintendo Switch API에 액세스하려면 인증 토큰을 사용하여 Nintendo 서버에 여러 번 요청해야 합니다.
전체 자습서:





성공적인 인증은 다음 세 가지 값을 제공합니다.

  • _g_token 쿠키

  • _park_session 쿠키

  • 인증 전달자 토큰

  • import requests
    
    user_auth_app_head = {
        'Host': 'web.sd.lp1.acbaa.srv.nintendo.net',
        'User-Agent': 'Mozilla/5.0 (Linux; Android 7.1.2; Pixel Build/NJH47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36',
        'Accept': 'application/json, text/plain, */*',
        'Connection': 'keep-alive',
        'Referer': 'https://web.sd.lp1.acbaa.srv.nintendo.net/?lang=en-US&na_country=US&na_lang=en-US',
        'Authorization' : 'tmp',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'en-us'
    }
    
    def sendReaction(reaction_value):
        data = {
            'body': reaction_value,
            'type': 'emoticon'
        }
        res = post_AC_NSOJSON(user_auth_app_head, data, 'https://web.sd.lp1.acbaa.srv.nintendo.net/api/sd/v1/messages')
        if res is not None:
            if 'status' in res:
                if res['status'] == 'success':
                    return 'Reaction sent!'
            elif 'code' in res:
                if res['code'] == '4102':
                    refresh_tokens(
                    return sendReaction(reaction_value)
                if res['code'] == '3002':
                    return 'Reaction not found'
                if res['code'] == '1001':
                    return 'Animal Crossing Session Not Connected'
        return res
    
    def post_AC_NSOJSON(header, body, url):
      h = header
      h['Authorization'] = 'Bearer ' + tokens['ac_b']
      pcookie = {}
      pcookie['_gtoken'] = tokens['ac_g']
      pcookie['_park_session'] = tokens['ac_p']
      r = requests.post(url, headers=h, cookies=pcookie, json=body)
      thejson = json.loads(r.text)
      return thejson
    


    테스트하고 작동하는지 확인하십시오 :)

    sendReaction('Aha')
    




    가르칠 수 있는 기계



    GoogleTeachable Machine은 음성, 사진 및 비디오를 인식하도록 모델을 교육하는 사용하기 쉬운 온라인 도구입니다. 기계 학습이 처음이라면 를 시청하는 것이 좋습니다.



    먼저 포즈 프로젝트를 만듭니다.



    포즈 샘플을 위해 웹캠을 선택합니다. 일등석 중립 이름을 지정하고 제스처없이 자신을 녹음하십시오. 그런 다음 박수를 치거나 손을 흔드는 것과 같은 추가 수업을 추가합니다. 원하는 만큼 창의적이 될 수 있습니다.



    완료되면 기차를 누릅니다. 학습이 완료되면 미리보기 패널에서 모델을 테스트할 수 있습니다. 만족스러우면 미리보기 패널 위의 모델 내보내기를 누르고 TensorFlow 모델을 다운로드합니다.



    간단한 사용자 인터페이스를 위해 제공된 Tensorflow.js Sample Script을 사용할 수 있습니다. 샘플 스크립트를 빈 html 파일에 복사하고 Node.js를 통해 제공합니다.

    npm install http-server -g
    cd my-pose-model
    http-server 
    


    API 호출을 predict() 함수 안에 삽입합니다. API 엔드포인트는 반응을 보내기 위해 Python 서버로 연결되어야 합니다.

    const confidence = 0.8; // Confidence range is 0 to 1
    
    async function predict() {
      ...
      const prediction = await model.predict(posenetOutput);
      for (let i = 0; i < maxPredictions; i++) {
        const classPrediction = prediction[i].className + ": " + prediction[i].probability.toFixed(2);
        // Insert the API call here
        if (prediction[i].probability > confidence) { 
          callReaction(prediction[i].className);
        }
        labelContainer.childNodes[i].innerHTML = classPrediction;
      }
      // finally draw the poses
      drawPose(pose);
    };
    
    let clapping = 0;
    const threshold = 5; // number of times of detection to run API
    async function callReaction(predictionClassName) {
      if (predictionClassName == 'Clapping') {
        clapping += 1
        if (clapping > threshold) {
          fetch('https://myapi.com/?reaction=Clapping');  // Change to your own API endpoint
          clapping = 0; // reset for threshold
        }
      }
    }
    


    창의력을 발휘하고 재미있게 보내세요!



    요약


  • mitmproxy를 사용하여 프라이빗 API를 리버스 엔지니어링합니다
  • .
  • Python으로 API 요청 보내기
  • ML 프로토타이핑에 Google의 Teachable Machine 사용

  • 참조



    Setting-up mitmproxy on macOS to intercept https requests

    좋은 웹페이지 즐겨찾기