回答編集履歴

1

実際に試してみた手順

2017/12/24 12:33

投稿

Tomak
Tomak

スコア1652

test CHANGED
@@ -1,16 +1,152 @@
1
+ 実際に試してみましたので、その時の手順を載せておきます。
2
+
3
+
4
+
5
+
6
+
7
+ #### LINEプロバイダ作成
8
+
9
+
10
+
11
+ [https://developers.line.me/console/register/messaging-api/provider/](https://developers.line.me/console/register/messaging-api/provider/)
12
+
13
+ ※メールアドレスでアカウントの認証が必要です。
14
+
15
+
16
+
17
+ 1. 下記から**LINE Developer**アカウントを作成します。
18
+
19
+ 1. プロバイダ作成します。
20
+
21
+ 1. アプリ作成します。
22
+
23
+ 1. LINEで作成したチャンネル**QRコード**を読み取って友達になっておきます。
24
+
25
+
26
+
27
+
28
+
29
+ #### Herokuアカウント作成
30
+
31
+
32
+
33
+ [https://signup.heroku.com/login](https://signup.heroku.com/login)
34
+
35
+ ※メールアドレスでアカウントの認証が必要です。
36
+
37
+
38
+
39
+ 1. Herokuアカウント作成します。
40
+
41
+ 1. New > アプリ作成します。
42
+
43
+ 1. PHPを選択します。
44
+
45
+
46
+
47
+
48
+
49
+ #### LINE Messaging API 設定
50
+
51
+
52
+
53
+ https://developers.line.me/console/channel/プロバイダID/basic/
54
+
55
+
56
+
57
+ 1. アクセストークン(ロングターム)を設定します。(適当に24時間で作成)
58
+
59
+ 1. **Webhook URL**にHerokuのApp URLを登録します。(https://Herokuのアプリ名.herokuapp.com/)
60
+
61
+ URLは`https://dashboard.heroku.com/apps/アプリ名/settings`の`Domain`にあります
62
+
63
+
64
+
65
+
66
+
67
+ #### Heroku設定にトークン設定
68
+
69
+
70
+
71
+ https://dashboard.heroku.com/apps/アプリ名/settings
72
+
73
+
74
+
75
+ **Herokuアプリ画面>Settigs**から`Reveal Config Vars`ボタンクリックして、LINEのアクセストークン、チャンネル鍵を登録します。
76
+
77
+
78
+
79
+ - `CHANNEL_ACCESS_TOKEN`:LINE Developer プロバイダで設定した`アクセストークン(ロングターム)`のトークン文字列をコピペ
80
+
81
+ - `CHANNEL_SECRET`:LINE Developer プロバイダの`Channel Secret`の文字列をコピペ
82
+
83
+
84
+
85
+
86
+
87
+ #### Herokuコマンドインストール(Windows)
88
+
89
+
90
+
91
+ 下記から**heroku**アプリをダウンロード、インストールします。
92
+
93
+ [https://devcenter.heroku.com/articles/getting-started-with-php#set-up](https://devcenter.heroku.com/articles/getting-started-with-php#set-up)
94
+
95
+
96
+
97
+
98
+
99
+ #### Herokuコマンドインストール(Linux)
100
+
101
+
102
+
103
+ ```bash
104
+
105
+ cd /tmp
106
+
107
+ curl -LO https://cli-assets.heroku.com/heroku-cli/channels/stable/heroku-cli-linux-x64.tar.gz
108
+
109
+ tar zxf heroku-cli-linux-x64.tar.gz
110
+
111
+
112
+
113
+ #解説に書いてある通りです。
114
+
115
+ sudo mkdir -p /usr/local/lib /usr/local/bin
116
+
117
+ sudo mv ./heroku-cli-v6.14.43-なんかのID-linux-x64 /usr/local/lib/
118
+
1
- > PHP Fatal error: Uncaught Error: Class 'Class LINE\LINEBot\HTTPClient\CurlHTTPClient' not found in /app/index.php:5
119
+ sudo ln -s /usr/local/lib/heroku-cli-v6.14.43-なんかのID-linux-x64/bin/heroku /usr/loca/bin/
120
+
2
-
121
+ rm -f heroku-cli-linux-x64.tar.gz
122
+
3
-
123
+ ```
124
+
125
+
126
+
127
+
128
+
4
-
129
+ #### Github, Dropbox
130
+
131
+
132
+
5
- `LINE\LINEBot\HTTPClient\CurlHTTPClient`が見つけられないというメッセジです。クラスの名前解決ができていないようです。
133
+ プロジェクトディレクトリ作成して、**composer**で**linecorp/line-bot-sdk**をインストルします。
134
+
135
+
136
+
6
-
137
+ ```bash
7
-
8
-
138
+
9
- ソースが質問文にないので、何とも言えませんが質問にある[リンク](https://codezine.jp/article/detail/9811)を見ると`index.php`は`vendor`と同じディレクトリに置いてあります。一方、質問のコードは、**app**ディレクトリにおいてあるようなので**require_once()**のパスは下記のようになるのではないでしょうか?
139
+ cd プロジェクトディレクトリ
10
-
11
-
12
-
140
+
13
- composerlinecorp/line-bot-sdkインストール後、venderディレクトリ内の**ファイル移動やディレクトリ移動は絶対に行ってはいけません**。クラスの名前解決ができなくなってしまいます。
141
+ composer require linecorp/line-bot-sdk
142
+
143
+ ```
144
+
145
+
146
+
147
+ 上記と同じプロジェクトディレクトリに`index.php`を下記のように新規作成します。
148
+
149
+ 文字コードは`UTF-8`、改行コードは`LF`で作成してください。(たぶん**Shift_JIS**、**CR+LF**だとうまく動きません)
14
150
 
15
151
 
16
152
 
@@ -18,9 +154,7 @@
18
154
 
19
155
  <?php
20
156
 
21
- // パスが正しいか確認してください。
22
-
23
- require_once __DIR__.'/../vendor/autoload.php';
157
+ require_once __DIR__.'/vendor/autoload.php';
24
158
 
25
159
 
26
160
 
@@ -28,30 +162,252 @@
28
162
 
29
163
  $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv('CHANNEL_SECRET')]);
30
164
 
165
+
166
+
167
+ $signature = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];
168
+
169
+
170
+
171
+ try {
172
+
173
+ $events = $bot->parseEventRequest(file_get_contents('php://input'), $signature);
174
+
175
+ }
176
+
177
+ catch(\LINE\LINEBot\Exception\InvalidSignatureException $e) {
178
+
179
+ error_log("parseEventRequest failed. InvalidSignatureException => ".var_export($e, true));
180
+
181
+ }
182
+
183
+ catch(\LINE\LINEBot\Exception\UnknownEventTypeException $e) {
184
+
185
+ error_log("parseEventRequest failed. UnknownEventTypeException => ".var_export($e, true));
186
+
187
+ }
188
+
189
+ catch(\LINE\LINEBot\Exception\UnknownMessageTypeException $e) {
190
+
191
+ error_log("parseEventRequest failed. UnknownMessageTypeException => ".var_export($e, true));
192
+
193
+ }
194
+
195
+ catch(\LINE\LINEBot\Exception\InvalidEventRequestException $e) {
196
+
197
+ error_log("parseEventRequest failed. InvalidEventRequestException => ".var_export($e, true));
198
+
199
+ }
200
+
201
+
202
+
203
+
204
+
205
+ foreach ($events as $event) {
206
+
207
+ if (!($event instanceof \LINE\LINEBot\Event\MessageEvent)) {
208
+
209
+ error_log('Non message event has come');
210
+
211
+ continue;
212
+
213
+ }
214
+
215
+
216
+
217
+ if (!($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage)) {
218
+
219
+ error_log('Non text message has come');
220
+
221
+ continue;
222
+
223
+ }
224
+
225
+
226
+
227
+ $bot->replyText($event->getReplyToken(), $event->getText());
228
+
229
+ }
230
+
231
+
232
+
233
+ ?>
234
+
31
- ```
235
+ ```
236
+
237
+
238
+
32
-
239
+ 同じくプロジェクトディレクトリに`Procfile`を下記のように新規作成します。
240
+
33
-
241
+ 文字コードは`UTF-8`、改行コードは`LF`で作成してください。(たぶん**Shift_JIS**、**CR+LF**だとうまく動きません)
242
+
243
+
244
+
34
-
245
+ ```
246
+
247
+ web: vendor/bin/heroku-php-nginx
248
+
249
+ ```
250
+
251
+
252
+
35
- また下記でcomposerでインストール済みパッケジ一覧表示することができますので、`linecorp/line-bot-sdk`がインストールに失敗していないかも確認したほうがよいしょう。
253
+ 1. Githubにレポジトリを作成してルのプッシュします。(Dropbox場合はDeploy設定をしてDeployするのみす)
254
+
255
+ 1. [https://dashboard.heroku.com/apps/](https://dashboard.heroku.com/apps/)の**Deploy**から、Githubの設定を行います。
256
+
257
+ 1. **Deploy Branch**ボタンクリックしてHerokuにGithubからデプロイします。
258
+
259
+
260
+
261
+ ※ ソースに問題がある場合はデプロイに失敗します。
262
+
263
+
264
+
265
+
266
+
267
+ #### Herokuコマンドでログ確認
268
+
269
+
270
+
271
+ **CMD**やターミナルなどを開いて、下記コマンドを入力する。メールアドレスとパスワードを確認されるので、それぞれ入力しておきます。
36
272
 
37
273
 
38
274
 
39
275
  ```bash
40
276
 
41
- cd プロジェクトディレクトリ
42
-
43
- composer show --installed
44
-
45
- #OR
46
-
47
- php composer.phar show --installed
277
+ heroku logs --app Herokuアプリ名 --tail -s app
48
-
278
+
49
- ```
279
+ ```
280
+
281
+
282
+
50
-
283
+ LINEで友達になったチャンネルに、メッセージを送信すると、下記のように画面にオウム返しにメッセージが表示されます。
284
+
285
+
286
+
51
-
287
+ ```
288
+
52
-
289
+ > テストです。
290
+
291
+ < テストです。
292
+
293
+ ```
294
+
295
+
296
+
297
+ LINEメッセージを友達になったチャンネルに送ると、同じメッセージが表示されます。その時のログです。
298
+
299
+ エラーがあると、デバッグメッセージが表示されます。
300
+
301
+
302
+
303
+ ```log
304
+
305
+ xxx app[api]: Build started by user メールアドレス
306
+
307
+ xxx app[api]: Build succeeded
308
+
309
+ xxx app[web.1]: Going down, terminating child processes...
310
+
311
+ xxx app[api]: Release v14 created by user メールアドレス
312
+
313
+ xxx app[web.1]: Optimizing defaults for 1X dyno...
314
+
315
+ xxx app[web.1]: 4 processes at 128MB memory limit.
316
+
317
+ xxx app[web.1]: Starting php-fpm...
318
+
319
+ xxx app[api]: Deploy デプロイID by user メールアドレス
320
+
321
+ xxx app[web.1]: Starting nginx...
322
+
53
- **LINE**ディレクトリは、**vendor**以下のディレクトリに置かれていて、`vendor/autoload.php`が自動的に名前解決を行ってくれます。composerのパッケージは皆同じ手法です。
323
+ xxx app[web.1]: [xxx] "POST / HTTP/1.1" 200 5 "-" "LineBotWebhook/1.0
324
+
54
-
325
+ xxx app[web.1]: [xxx] "POST / HTTP/1.1" 200 5 "-" "LineBotWebhook/1.0
326
+
55
-
327
+ ```
328
+
329
+
330
+
56
-
331
+ ブラウザでアクセスしたりすると、下記のようなエラーメッセージが表示されます。
332
+
333
+
334
+
335
+ ```log
336
+
57
- 実際のクラスパスは`vender/composer/`以下の`autoload_classmap.php`のファイルにクラスマップが自動生成されています。他にもネームスペースや、自動ロードファイルなどの設定も自動生成されています。LINEクラスパスが実際に存在するか検索してみるとわかりやすいです。
337
+ xxx app[web.1]: [xxx] parseEventRequest failed. InvalidSignatureException => , LINE\LINEBot\Exception\InvalidSignatureException::__set_state(array(
338
+
339
+ xxx app[web.1]: 'message' => 'Request does not contain signature',
340
+
341
+ xxx app[web.1]: 'code' => 0,
342
+
343
+ xxx app[web.1]: 'string' => '',
344
+
345
+ xxx app[web.1]: 'file' => '/app/vendor/linecorp/line-bot-sdk/src/LINEBot/Event/Parser/EventRequestParser.php',
346
+
347
+ xxx app[web.1]: 'line' => 61,
348
+
349
+ xxx app[web.1]: 'trace' =>
350
+
351
+ xxx app[web.1]: array (
352
+
353
+ xxx app[web.1]: 0 =>
354
+
355
+ xxx app[web.1]: array (
356
+
357
+ xxx app[web.1]: 'file' => '/app/vendor/linecorp/line-bot-sdk/src/LINEBot.php',
358
+
359
+ xxx app[web.1]: 'function' => 'parseEventRequest',
360
+
361
+ xxx app[web.1]: 'line' => 193,
362
+
363
+ xxx app[web.1]: 'class' => 'LINE\LINEBot\Event\Parser\EventRequestParser',
364
+
365
+ xxx app[web.1]: 'type' => '::',
366
+
367
+ xxx app[web.1]: 'args' =>
368
+
369
+ xxx app[web.1]: array (
370
+
371
+ xxx app[web.1]: 0 => '',
372
+
373
+ xxx app[web.1]: 1 => 'チャンネル鍵',
374
+
375
+ xxx app[web.1]: 2 => NULL,
376
+
377
+ xxx app[web.1]: ),
378
+
379
+ xxx app[web.1]: ),
380
+
381
+ xxx app[web.1]: 1 =>
382
+
383
+ xxx app[web.1]: array (
384
+
385
+ xxx app[web.1]: 'file' => '/app/index.php',
386
+
387
+ xxx app[web.1]: 'line' => 12,
388
+
389
+ xxx app[web.1]: 'function' => 'parseEventRequest',
390
+
391
+ xxx app[web.1]: 'type' => '->',
392
+
393
+ xxx app[web.1]: 'class' => 'LINE\LINEBot',
394
+
395
+ xxx app[web.1]: 'args' =>
396
+
397
+ xxx app[web.1]: array (
398
+
399
+ xxx app[web.1]: 0 => '',
400
+
401
+ xxx app[web.1]: 1 => NULL,
402
+
403
+ xxx app[web.1]: ),
404
+
405
+ xxx app[web.1]: ),
406
+
407
+ xxx app[web.1]: ),
408
+
409
+ xxx app[web.1]: 'previous' => NULL,
410
+
411
+ xxx app[web.1]: ))
412
+
413
+ ```