StratoSphere Stream

구글 어시스턴트에는 빌트 인텐트(Built-in intents) 라는것이 있다.

다음 링크에서 확인 가능하다



=> https://developers.google.com/actions/reference/built-in-intents/


사용자가 특정한 것을 의도하면 리스트를 뿌려주는 거 같다. 단편적으로 '게임해줘' 라고 말하면 대충 뜨는 리스트가 있는데

그게 actions.intent.PLAY_GAME 를 적용한 앱들이다.(아닌 것도 있는데 자동적으로 찾아주는거 같다.)


적용 방법은 아래처럼 이벤트에 넣어주면 된다. 자동으로 뜬다.

Dialogflow에서는 이벤트 부분에서 찾으면 된다.

각 빌트가 어떤 의미인지는 위의 링크에 있고.




Comment : 0

REF: https://actions-on-google.github.io/actions-on-google-nodejs/classes/dialogflow.dialogflowconversation.html


지역정보를 얻을려면 권한이 필요하다.

 아래의 코드를 쓴다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
app.intent(ALLROUND_INTENT, (conv, confirmationGranted) => {
  conv.data.fallbackCount = 0;
  console.log("confirmationGranted: ", confirmationGranted)
  if (Object.keys(confirmationGranted).length === 0) { //권한 없으면
 
    //https://developers.google.com/actions/assistant/helpers
    //위치 퍼미션 받는 intent
 
    // Choose one or more supported permissions to request:
    // NAME, DEVICE_PRECISE_LOCATION, DEVICE_COARSE_LOCATION
    const options = {
      context: '이름과 지역정보가 필요합니다.',
      // Ask for more than one permission. User can authorize all or none.
      permissions: ['NAME''DEVICE_PRECISE_LOCATION'],
    };
    conv.ask(new Permission(options));
 
  } else { // 권한을 얻었다면 작업 시작
    
  }
 
});
Colored by Color Scripter
cs

권한이 필요한 곳에 이렇게 쓴다

권한이 없으면 Permission 작업을 한다. 여기선 이름과 위치정보를 받아온다.

confirmationGranted로 현재권이 있는지없는지 구분을 해준다.




dialogflow에 Yes or No 작업을 넣어주고 또하나의 각 Intent 별로 만들어준다.


1
2
3
4
5
6
7
8
9
10
11
12
//actions_intent_PERMISSION
app.intent(ALLROUND_INTENT_YES, (conv, confirmationGranted) => {
  conv.data.fallbackCount = 0;
  console.log("confirmationGranted: ", confirmationGranted)
  conv.followup("aroundAll");
});

app.intent(ALLROUND_INTENT_NO, (conv, confirmationGranted) => {
  conv.data.fallbackCount = 0;
  console.log("confirmationGranted: ", confirmationGranted)
  conv.followup("start");
});

cs




Yes Intent 에는 Dialogflow에 actions_intent_PERMISSION 을 이벤트에 넣어준다.


 conv.followup("start"); 이게 궁금할 수 있는데


followup은 바로 넘겨주는 conv 이다. event이름으로 지정된 intent로 돌려버린다.






Comment : 0


[링크]


제작시 conv.data를 많이 써야 했습니다.

가장 퀄리티 높게 만드느라 고생은 했습니다 약 1주일.

여러 레일(시민은 시민flow, 마피아는 mafia flow)로 설계하느라 이부분이 context로 구현하는데

이건 경험이 있어서 그나마 괜찮은 편.


코드는 별로 공개하고 싶지 않고(이전 코드 보면 공부 충분히 되었으니까)

대략 이런것도 가능하다. 라고 설명을 해드리고 싶습니다.

택배라이브! 만들때도 그렇지만 뭘 만들어도 뭔가 보람이 없네요.

역시 돈이 안되서 그런가.

Comment : 0

구글 어시스턴트 챗봇 제작 의뢰도 받습니다.


dev.LunaStratos@gmail.com 입니다.


그런데 이렇게 쓴다고 해서 의뢰가 들어올지는 모르겠네요

Comment : 0


이번 글은 구글 gmail api를 이용해서 구글 로그인을 하는 방법을 다룬다.


