Created
February 25, 2019 07:09
-
-
Save yubeneko/980646bab45ee60a102f163e84fc4bec to your computer and use it in GitHub Desktop.
会津若松市のゴミの捨て方情報をClovaとLINEに出力するためのスクリプト。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Net; | |
using System.Net.Http; | |
using System.Threading.Tasks; | |
using CEK.CSharp; | |
using CEK.CSharp.Models; | |
using Line.Messaging; | |
using Microsoft.AspNetCore.Http; | |
using Microsoft.AspNetCore.Mvc; | |
using Microsoft.Azure.WebJobs; | |
using Microsoft.Azure.WebJobs.Extensions.Http; | |
using Microsoft.Extensions.Logging; | |
using Newtonsoft.Json; | |
using Newtonsoft.Json.Linq; | |
namespace ManageClova | |
{ | |
public static class Clova | |
{ | |
private static HttpClient client = new HttpClient (); | |
static LineMessagingClient linemessagingClient = new LineMessagingClient ("your_LINEbots_Access_Token"); | |
[FunctionName ("Clova")] | |
public static async Task<IActionResult> Run ( | |
[HttpTrigger (AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, | |
ILogger log) | |
{ | |
// リクエストのボディの JSON を検証して C# のクラスに変換。 | |
var clovaClient = new ClovaClient (); | |
var clovaRequest = await clovaClient.GetRequest (req.Headers["SignatureCEK"], req.Body); | |
// 返事を作成 | |
var clovaResponse = new CEKResponse (); | |
switch (clovaRequest.Request.Type) | |
{ | |
case RequestType.LaunchRequest: | |
// 起動時の処理 | |
clovaResponse.ShouldEndSession = false; // スキルを終わらせないように設定する | |
clovaResponse.AddText ("こんにちは。会津若松市でだしたいゴミを教えてね。"); | |
break; | |
case RequestType.SessionEndedRequest: | |
// 終了時の処理。スキルが終了したときに何かしたい時は、ここに処理を追加します | |
clovaResponse.AddText ("いつでも呼んでくださいね。"); | |
break; | |
case RequestType.IntentRequest: | |
// インテントの処理 | |
switch (clovaRequest.Request.Intent.Name) | |
{ | |
case "GarbargeIntent": | |
var wantToFindItem = ""; | |
if (clovaRequest.Request.Intent.Slots.TryGetValue ("GarbageSlot", out var commandSlot)) | |
{ | |
// スロットデータを取得できたらそちらを使う | |
wantToFindItem = commandSlot.Value; | |
} | |
if (wantToFindItem == "") | |
{ | |
clovaResponse.AddText ("スロットデータからデータを取得できませんでした。"); | |
clovaResponse.AddText ("出したいゴミの種類を教えてね。"); | |
clovaResponse.ShouldEndSession = false; // スキルを終わらせないように設定する | |
break; | |
} | |
clovaResponse.AddText ($"{wantToFindItem}ですね。"); | |
var jsonText = await GetResponseAsync ("https://www.data4citizen.jp/app/users/openDataOutput/json/get/GARBAGE_MASTER_TABLE"); | |
IList<GarbageThrowAnswer> garbageThrowAnswers = CreateItemList (jsonText); | |
var FoundItems = garbageThrowAnswers.Where (g => g.Item.Contains (wantToFindItem)).ToList (); | |
switch (FoundItems.Count) | |
{ | |
case 0: | |
clovaResponse.AddText ("見つかりませんでした"); | |
break; | |
case 1: | |
clovaResponse.AddText ($"{wantToFindItem}の捨て方。{FoundItems[0].Answer}"); | |
await linemessagingClient.PushMessageAsync (clovaRequest.Session.User.UserId, FoundItems[0].Item); | |
await linemessagingClient.PushMessageAsync (clovaRequest.Session.User.UserId, FoundItems[0].Answer); | |
break; | |
default: | |
clovaResponse.AddText ("複数見つかりました。まだこの機能には対応していません"); | |
break; | |
} | |
clovaResponse.ShouldEndSession = false; // スキルを終わらせないように設定する | |
clovaResponse.AddText ("出したいゴミの種類を教えてね。"); | |
break; | |
default: | |
// 認識できなかったインテント | |
clovaResponse.AddText ("よくわかりませんでした。"); | |
clovaResponse.ShouldEndSession = false; // スキルを終わらせないように設定する | |
break; | |
case "TerminateSlot": | |
clovaResponse.AddText ("いつでも呼んでくださいね。"); | |
clovaResponse.ShouldEndSession = true; | |
break; | |
} | |
break; | |
} | |
// レスポンスとして作成した返事の内容を返す | |
return new OkObjectResult (clovaResponse); | |
} | |
static async Task<string> GetResponseAsync (string uri) | |
{ | |
//var response = new HttpResponseMessage (); | |
var response = await client.GetAsync (uri); | |
string result = await response.Content.ReadAsStringAsync (); | |
return result; | |
} | |
static IList<GarbageThrowAnswer> CreateItemList (string jsonText) | |
{ | |
JObject garbageThrow = JObject.Parse (jsonText); | |
// get JSON result objects into a list | |
IList<JToken> results = garbageThrow["data"].Children ().ToList (); | |
// serialize JSON results into .NET objects | |
IList<GarbageThrowAnswer> garbageThrowAnswers = new List<GarbageThrowAnswer> (); | |
foreach (JToken result in results) | |
{ | |
// JToken.ToObject is a helper method that uses JsonSerializer internally | |
GarbageThrowAnswer garbageThrowAnswer = result.ToObject<GarbageThrowAnswer> (); | |
garbageThrowAnswers.Add (garbageThrowAnswer); | |
} | |
return garbageThrowAnswers; | |
} | |
} | |
public class GarbageThrowAnswer | |
{ | |
public string Item { get; set; } | |
public string Answer { get; set; } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment