

LINE Messaging APIを使って、LINEからSpotifyにログインしたいです（Eclipse + Node.js +
herokuを利用しています）

自分で書いたindex.js内のエラーは一つずつ潰してきたのですが、今回インストールしたパッケージしかコンソールに表示されず困っています。

どなたか直すべきところや疑わしいところをご指摘いただけますと大変嬉しです。  
よろしくお願いします。

[code]

    <index.js>
    
        'use strict';
    
        var express = require('express');
        var app = express();
        var bodyParser = require('body-parser');
        var request = require('request');
        var async = require('async');
        var crypto = require('crypto');
        var https = require('https');
        var qs = require('qs');
        const line = require('@line/bot-sdk');
    
        const client = new line.Client({
            channelAccessToken: '---my Channel Access Token---'
        });
    
        app.use(express.static('public'));
    
        app.set('port', (process.env.PORT || 8000));
        app.use(bodyParser.urlencoded({extended: true}));  // JSONの送信を許可
        app.use(bodyParser.json());                        // JSONのパースを楽に（受信時）
    
        app.post('/callback', function(req, res) {
    
            async.waterfall([
                    function(callback) {
    
                        console.log('req.headers is: ' + req.headers['x-line-signature']);
                        console.log('req.body is: ' + req.body);
                        console.log('validating result: ' + validate_signature(req.headers['x-line-signature'], req.body));
    
                        // 捕捉されない例外のスタックトレースを表示
                        process.on('unhandledRejection', console.dir);
    
                        // リクエストがLINE Platformから送られてきたか確認する
                        if (!validate_signature(req.headers['x-line-signature'], req.body)) {
                            return;
                        }
    
                        // テキストが送られてきた場合のみ返事をする
                        if ((req.body['events'][0]['type'] != 'message') || (req.body['events'][0]['message']['type'] != 'text')) {
                            return;
                        }
    
                    //署名検証
                    function validate_signature(signature, body) {
                        // return signature == crypto.createHmac('sha256', process.env.LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body), 'utf8')).digest('base64');
                        return signature == crypto.createHmac('sha256', '3126eead2c2301a08ff7113b4a4c1347').update(Buffer.from(JSON.stringify(body), 'utf8')).digest('base64');
                    }
    
                    const client = new line.Client({
                          channelAccessToken: '---my Channel Access Token---'
                        });
    
                    // 送信データ作成
                    // テンプレートの内容
                    let pushSendMessageObject = [{
                      'replyToken': req.body['events'][0]['replyToken'],
                          "type": "template",
                          "altText": "this is a buttons template",
                          "template": {
                              "type": "buttons",
                              "title": "Spotifyにログインをお願いします。",
                              "text": "login",
                              "actions": [
                                  {
                                    "type": "uri",
                                    "label": "はーい",
                                    "uri": "https://accounts.spotify.com/authorize"
                                  },
                                  {
                                    "type": "postback",
                                    "label": "やめとく",
                                    "data": "action=cancel&selectId=2"
                                  },
                              ]
                           }
                        }];
    
                            console.log('2 done');
                            callback(null, req, pushSendMessageObject);
                },
                function (req, pushSendMessageObject, callback){
                  client.replyMessage(req.body['events'][0]['replyToken'], pushSendMessageObject);
                  console.log('1 done');
    
                  setTimeout(function(){
                  callback(null);
                  }, 50);
            }
          ],function(err){
                if (err){
                    throw err;
                    console.log('This is an error message on the line 160');
                }
        }
        );
    });
    
    app.listen(app.get('port'), function() {
            console.log('Node app is running');
    });
    
[/code]

エラー内容は以下です。