원래는 레퍼런스를 보고 이해를 해야 하지만... 설명이 길면 백과사전이 되는 법. 어떤 과정이 필요한지를 요약하는게 좋을거 같아서 만들었다.


아직까지 어카운트 링크를 다룬 글도 없기도 하고.


0. 시작하기


Dialogflow - 구글 어시스턴트 앱에 로그인을 위해서는 OAuth가 필요하다. 직접 서버를 만드는 방법도 있고 서비스회사에서 서비스를 사는 방법도 있는데


여기서는 간단하게 만드는 테스트 삼아 구글 gmail을 쓴다.



1. API 설정



https://console.cloud.google.com/apis/dashboard 로 이동한다.




빨간 박스로 이동하고나서 "Credentials" 을 검색하면

'


위와같이 하나가 뜬다. 저걸 on한다.


본인은 이미 on되있는 상태라 저렇다.




이런 화면이 나오는데 여기서 사용자 인증 정보  클릭후 사용자 인증 정보 만들기 를 누른다.




그리고 OAuth 클라이언트 ID를 클릭





이 화면이 나오면 다음과 같이 입력한다.


승인된 리디렉션 URI는 https://oauth-redirect.googleusercontent.com/r/your-project-id 형태로 입력을 하면된다.


프로젝트 실제 id 는 action console이나 dialogflow 설정에 보면 나온다.




이 부분에 있다. 그대로 복사한다.



예를들어 고급레스토랑이라는 앱이 있고 프로젝트의 id가 advancedrestaurant 라고 한다면.


https://oauth-redirect.googleusercontent.com/r/advancedrestaurant


이런식으로 만들면 된다.





이제 만들어진 프로젝트를 간다.

위의 화면이 나오는데, 클라이언트의 id와 보안비밀번호를 나중에 쓸것이다.

참고로 그냥 복사할때 빈칸도 복사되는데 이 점을 주의해야 한다.


2. Dialogflow 부분



기능은 다들 알아서 만들겠지만 초기 2개는 중요하다.

welcome intent와 그후 실행할 intent인 get Signin인텐트


초기 시작인 welcome intent는 그냥 webhook만 활성화 해 두었으며

sign in부분에 EVENT를 넣었다.

왜 넣었냐면, Webhook부분에

// Create a Dialogflow intent with the `actions_intent_SIGN_IN` event 라고 주석이 있어서(..)

저렇게 해야 인식이 된다.



welcome인텐트는 초기 로그인에서만 쓰이며, 로그인된 계정은 이후 get Signin인텐트 flow만 쓴다.



다음으로는 integrantions를 한다.



Sign in required를 체크하고 오른쪽 하단의 manage assistant app을 클릭



왼쪽 메뉴에서 하단의 Account linking을 클릭하면

이제 입력만 남았다.






일단 다음과 같이


Linking type은 

OAuth

Authorization code로 한다.




이제 이 부분을 입력해야 한다.


생각이 안날수 있으니 아래를 펼치면 볼수 있다


더보기


Client ID issued by your Actions to Google : 이 부분에는 클라이언트 ID를 넣으면 된다.

Client secret: 클라이언트 보안 비밀을 넣으면 된다.

Authorization URL: https://accounts.google.com/o/oauth2/v2/auth

Token URL : https://www.googleapis.com/oauth2/v4/token


Authorization URL 에 https://accounts.google.com/o/oauth2/v2/auth 주소를 넣으면 안된다고 빨간글씨가 뜰때가 있는데

그때는 https://accounts.orion.com/o/oauth2/v2/auth 같은 걸 넣고 나서save를 하고 다시 원래의 주소

https://accounts.google.com/o/oauth2/v2/auth주소를 넣고 저장하면 된다.


마지막으로 Scopes가 있는데 여기서는 서비스상 메일주소가 필요하기 때문에 메일주소 api를 받는다.

api리스트는 아래의 주소를 가보자.





여러 api가 있는데 메일은 이 부분이 scope에 넣을 주소이다.


이 부분을 부실하게 알려주어서 햇갈리는데, 사진에 보이듯이 저 주소를 넣으면 된다.





마지막으로 제출때의 문제이긴 한데, Account linking앱들의 경우 계정들이 필요하다

