{"id":3444,"date":"2020-04-01T11:09:25","date_gmt":"2020-04-01T02:09:25","guid":{"rendered":"https:\/\/www.sambuichi.jp\/?p=3444"},"modified":"2020-04-01T12:33:21","modified_gmt":"2020-04-01T03:33:21","slug":"socket-io%e3%81%aeroom%e3%81%a8namespace","status":"publish","type":"post","link":"https:\/\/www.sambuichi.jp\/?p=3444","title":{"rendered":"socket.io\u306eroom\u3068namespace"},"content":{"rendered":"<p>Views: 80<\/p><link rel=\"stylesheet\" href=\"https:\/\/use.fontawesome.com\/releases\/v5.6.3\/css\/all.css\"\n      integrity=\"sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s\/\"\n      crossorigin=\"anonymous\">\n<div class=\"index\" style=\"width: 90%; margin: auto; padding-left: 8px; border: solid 1px #d0d0d0;\">\n<div style=\"text-align: center;\">\u76ee\u6b21<\/div>\n<p style=\"margin: 0;\">\n  <a href=\"#S1\">\u6982\u8981<\/a><br \/>\n  <a href=\"#S2\">\u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0<\/a><br \/>\n  <a href=\"#S3\">\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0<\/a>\n<\/p>\n<\/div>\n<p><span id=\"S1\"><\/span><\/p>\n<h4>\u6982\u8981<\/h4>\n<p>@IT\u306b\u3042\u308b\u300c<a href=\"https:\/\/www.atmarkit.co.jp\/ait\/articles\/1607\/01\/news027.html\">Socket.IO\u958b\u767a\u6642\u306b\u5f79\u7acb\u3064\u30c4\u30fc\u30eb4\u9078\u3068room\u3001namespace\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4f7f\u3044\u65b9<\/a>\u300d\u8a18\u4e8b\u3092\u53c2\u8003\u306bAWS EC2 CloudFront\u306bNginx\u3092\u30d7\u30ed\u30ad\u30b7\u30fc\u306b\u3057\u305fNode.js\u306e\u5b9f\u884c\u74b0\u5883\u3067room\u3068namespace\u3092\u78ba\u8a8d\u3059\u308b\u3002\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u306f\u6b21\u306e\u3068\u304a\u308a\u3002<br \/>\n[\u5909\u66f4\u70b9]<br \/>\n\u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0\u540d\u3092index.js\u3068\u3057\u3001public\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306bindex.html\u3068javascript\u30d7\u30ed\u30b0\u30e9\u30e0main.js\u3092\u7f6e\u3044\u305f\u3002<\/p>\n<pre class=\"lang:default decode:true \" >.\r\n\u251c\u2500\u2500 index.js\r\n\u251c\u2500\u2500 node_modules\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 express\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 socket.io\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 socket.io-adapter\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 socket.io-client\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 socket.io-parser\r\n...\r\n\u251c\u2500\u2500 package.json\r\n\u2514\u2500\u2500 public\r\n    \u251c\u2500\u2500 index.html\r\n    \u2514\u2500\u2500 main.js\r\n<\/pre>\n<p>[\u5909\u66f4\u70b9]<br \/>\nNginx\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306bchatroom\u3092location\u5b9a\u7fa9\u306b\u8ffd\u52a0\u3057\u305f\u3002<\/p>\n<pre class=\"lang:default decode:true \" >location ~ ^\/(chat|chatroom)\/(.*)$ {\r\n    alias \/your\/host\/public_html\/$1\/$2;\r\n}<\/pre>\n<p>[\u5909\u66f4\u70b9]<br \/>\n\u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0\u540d\u3092index.js\u3068\u3057package.json\u306bexpress\u3068socket.io\u3092dependencies\u306b\u8ffd\u52a0\u3057\u305f\u3002<\/p>\n<pre class=\"lang:default decode:true \" title=\"package.json\">{\r\n  \"name\": \"socket.io-room\",\r\n  \"version\": \"0.0.0\",\r\n  \"description\": \"A simple chat client using socket.io\",\r\n  \"main\": \"index.js\",\r\n  \"author\": \"\",\r\n  \"private\": true,\r\n  \"license\": \"MIT\",\r\n  \"dependencies\": {\r\n    \"express\": \"^4.13.4\",\r\n    \"socket.io\": \"^1.7.4\"\r\n  },\r\n  \"scripts\": {\r\n    \"start\": \"node index.js\"\r\n  }\r\n}<\/pre>\n<p><span id=\"S2\"><\/span><\/p>\n<h4>\u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0<\/h4>\n<p>[\u5909\u66f4\u70b9]<br \/>\nS04\u3067io.of(&#8216;\/chat&#8217;)\u3084io.of(&#8216;\/fortune&#8217;)\u306e\u3088\u3046\u306bnamespace\u3092\u6307\u5b9a\u3059\u308b\u3002<\/p>\n<pre class=\"lang:default decode:true \">var chat = io.of('\/chat').on('connection', function(socket) {\r\n...\r\n});<\/pre>\n<p>S02\u3000\/public\/index.html\u3092\u8868\u793a\u3059\u308b\u3002<br \/>\n\u30a4\u30d9\u30f3\u30c8\u540d\u3092to_server\u3084to_client\u306e\u3088\u3046\u306b\u77ed\u304f\u3057\u305f\u3002<\/p>\n<pre class=\"lang:default decode:true \" title=\"index.js\" >\/\/ S01. \u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3080\r\nvar http = require('http');\r\nvar socketio = require('socket.io');\r\nvar fs = require('fs');\r\nvar port = process.env.PORT || 3000;\r\n\/\/ S02. HTTP\u30b5\u30fc\u30d0\u3092\u751f\u6210\u3059\u308b\r\nvar server = http.createServer(function(req, res) {\r\n  res.writeHead(200, {'Content-Type' : 'text\/html'});\r\n  res.end(fs.readFileSync(__dirname + '\/public\/index.html', 'utf-8'));\r\n})\r\n.listen(port, () =&gt; {\r\n  console.log('Server listening at port %d', port);\r\n});\r\n\r\n\/\/ S03. HTTP\u30b5\u30fc\u30d0\u306b\u30bd\u30b1\u30c3\u30c8\u3092\u3072\u3082\u4ed8\u3051\u308b\uff08WebSocket\u6709\u52b9\u5316\uff09\r\nvar io = socketio.listen(server);\r\n \r\n\/\/ \u30c1\u30e3\u30c3\u30c8\u6a5f\u80fd\r\n\/\/ S04. connection\u30a4\u30d9\u30f3\u30c8\u3092\u53d7\u4fe1\u3059\u308b\r\nvar chat = io.of('\/chat').on('connection', function(socket) {\r\n  var room = '';\r\n  var name = '';\r\n\r\n  \/\/ room\u3078\u306e\u5165\u5ba4\u306f\u3001\u300csocket.join(room\u540d)\u300d\r\n  socket.on('join', function(data) {\r\n    room = data.value;\r\n    socket.join(room);\r\n  });\r\n  \/\/ S05. to_server\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3059\u308b\r\n  socket.on('to_server', function(data) {\r\n    \/\/ S06. to_client\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\r\n    chat.to(room).emit('to_client', {value : data.value});\r\n  });\r\n  \/\/ S07. broadcast\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3057\u3001\u9001\u4fe1\u5143\u4ee5\u5916\u306b\u9001\u4fe1\u3059\u308b\r\n  socket.on('broadcast', function(data) {\r\n    socket.broadcast.to(room).emit('to_client', {value : data.value});\r\n  });\r\n  \/\/ S08. personal\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3057\u3001\u9001\u4fe1\u5143\u306e\u307f\u306b\u9001\u4fe1\u3059\u308b\r\n  socket.on('personal', function(data) {\r\n    var id = socket.id;\r\n    name = data.value;\r\n    var personalMessage = \"\u3042\u306a\u305f\u306f\u3001\" + name + \"\u3055\u3093\u3068\u3057\u3066\u5165\u5ba4\u3057\u307e\u3057\u305f\u3002\"\r\n    chat.to(id).emit('to_client', {value : personalMessage});\r\n  });\r\n  \/\/ S09. dicconnect\u30a4\u30d9\u30f3\u30c8\u3092\u53d7\u4fe1\u3057\u3001\u9000\u51fa\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3059\u308b\r\n  socket.on('disconnect', function() {\r\n    if (name == '') {\r\n      console.log(\"\u672a\u5165\u5ba4\u306e\u307e\u307e\u3001\u3069\u3053\u304b\u3078\u53bb\u3063\u3066\u3044\u304d\u307e\u3057\u305f\u3002\");\r\n    } else {\r\n      var endMessage = name + \"\u3055\u3093\u304c\u9000\u51fa\u3057\u307e\u3057\u305f\u3002\"\r\n      chat.to(room).emit('to_client', {value : endMessage});\r\n    }\r\n  });\r\n});\r\n \r\n\/\/ \u4eca\u65e5\u306e\u904b\u52e2\u6a5f\u80fd\r\nvar fortune = io.of('\/fortune').on('connection', function(socket) {\r\n  var id = socket.id;\r\n  \/\/ \u904b\u52e2\u306e\u914d\u5217\u304b\u3089\u30e9\u30f3\u30c0\u30e0\u3067\u53d6\u5f97\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u9001\u4fe1\u3059\u308b\r\n  var fortunes = [\"\u5927\u5409\", \"\u5409\", \"\u4e2d\u5409\", \"\u5c0f\u5409\", \"\u672b\u5409\", \"\u51f6\", \"\u5927\u51f6\"];\r\n  var selectedFortune = fortunes[Math.floor(Math.random() * fortunes.length)];\r\n  var todaysFortune = \"\u4eca\u65e5\u306e\u3042\u306a\u305f\u306e\u904b\u52e2\u306f\u2026 \" + selectedFortune + \" \u3067\u3059\u3002\"\r\n  fortune.to(id).emit('to_client', {value : todaysFortune});\r\n});<\/pre>\n<p><span id=\"S3\"><\/span><\/p>\n<h4>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0<\/h4>\n<h5>index.html<\/h5>\n<p>[\u5909\u66f4\u70b9]<br \/>\nC01\u3067socket.io\u30e9\u30a4\u30d6\u30e9\u30ea\u3092 <span class=\"lang:default decode:true  crayon-inline \" >&lt;script src=&#8221;https:\/\/cdn.jsdelivr.net\/npm\/socket.io-client@2\/dist\/socket.io.js&#8221;&gt;&lt;\/script&gt;<\/span> \u306b\u5909\u66f4\u3057\u305f\u3002<br \/>\njquery\u3092\u9664\u5916\u3057\u3066javascript\u306e\u307f\u3068\u3057\u305f\u3002<br \/>\njavascript\u3092\u5225\u30d5\u30a1\u30a4\u30eb\u306b\u3057\u3066\u3001src=&#8221;\/chatroom\/public\/main.js&#8221;\u304b\u3089\u8aad\u307f\u8fbc\u3080\u3002<br \/>\nroom\u306e\u5024\u3092uuid(v4)\u306e\u5024\u304b\u3089&#8217;-&#8216;\u3092\u9664\u3044\u305f\u5024\u306b\u5909\u66f4\u3057\u305f\u3002<br \/>\nC02. \u30bd\u30b1\u30c3\u30c8\u3078\u306e\u63a5\u7d9a\u3000\u3067\u63a5\u7d9a\u5148\u306e\u6307\u5b9a\u3092\u3000var chat = io(&#8216;\/chat&#8217;);\u3000\u304a\u3088\u3073\u3000var fortune = io(&#8216;\/fortune&#8217;); \u306b\u5909\u66f4\u3057\u305f\u3002<\/p>\n<pre class=\"lang:default decode:true \" title=\"index.html\" >&lt;!DOCTYPE html&gt;\r\n&lt;html lang=\"ja\"&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=\"utf-8\"&gt;\r\n&lt;title&gt;websocket-chat&lt;\/title&gt;\r\n&lt;link rel=\"stylesheet\"\r\n    href=\"https:\/\/maxcdn.bootstrapcdn.com\/bootstrap\/3.3.5\/css\/bootstrap.min.css\"&gt;\r\n&lt;!-- &lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.11.3\/jquery.min.js\"&gt;&lt;\/script&gt; --&gt;\r\n&lt;!-- C01. Socket.IO\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u8aad\u8fbc\u307f --&gt;\r\n&lt;script src=\"https:\/\/cdn.jsdelivr.net\/npm\/socket.io-client@2\/dist\/socket.io.js\"&gt;&lt;\/script&gt;\r\n&lt;!-- &lt;script type=\"text\/javascript\" src=\"\/socket.io\/socket.io.js\"&gt;&lt;\/script&gt; --&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;div class=\"container\"&gt;\r\n  &lt;h1&gt;WebSocket-Chat&lt;\/h1&gt;\r\n  &lt;form class=\"form-inline\" onsubmit=\"submitForm()\"&gt;\r\n    &lt;div class=\"form-group\"&gt;\r\n      &lt;label class=\"roomLabel\" for=\"rooms\"&gt;\u90e8\u5c4b\uff1a&lt;\/label&gt;\r\n      &lt;select class=\"form-control\" id=\"rooms\"&gt;\r\n        &lt;option value=\"c90f7cc407c64aee91b52a99f897ff5a\"&gt;\u90e8\u5c4b01&lt;\/option&gt;\r\n        &lt;option value=\"8ac69ef6a26c46c68003a028e7633cf7\"&gt;\u90e8\u5c4b02&lt;\/option&gt;\r\n      &lt;\/select&gt;\r\n      &lt;label class=\"nameLabel\" for=\"msgForm\"&gt;\u540d\u524d\uff1a&lt;\/label&gt;\r\n      &lt;input type=\"text\" class=\"form-control\" id=\"msgForm\"&gt;\r\n    &lt;\/div&gt;\r\n    &lt;button type=\"submit\" class=\"btn btn-primary\" id=\"sendButton\"&gt;\u5165\u5ba4&lt;\/button&gt;\r\n  &lt;\/form&gt;\r\n  &lt;br&gt;\r\n\r\n  &lt;div id=\"chatLogs\"&gt;\r\n    &lt;p&gt;=====\u30c1\u30e3\u30c3\u30c8\u30ed\u30b0=====&lt;\/p&gt;\r\n  &lt;\/div&gt;\r\n  &lt;br&gt;\r\n  &lt;div id=\"fortune\"&gt;\r\n    &lt;p&gt;======\u4eca\u65e5\u306e\u904b\u52e2======&lt;\/p&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n&lt;script type=\"text\/javascript\" src=\"\/chatroom\/public\/main.js\"&gt;&lt;\/script&gt;\r\n&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<h5>main.js<\/h5>\n<pre class=\"lang:js decode:true \" title=\"main.js\" >var chat = io('\/chat');\r\nvar fortune = io('\/fortune');  \/\/ C02. \u30bd\u30b1\u30c3\u30c8\u3078\u306e\u63a5\u7d9a\r\nvar isEnter = false;\r\nvar name = '';\r\n\r\n\/\/ C04. to_client\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3059\u308b\r\nchat.on('to_client', function(data){\r\n  appendMsg(data.value);\r\n});\r\nfortune.on('to_client', function(data) {\r\n  appendFortune(data.value);\r\n});\r\n\r\nfunction appendMsg(text) {\r\n  document.getElementById('chatLogs')\r\n  .insertAdjacentHTML('beforeend', `&lt;div&gt;${text}&lt;\/div&gt;`);\r\n}\r\n\r\nfunction appendFortune(text) {\r\n  \/\/ $(\"#fortune\").append(\"&lt;div&gt;\" + text + \"&lt;\/div&gt;\");\r\n  document.getElementById('fortune')\r\n  .insertAdjacentHTML('beforeend', `&lt;div&gt;${text}&lt;\/div&gt;`);\r\n}\r\n\r\nfunction submitForm() {\r\n  var message = document.getElementById('msgForm').value;\r\n  var selectRoom = document.getElementById('rooms').value;\r\n  document.getElementById('msgForm').value = '';\r\n  if (isEnter) {\r\n    message = `[${name}]: ${message}`;\r\n    \/\/ C03. to_server\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\r\n    chat.emit('to_server', {value : message});\r\n  } else {\r\n    name = message;\r\n    var entryMessage = name + \"\u3055\u3093\u304c\u5165\u5ba4\u3057\u307e\u3057\u305f\u3002\";\r\n    chat.emit('join', {value : selectRoom});\r\n    \/\/ C05. broadcast\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\r\n    chat.emit('broadcast', {value : entryMessage});\r\n    \/\/ C06. personal\u30a4\u30d9\u30f3\u30c8\u30fb\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\r\n    chat.emit('personal', {value : name});\r\n    changeLabel();\r\n  }\r\n  event.preventDefault();\r\n}\r\n\r\nfunction changeLabel() {\r\n  document.querySelector('.nameLabel').innerText = '\u30e1\u30c3\u30bb\u30fc\u30b8\uff1a';\r\n  document.getElementById('rooms').setAttribute('disabled',true);\r\n  document.getElementsByTagName('button')[0].innerText = '\u9001\u4fe1';\r\n  isEnter = true;\r\n}<\/pre>\n<p><a  href=\"https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2020\/04\/ad9160eb3dbaa8050b2088b0020d295d.png\" data-rel=\"lightbox-gallery-0\" data-rl_title=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-04-01 12.11.01\" data-rl_caption=\"\" title=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-04-01 12.11.01\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2020\/04\/ad9160eb3dbaa8050b2088b0020d295d-1024x282.png\" alt=\"\" width=\"1024\" height=\"282\" class=\"alignnone size-large wp-image-3451\" srcset=\"https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2020\/04\/ad9160eb3dbaa8050b2088b0020d295d-1024x282.png 1024w, https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2020\/04\/ad9160eb3dbaa8050b2088b0020d295d-300x83.png 300w, https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2020\/04\/ad9160eb3dbaa8050b2088b0020d295d-768x211.png 768w, https:\/\/www.sambuichi.jp\/wp-content\/uploads\/2020\/04\/ad9160eb3dbaa8050b2088b0020d295d.png 2036w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Views: 80 \u76ee\u6b21 \u6982\u8981 \u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0 \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0 \u6982\u8981 @IT\u306b\u3042\u308b\u300cSocket.IO\u958b\u767a\u6642\u306b\u5f79\u7acb\u3064\u30c4\u30fc\u30eb4\u9078\u3068room\u3001namespace\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4f7f\u3044\u65b9\u300d\u8a18\u4e8b\u3092\u53c2\u8003\u306bAWS EC2 Cl [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3451,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[20],"tags":[],"_links":{"self":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/3444"}],"collection":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3444"}],"version-history":[{"count":13,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/3444\/revisions"}],"predecessor-version":[{"id":3459,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/3444\/revisions\/3459"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/media\/3451"}],"wp:attachment":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}