[code]

    [$ heroku logs
    2018-03-19T11:40:48.090391+00:00 app[web.1]:         headers: [Object],
    2018-03-19T11:40:48.090392+00:00 app[web.1]:         config: [Object],
    2018-03-19T11:40:48.090394+00:00 app[web.1]:         request: [Object],
    2018-03-19T11:40:48.090396+00:00 app[web.1]:         data: [Object] } } }
    2018-03-19T11:41:17.678669+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/callback" host=ciecho.herokuapp.com request_id=4ff26185-f921-4af8-928c-53a9c05a1142 fwd="203.104.146.153" dyno=web.1 connect=0ms service=30001ms status=503 bytes=0 protocol=https
    2018-03-19T11:42:22.000000+00:00 app[api]: Build started by user xxx@gmail.com
    2018-03-19T11:42:48.333058+00:00 app[api]: Deploy 096014ce by user xxx@gmail.com
    2018-03-19T11:42:48.333058+00:00 app[api]: Release v152 created by user xxx@gmail.com
    2018-03-19T11:42:22.000000+00:00 app[api]: Build succeeded
    2018-03-19T11:42:49.235277+00:00 heroku[web.1]: Restarting
    2018-03-19T11:42:49.236384+00:00 heroku[web.1]: State changed from up to starting
    2018-03-19T11:42:50.364974+00:00 heroku[web.1]: Stopping all processes with SIGTERM
    2018-03-19T11:42:50.435324+00:00 heroku[web.1]: Process exited with status 143
    2018-03-19T11:42:54.908997+00:00 heroku[web.1]: Starting process with command `node index.js`
    2018-03-19T11:42:57.963816+00:00 app[web.1]: Node app is running
    2018-03-19T11:42:58.711373+00:00 heroku[web.1]: State changed from starting to up
    2018-03-19T11:43:15.632079+00:00 app[web.1]: req.headers is: SB9MLEAATN0YtWS/Q0tVTWb1WagzlQcqKWVwXGzxgKQ=
    2018-03-19T11:43:15.633614+00:00 app[web.1]: 2 done
    2018-03-19T11:43:15.635680+00:00 app[web.1]: 1 done
    2018-03-19T11:43:15.633226+00:00 app[web.1]: validating result: true
    2018-03-19T11:43:15.632340+00:00 app[web.1]: req.body is: [object Object]
    2018-03-19T11:43:16.227644+00:00 app[web.1]: { Error: Request failed with status code 403
    2018-03-19T11:43:16.227656+00:00 app[web.1]:     at wrapError (/app/node_modules/@line/bot-sdk/dist/http.js:10:15)
    2018-03-19T11:43:16.227659+00:00 app[web.1]:     at <anonymous>
    2018-03-19T11:43:16.227660+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:188:7)
    2018-03-19T11:43:16.227662+00:00 app[web.1]:   statusCode: 403,
    2018-03-19T11:43:16.227664+00:00 app[web.1]:   statusMessage: 'Forbidden',
    2018-03-19T11:43:16.227665+00:00 app[web.1]:   originalError: 
    2018-03-19T11:43:16.227667+00:00 app[web.1]:    { Error: Request failed with status code 403
    2018-03-19T11:43:16.227668+00:00 app[web.1]:     at createError (/app/node_modules/axios/lib/core/createError.js:16:15)
    2018-03-19T11:43:16.227670+00:00 app[web.1]:     at settle (/app/node_modules/axios/lib/core/settle.js:18:12)
    2018-03-19T11:43:16.227690+00:00 app[web.1]:     at IncomingMessage.handleStreamEnd (/app/node_modules/axios/lib/adapters/http.js:191:11)
    2018-03-19T11:43:16.227692+00:00 app[web.1]:     at emitNone (events.js:111:20)
    2018-03-19T11:43:16.227694+00:00 app[web.1]:     at IncomingMessage.emit (events.js:208:7)
    2018-03-19T11:43:16.227698+00:00 app[web.1]:     at _combinedTickCallback (internal/process/next_tick.js:138:11)
    2018-03-19T11:43:16.227696+00:00 app[web.1]:     at endReadableNT (_stream_readable.js:1056:12)
    2018-03-19T11:43:16.227700+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:180:9)
    2018-03-19T11:43:16.227703+00:00 app[web.1]:      config: 
    2018-03-19T11:43:16.227704+00:00 app[web.1]:       { adapter: [Function: httpAdapter],
    2018-03-19T11:43:16.227706+00:00 app[web.1]:         transformRequest: [Object],
    2018-03-19T11:43:16.227708+00:00 app[web.1]:         transformResponse: [Object],
    2018-03-19T11:43:16.227709+00:00 app[web.1]:         timeout: 0,
    2018-03-19T11:43:16.227711+00:00 app[web.1]:         xsrfCookieName: 'XSRF-TOKEN',
    2018-03-19T11:43:16.227712+00:00 app[web.1]:         xsrfHeaderName: 'X-XSRF-TOKEN',
    2018-03-19T11:43:16.227714+00:00 app[web.1]:         maxContentLength: -1,
    2018-03-19T11:43:16.227715+00:00 app[web.1]:         validateStatus: [Function: validateStatus],
    2018-03-19T11:43:16.227717+00:00 app[web.1]:         headers: [Object],
    2018-03-19T11:43:16.227719+00:00 app[web.1]:         method: 'post',
    2018-03-19T11:43:16.227720+00:00 app[web.1]:         url: 'https://api.line.me/v2/bot/message/reply',
    2018-03-19T11:43:16.227729+00:00 app[web.1]:         data: '{"messages":[{"replyToken":"f0e97d20499e4520be90046fb6541d8c","type":"template","altText":"this is a buttons template","template":{"type":"buttons","title":"Spotifyにログインをお願いします。","text":"login","actions":[{"type":"uri","label":"はーい","uri":"https://accounts.spotify.com/authorize"},{"type":"postback","label":"やめとく","data":"action=cancel&selectId=2"}]}}],"replyToken":"f0e97d20499e4520be90046fb6541d8c"}' },
    2018-03-19T11:43:16.227731+00:00 app[web.1]:      request: 
    2018-03-19T11:43:16.227733+00:00 app[web.1]:       ClientRequest {
    2018-03-19T11:43:16.227734+00:00 app[web.1]:         domain: null,
    2018-03-19T11:43:16.227736+00:00 app[web.1]:         _events: [Object],
    2018-03-19T11:43:16.227738+00:00 app[web.1]:         _eventsCount: 6,
    2018-03-19T11:43:16.227740+00:00 app[web.1]:         _maxListeners: undefined,
    2018-03-19T11:43:16.227741+00:00 app[web.1]:         output: [],
    2018-03-19T11:43:16.227743+00:00 app[web.1]:         outputEncodings: [],
    2018-03-19T11:43:16.227744+00:00 app[web.1]:         outputCallbacks: [],
    2018-03-19T11:43:16.227746+00:00 app[web.1]:         outputSize: 0,
    2018-03-19T11:43:16.227748+00:00 app[web.1]:         writable: true,
    2018-03-19T11:43:16.227749+00:00 app[web.1]:         _last: true,
    2018-03-19T11:43:16.227751+00:00 app[web.1]:         upgrading: false,
    2018-03-19T11:43:16.227752+00:00 app[web.1]:         chunkedEncoding: false,
    2018-03-19T11:43:16.227754+00:00 app[web.1]:         shouldKeepAlive: false,
    2018-03-19T11:43:16.227755+00:00 app[web.1]:         useChunkedEncodingByDefault: true,
    2018-03-19T11:43:16.227757+00:00 app[web.1]:         sendDate: false,
    2018-03-19T11:43:16.227759+00:00 app[web.1]:         _removedConnection: false,
    2018-03-19T11:43:16.227760+00:00 app[web.1]:         _removedContLen: false,
    2018-03-19T11:43:16.227762+00:00 app[web.1]:         _removedTE: false,
    2018-03-19T11:43:16.227764+00:00 app[web.1]:         _contentLength: null,
    2018-03-19T11:43:16.227765+00:00 app[web.1]:         _hasBody: true,
    2018-03-19T11:43:16.227767+00:00 app[web.1]:         _trailer: '',
    2018-03-19T11:43:16.227768+00:00 app[web.1]:         finished: true,
    2018-03-19T11:43:16.227770+00:00 app[web.1]:         _headerSent: true,
    2018-03-19T11:43:16.227771+00:00 app[web.1]:         socket: [Object],
    2018-03-19T11:43:16.227773+00:00 app[web.1]:         connection: [Object],
    2018-03-19T11:43:16.227776+00:00 app[web.1]:         _header: 'POST /v2/bot/message/reply HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nContent-Type: application/json\r\nAuthorization: Bearer mGKjMIpknOpyCQ7VdpNWjOw1jjwCJJxM0qRuojibKdChbfusZlUl/2DcCbS3A6cX4QWQ58yGZrKcH8pxXjmPwHMTKavxKhXGjIT3vFh5Z1NL8kUGnznrEM7QPCSQrPq+17OQgzIDWnUW/mP5abzpSgdB04t89/1O/w1cDnyilFU=\r\nUser-Agent: @line/bot-sdk/5.2.0\r\nContent-Length: 442\r\nHost: api.line.me\r\nConnection: close\r\n\r\n',
    2018-03-19T11:43:16.227778+00:00 app[web.1]:         _onPendingData: [Function: noopPendingOutput],
    2018-03-19T11:43:16.227779+00:00 app[web.1]:         agent: [Object],
    2018-03-19T11:43:16.227781+00:00 app[web.1]:         socketPath: undefined,
    2018-03-19T11:43:16.227782+00:00 app[web.1]:         timeout: undefined,
    2018-03-19T11:43:16.227784+00:00 app[web.1]:         method: 'POST',
    2018-03-19T11:43:16.227786+00:00 app[web.1]:         path: '/v2/bot/message/reply',
    2018-03-19T11:43:16.227787+00:00 app[web.1]:         _ended: true,
    2018-03-19T11:43:16.227789+00:00 app[web.1]:         res: [Object],
    2018-03-19T11:43:16.227790+00:00 app[web.1]:         aborted: undefined,
    2018-03-19T11:43:16.227792+00:00 app[web.1]:         timeoutCb: null,
    2018-03-19T11:43:16.227794+00:00 app[web.1]:         upgradeOrConnect: false,
    2018-03-19T11:43:16.227795+00:00 app[web.1]:         parser: null,
    2018-03-19T11:43:16.227798+00:00 app[web.1]:         _redirectable: [Object],
    2018-03-19T11:43:16.227797+00:00 app[web.1]:         maxHeadersCount: null,
    2018-03-19T11:43:16.227800+00:00 app[web.1]:         [Symbol(outHeadersKey)]: [Object] },
    2018-03-19T11:43:16.227802+00:00 app[web.1]:      response: 
    2018-03-19T11:43:16.227803+00:00 app[web.1]:       { status: 403,
    2018-03-19T11:43:16.227805+00:00 app[web.1]:         statusText: 'Forbidden',
    2018-03-19T11:43:16.227806+00:00 app[web.1]:         headers: [Object],
    2018-03-19T11:43:16.227808+00:00 app[web.1]:         config: [Object],
    2018-03-19T11:43:16.227810+00:00 app[web.1]:         request: [Object],
    2018-03-19T11:43:16.227811+00:00 app[web.1]:         data: [Object] } } }
    