계정은 테스터들이 생성하지 않고 개발자가 만들어서 줘야 한다.

고로 저 부분에 테스트용 계정을 입력하면 된다.

안하면 deny 행.



참조 글 : https://stackoverflow.com/questions/44288981/how-to-authenticate-user-with-just-a-google-account-on-actions-on-google

Comment : 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
    console.log("req.body: " + req.body); // debug 
 
    let actions = req.body.queryResult.action; // action name get
 
    // REF: https://dialogflow.com/docs/fulfillment#sample_response_from_the_service
    // Response body
    function jsonResponse(text) {
 
        let json = {
            "fulfillmentText""This is a text response",
            "fulfillmentMessages": [
  ],
            "source""example.com",
            "payload": {
                "google": {
                    "expectUserResponse"true,
                    "richResponse": {
                        "items": [
                            {
                                "simpleResponse": {
                                    "textToSpeech": text
                                }
          }
        ]
                    }
                }
            }
        };
        return json
    }
 
    //Switch
    //It is use action name. 
    let insertText = ''// text make.
    switch (actions) {
        case "input.welcome":
            console.log("input.welcome");
            insertText = "Welcome action";
            
            // 1. insert text in jsonResponse() 
            // 2. it return json field.
            // 3. use it.
            res.send(jsonResponse(insertText)); // json send 
            break;
        default:
            console.log("ETC: default");
            insertText = "another default action";
            res.send(jsonResponse(insertText)); // json send 
            break;
    }
 
 
cs


프로그래머러 들은 이상한 사람들이 많아서 api가 아닌 json raw로 보내야 할때가 있다.

다음과 같이 코드를 쓰면 return이 가능하다.

Comment : 0

 

1. Dialogflow의 상태

2. Webhook의 상태


// Welcome intent.
// V2, It use intent name, not action name.
app.intent(WELCOME_INTENT, (conv) => {
  console.log("WELCOME_INTENT");
  // for debug. If you want debug, copy and paste.
  // conv is json data.

  conv.ask('plat it');
  conv.ask(new MediaObject({
    name: 'Jazz in Paris',
    url: 'http://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3',
    description: 'A funky Jazz tune',
    icon: new Image({
      url: 'http://storage.googleapis.com/automotive-media/album_art.jpg',
      alt: 'Media icon',
    }),
  }));
  conv.ask(new Suggestions(['play']));

});


// actions_intent_MEDIA_STATUS를 intent를 받는 dialogflow에 넣어야 한다.
app.intent('actions.intent.MEDIA_STATUS1', (conv) => {
  console.log('MEDIA_STATUS1')
  const mediaStatus = conv.arguments.get('MEDIA_STATUS');
  let response = 'Unknown media status received.';

  if (mediaStatus && mediaStatus.status === 'FINISHED') {
    response = new MediaObject({
      name: 'Jazz in Paris',
      url: 'http://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3',
      description: 'A funky Jazz tune',
      icon: new Image({
        url: 'http://storage.googleapis.com/automotive-media/album_art.jpg',
        alt: 'Media icon',
      }),
    });

  }
  conv.ask('plat it');
  conv.ask(response);
  conv.ask(new Suggestions(['play']));
});


이렇게 하면 된다.


Comment : 0


다음과 같은 에러시





https://myaccount.google.com/activitycontrols


앱 및 앱 활동을 활성화한다.




Comment : 0

Thank you for your interest in Actions on Google.
There should be no time limit on the data saved in userStorage. The usrStorage should be the same until it is cleared by you or the user.

Kind Regards,

Jean-Charles,
Actions on Google Support Team.


userStorage에 저장이 가능한데 이게 언제까지 저장되는지 몰라서 물어봄.


메일로 물어봤는데 유저가 리셋하지 않는 이상은 계속 존재.

Comment : 0

단순히 원샷으로 끝나는 앱: 가능


flow를 하게 하는 앱 : 가능


계산이나 외부 데이터 끌어오기: 불가능


결론적으로는 가능은 한 데 계산이나 데이터 끌어오는거 등등이 나오면 불가능하다.


조금만 복잡해져도 불가능함. 

Comment : 0