{"id":130,"date":"2019-05-14T19:11:49","date_gmt":"2019-05-14T19:11:49","guid":{"rendered":"https:\/\/oidema-jp.com\/media\/2019-05-14-191149\/"},"modified":"2019-05-14T19:11:49","modified_gmt":"2019-05-14T19:11:49","slug":"2019-05-14-191149","status":"publish","type":"post","link":"https:\/\/oidema-jp.com\/media\/2019-05-14-191149\/","title":{"rendered":"\u3010LINE WORKS\u3011Callback\u30b5\u30fc\u30d0\u30fc\u306b\u767b\u9332\u3059\u308b\u79d8\u5bc6\u9375\u306e\u53d6\u308a\u6271\u3044\u3067\u5c11\u3057\u30cf\u30de\u308a\u307e\u3057\u305f"},"content":{"rendered":"<h2 id=\"i-0\">\u4eca\u56de\u306e\u5185\u5bb9<\/h2>\n<p>2021\u5e7412\u67081\u65e5\u3001<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/API\">API<\/a>\u5ec3\u6b62\u306e\u95a2\u4fc2\u3067\u52d5\u304b\u306a\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u3001\u4e0b\u8a18\u306e\u30ea\u30f3\u30af\u306b\u3057\u305f\u304c\u3063\u3066\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u3053\u3061\u3089\u306e\u30d6\u30ed\u30b0\u3067\u3082\u4fee\u6b63\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<p><iframe src=\"https:\/\/hatenablog-parts.com\/embed?url=https%3A%2F%2Fdevelopers.worksmobile.com%2Fjp%2Fdocument%2F10016001%3Flang%3Dja\" title=\"\u5ec3\u6b62\u4e88\u5b9a\u306e API - \u5ec3\u6b62\u4e88\u5b9a\u306e API - LINE WORKS Developers Document\" class=\"embed-card embed-webcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;\"><\/iframe><cite class=\"hatena-citation\"><a href=\"https:\/\/developers.worksmobile.com\/jp\/document\/10016001?lang=ja\">developers.worksmobile.com<\/a><\/cite><\/p>\n<p>\u73fe\u5728\u3001\u30c8\u30e9\u30a4\u30a2\u30eb\u3067LINE WORKS\u306e<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%A5%C8%A1%BC%A5%AF\">\u30c8\u30fc\u30af<\/a><a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/Bot\">Bot<\/a>\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306fNode.js + Heroku\u3067\u9032\u3081\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%A5%C8%A1%BC%A5%AF\">\u30c8\u30fc\u30af<\/a><a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/Bot\">Bot<\/a>\u3092\u4f5c\u6210\u3059\u308b\u969b\u306b<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%A5%C8%A1%BC%A5%AF\">\u30c8\u30fc\u30af<\/a><a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/Bot\">Bot<\/a>\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u53d7\u4fe1\u3057\u3001callback\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u306b<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%C8%EB%CC%A9%B8%B0\">\u79d8\u5bc6\u9375<\/a>\u306e\u60c5\u5831\u3092\u767b\u9332\u3057\u306a\u3051\u308c\u3070\u3044\u3051\u306a\u3044\u306e\u3067\u3059\u304c\u3001LINE WORKS\u306e\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u63b2\u8f09\u3055\u308c\u3066\u3044\u308b\u8a8d\u8a3c\u30ad\u30fc\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u4e0b\u56f3\u306e\u3088\u3046\u306a\u611f\u306b\u306a\u3063\u3066\u3044\u308b\u306e\u306b\u5bfe\u3057\u3066<\/p>\n<blockquote>\n<p>\u2014\u2013BEGIN <a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/RSA\">RSA<\/a> PRIVATE KEY\u2014\u2013<br \/>aaa<br \/>bbb<br \/>ccc<br \/>\n\u2014\u2013END <a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/RSA\">RSA<\/a> PRIVATE KEY\u2014\u2013<\/p>\n<\/blockquote>\n<p><span itemscope itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/k\/keisuke8925gdk\/20190514\/20190514145509.png\" alt=\"f:id:keisuke8925gdk:20190514145509p:plain\" width=\"578\" height=\"559\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"><\/span><\/p>\n<p>\u79c1\u304c\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3044\u308bxxxxxx.key\u30d5\u30a1\u30a4\u30eb\u306f<\/p>\n<blockquote>\n<p>\u2014\u2013BEGIN  PRIVATE KEY\u2014\u2013<br \/>aaa<br \/>bbb<br \/>ccc<br \/>\n\u2014\u2013END PRIVATE KEY\u2014\u2013<\/p>\n<\/blockquote>\n<p><span itemscope itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/k\/keisuke8925gdk\/20190514\/20190514150404.png\" alt=\"f:id:keisuke8925gdk:20190514150404p:plain\" width=\"536\" height=\"488\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"><\/span><\/p>\n<p>\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b\u3002<\/p>\n<p>\u3042\u308c\u3001\u306a\u3093\u304b\u9055\u3046\u3002<\/p>\n<blockquote>\n<p>\u2014\u2013BEGIN <a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/RSA\">RSA<\/a> PRIVATE KEY\u2014\u2013<br \/>aaa<br \/>\n\u2014\u2013END <a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/RSA\">RSA<\/a> PRIVATE KEY\u2014\u2013<\/p>\n<p>\u2193\u79c1\u306e\u30d5\u30a1\u30a4\u30eb<\/p>\n<p>\u2014\u2013BEGIN  PRIVATE KEY\u2014\u2013<br \/>aaa<br \/>\n\u2014\u2013END PRIVATE KEY\u2014\u2013<\/p>\n<\/blockquote>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u8abf\u3079\u3066\u307f\u308b\u3068\u3084\u306f\u308a\u3001\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u305f.key\u30d5\u30a1\u30a4\u30eb\u306e<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9\">\u30a8\u30f3\u30b3\u30fc\u30c9<\/a>\u65b9\u5f0f\u304c\u9055\u3046\u3001\u3082\u3068\u3082\u3068\u306f\u304a\u305d\u3089\u304f\u3001\u305f\u3060\u306e\u5e73\u6587\u3060\u3063\u305for Der\u65b9\u5f0f\u3060\u3063\u305f\uff1f\uff1f\u3088\u3046\u3067PEM\u3067<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9\">\u30a8\u30f3\u30b3\u30fc\u30c9<\/a>\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u4e0b\u8a18\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3001<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%B4%C4%B6%AD%CA%D1%BF%F4\">\u74b0\u5883\u5909\u6570<\/a>\u306b\u767b\u9332\u3057\u305f\u3068\u3053\u308d\u4e0a\u624b\u304f\u52d5\u304f\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">openssl rsa -in &lt;my file name&gt;.key -out &lt;my file name&gt;.key -outform pem\n<\/pre>\n<h4 id=\"i-1\">openssl\u30b3\u30de\u30f3\u30c9\u306b\u3064\u3044\u3066\u306e\u7c21\u6613\u306a\u30e1\u30e2<br \/><\/h4>\n<p><code>openssl rsa<\/code>\u30b3\u30de\u30f3\u30c9\u306f<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/RSA\">RSA<\/a>\u306e<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%C8%EB%CC%A9%B8%B0\">\u79d8\u5bc6\u9375<\/a>\u3092\u4f7f\u3063\u305f\u51e6\u7406\u3092\u884c\u3046\u3082\u306e\u3002<\/p>\n<ul>\n<li>-in \u3067\u8aad\u307f\u8fbc\u3080<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%C8%EB%CC%A9%B8%B0\">\u79d8\u5bc6\u9375<\/a>\u3092\u6307\u5b9a<\/li>\n<li>-out \u3067\u66f8\u304d\u51fa\u3059\u30d5\u30a1\u30a4\u30eb\u3092\u6307\u5b9a<\/li>\n<li>-outform \u3067\u66f8\u304d\u51fa\u3059\u30d5\u30a1\u30a4\u30eb\u306e<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0\">\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0<\/a>\u3092\u6307\u5b9a<\/li>\n<\/ul>\n<h2 id=\"i-2\">Heroku\u306e<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%B4%C4%B6%AD%CA%D1%BF%F4\">\u74b0\u5883\u5909\u6570<\/a>\u3078\u306e\u767b\u9332<\/h2>\n<p>\u4eca\u56de\u306f<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%C8%EB%CC%A9%B8%B0\">\u79d8\u5bc6\u9375<\/a>\u306e\u5185\u5bb9\u3092Heroku\u306e<a class=\"keyword\" href=\"http:\/\/d.hatena.ne.jp\/keyword\/%B4%C4%B6%AD%CA%D1%BF%F4\">\u74b0\u5883\u5909\u6570<\/a>\u3078\u767b\u9332\u3057\u3066\u5229\u7528\u3057\u305f\u3044\u305f\u3081\u4e0b\u8a18\u306e\u30b3\u30de\u30f3\u30c9\u3067\u767b\u9332\u3057\u3088\u3046\u3068\u3057\u305f\u306e\u3067\u3059\u304c\u3001\u6539\u884c\u3084\u30b9\u30da\u30fc\u30b9\u304c\u3042\u308b\u3068\u4e0a\u624b\u304f\u6271\u3048\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">heroku config:set =\"\"\n<\/pre>\n<p><\/p>\n<p>\u305d\u306e\u305f\u3081\u4eca\u56de\u306f\u3044\u3055\u304e\u3088\u304f\u8ae6\u3081\u3066Heroku\u306e\u753b\u9762\u304b\u3089\u767b\u9332\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>Heroku\u306esettings &gt; config var\u306e\u3068\u3053\u308d\u3067\u76f4\u63a5\u66f8\u304d\u8fbc\u307f\u3057\u307e\u3057\u305f\u3002<\/p>\n<p><span itemscope itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/k\/keisuke8925gdk\/20190515\/20190515155238.png\" alt=\"f:id:keisuke8925gdk:20190515155238p:plain\" width=\"1200\" height=\"628\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"><\/span><\/p>\n<p>\u4eca\u56de\u306e\u30b5\u30f3\u30d7\u30eb\u8cbc\u3063\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-javascript\" data-lang=\"javascript\" data-unlink=\"\"><span class=\"synConstant\">\"use strict\"<\/span>;\n<span class=\"synComment\">\/\/ \u30e2\u30b8\u30e5\u30fc\u30eb\u30a4\u30f3\u30dd\u30fc\u30c8<\/span>\n<span class=\"synStatement\">const<\/span> express = require(<span class=\"synConstant\">\"express\"<\/span>);\n<span class=\"synStatement\">const<\/span> server = express();\n<span class=\"synStatement\">const<\/span> bodyParser = require(<span class=\"synConstant\">\"body-parser\"<\/span>);\n<span class=\"synStatement\">const<\/span> jwt = require(<span class=\"synConstant\">'jsonwebtoken'<\/span>);\n<span class=\"synStatement\">const<\/span> https = require(<span class=\"synConstant\">\"https\"<\/span>);\n<span class=\"synStatement\">const<\/span> request = require(<span class=\"synConstant\">\"request\"<\/span>);\n<span class=\"synStatement\">const<\/span> qs = require(<span class=\"synConstant\">\"querystring\"<\/span>);\n<span class=\"synComment\">\/\/\u5909\u6570<\/span>\n<span class=\"synStatement\">const<\/span> APIID = process.env.APIID;\n<span class=\"synStatement\">const<\/span> SERVERID = process.env.SERVERID;\n<span class=\"synStatement\">const<\/span> CONSUMERKEY = process.env.CONSUMERKEY;\n<span class=\"synStatement\">const<\/span> PRIVATEKEY = process.env.PRIVATEKEY;\n<span class=\"synStatement\">const<\/span> BOTNO = process.env.BOTNO;\nserver.use(bodyParser.json());\n<span class=\"synComment\">\/\/ Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u8d77\u52d5<\/span>\nserver.listen(process.env.PORT || 3000);\n<span class=\"synComment\">\/\/ \u30b5\u30fc\u30d0\u30fc\u8d77\u52d5\u78ba\u8a8d<\/span>\nserver.get(<span class=\"synConstant\">'\/'<\/span>, (req, res) =&gt; <span class=\"synIdentifier\">{<\/span>\nres.send(<span class=\"synConstant\">'Hello World!'<\/span>);\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synComment\">\/\/ Bot\u304b\u3089\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u5fdc\u7b54<\/span>\nserver.post(<span class=\"synConstant\">'\/callback'<\/span>, (req, res) =&gt; <span class=\"synIdentifier\">{<\/span>\nres.sendStatus(200);\n<span class=\"synStatement\">const<\/span> message = req.body.content.text;\n<span class=\"synStatement\">const<\/span> roomId = req.body.source.roomId;\n<span class=\"synStatement\">const<\/span> accountId = req.body.source.accountId;\n<span class=\"synComment\">\/\/ \u3053\u3053\u304c\u8a8d\u8a3c\u3057\u3066\u3044\u308b\u3068\u3053\u308d<\/span>\n<span class=\"synComment\">\/\/ \u3053\u3053\u306b\u8a73\u3057\u304f\u66f8\u3044\u3066\u3042\u308b<\/span>\n<span class=\"synComment\">\/\/ https:\/\/developers.worksmobile.com\/jp\/document\/1002002?lang=ja<\/span>\ngetJWT((jwttoken) =&gt; <span class=\"synIdentifier\">{<\/span>\ngetServerToken(jwttoken, (newtoken) =&gt; <span class=\"synIdentifier\">{<\/span>\nsendMessage(newtoken, accountId, message);\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synComment\">\/\/1. \u30b5\u30fc\u30d0\u30fcAPI\u7528JWT\u53d6\u5f97<\/span>\n<span class=\"synIdentifier\">function<\/span> getJWT(callback)<span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">const<\/span> iss = SERVERID;\n<span class=\"synStatement\">const<\/span> iat = Math.floor(<span class=\"synType\">Date<\/span>.now() \/ 1000);\n<span class=\"synStatement\">const<\/span> exp = iat + (60 * 60);\u3000<span class=\"synComment\">\/\/JWT\u306e\u6709\u52b9\u671f\u9593\u306f1\u6642\u9593<\/span>\n<span class=\"synStatement\">const<\/span> cert = PRIVATEKEY;\n<span class=\"synStatement\">const<\/span> token = <span class=\"synIdentifier\">[]<\/span>;\n<span class=\"synStatement\">const<\/span> jwttoken = jwt.sign(<span class=\"synIdentifier\">{<\/span><span class=\"synConstant\">\"iss\"<\/span>:iss, <span class=\"synConstant\">\"iat\"<\/span>:iat, <span class=\"synConstant\">\"exp\"<\/span>:exp<span class=\"synIdentifier\">}<\/span>, cert, <span class=\"synIdentifier\">{<\/span>algorithm:<span class=\"synConstant\">\"RS256\"<\/span><span class=\"synIdentifier\">}<\/span>, (err, jwttoken) =&gt; <span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">if<\/span> (!err) <span class=\"synIdentifier\">{<\/span>\ncallback(jwttoken);\n<span class=\"synIdentifier\">}<\/span> <span class=\"synStatement\">else<\/span> <span class=\"synIdentifier\">{<\/span>\nconsole.log(err);\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synComment\">\/\/2. \u30b5\u30fc\u30d0\u30fc\u30c8\u30fc\u30af\u30f3\u306e\u53d6\u5f97<\/span>\n<span class=\"synIdentifier\">function<\/span> getServerToken(jwttoken, callback) <span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">const<\/span> postdata = <span class=\"synIdentifier\">{<\/span>\nurl: <span class=\"synConstant\">'https:\/\/authapi.worksmobile.com\/b\/'<\/span> + APIID + <span class=\"synConstant\">'\/server\/token'<\/span>,\nheaders : <span class=\"synIdentifier\">{<\/span>\n<span class=\"synConstant\">'Content-Type'<\/span> : <span class=\"synConstant\">'application\/x-www-form-urlencoded; charset=UTF-8'<\/span>,\n<span class=\"synIdentifier\">}<\/span>,\nform: <span class=\"synIdentifier\">{<\/span>\n<span class=\"synConstant\">\"grant_type\"<\/span> : encodeURIComponent(<span class=\"synConstant\">\"urn:ietf:params:oauth:grant-type:jwt-bearer\"<\/span>),\n<span class=\"synConstant\">\"assertion\"<\/span> : jwttoken\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synIdentifier\">}<\/span>;\nrequest.post(postdata, (error, response, body) =&gt; <span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">if<\/span> (error) <span class=\"synIdentifier\">{<\/span>\nconsole.log(err);\ncallback(err);\n<span class=\"synIdentifier\">}<\/span> <span class=\"synStatement\">else<\/span> <span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">const<\/span> jsonobj = JSON.parse(body);\n<span class=\"synStatement\">const<\/span> AccessToken = jsonobj.access_token;\ncallback(AccessToken);\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synComment\">\/\/sendMessage\u3092\u5229\u7528\u3057\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1<\/span>\n<span class=\"synIdentifier\">function<\/span> sendMessage(token, accountId, message) <span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">const<\/span> postdata = <span class=\"synIdentifier\">{<\/span>\n<span class=\"synComment\">\/\/2021\u5e7412\u67081\u65e5\u4fee\u6b63<\/span>\nurl:<span class=\"synConstant\">'https:\/\/apis.worksmobile.com\/r\/'<\/span> + APID + <span class=\"synConstant\">'\/message\/v1\/'<\/span> + BOTNO +  <span class=\"synConstant\">'\/message\/push\u2019<\/span>\n<span class=\"synComment\">\/*\u3053\u3053\u304b\u3089<\/span>\n<span class=\"synComment\">        url: 'https:\/\/apis.worksmobile.com\/' + APIID + '\/message\/sendMessage\/v2', <\/span>\n<span class=\"synComment\">         \u3053\u3053\u307e\u3067\u524a\u9664\u3000\u5ec3\u6b62API\u306e\u305f\u3081*\/<\/span>\nheaders : <span class=\"synIdentifier\">{<\/span>\n<span class=\"synConstant\">'Content-Type'<\/span> : <span class=\"synConstant\">'application\/json;charset=UTF-8'<\/span>,\n<span class=\"synConstant\">'consumerKey'<\/span> : CONSUMERKEY,\n<span class=\"synConstant\">'Authorization'<\/span> : <span class=\"synConstant\">\"Bearer \"<\/span> + token\n<span class=\"synIdentifier\">}<\/span>,\njson: <span class=\"synIdentifier\">{<\/span>\n<span class=\"synConstant\">\"botNo\"<\/span> : <span class=\"synType\">Number<\/span>(BOTNO),\n<span class=\"synConstant\">\"accountId\"<\/span> : accountId,\n<span class=\"synConstant\">\"content\"<\/span> : <span class=\"synIdentifier\">{<\/span>\n<span class=\"synConstant\">\"type\"<\/span> : <span class=\"synConstant\">\"text\"<\/span>,\n<span class=\"synConstant\">\"text\"<\/span> : message\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synIdentifier\">}<\/span>\n<span class=\"synIdentifier\">}<\/span>;\nrequest.post(postdata, (error, response, body) =&gt; <span class=\"synIdentifier\">{<\/span>\n<span class=\"synStatement\">if<\/span> (error) <span class=\"synIdentifier\">{<\/span>\nconsole.log(error);\n<span class=\"synIdentifier\">}<\/span>\nconsole.log(body);\n<span class=\"synIdentifier\">}<\/span>);\n<span class=\"synIdentifier\">}<\/span>\n<\/pre>\n<h2 id=\"i-3\">\u53c2\u7167<\/h2>\n<ul>\n<li>\n<p><a href=\"https:\/\/qiita.com\/tokotan\/items\/f615f4a62219d655436f\">LINE WORKS\u3067\u521d\u3081\u3066\u306eBot\u958b\u767a\uff01(\u524d\u7de8)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/qiita.com\/tokotan\/items\/976d35ca56132e0bb5c1\">LINE WORKS\u3067\u521d\u3081\u3066\u306eBot\u958b\u767a\uff01(\u5f8c\u7de8)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developers.worksmobile.com\/jp\/document\/1002002?lang=ja\">API \u8a8d\u8a3c\u306e\u6e96\u5099<\/a><\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u56de\u306e\u5185\u5bb9 2021\u5e7412\u67081\u65e5\u3001API\u5ec3\u6b62\u306e\u95a2\u4fc2\u3067\u52d5\u304b\u306a\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u3001\u4e0b\u8a18\u306e\u30ea\u30f3\u30af\u306b\u3057\u305f\u304c\u3063\u3066\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \u3053\u3061\u3089\u306e\u30d6\u30ed\u30b0\u3067\u3082\u4fee\u6b63\u3057\u3066\u304a\u304d\u307e\u3059\u3002 developers.worksmobile.com \u73fe &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"om_disable_all_campaigns":false,"footnotes":""},"categories":[14,16,17,15],"tags":[],"class_list":{"0":"post-130","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"category-line-works","8":"category-node-js","9":"category-15","10":"entry","11":"nothumb"},"acf":[],"aioseo_notices":[],"mb":[],"mfb_rest_fields":["title","aioseo_notices"],"_links":{"self":[{"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/posts\/130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/comments?post=130"}],"version-history":[{"count":0,"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/posts\/130\/revisions"}],"wp:attachment":[{"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/media?parent=130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/categories?post=130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oidema-jp.com\/media\/wp-json\/wp\/v2\/tags?post=130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}