[/code]


CC BY-SA 3.0
2018-03-19T12:48:41.333
42496
2019-12-05T06:43:57.897
2019-12-04T04:39:01.677
2808
27808
question
node.js api eclipse https line
Node.js 403：エラーログに自分で編集したファイル以外しか出てこない時のエラーの原因


Messaging APIからステータスコード403で返っているので、LINEアカウントの設定に何かしら問題がありそうです。  
LINE@ ManagerかLINE Developersから再度確認してみてください。

参考: <https://developers.line.me/ja/docs/messaging-
api/reference/#anchor-006a70a2021e9f35c762d309e9bd5f4e8aa94355>

`403 Forbidden リソースにアクセスする権限がありません。ご契約中のプランやアカウントに付与されている権限を確認してください。`


CC BY-SA 3.0
2018-04-14T03:31:55.323
43231
2018-04-14T03:56:47.770
2018-04-14T03:56:47.770
19612
19612
42496
answer


質問文中のコードを試してみましたが、想定通り返答できているように見えます。

(少なくとも2019年現在では、)デベロッパーコンソールの「セキュリティ設定」で設定を行っているIPアドレス以外からメッセージ送信しようとすると `403`
が返ってくるようですのでそちらの設定の問題の可能性があります。

いわゆるやってみた系記事では上記IPアドレス設定が必須であるように読めるものも散見されますが、[未設定でも動作する](https://twitter.com/line_dev/status/789333727860056064)(注:
昔はServer IP
Whitelistという設定項目名だったようです)ので、もし何か設定されているのであれば一旦全削除して動作確認してみるのも手かと思います。


CC BY-SA 4.0
2019-12-05T06:43:57.897
61128
2019-12-05T06:43:57.897
2808
42496
answer