Skip to content

Instantly share code, notes, and snippets.

@yubeneko
Created February 25, 2019 07:09
Show Gist options
  • Save yubeneko/980646bab45ee60a102f163e84fc4bec to your computer and use it in GitHub Desktop.
Save yubeneko/980646bab45ee60a102f163e84fc4bec to your computer and use it in GitHub Desktop.
会津若松市のゴミの捨て方情報をClovaとLINEに出力するためのスクリプト。
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