구글 어시스턴트 Poké Partner에서 음성으로 활성화된 Poké dex를 만들었습니다!다음은 방법입니다.

"헤이, 구글, 포켓몬 파트너와 얘기 좀 하자"



말할 것도 없이 나는 거대한 포켓몬 마니아다.최초의 시리즈가 미국에 왔을 때부터 저는 Ash와 Pikachu가 관동을 정복하려고 시도하거나 포켓몬 블루와 모든 포켓몬 게임에 무수한 시간을 쏟아부은 것을 보았습니다. 그때부터...나는 중독되었다.현재 제 딸은 새로운 드라마를 보고 있습니다. Let's Go Eevee를 하고 있습니다. 20여 년 동안 저는 항상 말을 잘하는 Pokedex를 원합니다.응, 기다릴 만큼 참았어. 그래서 내가 했어.본고에서 저는 Poké Partner에 대한 생각과 실행을 소개할 것입니다. 이것은 구글 홈페이지/조수 응용 프로그램입니다. Pokémon에 대해 이야기할 수 있습니다.
리소스:
Website
Sourcecode

포켓몬이 뭐예요?


PokePartner는 구글 조수 프로그램으로 포켓몬에 대한 답을 빠르게 얻을 수 있다.내가 그것을 지은 것은 내 집안의 문제를 해결하기 위해서이다.포켓몬과의 전투에서 구글 홈페이지'풀/불형 포켓몬에 대항하는 강력한 힘이 무엇인지'를 물어보고 바로 답을 얻을 수 있을 것 같습니다. 제 핸드폰을 잡고 유형표를 볼 필요가 없습니다.처음에는 그랬어요. 저는 그냥 강한 포켓몬이나 약한 다른 포켓몬이 뭔지 알고 싶었어요.

응용 프로그램 설계


그래서 나는 구글 조수를 위해 어떻게 응용 프로그램을 구축하는지 모르겠다.한 차례의 발굴을 통해 나는 Dialogflow를 발견했다. 이것은 사용자가 우호적이고 직관적이며 자연스러운 언어 처리 도구로 구글의 소유이다.이 앱은 사용자와 구글 조수 간의 통신을 직접 처리하여 많은 수수께끼에서 벗어났다.나는 데이터를 어떻게 처리하고 사용자에게 되돌려주는지 알기 위해 대략적인 도표를 설계하기 시작했다.
PokePartner 응용 프로그램의 간단한 구조.
이러한 구경의 응용 프로그램에 필요한 모든 데이터를 수동으로 추가할 수는 없습니다. 미리 존재하고 만들어진 API가 필요합니다.다행히도, PokeAPI 이미 존재합니다.PokeAPI는 한 곳에서 당신이 필요로 하는 모든 Pokémon 데이터를 제공하여 현대적인restfulapi를 통해 쉽게 접근할 수 있습니다.완벽해, 바로 내가 원하는 거야. 게다가 공짜야!나의 현재 유일한 문제는 의미 있는 방식으로 데이터를 내 사용자에게 제공하는 것이다.이것은 내가 Poke API에서 온 데이터를 실제로 구축하고 구글 조수를 통해 Dialogflow를 사용하는 사용자에게 되돌려야 한다는 것을 의미한다.

백엔드 구축


나는 마침내 C#과 개인 웹 API를 구축했다.NET Core 3.0.저는 디렉터리를 모델 보기 컨트롤러(MVC)가 아닌 기능 폴더로 구축했습니다. 특히 전통적인 보기를 사용하지 않는 상황에서 더 깨끗한 형식을 발견했기 때문입니다.기능 폴더를 만들면 기본적으로 모든 관련 파일을 쉽게 접근할 수 있는 디렉터리에 넣을 수 있습니다.대형 응용 프로그램에 있어서, 이것은 모든 내용을 분산시키는 것보다 더욱 의미가 있다.
PokePartner의 기능 폴더 아이디어Api 프로젝트.
이 프로그램은 세 개의 홈 디렉터리로 나눌 것이다.포켓몬, 유형과 서비스.포켓몬 폴더가 하나 있지만 그 안에 모델이 하나 있습니다. 이것은 현재 포켓 파트너가 포켓몬 유형에 대한 문제만 지원하기 때문입니다.하지만 포켓몬 모형.cs 파일은 사용자가 자신의 이름에 따라 Pokemontypes를 얻을 수 있도록 합니다. 이것은 제가 응용 프로그램을 구축한 후에 추가한 좋은 기능입니다.
내가 해결하고 싶은 가장 큰 문제는 어떤 유형의 포켓몬을 사용해서 어떤 단일하거나 이중 유형의 상대 포켓몬을 상대하는지 아는 것이다.이를 위해 Types Controller를 만들고 여러 가지 다른 API 단점을 구축했습니다.컨트롤러는 포켓몬 방어 공세에 대한 질문에 단형 또는 이중형 포켓몬에 대해 대답할 수 있다.포켓몬 유형에 대한 질문에 포켓몬 이름만 기반으로 대답할 수 있다.예:
[HttpGet("defense/{type1}/{type2}")]
        public async Task<IActionResult> DualTypeChartAsDefender(string type1, string type2)
        {
            var types = new List<string>();
            types.Add(type1);
            types.Add(type2);

            var noEffect = new List<string>();
            var notVeryEffectiveRaw = new List<string>();
            var superEffectiveRaw = new List<string>();

            foreach (var t in types)
            {
                var apiType = await _pokeApi.RequestData($"type/{t}");
                var resultsType = JsonConvert.DeserializeObject<TypesModel>(apiType);

                foreach (var rt in resultsType.DamageRelations.DoubleDamageFrom)
                {
                    superEffectiveRaw.Add(rt.Name);
                }

                foreach (var rt in resultsType.DamageRelations.HalfDamageFrom)
                {
                    notVeryEffectiveRaw.Add(rt.Name);
                }

                foreach (var rt in resultsType.DamageRelations.NoDamageFrom)
                {
                    noEffect.Add(rt.Name);
                }
            }

            var json = TypesCalculator.CalculateDamage(superEffectiveRaw, notVeryEffectiveRaw, noEffect);
            return Ok(json);

        }
문제의 포켓몬 유형이 너무 유효하거나 무효하거나 무효라면 컨트롤러의 모든 결과가 되돌아옵니다.그런 다음 원본 데이터를 TypesCalculator로 전송합니다.cs 파일은 더 자세한 결과를 처리합니다.이것은 효과적으로 재사용할 수 있도록 자신의 클래스와 방법에 넣고, 형식이 슈퍼 EffectiveX4, 슈퍼 EffectiveX2, notveryeeffectivehalf, notveryeeffectivequarter 또는 No Effect와 일치하면 되돌려줍니다.결국 구글 조수와 사용자에게 돌아가는 내용이다.
PokeAPI에서 온 데이터를 순조롭게 사용하기 위해 저는 관심 있는 데이터에 모델을 구축하고 서버와 PokeAPI 간의 모든 통신을 처리하는 서비스를 만들었습니다.Pokemon 데이터의 복잡성 때문에, 나는 끼워 넣은 JSON 형식과 잘 어울려 사용할 수 있는 모델을 사용하기로 결정했다.나는 다음과 같은 결론을 얻었다.
public class TypesModel
    {
        [JsonProperty("damage_relations")]
        public DamageResult DamageRelations { get; set; }
    }

    public class DamageResult
    {
        [JsonProperty("double_damage_from")]
        public List<DamageData> DoubleDamageFrom { get; set; }

        [JsonProperty("double_damage_to")]
        public List<DamageData> DoubleDamageTo { get; set; }

        [JsonProperty("half_damage_from")]
        public List<DamageData> HalfDamageFrom { get; set; }

        [JsonProperty("half_damage_to")]
        public List<DamageData> HalfDamageTo { get; set; }

        [JsonProperty("no_damage_from")]
        public List<DamageData> NoDamageFrom { get; set; }

        [JsonProperty("no_damage_to")]
        public List<DamageData> NoDamageTo { get; set; }
    }

    public class DamageData
    {
        [JsonProperty("name")]
        public string Name { get; set; }
    }
PokeAPI와의 통신에 있어서 내 서비스는 매우 간단합니다.나는 단지 HttpClient를 만들고 요청을 정확한 Uri에 전달하고 응답을 기다린 다음에 원본 JSON을 요청 데이터에 되돌려주는 어떤 방법도 만들었다.RESTful API를 사용하기 시작하는 것은 정말 간단합니다.
public async Task<string> RequestData(string endpoint) 
        {
            using (var client = new HttpClient())
            {
                var url = new Uri($"https://pokeapi.co/api/v2/{endpoint}");
                var response = await client.GetAsync(url);
                var results = await response.Content.ReadAsStringAsync();
                return results;
            }
        }
이것은 거의 내가 백엔드에서 해야 할 모든 일이다.이제는 내가 익숙하지 않은 영역으로 옮길 때가 됐어, Dialogflow.

인터페이스 구축


그래서 저는 Dialogflow나 Firebase를 사용하는 전문가가 아닙니다. 저는 영원히 그럴 수 없습니다.저는 Dialogflow를 어떻게 사용하는지에 대한 강좌를 제공하지 않을 뿐만 아니라, Dialogflow에 Firebase를 설정하는 방법에 대한 깊은 안내도 제공하지 않을 것입니다.하지만 내가 시작하기 전에 본 Dialogflow에서.이 동영상은 내가 구글 어시스턴트 앱을 구축할 때의 망설임을 없앴다.Dialogflow는 다음과 같은 두 가지 주요 주제에 대해 논의해야 합니다.
1. 의도: 사용자가 응용 프로그램과 어떻게 상호작용하는지.
목적을 달성하기 위해서는 사용자가 PokePartner에게 물어볼 수 있는 질문이 필요합니다. 예를 들어'슈퍼 효과적인 방화형 포켓몬은 무엇입니까?'아니면 "비행과 수형 포켓몬은 어느 정도 약해요?"아니면'피카츄의 약점은 무엇입니까?'나는 적어도 세 가지 다른 의도가 필요하다. 그래서 나는 최종적으로 세 가지 의도를 했다. 그것이 바로 Single Type, Dual Type과 Pokemon Weakness이다.

