├── .gitignore ├── LICENSE ├── README.md ├── handler.py ├── package-lock.json ├── package.json ├── requirements.txt ├── serverless.yml └── setup.cfg /.gitignore: -------------------------------------------------------------------------------- 1 | # Distribution / packaging 2 | .Python 3 | *.pyc 4 | env/ 5 | build/ 6 | develop-eggs/ 7 | dist/ 8 | downloads/ 9 | eggs/ 10 | .eggs/ 11 | lib/ 12 | lib64/ 13 | parts/ 14 | sdist/ 15 | var/ 16 | *.egg-info/ 17 | .installed.cfg 18 | *.egg 19 | node_modules/ 20 | # Serverless directories 21 | .serverless 22 | .vscode/ 23 | .package-lock.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2019 NiJia Lin 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aws-LINE-echo-bot 2 | 3 | This is my first project using Serverless framework to create LINE echo bot in AWS. 4 | 5 | Release this project to help first time use this framework's developer! 6 | 7 | # Bebore you start 8 | 9 | 1. LINE developer account 10 | 2. [LINE Message API](https://developers.line.biz/en/docs/messaging-api/getting-started/) 11 | 12 | # Quick Start 13 | 14 | 1. Install serverless via npm 15 | 16 | ```bash= 17 | $ npm install -g serverless 18 | ``` 19 | 20 | 2. Setup your **AWS** ceritficate 21 | 22 | ```bash= 23 | export AWS_ACCESS_KEY_ID= 24 | export AWS_SECRET_ACCESS_KEY= 25 | ``` 26 | 27 | 3. Clone this project 28 | 29 | ```bash= 30 | $ serverless install --url https://github.com/louis70109/aws-line-echo-bot -n 31 | $ cd / 32 | ``` 33 | 34 | 4. Insert you LINE bot secret & key 35 | 36 | ```python= 37 | line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN') 38 | handler = WebhookHandler('YOUR_CHANNEL_SECRET') 39 | ``` 40 | 41 | 5. Deploy the webhhok function 42 | 43 | ```bash= 44 | npm install 45 | pip install -r requirements.txt 46 | serverless deploy 47 | ``` 48 | 49 | Now you can test you chatbot, have fun! 50 | ![Echo bot](https://i.imgur.com/Tn1XS13.png) 51 | 52 | # Author 53 | 54 | Create by NiJia 55 | 56 | # Bonus 57 | 58 | This project is combined in [serverless example project](https://github.com/serverless/examples/tree/master/aws-python-line-echo-bot) 59 | 60 | # License 61 | 62 | MIT 63 | -------------------------------------------------------------------------------- /handler.py: -------------------------------------------------------------------------------- 1 | import json 2 | from linebot import ( 3 | LineBotApi, WebhookHandler 4 | ) 5 | from linebot.models import ( 6 | MessageEvent, TextMessage, TextSendMessage, 7 | ) 8 | 9 | 10 | def webhook(event, context): 11 | line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN') 12 | handler = WebhookHandler('YOUR_CHANNEL_SECRET') 13 | 14 | msg = json.loads(event['body']) 15 | # print(msg) 16 | line_bot_api.reply_message( 17 | msg['events'][0]['replyToken'], 18 | TextSendMessage(text=msg['events'][0]['message']['text']) 19 | ) 20 | response = { 21 | "statusCode": 200, 22 | "body": json.dumps({"message": 'ok'}) 23 | } 24 | 25 | return response 26 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-line-echo-bot", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "appdirectory": { 8 | "version": "0.1.0", 9 | "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", 10 | "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=", 11 | "dev": true 12 | }, 13 | "array-filter": { 14 | "version": "0.0.1", 15 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 16 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 17 | "dev": true 18 | }, 19 | "array-map": { 20 | "version": "0.0.0", 21 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 22 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 23 | "dev": true 24 | }, 25 | "array-reduce": { 26 | "version": "0.0.0", 27 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 28 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 29 | "dev": true 30 | }, 31 | "balanced-match": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 34 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 35 | "dev": true 36 | }, 37 | "bluebird": { 38 | "version": "3.5.5", 39 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 40 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", 41 | "dev": true 42 | }, 43 | "brace-expansion": { 44 | "version": "1.1.11", 45 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 46 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 47 | "dev": true, 48 | "requires": { 49 | "balanced-match": "^1.0.0", 50 | "concat-map": "0.0.1" 51 | } 52 | }, 53 | "concat-map": { 54 | "version": "0.0.1", 55 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 56 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 57 | "dev": true 58 | }, 59 | "core-util-is": { 60 | "version": "1.0.2", 61 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 62 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 63 | "dev": true 64 | }, 65 | "fs-extra": { 66 | "version": "7.0.1", 67 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 68 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 69 | "dev": true, 70 | "requires": { 71 | "graceful-fs": "^4.1.2", 72 | "jsonfile": "^4.0.0", 73 | "universalify": "^0.1.0" 74 | } 75 | }, 76 | "fs.realpath": { 77 | "version": "1.0.0", 78 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 79 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 80 | "dev": true 81 | }, 82 | "glob": { 83 | "version": "7.1.4", 84 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 85 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 86 | "dev": true, 87 | "requires": { 88 | "fs.realpath": "^1.0.0", 89 | "inflight": "^1.0.4", 90 | "inherits": "2", 91 | "minimatch": "^3.0.4", 92 | "once": "^1.3.0", 93 | "path-is-absolute": "^1.0.0" 94 | } 95 | }, 96 | "glob-all": { 97 | "version": "3.1.0", 98 | "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", 99 | "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", 100 | "dev": true, 101 | "requires": { 102 | "glob": "^7.0.5", 103 | "yargs": "~1.2.6" 104 | } 105 | }, 106 | "graceful-fs": { 107 | "version": "4.2.0", 108 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", 109 | "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", 110 | "dev": true 111 | }, 112 | "immediate": { 113 | "version": "3.0.6", 114 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 115 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", 116 | "dev": true 117 | }, 118 | "inflight": { 119 | "version": "1.0.6", 120 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 121 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 122 | "dev": true, 123 | "requires": { 124 | "once": "^1.3.0", 125 | "wrappy": "1" 126 | } 127 | }, 128 | "inherits": { 129 | "version": "2.0.4", 130 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 131 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 132 | "dev": true 133 | }, 134 | "is-wsl": { 135 | "version": "1.1.0", 136 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 137 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", 138 | "dev": true 139 | }, 140 | "isarray": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 143 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 144 | "dev": true 145 | }, 146 | "jsonfile": { 147 | "version": "4.0.0", 148 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 149 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 150 | "dev": true, 151 | "requires": { 152 | "graceful-fs": "^4.1.6" 153 | } 154 | }, 155 | "jsonify": { 156 | "version": "0.0.0", 157 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 158 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 159 | "dev": true 160 | }, 161 | "jszip": { 162 | "version": "3.2.1", 163 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", 164 | "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", 165 | "dev": true, 166 | "requires": { 167 | "lie": "~3.3.0", 168 | "pako": "~1.0.2", 169 | "readable-stream": "~2.3.6", 170 | "set-immediate-shim": "~1.0.1" 171 | } 172 | }, 173 | "lie": { 174 | "version": "3.3.0", 175 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 176 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 177 | "dev": true, 178 | "requires": { 179 | "immediate": "~3.0.5" 180 | } 181 | }, 182 | "lodash.get": { 183 | "version": "4.4.2", 184 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 185 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 186 | "dev": true 187 | }, 188 | "lodash.set": { 189 | "version": "4.3.2", 190 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 191 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", 192 | "dev": true 193 | }, 194 | "lodash.uniqby": { 195 | "version": "4.7.0", 196 | "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", 197 | "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", 198 | "dev": true 199 | }, 200 | "lodash.values": { 201 | "version": "4.3.0", 202 | "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", 203 | "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=", 204 | "dev": true 205 | }, 206 | "md5-file": { 207 | "version": "4.0.0", 208 | "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz", 209 | "integrity": "sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==", 210 | "dev": true 211 | }, 212 | "minimatch": { 213 | "version": "3.0.4", 214 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 215 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 216 | "dev": true, 217 | "requires": { 218 | "brace-expansion": "^1.1.7" 219 | } 220 | }, 221 | "minimist": { 222 | "version": "0.1.0", 223 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", 224 | "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", 225 | "dev": true 226 | }, 227 | "once": { 228 | "version": "1.4.0", 229 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 230 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 231 | "dev": true, 232 | "requires": { 233 | "wrappy": "1" 234 | } 235 | }, 236 | "pako": { 237 | "version": "1.0.10", 238 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 239 | "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", 240 | "dev": true 241 | }, 242 | "path-is-absolute": { 243 | "version": "1.0.1", 244 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 245 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 246 | "dev": true 247 | }, 248 | "process-nextick-args": { 249 | "version": "2.0.1", 250 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 251 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 252 | "dev": true 253 | }, 254 | "readable-stream": { 255 | "version": "2.3.6", 256 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 257 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 258 | "dev": true, 259 | "requires": { 260 | "core-util-is": "~1.0.0", 261 | "inherits": "~2.0.3", 262 | "isarray": "~1.0.0", 263 | "process-nextick-args": "~2.0.0", 264 | "safe-buffer": "~5.1.1", 265 | "string_decoder": "~1.1.1", 266 | "util-deprecate": "~1.0.1" 267 | } 268 | }, 269 | "rimraf": { 270 | "version": "2.6.3", 271 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 272 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 273 | "dev": true, 274 | "requires": { 275 | "glob": "^7.1.3" 276 | } 277 | }, 278 | "safe-buffer": { 279 | "version": "5.1.2", 280 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 281 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 282 | "dev": true 283 | }, 284 | "serverless-python-requirements": { 285 | "version": "4.3.0", 286 | "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-4.3.0.tgz", 287 | "integrity": "sha512-VyXdEKNxUWoQDbssWZeR5YMaTDf1U4CO3yJH2953Y2Rt8zD6hG+vpTkVR490/Ws1PQsBopWuFfgDcLyvAppaRg==", 288 | "dev": true, 289 | "requires": { 290 | "appdirectory": "^0.1.0", 291 | "bluebird": "^3.0.6", 292 | "fs-extra": "^7.0.0", 293 | "glob-all": "^3.1.0", 294 | "is-wsl": "^1.1.0", 295 | "jszip": "^3.1.0", 296 | "lodash.get": "^4.4.2", 297 | "lodash.set": "^4.3.2", 298 | "lodash.uniqby": "^4.0.0", 299 | "lodash.values": "^4.3.0", 300 | "md5-file": "^4.0.0", 301 | "rimraf": "^2.6.2", 302 | "shell-quote": "^1.6.1" 303 | } 304 | }, 305 | "set-immediate-shim": { 306 | "version": "1.0.1", 307 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 308 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 309 | "dev": true 310 | }, 311 | "shell-quote": { 312 | "version": "1.6.1", 313 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 314 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 315 | "dev": true, 316 | "requires": { 317 | "array-filter": "~0.0.0", 318 | "array-map": "~0.0.0", 319 | "array-reduce": "~0.0.0", 320 | "jsonify": "~0.0.0" 321 | } 322 | }, 323 | "string_decoder": { 324 | "version": "1.1.1", 325 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 326 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 327 | "dev": true, 328 | "requires": { 329 | "safe-buffer": "~5.1.0" 330 | } 331 | }, 332 | "universalify": { 333 | "version": "0.1.2", 334 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 335 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 336 | "dev": true 337 | }, 338 | "util-deprecate": { 339 | "version": "1.0.2", 340 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 341 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 342 | "dev": true 343 | }, 344 | "wrappy": { 345 | "version": "1.0.2", 346 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 347 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 348 | "dev": true 349 | }, 350 | "yargs": { 351 | "version": "1.2.6", 352 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", 353 | "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", 354 | "dev": true, 355 | "requires": { 356 | "minimist": "^0.1.0" 357 | } 358 | } 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-line-echo-bot", 3 | "description": "this is echo!", 4 | "version": "0.1.0", 5 | "dependencies": {}, 6 | "devDependencies": { 7 | "serverless-python-requirements": "^4.3.0" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | line-bot-sdk==1.12.1 -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: aws-line-echo-bot 2 | provider: 3 | name: aws 4 | runtime: python3.7 5 | 6 | functions: 7 | line_bot: 8 | handler: handler.webhook 9 | events: 10 | - http: 11 | path: /webhook 12 | method: POST 13 | 14 | plugins: 15 | - serverless-python-requirements 16 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [install] 2 | prefix= --------------------------------------------------------------------------------