{"id":241,"date":"2025-03-04T01:07:44","date_gmt":"2025-03-03T16:07:44","guid":{"rendered":"https:\/\/hexis.jp\/?p=241"},"modified":"2025-03-04T01:11:18","modified_gmt":"2025-03-03T16:11:18","slug":"%e3%80%90%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%e3%80%91laravel%e3%81%a7dialogflow%e3%81%a8%e9%80%a3%e6%90%ba%e3%81%97%e3%81%a6%e5%a4%a9%e6%b0%97%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97","status":"publish","type":"post","link":"https:\/\/hexis.jp\/?p=241","title":{"rendered":"\u3010\u521d\u5fc3\u8005\u5411\u3051\u3011Laravel\u3067Dialogflow\u3068\u9023\u643a\u3057\u3066\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u308b"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"><\/span><strong>1. \u306f\u3058\u3081\u306b<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Web\u30a2\u30d7\u30ea\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u5165\u529b\u3057\u305f\u5185\u5bb9\u3092\u3082\u3068\u306b\u5916\u90e8\u306eAPI\u3068\u9023\u643a\u3057\u3066\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u6a5f\u80fd\u306f\u975e\u5e38\u306b\u4fbf\u5229\u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001<strong>Laravel\u3068Google\u306e\u81ea\u7136\u8a00\u8a9e\u7406\u89e3\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u300cDialogflow\u300d\u3092\u9023\u643a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3059\u308b\u3068\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5<\/strong> \u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 \u3053\u306e\u8a18\u4e8b\u3067\u5b66\u3079\u308b\u3053\u3068<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dialogflow\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/strong>\uff08\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u4f5c\u6210\u30fb\u30a4\u30f3\u30c6\u30f3\u30c8\u8a2d\u5b9a\u30fbWebhook\u306e\u6d3b\u7528\uff09<\/li>\n\n\n\n<li><strong>Laravel\u3068Dialogflow\u306e\u9023\u643a\u65b9\u6cd5<\/strong>\uff08Webhook\u3092\u5229\u7528\u3057\u3066Dialogflow\u306e\u5fdc\u7b54\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\uff09<\/li>\n\n\n\n<li><strong>\u5929\u6c17\u4e88\u5831API\u3068\u306e\u7d71\u5408<\/strong>\uff08OpenWeatherMap API\u306a\u3069\u3092\u5229\u7528\u3057\u3066\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306e\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 \u5fc5\u8981\u306a\u74b0\u5883<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u8a18\u4e8b\u3092\u9032\u3081\u308b\u306b\u3042\u305f\u3063\u3066\u3001\u4ee5\u4e0b\u306e\u74b0\u5883\u3092\u6e96\u5099\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u9805\u76ee<\/th><th>\u30d0\u30fc\u30b8\u30e7\u30f3 \/ \u5099\u8003<\/th><\/tr><\/thead><tbody><tr><td>PHP<\/td><td>8.0\u4ee5\u4e0a\uff08Laravel\u306e\u63a8\u5968\u74b0\u5883\uff09<\/td><\/tr><tr><td>Laravel<\/td><td>10.x\uff08\u307e\u305f\u306f9.x\uff09<\/td><\/tr><tr><td>Composer<\/td><td>\u6700\u65b0\u7248\u3092\u63a8\u5968<\/td><\/tr><tr><td>Google Cloud\u30a2\u30ab\u30a6\u30f3\u30c8<\/td><td>Dialogflow\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981<\/td><\/tr><tr><td>OpenWeatherMap API\u30ad\u30fc<\/td><td>\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 \u5b9f\u88c5\u3059\u308b\u6a5f\u80fd\u306e\u6d41\u308c<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dialogflow\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/strong>\uff08\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u4f5c\u6210\u30fb\u30a4\u30f3\u30c6\u30f3\u30c8\u8a2d\u5b9a\u30fbWebhook\u6709\u52b9\u5316\uff09<\/li>\n\n\n\n<li><strong>Laravel\u3067Dialogflow\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3059\u308bWebhook\u3092\u4f5c\u6210<\/strong><\/li>\n\n\n\n<li><strong>\u5929\u6c17\u4e88\u5831API\uff08OpenWeatherMap\u306a\u3069\uff09\u3068\u9023\u643a\u3057\u3066\u5929\u6c17\u30c7\u30fc\u30bf\u3092\u53d6\u5f97<\/strong><\/li>\n\n\n\n<li><strong>\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8a18\u4e8b\u3067\u306f\u3001\u521d\u5fc3\u8005\u306e\u65b9\u3067\u3082\u7406\u89e3\u3057\u3084\u3059\u3044\u3088\u3046\u306b <strong>\u30b9\u30c6\u30c3\u30d7\u3054\u3068\u306b\u30b3\u30fc\u30c9\u3092\u7d39\u4ecb\u3057\u306a\u304c\u3089\u89e3\u8aac<\/strong> \u3057\u3066\u3044\u304d\u307e\u3059\u3002\u305c\u3072\u3001Laravel\u3068Dialogflow\u306e\u9023\u643a\u3092\u4f53\u9a13\u3057\u306a\u304c\u3089\u3001Web\u30a2\u30d7\u30ea\u958b\u767a\u30b9\u30ad\u30eb\u3092\u5411\u4e0a\u3055\u305b\u3066\u304f\u3060\u3055\u3044\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Dialogflow%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97\"><\/span><strong>2. Dialogflow\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u306f\u3001Google\u306e\u81ea\u7136\u8a00\u8a9e\u7406\u89e3\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0 <strong>Dialogflow<\/strong> \u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u3001\u5929\u6c17\u4e88\u5831\u306b\u95a2\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306e\u5165\u529b\u3092\u51e6\u7406\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 2-1. Google Cloud\u3067Dialogflow\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Google Cloud Console<\/strong>\uff08<a>https:\/\/console.cloud.google.com\/<\/a>\uff09\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001Google\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210<\/strong> \u3057\u3001\u308f\u304b\u308a\u3084\u3059\u3044\u540d\u524d\uff08\u4f8b: <code>weather-dialogflow<\/code>\uff09\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>Dialogflow API\u3092\u6709\u52b9\u5316<\/strong> \u3059\u308b\u305f\u3081\u3001\u5de6\u4e0a\u306e\u300c\u2261 \u30e1\u30cb\u30e5\u30fc\u300d\u2192\u300cAPI\u3068\u30b5\u30fc\u30d3\u30b9\u300d\u2192\u300c\u30e9\u30a4\u30d6\u30e9\u30ea\u300d\u3092\u958b\u304d\u3001<code>Dialogflow API<\/code> \u3092\u691c\u7d22\u3057\u3066\u6709\u52b9\u5316\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 2-2. Dialogflow\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/console.cloud.google.com\/?hl=ja\">Dialogflow\u306e\u30b3\u30f3\u30bd\u30fc\u30eb<\/a> \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001\u300c<strong>\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u4f5c\u6210<\/strong>\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u540d\uff08\u4f8b: <code>WeatherBot<\/code>\uff09\u3092\u5165\u529b\u3057\u3001\u300c<strong>Google Cloud\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/strong>\u300d\u3067\u5148\u307b\u3069\u4f5c\u6210\u3057\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u9078\u629e\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u8a00\u8a9e\u3092\u300c<strong>\u65e5\u672c\u8a9e<\/strong>\u300d\u3001\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u9069\u5207\u306a\u3082\u306e\u306b\u8a2d\u5b9a\u3057\u3001\u300c<strong>\u4f5c\u6210<\/strong>\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 2-3. \u30a4\u30f3\u30c6\u30f3\u30c8\u306e\u4f5c\u6210\uff08\u30e6\u30fc\u30b6\u30fc\u5165\u529b\u306e\u51e6\u7406\uff09<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30a4\u30f3\u30c6\u30f3\u30c8\uff08Intent\uff09\u3068\u306f\u3001<strong>\u30e6\u30fc\u30b6\u30fc\u304c\u5165\u529b\u3057\u305f\u5185\u5bb9\u306e\u610f\u56f3\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306a\u5fdc\u7b54\u3092\u8fd4\u3059\u305f\u3081\u306e\u8a2d\u5b9a<\/strong> \u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u300c\u30a4\u30f3\u30c6\u30f3\u30c8\u300d\u30e1\u30cb\u30e5\u30fc\u3092\u958b\u304d\u3001\u300c\u65b0\u3057\u3044\u30a4\u30f3\u30c6\u30f3\u30c8\u300d\u3092\u4f5c\u6210<\/strong> \u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30a4\u30f3\u30c6\u30f3\u30c8\u540d\u3092 <code>GetWeather<\/code> \u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u300c\u30c8\u30ec\u30fc\u30cb\u30f3\u30b0\u30d5\u30ec\u30fc\u30ba\u300d\u306b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30d5\u30ec\u30fc\u30ba\u3092\u5165\u529b\u3057\u307e\u3059\u3002\n<ul class=\"wp-block-list\">\n<li>\u300c\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066\u300d<\/li>\n\n\n\n<li>\u300c\u5927\u962a\u306e\u5929\u6c17\u306f\uff1f\u300d<\/li>\n\n\n\n<li>\u300c\u798f\u5ca1\u306e\u5929\u6c17\u3092\u77e5\u308a\u305f\u3044\u300d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u300c\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u300d\u3092\u8a2d\u5b9a\u3057\u3001 <code>{location}<\/code> \u3068\u3044\u3046\u5909\u6570\u3092\u4f5c\u6210\u3057\u3066\u90fd\u5e02\u540d\u3092\u53d6\u5f97\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u300c\u4fdd\u5b58\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 2-4. Fulfillment\uff08Webhook\uff09\u306e\u6709\u52b9\u5316<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dialogflow\u3067\u306f\u3001Webhook\u3092\u4f7f\u3063\u3066\u5916\u90e8\u306e\u30b5\u30fc\u30d0\u30fc\uff08Laravel\uff09\u3068\u9023\u643a\u3057\u3001\u52d5\u7684\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u300c<strong>Fulfillment<\/strong>\u300d\u30e1\u30cb\u30e5\u30fc\u3092\u958b\u304d\u3001\u300c<strong>Webhook\u3092\u6709\u52b9\u5316<\/strong>\u300d\u3092\u30aa\u30f3\u306b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>Webhook\u306eURL\u306b\u306f\u3001\u5f8c\u307b\u3069\u4f5c\u6210\u3059\u308b <strong>Laravel\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\uff08\u4f8b: <code>https:\/\/yourdomain.com\/api\/dialogflow<\/code>\uff09<\/strong> \u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\uff08\u4eca\u306f\u4eee\u306eURL\u3092\u5165\u529b\u3057\u3066\u304a\u304d\u3001Laravel\u5074\u3092\u69cb\u7bc9\u3057\u305f\u5f8c\u306b\u66f4\u65b0\u3057\u307e\u3059\uff09<\/li>\n\n\n\n<li>\u300c\u4fdd\u5b58\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Laravel%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97\"><\/span><strong>3. Laravel\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306b\u3001Laravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u3001Dialogflow\u3068\u9023\u643a\u3067\u304d\u308b\u74b0\u5883\u3092\u6574\u3048\u307e\u3059\u3002Laravel\u5074\u3067\u306f\u3001Dialogflow\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308b\u305f\u3081\u306eWebhook\u3092\u4f5c\u6210\u3057\u3001\u5929\u6c17\u4e88\u5831API\u3068\u9023\u643a\u3057\u3066\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 3-1. Laravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u3001\u65b0\u898f\u306eLaravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b\u304b\u3001\u65e2\u5b58\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\ud83d\udee0 \u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b\u5834\u5408<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3001\u65b0\u3057\u3044Laravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>composer create-project --prefer-dist laravel\/laravel dialogflow-weather<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>cd dialogflow-weather<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\ud83d\udee0 \u65e2\u5b58\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u65e2\u5b58\u306eLaravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u305d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 3-2. \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dialogflow API\u3068\u5916\u90e8\u306e\u5929\u6c17\u4e88\u5831API\u3092\u6271\u3046\u305f\u3081\u306b\u3001<code>GuzzleHTTP<\/code> \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001Laravel\u306eHTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3067API\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>composer require guzzlehttp\/guzzle<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 3-3. \u74b0\u5883\u5909\u6570\uff08.env\uff09\u306e\u8a2d\u5b9a<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">API\u30ad\u30fc\u3084\u5916\u90e8\u30b5\u30fc\u30d3\u30b9\u306e\u60c5\u5831\u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b\u3001<code>.env<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>nano .env<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306e\u3088\u3046\u306b\u3001Dialogflow\u306eWebhook URL\u3084\u5929\u6c17\u4e88\u5831API\u306e\u30ad\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\uff08<code>YOUR_OPENWEATHER_API_KEY<\/code> \u306e\u90e8\u5206\u306f\u3001\u5f8c\u307b\u3069\u53d6\u5f97\u3059\u308bAPI\u30ad\u30fc\u306b\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-graphql\" data-lang=\"GraphQL\"><code>DIALOGFLOW_WEBHOOK_URL=https:\/\/yourdomain.com\/api\/dialogflow\nOPENWEATHER_API_KEY=YOUR_OPENWEATHER_API_KEY<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u5909\u66f4\u3092\u4fdd\u5b58\u3057\u305f\u3089\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u30af\u30ea\u30a2\u3057\u3066\u8a2d\u5b9a\u3092\u53cd\u6620\u3055\u305b\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan config:clear<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 3-4. Laravel\u306e\u30eb\u30fc\u30c8\u8a2d\u5b9a<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dialogflow\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308b\u305f\u3081\u306e <strong>Webhook\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8<\/strong> \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>routes\/api.php<\/code> \u3092\u958b\u304d\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>use Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\nuse App\\Http\\Controllers\\DialogflowController;\n\nRoute::post(&#39;\/dialogflow&#39;, [DialogflowController::class, &#39;handleRequest&#39;]);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u304c\u3001Dialogflow\u306eWebhook\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3059\u308b\u5f79\u5272\u3092\u679c\u305f\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 3-5. \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306b\u3001Dialogflow\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3059\u308b <code>DialogflowController<\/code> \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan make:controller DialogflowController<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f5c\u6210\u3055\u308c\u305f <code>app\/Http\/Controllers\/DialogflowController.php<\/code> \u3092\u958b\u304d\u3001\u6b21\u306e\u3088\u3046\u306b\u7de8\u96c6\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Http;\n\nclass DialogflowController extends Controller\n{\n    public function handleRequest(Request $request)\n    {\n        \/\/ Dialogflow\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d6\u5f97\n        $queryText = $request-&gt;input(&#39;queryResult.queryText&#39;);\n        $city = $request-&gt;input(&#39;queryResult.parameters.location&#39;);\n\n        if (!$city) {\n            return response()-&gt;json([&#39;fulfillmentText&#39; =&gt; &#39;\u90fd\u5e02\u540d\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#39;]);\n        }\n\n        \/\/ \u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\n        $weather = $this-&gt;getWeather($city);\n\n        return response()-&gt;json([&#39;fulfillmentText&#39; =&gt; $weather]);\n    }\n\n    private function getWeather($city)\n    {\n        $apiKey = env(&#39;OPENWEATHER_API_KEY&#39;);\n        $url = &quot;https:\/\/api.openweathermap.org\/data\/2.5\/weather?q={$city}&appid={$apiKey}&units=metric&lang=ja&quot;;\n\n        $response = Http::get($url);\n\n        if ($response-&gt;failed()) {\n            return &quot;\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002&quot;;\n        }\n\n        $data = $response-&gt;json();\n        $description = $data[&#39;weather&#39;][0][&#39;description&#39;];\n        $temp = $data[&#39;main&#39;][&#39;temp&#39;];\n\n        return &quot;{$city}\u306e\u5929\u6c17\u306f\u300c{$description}\u300d\u3001\u6c17\u6e29\u306f{$temp}\u00b0C\u3067\u3059\u3002&quot;;\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81\"><\/span><strong>\ud83c\udfaf \u3053\u3053\u307e\u3067\u306e\u307e\u3068\u3081<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Laravel\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210<br>\u2705 \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\uff08GuzzleHTTP\uff09\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<br>\u2705 <code>.env<\/code> \u306bDialogflow\u3068\u5929\u6c17API\u306e\u8a2d\u5b9a\u3092\u8ffd\u52a0<br>\u2705 Dialogflow\u306eWebhook\u7528\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u4f5c\u6210<br>\u2705 Dialogflow\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3057\u3001\u5929\u6c17\u4e88\u5831API\u3068\u9023\u643a\u3059\u308b\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3092\u4f5c\u6210<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_%E5%A4%A9%E6%B0%97%E4%BA%88%E5%A0%B1API%EF%BC%88OpenWeatherMap%E3%81%AA%E3%81%A9%EF%BC%89%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA\"><\/span><strong>4. \u5929\u6c17\u4e88\u5831API\uff08OpenWeatherMap\u306a\u3069\uff09\u3068\u306e\u9023\u643a<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u3001Dialogflow\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308a\u3001\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u6e96\u5099\u3092\u3057\u307e\u3057\u305f\u3002\u3053\u3053\u3067\u306f\u3001\u5929\u6c17\u4e88\u5831API\uff08OpenWeatherMap\uff09\u3092\u4f7f\u3063\u3066\u3001\u5b9f\u969b\u306b\u90fd\u5e02\u306e\u5929\u6c17\u3092\u53d6\u5f97\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 4-1. OpenWeatherMap API\u306e\u767b\u9332<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u3001OpenWeatherMap\u306eAPI\u30ad\u30fc\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a>OpenWeatherMap<\/a> \u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001\u65b0\u898f\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3002<\/li>\n\n\n\n<li>\u30ed\u30b0\u30a4\u30f3\u5f8c\u3001\u300c<strong>API Keys<\/strong>\u300d\u306e\u30da\u30fc\u30b8\u3067\u65b0\u3057\u3044API\u30ad\u30fc\u3092\u53d6\u5f97\u3059\u308b\u3002\uff08\u7121\u6599\u30d7\u30e9\u30f3\u3067\u3082\u57fa\u672c\u7684\u306a\u5929\u6c17\u60c5\u5831\u306f\u53d6\u5f97\u53ef\u80fd\uff09<\/li>\n\n\n\n<li><code>.env<\/code> \u30d5\u30a1\u30a4\u30eb\u306bAPI\u30ad\u30fc\u3092\u8ffd\u52a0\u3059\u308b\u3002<\/li>\n<\/ol>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-graphql\" data-lang=\"GraphQL\"><code>OPENWEATHER_API_KEY=YOUR_API_KEY_HERE<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u8ffd\u52a0\u3057\u305f\u3089\u3001\u8a2d\u5b9a\u3092\u53cd\u6620\u3059\u308b\u305f\u3081\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u30af\u30ea\u30a2\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan config:clear<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 4-2. \u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u95a2\u6570\u3092\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5929\u6c17\u4e88\u5831API\u3092\u547c\u3073\u51fa\u3057\u3066\u3001\u90fd\u5e02\u3054\u3068\u306e\u5929\u6c17\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3059\u308b\u51e6\u7406\u3092 <code>WeatherService<\/code> \u30af\u30e9\u30b9\u3068\u3057\u3066\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u2460 <code>app\/Services\/WeatherService.php<\/code> \u3092\u4f5c\u6210<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3001<code>Services<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\uff08\u65e2\u306b\u3042\u308b\u5834\u5408\u306f\u4e0d\u8981\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>mkdir app\/Services<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306b\u3001<code>WeatherService.php<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nnamespace App\\Services;\n\nuse Illuminate\\Support\\Facades\\Http;\n\nclass WeatherService\n{\n    public function getWeather($city)\n    {\n        $apiKey = env(&#39;OPENWEATHER_API_KEY&#39;);\n        $url = &quot;https:\/\/api.openweathermap.org\/data\/2.5\/weather?q={$city}&appid={$apiKey}&units=metric&lang=ja&quot;;\n\n        $response = Http::get($url);\n\n        if ($response-&gt;failed()) {\n            return &quot;\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002&quot;;\n        }\n\n        $data = $response-&gt;json();\n        $description = $data[&#39;weather&#39;][0][&#39;description&#39;];\n        $temp = $data[&#39;main&#39;][&#39;temp&#39;];\n\n        return &quot;{$city}\u306e\u5929\u6c17\u306f\u300c{$description}\u300d\u3001\u6c17\u6e29\u306f{$temp}\u00b0C\u3067\u3059\u3002&quot;;\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 4-3. \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067 <code>WeatherService<\/code> \u3092\u5229\u7528\u3059\u308b<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306b\u3001<code>DialogflowController<\/code> \u3067 <code>WeatherService<\/code> \u3092\u5229\u7528\u3059\u308b\u3088\u3046\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u2461 <code>app\/Http\/Controllers\/DialogflowController.php<\/code> \u3092\u7de8\u96c6<\/strong><\/h4>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse App\\Services\\WeatherService;\n\nclass DialogflowController extends Controller\n{\n    protected $weatherService;\n\n    public function __construct(WeatherService $weatherService)\n    {\n        $this-&gt;weatherService = $weatherService;\n    }\n\n    public function handleRequest(Request $request)\n    {\n        \/\/ Dialogflow\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d6\u5f97\n        $queryText = $request-&gt;input(&#39;queryResult.queryText&#39;);\n        $city = $request-&gt;input(&#39;queryResult.parameters.location&#39;);\n\n        if (!$city) {\n            return response()-&gt;json([&#39;fulfillmentText&#39; =&gt; &#39;\u90fd\u5e02\u540d\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#39;]);\n        }\n\n        \/\/ \u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\n        $weather = $this-&gt;weatherService-&gt;getWeather($city);\n\n        return response()-&gt;json([&#39;fulfillmentText&#39; =&gt; $weather]);\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 4-4. \u52d5\u4f5c\u78ba\u8a8d\uff08API\u30c6\u30b9\u30c8\uff09<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u3053\u307e\u3067\u306e\u8a2d\u5b9a\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u30ed\u30fc\u30ab\u30eb\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u3066\u3001API\u306e\u52d5\u4f5c\u3092\u30c6\u30b9\u30c8\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>php artisan serve<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u5225\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u3092\u958b\u304d\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067 <strong>\u90fd\u5e02\u540d\u3092\u6307\u5b9a\u3057\u3066\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u304b<\/strong> \u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>curl -X POST -H &quot;Content-Type: application\/json&quot; \\\n-d &#39;{\n  &quot;queryResult&quot;: {\n    &quot;queryText&quot;: &quot;\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066&quot;,\n    &quot;parameters&quot;: {\n      &quot;location&quot;: &quot;\u6771\u4eac&quot;\n    }\n  }\n}&#39; http:\/\/127.0.0.1:8000\/api\/dialogflow<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 \u6b63\u3057\u304f\u52d5\u4f5c\u3059\u308c\u3070\u3001\u6b21\u306e\u3088\u3046\u306aJSON\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u8fd4\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-json\" data-lang=\"JSON\"><code>{\n  &quot;fulfillmentText&quot;: &quot;\u6771\u4eac\u306e\u5929\u6c17\u306f\u300c\u6674\u308c\u300d\u3001\u6c17\u6e29\u306f18\u00b0C\u3067\u3059\u3002&quot;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u3082\u3057\u30a8\u30e9\u30fc\u304c\u51fa\u305f\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code> \u30d5\u30a1\u30a4\u30eb\u306e <code>OPENWEATHER_API_KEY<\/code> \u306f\u6b63\u3057\u304f\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u304b<\/li>\n\n\n\n<li><code>php artisan config:clear<\/code> \u3092\u5b9f\u884c\u3057\u305f\u304b<\/li>\n\n\n\n<li>OpenWeatherMap\u306eAPI\u30ad\u30fc\u304c\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u308b\u304b\uff08\u767a\u884c\u5f8c\u3001\u6570\u6642\u9593\u304b\u304b\u308b\u5834\u5408\u3042\u308a\uff09<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81-2\"><\/span><strong>\ud83c\udfaf \u3053\u3053\u307e\u3067\u306e\u307e\u3068\u3081<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 OpenWeatherMap API\u306e\u767b\u9332 &amp; API\u30ad\u30fc\u306e\u53d6\u5f97<br>\u2705 <code>.env<\/code> \u306bAPI\u30ad\u30fc\u3092\u8a2d\u5b9a<br>\u2705 <code>WeatherService<\/code> \u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u3001\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u95a2\u6570\u3092\u5b9f\u88c5<br>\u2705 <code>DialogflowController<\/code> \u3067 <code>WeatherService<\/code> \u3092\u5229\u7528\u3057\u3001\u5929\u6c17\u60c5\u5831\u3092\u8fd4\u3059\u51e6\u7406\u3092\u8ffd\u52a0<br>\u2705 API\u30c6\u30b9\u30c8\u3092\u5b9f\u65bd\u3057\u3001\u6b63\u3057\u304f\u5929\u6c17\u30c7\u30fc\u30bf\u304c\u53d6\u5f97\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_Laravel%E3%81%A8Dialogflow%E3%81%AE%E9%80%A3%E6%90%BA\"><\/span><strong>5. Laravel\u3068Dialogflow\u306e\u9023\u643a<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u3001Laravel\u306e <code>DialogflowController<\/code> \u3092\u901a\u3058\u3066\u5929\u6c17\u4e88\u5831API\u3068\u9023\u643a\u3059\u308b\u51e6\u7406\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<br>\u3053\u3053\u3067\u306f\u3001Dialogflow\u306eWebhook\u3068\u3057\u3066Laravel\u3092\u9023\u643a\u3055\u305b\u3001\u5b9f\u969b\u306b\u30e6\u30fc\u30b6\u30fc\u306e\u5165\u529b\u306b\u5bfe\u3057\u3066\u9069\u5207\u306a\u5fdc\u7b54\u3092\u8fd4\u3059\u4ed5\u7d44\u307f\u3092\u69cb\u7bc9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 5-1. Webhook\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092Dialogflow\u306b\u8a2d\u5b9a<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Laravel\u306eAPI\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u516c\u958b<\/strong><ul><li>\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\uff08<code>http:\/\/127.0.0.1:8000\/api\/dialogflow<\/code>\uff09\u3067\u306f\u3001Dialogflow\u304c\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3002Ngrok\u3092\u4f7f\u7528\u3057\u3066\u3001\u4e00\u6642\u7684\u306a\u30d1\u30d6\u30ea\u30c3\u30afURL\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li><\/ul><strong>Ngrok\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08\u672a\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306e\u5834\u5408\uff09<\/strong><\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>npm install -g ngrok <\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ngrok\u3067\u30ed\u30fc\u30ab\u30eb\u30b5\u30fc\u30d0\u30fc\u3092\u516c\u958b<\/strong><\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>ngrok http 8000<\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u3059\u308b\u3068\u3001<code>https:\/\/xxxxx.ngrok.io<\/code> \u306e\u3088\u3046\u306aURL\u304c\u767a\u884c\u3055\u308c\u307e\u3059\u3002<br>\u3053\u308c\u3092 <strong>Dialogflow\u306eWebhook\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3068\u3057\u3066\u8a2d\u5b9a<\/strong> \u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>Dialogflow\u306eWebhook\u8a2d\u5b9a\u3092\u66f4\u65b0<\/strong>\n<ul class=\"wp-block-list\">\n<li><a>Dialogflow\u30b3\u30f3\u30bd\u30fc\u30eb<\/a> \u306b\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u5de6\u30e1\u30cb\u30e5\u30fc\u306e <strong>\u300cFulfillment\u300d<\/strong> \u3092\u958b\u304f<\/li>\n\n\n\n<li><strong>Webhook\u3092\u6709\u52b9\u5316<\/strong> \u3057\u3001URL\u306b <code>https:\/\/xxxxx.ngrok.io\/api\/dialogflow<\/code> \u3092\u5165\u529b<\/li>\n\n\n\n<li>\u300c\u4fdd\u5b58\u300d\u3092\u30af\u30ea\u30c3\u30af<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 5-2. Dialogflow\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u73fe\u5728\u306e <code>DialogflowController<\/code> \u3067\u306f\u3001\u5929\u6c17\u60c5\u5831\u3092\u305d\u306e\u307e\u307e\u30c6\u30ad\u30b9\u30c8\u3067\u8fd4\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u3088\u308a\u30ea\u30c3\u30c1\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u305b\u308b\u3088\u3046\u306b\u6539\u826f\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\ud83d\udca1 \u30ea\u30c3\u30c1\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8ffd\u52a0<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3001<strong>\u30ab\u30fc\u30c9\uff08Card\uff09\u3084\u30af\u30a4\u30c3\u30af\u30ea\u30d7\u30e9\u30a4\uff08Quick Replies\uff09<\/strong> \u3092\u542b\u3081\u305f\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u305b\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>app\/Http\/Controllers\/DialogflowController.php<\/code> \u3092\u4fee\u6b63\uff1a<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse App\\Services\\WeatherService;\n\nclass DialogflowController extends Controller\n{\n    protected $weatherService;\n\n    public function __construct(WeatherService $weatherService)\n    {\n        $this-&gt;weatherService = $weatherService;\n    }\n\n    public function handleRequest(Request $request)\n    {\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u306e\u5165\u529b\u5185\u5bb9\u3092\u53d6\u5f97\n        $city = $request-&gt;input(&#39;queryResult.parameters.location&#39;);\n\n        if (!$city) {\n            return response()-&gt;json([\n                &#39;fulfillmentText&#39; =&gt; &#39;\u90fd\u5e02\u540d\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#39;,\n                &#39;fulfillmentMessages&#39; =&gt; [\n                    [&#39;text&#39; =&gt; [&#39;text&#39; =&gt; [&#39;\u90fd\u5e02\u540d\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#39;]]]\n                ]\n            ]);\n        }\n\n        \/\/ \u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\n        $weather = $this-&gt;weatherService-&gt;getWeather($city);\n\n        return response()-&gt;json([\n            &#39;fulfillmentText&#39; =&gt; $weather,\n            &#39;fulfillmentMessages&#39; =&gt; [\n                [\n                    &#39;card&#39; =&gt; [\n                        &#39;title&#39; =&gt; &quot;{$city}\u306e\u5929\u6c17&quot;,\n                        &#39;subtitle&#39; =&gt; $weather,\n                        &#39;imageUri&#39; =&gt; &quot;https:\/\/source.unsplash.com\/featured\/?weather,{$city}&quot;,\n                        &#39;buttons&#39; =&gt; [\n                            [\n                                &#39;text&#39; =&gt; &#39;\u8a73\u3057\u304f\u898b\u308b&#39;,\n                                &#39;postback&#39; =&gt; &quot;https:\/\/www.google.com\/search?q={$city}+\u5929\u6c17&quot;\n                            ]\n                        ]\n                    ]\n                ],\n                [\n                    &#39;quickReplies&#39; =&gt; [\n                        &#39;title&#39; =&gt; &#39;\u4ed6\u306e\u90fd\u5e02\u306e\u5929\u6c17\u3082\u77e5\u308a\u305f\u3044\u3067\u3059\u304b\uff1f&#39;,\n                        &#39;quickReplies&#39; =&gt; [&#39;\u6771\u4eac&#39;, &#39;\u5927\u962a&#39;, &#39;\u540d\u53e4\u5c4b&#39;]\n                    ]\n                ]\n            ]\n        ]);\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\ud83d\udca1 \u8ffd\u52a0\u3057\u305f\u30dd\u30a4\u30f3\u30c8<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u753b\u50cf\u4ed8\u304d\u30ab\u30fc\u30c9\uff08Card\uff09\u3092\u8ffd\u52a0<\/strong> \u2192 <code>imageUri<\/code> \u306b\u3001\u90fd\u5e02\u540d\u3092\u542b\u3080\u5929\u6c17\u95a2\u9023\u306e\u753b\u50cf\u3092\u8868\u793a<br>\u2705 <strong>\u300c\u8a73\u3057\u304f\u898b\u308b\u300d\u30dc\u30bf\u30f3\u3092\u8ffd\u52a0<\/strong> \u2192 Google\u3067\u305d\u306e\u90fd\u5e02\u306e\u5929\u6c17\u3092\u691c\u7d22\u3059\u308b\u30ea\u30f3\u30af<br>\u2705 <strong>\u30af\u30a4\u30c3\u30af\u30ea\u30d7\u30e9\u30a4\uff08Quick Replies\uff09\u3092\u8ffd\u52a0<\/strong> \u2192 \u30e6\u30fc\u30b6\u30fc\u304c\u3059\u3050\u306b\u5225\u306e\u90fd\u5e02\u306e\u5929\u6c17\u3092\u805e\u3051\u308b<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 5-3. Webhook\u306e\u52d5\u4f5c\u78ba\u8a8d<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ngrok\u3067\u516c\u958b\u3057\u305f\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092Dialogflow\u306b\u8a2d\u5b9a\u3057\u305f\u3089\u3001\u4ee5\u4e0b\u306e\u65b9\u6cd5\u3067Webhook\u306e\u52d5\u4f5c\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dialogflow\u306e\u300c\u30c6\u30b9\u30c8\u30b3\u30f3\u30bd\u30fc\u30eb\u300d\u3067\u8a66\u3059<\/strong>\n<ul class=\"wp-block-list\">\n<li><a>Dialogflow\u30b3\u30f3\u30bd\u30fc\u30eb<\/a> \u3092\u958b\u304f<\/li>\n\n\n\n<li>\u53f3\u5074\u306e\u30c1\u30e3\u30c3\u30c8\u30dc\u30c3\u30c8\u306b\u300c\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066\u300d\u3068\u5165\u529b<\/li>\n\n\n\n<li><strong>\u300c\u6771\u4eac\u306e\u5929\u6c17\u306f\u3007\u3007\u3067\u3059\u300d<\/strong> \u306e\u3088\u3046\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u8fd4\u308b\u3053\u3068\u3092\u78ba\u8a8d<\/li>\n\n\n\n<li><strong>\u30ab\u30fc\u30c9\uff08\u753b\u50cf\uff0b\u30dc\u30bf\u30f3\uff09\u3084\u30af\u30a4\u30c3\u30af\u30ea\u30d7\u30e9\u30a4\u3082\u8868\u793a\u3055\u308c\u308b\u304b\u78ba\u8a8d<\/strong><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Postman \u3067API\u3092\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>curl -X POST -H &quot;Content-Type: application\/json&quot; \\ -d &#39;{ &quot;queryResult&quot;: { &quot;queryText&quot;: &quot;\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066&quot;, &quot;parameters&quot;: { &quot;location&quot;: &quot;\u6771\u4eac&quot; } } }&#39; https:\/\/xxxxx.ngrok.io\/api\/dialogflow <\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 JSON\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u8fd4\u308c\u3070OK\uff01 \ud83d\ude80<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81-3\"><\/span><strong>\ud83c\udfaf \u3053\u3053\u307e\u3067\u306e\u307e\u3068\u3081<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>Ngrok\u3092\u4f7f\u3063\u3066Laravel\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u516c\u958b<\/strong><br>\u2705 <strong>Dialogflow\u306eWebhook\u3092\u8a2d\u5b9a<\/strong><br>\u2705 <strong>\u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u753b\u50cf\u4ed8\u304d\u30ab\u30fc\u30c9\u30fb\u30dc\u30bf\u30f3\u30fb\u30af\u30a4\u30c3\u30af\u30ea\u30d7\u30e9\u30a4\u3092\u8ffd\u52a0<\/strong><br>\u2705 <strong>Dialogflow\u306e\u30c6\u30b9\u30c8\u30b3\u30f3\u30bd\u30fc\u30eb\u3084Postman\u3067\u52d5\u4f5c\u78ba\u8a8d<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%EF%BC%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%EF%BC%89%E3%81%AE%E4%BD%9C%E6%88%90\"><\/span><strong>6. \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\uff08\u30d5\u30a9\u30fc\u30e0\uff09\u306e\u4f5c\u6210<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u3053\u307e\u3067\u3067\u3001<strong>Dialogflow\u3068Laravel\u3092\u9023\u643a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u5165\u529b\u306b\u57fa\u3065\u3044\u3066\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3059\u308bAPI<\/strong> \u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<br>\u6b21\u306b\u3001<strong>\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210<\/strong> \u3057\u3001\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u4ed5\u7d44\u307f\u3092\u69cb\u7bc9\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 6-1. \u30eb\u30fc\u30c8\u306e\u8a2d\u5b9a<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u30da\u30fc\u30b8\u3092\u8868\u793a\u3059\u308b\u305f\u3081\u306e\u30eb\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>routes\/web.php<\/code> \u306b\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>use App\\Http\\Controllers\\WeatherFormController;\n\nRoute::get(&#39;\/weather&#39;, [WeatherFormController::class, &#39;index&#39;]);\nRoute::post(&#39;\/weather&#39;, [WeatherFormController::class, &#39;getWeather&#39;]);<\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>GET \/weather<\/code> \u2192 \u30d5\u30a9\u30fc\u30e0\u3092\u8868\u793a<\/li>\n\n\n\n<li><code>POST \/weather<\/code> \u2192 \u5165\u529b\u3055\u308c\u305f\u90fd\u5e02\u540d\u3092Dialogflow\u306b\u9001\u4fe1\u3057\u3001\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 6-2. \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306b\u3001\u30d5\u30a9\u30fc\u30e0\u306e\u51e6\u7406\u3092\u884c\u3046 <code>WeatherFormController<\/code> \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan make:controller WeatherFormController<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f5c\u6210\u3055\u308c\u305f <code>app\/Http\/Controllers\/WeatherFormController.php<\/code> \u3092\u7de8\u96c6\u3057\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Http;\n\nclass WeatherFormController extends Controller\n{\n    public function index()\n    {\n        return view(&#39;weather-form&#39;);\n    }\n\n    public function getWeather(Request $request)\n    {\n        $city = $request-&gt;input(&#39;city&#39;);\n\n        if (!$city) {\n            return back()-&gt;with(&#39;error&#39;, &#39;\u90fd\u5e02\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#39;);\n        }\n\n        \/\/ Dialogflow\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1\n        $response = Http::post(env(&#39;DIALOGFLOW_WEBHOOK_URL&#39;), [\n            &#39;queryResult&#39; =&gt; [\n                &#39;parameters&#39; =&gt; [\n                    &#39;location&#39; =&gt; $city\n                ]\n            ]\n        ]);\n\n        $weatherInfo = $response-&gt;json()[&#39;fulfillmentText&#39;] ?? &#39;\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002&#39;;\n\n        return back()-&gt;with(&#39;weather&#39;, $weatherInfo);\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30fc\u30b6\u30fc\u304c\u30d5\u30a9\u30fc\u30e0\u306b\u5165\u529b\u3057\u305f\u90fd\u5e02\u540d\u3092\u53d6\u5f97<\/li>\n\n\n\n<li>Laravel\u7d4c\u7531\u3067 <strong>Dialogflow\u306eWebhook\uff08Laravel\u306eAPI\uff09<\/strong> \u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1<\/li>\n\n\n\n<li>\u53d6\u5f97\u3057\u305f\u5929\u6c17\u60c5\u5831\u3092\u753b\u9762\u306b\u8868\u793a<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 6-3. \u30d3\u30e5\u30fc\uff08\u30d5\u30a9\u30fc\u30e0\uff09\u306e\u4f5c\u6210<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b21\u306b\u3001\u5929\u6c17\u60c5\u5831\u3092\u5165\u529b\u30fb\u8868\u793a\u3059\u308b\u305f\u3081\u306e\u30d3\u30e5\u30fc\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>resources\/views\/weather-form.blade.php<\/code> \u3092\u4f5c\u6210\u3057\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;ja&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;title&gt;\u5929\u6c17\u4e88\u5831\u30d5\u30a9\u30fc\u30e0&lt;\/title&gt;\n    &lt;style&gt;\n        body { font-family: Arial, sans-serif; text-align: center; margin: 50px; }\n        form { margin-bottom: 20px; }\n        input, button { padding: 10px; font-size: 16px; }\n        .result { margin-top: 20px; font-size: 18px; }\n        .error { color: red; }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\n    &lt;h1&gt;\u5929\u6c17\u4e88\u5831\u3092\u78ba\u8a8d&lt;\/h1&gt;\n    &lt;form action=&quot;\/weather&quot; method=&quot;POST&quot;&gt;\n        @csrf\n        &lt;input type=&quot;text&quot; name=&quot;city&quot; placeholder=&quot;\u90fd\u5e02\u540d\u3092\u5165\u529b&quot; required&gt;\n        &lt;button type=&quot;submit&quot;&gt;\u5929\u6c17\u3092\u53d6\u5f97&lt;\/button&gt;\n    &lt;\/form&gt;\n\n    @if(session(&#39;weather&#39;))\n        &lt;p class=&quot;result&quot;&gt;{{ session(&#39;weather&#39;) }}&lt;\/p&gt;\n    @endif\n\n    @if(session(&#39;error&#39;))\n        &lt;p class=&quot;error&quot;&gt;{{ session(&#39;error&#39;) }}&lt;\/p&gt;\n    @endif\n\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u30d5\u30a9\u30fc\u30e0\u306e\u6a5f\u80fd<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3067\u304d\u308b<\/li>\n\n\n\n<li><code>POST \/weather<\/code> \u306b\u9001\u4fe1\u3057\u3001\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97<\/li>\n\n\n\n<li>\u7d50\u679c\u3092\u753b\u9762\u306b\u8868\u793a<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 6-4. \u52d5\u4f5c\u78ba\u8a8d<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Laravel\u306e\u958b\u767a\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5sh\u30b3\u30d4\u30fc\u3059\u308b\u7de8\u96c6\u3059\u308b<code>php artisan serve<\/code><\/li>\n\n\n\n<li>\u30d6\u30e9\u30a6\u30b6\u3067 <code>http:\/\/127.0.0.1:8000\/weather<\/code> \u306b\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u30d5\u30a9\u30fc\u30e0\u306b\u300c\u6771\u4eac\u300d\u306a\u3069\u306e\u90fd\u5e02\u540d\u3092\u5165\u529b\u3057\u3001\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u2705 \u6b63\u3057\u304f\u52d5\u4f5c\u3059\u308c\u3070\u3001\u300c\u6771\u4eac\u306e\u5929\u6c17\u306f\u3007\u3007\u3067\u3059\u300d\u306a\u3069\u306e\u7d50\u679c\u304c\u8868\u793a\u3055\u308c\u307e\u3059\uff01<\/strong> \ud83c\udf89<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81-4\"><\/span><strong>\ud83c\udfaf \u3053\u3053\u307e\u3067\u306e\u307e\u3068\u3081<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u5929\u6c17\u3092\u53d6\u5f97\u3059\u308b\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210<\/strong><br>\u2705 <strong>Dialogflow\u306eAPI\u3068\u9023\u643a\u3057\u3066\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97<\/strong><br>\u2705 <strong>\u53d6\u5f97\u3057\u305f\u5929\u6c17\u60c5\u5831\u3092\u753b\u9762\u306b\u8868\u793a<\/strong><br>\u2705 <strong>\u52d5\u4f5c\u78ba\u8a8d\uff08\u30d5\u30a9\u30fc\u30e0\u5165\u529b \u2192 \u5929\u6c17\u60c5\u5831\u306e\u53d6\u5f97\uff09<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E3%81%A8%E3%83%87%E3%83%90%E3%83%83%E3%82%B0\"><\/span><strong>7. \u52d5\u4f5c\u78ba\u8a8d\u3068\u30c7\u30d0\u30c3\u30b0<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u3053\u307e\u3067\u3067\u3001<strong>Laravel\u3068Dialogflow\u3092\u9023\u643a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3059\u308b\u3068\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0<\/strong> \u304c\u5b8c\u6210\u3057\u307e\u3057\u305f\u3002<br>\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u52d5\u4f5c\u78ba\u8a8d\u306e\u65b9\u6cd5\u3068\u3001\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 7-1. \u52d5\u4f5c\u78ba\u8a8d\uff08\u30d5\u30a9\u30fc\u30e0 &amp; API\uff09<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u307e\u305a\u3001\u30d5\u30a9\u30fc\u30e0\u3068API\u304c\u6b63\u3057\u304f\u52d5\u4f5c\u3059\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u2705 \u30d5\u30a9\u30fc\u30e0\u304b\u3089\u30c6\u30b9\u30c8<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Laravel\u306e\u958b\u767a\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5<\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan serve<\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30a6\u30b6\u3067 <code>http:\/\/127.0.0.1:8000\/weather<\/code> \u306b\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u30d5\u30a9\u30fc\u30e0\u306b\u300c\u6771\u4eac\u300d\u306a\u3069\u306e\u90fd\u5e02\u540d\u3092\u5165\u529b\u3057\u3001\u300c\u5929\u6c17\u3092\u53d6\u5f97\u300d\u30dc\u30bf\u30f3\u3092\u62bc\u3059<\/li>\n\n\n\n<li><strong>\u5929\u6c17\u60c5\u5831\u304c\u753b\u9762\u306b\u8868\u793a\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud83d\udfe2 \u6b63\u5e38\u306a\u51fa\u529b\u306e\u4f8b<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>\u6771\u4eac\u306e\u5929\u6c17\u306f\u300c\u6674\u308c\u300d\u3001\u6c17\u6e29\u306f18\u00b0C\u3067\u3059\u3002<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud83d\udd34 \u30a8\u30e9\u30fc\u4f8b<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 API\u30ad\u30fc\u306e\u8a2d\u5b9a\u3084\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u51e6\u7406\u3092\u78ba\u8a8d\uff08\u5f8c\u8ff0\u306e\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5\u3092\u53c2\u7167\uff09<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u2705 Postman \u3067API\u30c6\u30b9\u30c8<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u3082\u3057\u30d5\u30a9\u30fc\u30e0\u304c\u3046\u307e\u304f\u52d5\u4f5c\u3057\u306a\u3044\u5834\u5408\u3001API\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6b63\u3057\u304f\u51e6\u7406\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\u3002<br>Postman\u3092\u4f7f\u3063\u3066 <strong>Dialogflow\u306eWebhook<\/strong> \u306b\u76f4\u63a5\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud83d\udee0 Postman\u306e\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30e1\u30bd\u30c3\u30c9<\/strong>: <code>POST<\/code><\/li>\n\n\n\n<li><strong>URL<\/strong>: <code>http:\/\/127.0.0.1:8000\/api\/dialogflow<\/code><\/li>\n\n\n\n<li><strong>\u30d8\u30c3\u30c0\u30fc<\/strong>:<\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>Content-Type: application\/json<\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Body (JSON)<\/strong>:<\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-json\" data-lang=\"JSON\"><code>{ &quot;queryResult&quot;: { &quot;queryText&quot;: &quot;\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066&quot;, &quot;parameters&quot;: { &quot;location&quot;: &quot;\u6771\u4eac&quot; } } }<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud83d\udfe2 \u671f\u5f85\u3055\u308c\u308b\u30ec\u30b9\u30dd\u30f3\u30b9<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-json\" data-lang=\"JSON\"><code>{\n  &quot;fulfillmentText&quot;: &quot;\u6771\u4eac\u306e\u5929\u6c17\u306f\u300c\u6674\u308c\u300d\u3001\u6c17\u6e29\u306f18\u00b0C\u3067\u3059\u3002&quot;\n}<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 7-2. \u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u30c6\u30b9\u30c8\u6642\u306b\u3088\u304f\u767a\u751f\u3059\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u7b56\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u274c 1. \u300c\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u300d<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u539f\u56e0<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code> \u306b <code>OPENWEATHER_API_KEY<\/code> \u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044<\/li>\n\n\n\n<li>OpenWeatherMap\u306eAPI\u30ad\u30fc\u304c\u7121\u52b9 \/ \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30b7\u30e7\u30f3\u304c\u5b8c\u4e86\u3057\u3066\u3044\u306a\u3044<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u89e3\u6c7a\u7b56<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code> \u306b <strong>\u6b63\u3057\u3044API\u30ad\u30fc<\/strong> \u304c\u3042\u308b\u304b\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>OPENWEATHER_API_KEY=your_api_key_here<\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8a2d\u5b9a\u3092\u53cd\u6620\u3059\u308b\u305f\u3081\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u30af\u30ea\u30a2<\/strong><\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan config:clear<\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>OpenWeatherMap\u306eAPI\u30ad\u30fc\u304c\u30a2\u30af\u30c6\u30a3\u30d6\u304b\u78ba\u8a8d<\/strong><br>\u2192 API\u30ad\u30fc\u3092\u53d6\u5f97\u5f8c\u3001\u53cd\u6620\u306b <strong>\u6570\u6642\u9593\u304b\u304b\u308b\u5834\u5408\u3042\u308a<\/strong><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u274c 2. \u300cDialogflow\u306eWebhook\u304c\u52d5\u4f5c\u3057\u306a\u3044\u300d<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u539f\u56e0<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ngrok\u304c\u505c\u6b62\u3057\u3066\u3044\u308b \/ URL\u304c\u5909\u308f\u3063\u305f<\/li>\n\n\n\n<li>Webhook URL\u3092\u66f4\u65b0\u3057\u3066\u3044\u306a\u3044<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u89e3\u6c7a\u7b56<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Ngrok\u3092\u518d\u8d77\u52d5<\/strong> \u3057\u3001\u65b0\u3057\u3044URL\u3092\u53d6\u5f97<\/li>\n<\/ol>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>ngrok http 8000<\/code><\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dialogflow\u306eWebhook\u8a2d\u5b9a\u3092\u66f4\u65b0<\/strong>\n<ul class=\"wp-block-list\">\n<li><a>Dialogflow\u30b3\u30f3\u30bd\u30fc\u30eb<\/a> \u306e\u300cFulfillment\u300d<\/li>\n\n\n\n<li><strong>Webhook URL \u3092\u65b0\u3057\u3044 Ngrok \u306e URL \u306b\u5909\u66f4<\/strong><\/li>\n\n\n\n<li>\u300c\u4fdd\u5b58\u300d\u3092\u30af\u30ea\u30c3\u30af<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u274c 3. \u300c\u30d5\u30a9\u30fc\u30e0\u3067\u30a8\u30e9\u30fc\u304c\u51fa\u308b\u300d<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u539f\u56e0<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSRF\u30c8\u30fc\u30af\u30f3\u30a8\u30e9\u30fc<\/li>\n\n\n\n<li>Laravel\u306e\u30b5\u30fc\u30d0\u30fc\u304c\u52d5\u3044\u3066\u3044\u306a\u3044<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u89e3\u6c7a\u7b56<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u30d5\u30a9\u30fc\u30e0\u304c <code>@csrf<\/code> \u3092\u542b\u3093\u3067\u3044\u308b\u304b\u78ba\u8a8d<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;form action=&quot;\/weather&quot; method=&quot;POST&quot;&gt;\n    @csrf\n    &lt;input type=&quot;text&quot; name=&quot;city&quot; placeholder=&quot;\u90fd\u5e02\u540d\u3092\u5165\u529b&quot; required&gt;\n    &lt;button type=&quot;submit&quot;&gt;\u5929\u6c17\u3092\u53d6\u5f97&lt;\/button&gt;\n&lt;\/form&gt;<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u30b5\u30fc\u30d0\u30fc\u304c\u8d77\u52d5\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d<\/strong><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>php artisan serve<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3055\u305b\u3066\u539f\u56e0\u3092\u7279\u5b9a<\/strong><br><code>storage\/logs\/laravel.log<\/code> \u3092\u78ba\u8a8d<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>tail -f storage\/logs\/laravel.log<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 7-3. \u30c7\u30d0\u30c3\u30b0\u306e\u30b3\u30c4<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u958b\u767a\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u305f\u3068\u304d\u306e\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>1. Laravel\u306e\u30ed\u30b0\u3092\u78ba\u8a8d\u3059\u308b<\/strong> \u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3084\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5185\u5bb9\u3092\u8a18\u9332\u3059\u308b\u3053\u3068\u3067\u3001\u539f\u56e0\u3092\u7279\u5b9a\u3057\u3084\u3059\u304f\u306a\u308a\u307e\u3059\u3002<br><code>app\/Http\/Controllers\/DialogflowController.php<\/code> \u306b\u4ee5\u4e0b\u3092\u8ffd\u52a0\u3059\u308b\u3068\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u5185\u5bb9\u3092\u30ed\u30b0\u306b\u8a18\u9332\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>use Illuminate\\Support\\Facades\\Log;\n\npublic function handleRequest(Request $request)\n{\n    Log::info(&#39;Dialogflow\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8: &#39;, $request-&gt;all());\n\n    $city = $request-&gt;input(&#39;queryResult.parameters.location&#39;);\n\n    if (!$city) {\n        return response()-&gt;json([&#39;fulfillmentText&#39; =&gt; &#39;\u90fd\u5e02\u540d\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002&#39;]);\n    }\n\n    $weather = $this-&gt;weatherService-&gt;getWeather($city);\n\n    return response()-&gt;json([&#39;fulfillmentText&#39; =&gt; $weather]);\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>2. Debugbar\u3092\u4f7f\u3046<\/strong> Laravel Debugbar \u3092\u5c0e\u5165\u3059\u308b\u3068\u3001\u30c7\u30d0\u30c3\u30b0\u304c\u7c21\u5358\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-powershell\" data-lang=\"PowerShell\"><code>composer require barryvdh\/laravel-debugbar --dev\nphp artisan config:clear<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 <strong>\u753b\u9762\u4e0a\u306bAPI\u30ea\u30af\u30a8\u30b9\u30c8\u3084SQL\u306e\u5b9f\u884c\u30ed\u30b0\u304c\u8868\u793a\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/strong> \ud83d\ude80<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81-5\"><\/span><strong>\ud83c\udfaf \u3053\u3053\u307e\u3067\u306e\u307e\u3068\u3081<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u30d5\u30a9\u30fc\u30e0\u3068API\u306e\u52d5\u4f5c\u78ba\u8a8d<\/strong><br>\u2705 <strong>Postman\u3092\u4f7f\u3063\u305fAPI\u30c6\u30b9\u30c8<\/strong><br>\u2705 <strong>\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u6cd5<\/strong><br>\u2705 <strong>\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5\uff08\u30ed\u30b0\u78ba\u8a8d\u30fbDebugbar\u306e\u6d3b\u7528\uff09<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8_%E3%81%BE%E3%81%A8%E3%82%81\"><\/span><strong>8. \u307e\u3068\u3081<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8a18\u4e8b\u3067\u306f\u3001<strong>Laravel\u3068Dialogflow\u3092\u9023\u643a\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3059\u308b\u3068\u5929\u6c17\u4e88\u5831\u3092\u53d6\u5f97\u3067\u304d\u308b\u30d5\u30a9\u30fc\u30e0<\/strong> \u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<br>\u6700\u521d\u304b\u3089\u9806\u3092\u8ffd\u3063\u3066\u5b9f\u88c5\u3057\u3001<strong>Google\u306e\u81ea\u7136\u8a00\u8a9e\u7406\u89e3\uff08NLP\uff09\u6a5f\u80fd\u3068API\u9023\u643a\u3092\u6d3b\u7528<\/strong> \u3059\u308b\u65b9\u6cd5\u3092\u5b66\u3073\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 \u3053\u306e\u8a18\u4e8b\u3067\u5b66\u3093\u3060\u3053\u3068<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>Dialogflow\u306e\u57fa\u672c\u8a2d\u5b9a<\/strong>\uff08\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u4f5c\u6210\u30fb\u30a4\u30f3\u30c6\u30f3\u30c8\u8a2d\u5b9a\u30fbWebhook\u6709\u52b9\u5316\uff09<br>\u2705 <strong>Laravel\u3067Dialogflow\u306eWebhook\u3092\u51e6\u7406<\/strong>\uff08\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308a\u3001\u9069\u5207\u306a\u5fdc\u7b54\u3092\u8fd4\u3059\uff09<br>\u2705 <strong>\u5929\u6c17\u4e88\u5831API\uff08OpenWeatherMap\uff09\u3068\u9023\u643a<\/strong>\uff08API\u30ad\u30fc\u3092\u4f7f\u3063\u3066\u5929\u6c17\u60c5\u5831\u3092\u53d6\u5f97\uff09<br>\u2705 <strong>\u30d5\u30a9\u30fc\u30e0\u306e\u4f5c\u6210\u3068\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u306e\u7d71\u5408<\/strong>\uff08\u30e6\u30fc\u30b6\u30fc\u304c\u5165\u529b\u3057\u305f\u90fd\u5e02\u540d\u3092\u51e6\u7406\uff09<br>\u2705 <strong>\u52d5\u4f5c\u78ba\u8a8d\u30fb\u30c7\u30d0\u30c3\u30b0\u306e\u65b9\u6cd5<\/strong>\uff08Postman\u30c6\u30b9\u30c8\u3001Ngrok\u3067\u306eWebhook\u516c\u958b\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u308c\u3089\u306e\u30b9\u30ad\u30eb\u3092\u7fd2\u5f97\u3059\u308b\u3053\u3068\u3067\u3001<strong>\u3088\u308a\u9ad8\u5ea6\u306aAI\u9023\u643a\u30a2\u30d7\u30ea<\/strong> \u3092\u958b\u767a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff01\ud83d\ude80<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 \u5fdc\u7528\u306e\u30a2\u30a4\u30c7\u30a2<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8a18\u4e8b\u306e\u5185\u5bb9\u3092\u767a\u5c55\u3055\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b9f\u7528\u7684\u306a\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u3053\u3068\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>\u97f3\u58f0\u5165\u529b\u3092\u8ffd\u52a0<\/strong><br>\u2192 Dialogflow\u306e\u97f3\u58f0\u8a8d\u8b58\u6a5f\u80fd\u3092\u6d3b\u7528\u3057\u3001<strong>\u300c\u6771\u4eac\u306e\u5929\u6c17\u306f\uff1f\u300d\u3068\u8a71\u3057\u304b\u3051\u308b\u3060\u3051\u3067\u53d6\u5f97<\/strong> \u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>LINE\u30dc\u30c3\u30c8\u3084Slack\u30dc\u30c3\u30c8\u3068\u9023\u643a<\/strong><br>\u2192 Laravel\u3092Webhook\u30b5\u30fc\u30d0\u30fc\u3068\u3057\u3066\u4f7f\u7528\u3057\u3001<strong>LINE\u3084Slack\u306e\u30c1\u30e3\u30c3\u30c8\u30dc\u30c3\u30c8\u304b\u3089\u5929\u6c17\u3092\u554f\u3044\u5408\u308f\u305b\u3089\u308c\u308b\u3088\u3046\u306b\u3059\u308b<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>\u5929\u6c17\u30c7\u30fc\u30bf\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58<\/strong><br>\u2192 \u53d6\u5f97\u3057\u305f\u5929\u6c17\u60c5\u5831\u3092DB\u306b\u8a18\u9332\u3057\u3001<strong>\u904e\u53bb\u306e\u5929\u6c17\u3084\u5c65\u6b74\u3092\u53c2\u7167\u3067\u304d\u308b\u6a5f\u80fd\u3092\u5b9f\u88c5<\/strong> \u3059\u308b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>\u5929\u6c17\u4e88\u5831\u3092\u81ea\u52d5\u901a\u77e5<\/strong><br>\u2192 \u30e6\u30fc\u30b6\u30fc\u304c\u767b\u9332\u3057\u305f\u90fd\u5e02\u306e\u5929\u6c17\u3092 <strong>\u6bce\u671d\u81ea\u52d5\u3067\u901a\u77e5\u3059\u308b<\/strong> \u6a5f\u80fd\u3092\u8ffd\u52a0\u3059\u308b\uff08Laravel\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u6a5f\u80fd <code>Task Scheduling<\/code> \u3092\u6d3b\u7528\uff09\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd39 \u3055\u3044\u3054\u306b<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8a18\u4e8b\u3092\u901a\u3057\u3066\u3001<strong>Laravel\u3068Dialogflow\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u5b9f\u8df5\u7684\u306a\u30a2\u30d7\u30ea\u958b\u767a<\/strong> \u3092\u4f53\u9a13\u3067\u304d\u305f\u3068\u601d\u3044\u307e\u3059\u3002<br>AI\u3092\u6d3b\u7528\u3057\u305fWeb\u30a2\u30d7\u30ea\u306e\u53ef\u80fd\u6027\u306f\u7121\u9650\u5927\u3067\u3059\uff01\u2728<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u305c\u3072\u4eca\u56de\u5b66\u3093\u3060\u5185\u5bb9\u3092\u6d3b\u304b\u3057\u3066\u3001<strong>\u3088\u308a\u4fbf\u5229\u306a\u30b5\u30fc\u30d3\u30b9\u3084\u30a2\u30d7\u30ea\u3092\u958b\u767a<\/strong> \u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\uff01\ud83d\udcaa\ud83d\udd25<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. \u306f\u3058\u3081\u306b Web\u30a2\u30d7\u30ea\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u5165\u529b\u3057\u305f\u5185\u5bb9\u3092\u3082\u3068\u306b\u5916\u90e8\u306eAPI\u3068\u9023\u643a\u3057\u3066\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u6a5f\u80fd\u306f\u975e\u5e38\u306b\u4fbf\u5229\u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001Laravel\u3068Google\u306e\u81ea\u7136\u8a00\u8a9e\u7406\u89e3\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u300cDialogflo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":242,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"sns_share_botton_hide":"","vkExUnit_sns_title":"","_vk_print_noindex":"","sitemap_hide":"","_veu_custom_css":"","veu_display_promotion_alert":"common","vkexunit_cta_each_option":"","_lightning_design_setting":{"layout":"default"},"footnotes":""},"categories":[11,9,6],"tags":[],"class_list":["post-241","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-laravel","category-app_development"],"veu_head_title_object":{"title":"","add_site_title":""},"_links":{"self":[{"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/posts\/241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hexis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=241"}],"version-history":[{"count":2,"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/posts\/241\/revisions"}],"predecessor-version":[{"id":245,"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/posts\/241\/revisions\/245"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hexis.jp\/index.php?rest_route=\/wp\/v2\/media\/242"}],"wp:attachment":[{"href":"https:\/\/hexis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hexis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hexis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}