이러한 의도를 추가하는 것은 상당히 쉽다.나는 단지 내가 흔히 볼 수 있는 문제의 목록을 추가하고 Dialogflow에 내장된 자연 언어 처리 도구를 사용하여 비슷한 문장을 처리할 수 있다.다음으로 해결해야 할 문제는 내가 어떻게 이런 질문에 대답해야 하는가이다. "나는 버그 유형의 포켓몬을 무엇으로 대처해야 하는가?"정확한 데이터를 얻을 수 있습니까?기술적으로 말하자면, 당신은 Dialogflow를 미리 쓴 답안을 되돌려 줄 수 있지만, 모든 장면에 대해 이렇게 할 수 있다고 상상할 수 있습니까?그건 미친 짓이야!고맙습니다. 이 문제를 처리하기 위해 백엔드 논리를 작성했습니다. PokeAPI에서 원시 데이터를 가져와 유용한 형식으로 변환했습니다.근데 내가 어떻게 했지?
2. 실현: Webhook을 의도에 통합시켜 의미 있는 결과를 제공한다.
간단한 자바스크립트를 작성하고 Firebase를 사용하면 Dialogflow에서 POST 요청을 받을 수 있습니다.Google Cloud의 Dialogflow에서 내장 편집기를 사용하여 이를 수행할 수 있습니다. 이 편집기는 Firebase 클라우드 함수에서 지원됩니다.다음은 빠른 요청 예입니다.
// Single Type 
  function singleTypeHandler(agent){
    const type = agent.parameters.type.toLowerCase();  
    return axios.get(`/type/defense/${type}`)
    .then((result) => {   
      agent.add(`${type} Type Pokémon are weak to ${result.data.superEffective}. So if you want to do the most damage, use one of those types.`); 
      if (result.data.notVeryEffective.length == 0 && result.data.noEffect.length == 0) {
        // If pokemon has notVeryEffect and NoEffect
      } else if (result.data.noEffect.length == 0) {
        // If pokemon has Weakness but no NoEffects
        agent.add(` Do not use ${result.data.notVeryEffective} As those types are not very effective against ${type} Type Pokemon.`);
      } else {
        // If Pokemon has NoEffect only
        agent.add(`By the way, don't use ${result.data.noEffect} because it will have no effect.`);
      }
    }); 
  }
얼마 안 남았어요. 그렇습니다.Firebase는 모든 복잡한 부품을 처리합니다.Javascript와 RESTful API를 작성하는 방법을 알고 있다면 Google Assistant 응용 프로그램을 구축하는 데 매우 적합할 것입니다.

응용 프로그램을 게시하려면 다음과 같이 하십시오.


마침내 나의 응용 프로그램을 발표할 때가 되었다.나는 구글 클라우드 컴퓨팅 엔진을 사용하여 C와 개인 백엔드 API를 사용하기로 결정했다.순수한 핵심.구글 어시스턴트 응용 프로그램에 맞추기 위해'도발적인 사이트'도 발표했다. 나는 이 사이트가 간단한 정적 로그인 페이지이기 때문에 저장통을 사용하고 있다.
구글 클라우드 캡처.
Google은 이들 애플리케이션Actions Console을 사용하여 쉽게 배포할 수 있습니다.너는 정식 정보를 기입하기만 하면 된다. 너의 신청은 며칠 안에 비준을 받거나 거절해야 한다.나의 신청은 처음에 3일이 걸려서야 거절당했다.그것은 거절당했다. 왜냐하면 이 이름은 내가 열거한 이름의 발음과 일치하지 않기 때문이다.솔직히 말해서, 이것은 아주 좋은 포착이다. 내가 그것을 해결하면, 그것은 받아들여지는 같은 날이다.
구글 조작 컨트롤러.
이것은 반드시 모호하게 모든 것을 포괄해야 한다.나는 이미 나의 Github에 이 항목을 열거하여 발표 사이트here를 찾을 수 있다.이 앱을 사용해 보려면'헤이, 구글, 포켓몬 파트너와 얘기해 봐'라고 말해라.하지만 주의해야 할 것은 네가 정말 제(Poke EE Partner)를 과도하게 발음해야 한다는 것이다.
누군가가 그것을 사용할 수 있기를 바랍니다!나는 개인적으로 포켓몬의 검과 포켓몬의 방패를 가지고 놀 때 매우 즐겁게 놀았다.그러나 주의해야 할 것은 본문을 작성할 때 PokeAPI는 최신 세대의 Pokemon을 API에 추가하지 않았기 때문에 그 어떠한 이름도 사용할 수 없습니다.
나는 앞으로 이 프로젝트에 더 많은 내용을 추가할 수 있기를 바란다. 나는 Github 작업에 대한 어떤 추가도 받아들일 수 있어서 매우 기쁘다.나는 그것이 포켓몬 커뮤니티에서 무료이고 사용하기 쉬운 자원이 되기를 바란다.
《포켓몬의 밤》 예술품 작가魔人 王.

좋은 웹페이지 즐겨찾기