質問編集履歴

1

コードを追加しました。

2021/09/05 21:42

投稿

nachu_
nachu_

スコア3

test CHANGED
@@ -1 +1 @@
1
- Javaでスケジュール管理をするLINE BOTを作りたい
1
+ Javaでスケジュール管理をするLINE BOTを作りたいが、うまくいかない
test CHANGED
@@ -1,10 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
-
4
-
5
- プログラミング学習の一環で、javaでスケジュール管理を行えるLINE BOTを作りたいと考えています。
3
+ javaでスケジュール管理を行えるLINE BOTを作りたいと考えています。
6
-
7
-
8
4
 
9
5
  リッチメニューの『予定追加』からスケジュールの追加(日付入力の後に予定の内容を送信する)、
10
6
 
@@ -16,17 +12,13 @@
16
12
 
17
13
  などというように返信し、普通に文章を送信するとオウム返しをするようなものを完成形として想定しています。
18
14
 
19
-
20
-
21
15
  しかし、予定を登録して表示させようと思っても何も反応が返ってきませんでした。(オウム返しの方だけはちゃんと返信が返ってきました)
22
16
 
23
- 調べて出てきたものを少しずつ改変したり応用したりするような形でコード作成をしているのですが、なにがよくないのかわかりません。どうすればうまくいくでしょう
17
+ 調べて出てきたものを少しずつ改変したり応用したりするような形でコード作成をしているのですが、どうすればうまくいくかわかりません。
24
-
25
-
26
-
18
+
19
+
20
+
27
- ### 該当のソースコード
21
+ ### ソースコード
28
-
29
-
30
22
 
31
23
  ```java
32
24
 
@@ -48,570 +40,536 @@
48
40
 
49
41
  public class DialogAnswer implements Replier {
50
42
 
51
-
52
-
53
43
  private PostbackEvent event;
54
44
 
55
-
56
-
57
45
  public DialogAnswer(PostbackEvent event) {
58
46
 
59
47
  this.event = event;
60
48
 
61
49
  }
62
50
 
63
-
64
-
65
51
  private MessageEvent<TextMessageContent> event1;
66
52
 
67
-
68
-
69
53
  public DialogAnswer(MessageEvent<TextMessageContent> event1) {
70
54
 
71
55
  this.event1 = event1;
72
56
 
73
57
  }
74
58
 
59
+ @Override
60
+
61
+ public Message reply() {
62
+
63
+ String actionLabel = this.event.getPostbackContent().getData();
64
+
65
+ switch (actionLabel) {
66
+
67
+ case "DT":
68
+
69
+ List list = new List(this.event.getPostbackContent().getParams().toString());
70
+
71
+ TextMessageContent tmc = this.event1.getMessage();
72
+
73
+ list.add(tmc);
74
+
75
+ return new TextMessage("予定を追加しました");
76
+
77
+ }
78
+
79
+ return new TextMessage("?");
80
+
81
+ }
82
+
83
+ }
84
+
85
+ ```
86
+
87
+ ```java
88
+
89
+ package com.example.linebot.replier;
90
+
91
+
92
+
93
+ import com.linecorp.bot.model.event.message.TextMessageContent;
94
+
95
+ import java.util.ArrayList;
96
+
97
+
98
+
99
+ // 予定追加
100
+
101
+ public class List {
102
+
103
+ private String date;
104
+
105
+ private ArrayList<String> list = new ArrayList<>();
106
+
107
+ private String scheduleList;
108
+
109
+ public List(String date){
110
+
111
+ this.date = date;
112
+
113
+ this.scheduleList = "";
114
+
115
+ }
116
+
117
+ public List(){
118
+
119
+ }
120
+
121
+ public void add(TextMessageContent schedule){
122
+
123
+ String text = String.format(date + " " + schedule + "\n");
124
+
125
+ list.add(text);
126
+
127
+ for (String list1 : list){
128
+
129
+ scheduleList = String.format(scheduleList + list1);
130
+
131
+ }
132
+
133
+ }
134
+
135
+ public String getScheduleList(){
136
+
137
+ return scheduleList;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ ```
144
+
145
+ ```java
146
+
147
+ package com.example.linebot.replier;
148
+
149
+
150
+
151
+ import com.linecorp.bot.model.message.Message;
152
+
153
+ import com.linecorp.bot.model.message.TextMessage;
154
+
155
+
156
+
157
+ // 予定確認
158
+
159
+ public class Verification implements Replier {
160
+
161
+ @Override
162
+
163
+ public Message reply() {
164
+
165
+ List scheduleList = new List();
166
+
167
+ return new TextMessage(scheduleList.getScheduleList());
168
+
169
+ }
170
+
171
+ }
172
+
173
+ ```
174
+
175
+ ```jaca
176
+
177
+ package com.example.linebot;
178
+
179
+
180
+
181
+ import com.example.linebot.replier.*;
182
+
183
+ import com.linecorp.bot.model.event.FollowEvent;
184
+
185
+ import com.linecorp.bot.model.message.Message;
186
+
187
+ import com.linecorp.bot.spring.boot.annotation.EventMapping;
188
+
189
+ import com.linecorp.bot.spring.boot.annotation.LineMessageHandler;
190
+
191
+ import org.slf4j.Logger;
192
+
193
+ import org.slf4j.LoggerFactory;
194
+
195
+ import com.linecorp.bot.model.event.message.TextMessageContent;
196
+
197
+ import com.linecorp.bot.model.event.MessageEvent;
198
+
199
+ import com.linecorp.bot.model.event.PostbackEvent;
200
+
201
+
202
+
203
+ @LineMessageHandler
204
+
205
+ public class Callback {
206
+
207
+ private static final Logger log = LoggerFactory.getLogger(Callback.class);
208
+
209
+
210
+
211
+ @EventMapping
212
+
213
+ public Message handleFollow(FollowEvent event) {
214
+
215
+ Follow follow = new Follow(event);
216
+
217
+ return follow.reply();
218
+
219
+ }
220
+
221
+
222
+
223
+ @EventMapping
224
+
225
+ public Message handleMessage(MessageEvent<TextMessageContent> event) {
226
+
227
+ TextMessageContent tmc = event.getMessage();
228
+
229
+ String text = tmc.getText();
230
+
231
+ switch (text) {
232
+
233
+ case "予定確認":
234
+
235
+ // リッチメニューから送信
236
+
237
+ Verification verification = new Verification();
238
+
239
+ return verification.reply();
240
+
241
+ default:
242
+
243
+ //オウム返し
244
+
245
+ Parrot parrot = new Parrot(event);
246
+
247
+ return parrot.reply();
248
+
249
+ }
250
+
251
+ }
252
+
75
253
 
76
254
 
77
255
  // PostBackEventに対応する
78
256
 
257
+ @EventMapping
258
+
259
+ public Message handlePostBack(PostbackEvent event) {
260
+
261
+ DialogAnswer dialogAnswer = new DialogAnswer(event);
262
+
263
+ return dialogAnswer.reply();
264
+
265
+ }
266
+
267
+
268
+
269
+ }
270
+
271
+ ```
272
+
273
+ ```java
274
+
275
+ package com.example.linebot;
276
+
277
+
278
+
279
+ import com.linecorp.bot.client.LineBlobClient;
280
+
281
+ import com.linecorp.bot.client.LineMessagingClient;
282
+
283
+ import com.linecorp.bot.model.action.DatetimePickerAction;
284
+
285
+ import com.linecorp.bot.model.action.MessageAction;
286
+
287
+ import com.linecorp.bot.model.response.BotApiResponse;
288
+
289
+ import com.linecorp.bot.model.richmenu.*;
290
+
291
+ import org.slf4j.Logger;
292
+
293
+ import org.slf4j.LoggerFactory;
294
+
295
+ import org.springframework.beans.factory.annotation.Autowired;
296
+
297
+ import org.springframework.core.io.ClassPathResource;
298
+
299
+ import org.springframework.web.bind.annotation.GetMapping;
300
+
301
+ import org.springframework.web.bind.annotation.RestController;
302
+
303
+ import java.io.IOException;
304
+
305
+ import java.nio.file.Files;
306
+
307
+ import java.time.LocalDateTime;
308
+
309
+ import java.util.ArrayList;
310
+
311
+ import java.util.List;
312
+
313
+ import java.util.concurrent.ExecutionException;
314
+
315
+
316
+
317
+ @RestController
318
+
319
+ public class RichMenuController {
320
+
321
+ private static final Logger log = LoggerFactory.getLogger(Push.class);
322
+
323
+
324
+
325
+ // push先のユーザID(本来は、友達登録をした瞬間にDBなどに格納しておく)
326
+
327
+ private String userId = "xxxxx";
328
+
329
+   // 伏せてありますが、ここにはMessaging APIのチャネル基本設定にある「あなたのユーザーID」を入れています
330
+
331
+
332
+
333
+ private final LineMessagingClient messagingClient;
334
+
335
+ private final LineBlobClient blobClient;
336
+
337
+ @Autowired
338
+
339
+ public RichMenuController(LineMessagingClient lineMessagingClient, LineBlobClient blobClient) {
340
+
341
+ this.messagingClient = lineMessagingClient;
342
+
343
+ this.blobClient = blobClient;
344
+
345
+ }
346
+
347
+ @GetMapping("addRich")
348
+
349
+ public String addRichMenu() {
350
+
351
+ String text = "リッチメニューを作成し、ユーザーに紐付けます";
352
+
353
+ RichMenu richMenu = RichMenu.builder()
354
+
355
+ .name("リッチメニュー1")
356
+
357
+ .chatBarText("コントローラー")
358
+
359
+ .areas(makeRichMenuAreas())
360
+
361
+ .selected(true)
362
+
363
+ .size(RichMenuSize.FULL)
364
+
365
+ .build();
366
+
367
+ try {
368
+
369
+ RichMenuIdResponse resp1 = messagingClient.createRichMenu(richMenu).get();
370
+
371
+ log.info("create richmenu:{}", resp1);
372
+
373
+
374
+
375
+ ClassPathResource cpr = new ClassPathResource("/img/RichMenu.png");
376
+
377
+ byte[] fileContent = Files.readAllBytes(cpr.getFile().toPath());
378
+
379
+ BotApiResponse resp2 = blobClient.setRichMenuImage(resp1.getRichMenuId(), "image/jpeg", fileContent).get();
380
+
381
+ log.info("set richmenu image:{}", resp2);
382
+
383
+
384
+
385
+ BotApiResponse resp3 = messagingClient.linkRichMenuIdToUser(userId, resp1.getRichMenuId()).get();
386
+
387
+ log.info("link richmenu:{}", resp3);
388
+
389
+
390
+
391
+ } catch (InterruptedException | ExecutionException | IOException e) {
392
+
393
+ throw new RuntimeException(e);
394
+
395
+ }
396
+
397
+ return text;
398
+
399
+ }
400
+
401
+ @GetMapping("delRich")
402
+
403
+ public String delRichMenu() {
404
+
405
+ String text = "リッチメニューをすべて削除します";
406
+
407
+ try {
408
+
409
+ messagingClient.unlinkRichMenuIdFromUser(userId);
410
+
411
+
412
+
413
+ RichMenuListResponse resp4 = messagingClient.getRichMenuList().get();
414
+
415
+ log.info("get richmenus:{}", resp4);
416
+
417
+
418
+
419
+ resp4.getRichMenus().stream()
420
+
421
+ .forEach(r -> messagingClient.deleteRichMenu(r.getRichMenuId()));
422
+
423
+
424
+
425
+ } catch (InterruptedException | ExecutionException e) {
426
+
427
+ throw new RuntimeException(e);
428
+
429
+ }
430
+
431
+ return text;
432
+
433
+ }
434
+
435
+ private List<RichMenuArea> makeRichMenuAreas() {
436
+
437
+ final ArrayList<RichMenuArea> richMenuAreas = new ArrayList<>();
438
+
439
+ richMenuAreas.add(makeDateTimeAction(0, 0, 1250, 1686, "予定追加"));
440
+
441
+ richMenuAreas.add(makeMessageAction(1250, 0, 1250, 1686, "予定確認"));
442
+
443
+ return richMenuAreas;
444
+
445
+ }
446
+
447
+ private RichMenuArea makeMessageAction(int x, int y, int w, int h, String label) {
448
+
449
+ return new RichMenuArea(new RichMenuBounds(x, y, w, h),
450
+
451
+ new MessageAction(label, label));
452
+
453
+ }
454
+
455
+ private RichMenuArea makeDateTimeAction(int x, int y, int w, int h, String label) {
456
+
457
+ return new RichMenuArea(new RichMenuBounds(x, y, w, h),
458
+
459
+ DatetimePickerAction.OfLocalDatetime.builder()
460
+
461
+ .label(label)
462
+
463
+ .data("DT")
464
+
465
+ .initial(LocalDateTime.now())
466
+
467
+ .min(LocalDateTime.now().minusYears(10l))
468
+
469
+ .max(LocalDateTime.now().plusYears(10l))
470
+
471
+ .build());
472
+
473
+ }
474
+
475
+ }
476
+
477
+ ```
478
+
479
+ ```java
480
+
481
+ package com.example.linebot.replier;
482
+
483
+ import com.linecorp.bot.model.event.FollowEvent;
484
+
485
+ import com.linecorp.bot.model.message.Message;
486
+
487
+ import com.linecorp.bot.model.message.TextMessage;
488
+
489
+ import java.util.ArrayList;
490
+
491
+
492
+
493
+ // フォローされた時用の返信クラス
494
+
495
+ public class Follow implements Replier {
496
+
497
+ private FollowEvent event;
498
+
499
+ public Follow(FollowEvent event) {
500
+
501
+ this.event = event;
502
+
503
+ }
504
+
79
505
  @Override
80
506
 
81
507
  public Message reply() {
82
508
 
83
- String actionLabel = this.event.getPostbackContent().getData();
509
+ String userId = this.event.getSource().getUserId();
510
+
84
-
511
+ //ユーザーID記録
512
+
513
+ ArrayList<String> userid = new ArrayList<>();
514
+
515
+ userid.add(userId);
516
+
85
- switch (actionLabel) {
517
+ String text = String.format(
518
+
86
-
519
+ "こんにちは!\n" +
520
+
87
-
521
+ "スケジュール管理をするBotです。\n" +
88
-
522
+
89
- case "DT":
523
+ "\n" +
90
-
524
+
91
- List list = new List(this.event.getPostbackContent().getParams().toString());
525
+ "「予定登録」で予定を登録します。\n" +
92
-
526
+
93
- TextMessageContent tmc = this.event1.getMessage();
527
+ "「予定確認」で登録されたスケジュールを確認できます。");
94
-
95
- list.add(tmc);
528
+
96
-
97
- return new TextMessage("予定を追加しました");
529
+ return new TextMessage(text);
98
-
530
+
99
- }
531
+ }
100
-
101
- return new TextMessage("?");
532
+
102
-
103
- }
533
+ }
104
-
105
- }
534
+
106
-
107
- ```
535
+ ```
108
-
109
-
110
536
 
111
537
  ```java
112
538
 
113
539
  package com.example.linebot.replier;
114
540
 
115
-
116
-
117
- import com.linecorp.bot.model.event.message.TextMessageContent;
118
-
119
-
120
-
121
- import java.util.ArrayList;
122
-
123
-
124
-
125
- // 予定を追加(記録)
126
-
127
- public class List {
128
-
129
- private String date;
130
-
131
- private ArrayList<String> list = new ArrayList<>();
132
-
133
- private String scheduleList;
134
-
135
-
136
-
137
- public List(String date){
138
-
139
- this.date = date;
140
-
141
- this.scheduleList = "";
142
-
143
- }
144
-
145
- public List(){
146
-
147
- }
148
-
149
-
150
-
151
- public void add(TextMessageContent schedule){
152
-
153
- String text = String.format(date + " " + schedule + "\n");
154
-
155
- list.add(text);
156
-
157
- for (String list1 : list){
158
-
159
- scheduleList = String.format(scheduleList + list1);
160
-
161
- }
162
-
163
- }
164
-
165
-
166
-
167
- public String getScheduleList(){
168
-
169
- return scheduleList;
170
-
171
- }
172
-
173
-
174
-
175
- }
176
-
177
- ```
178
-
179
-
180
-
181
- ```java
182
-
183
- package com.example.linebot.replier;
184
-
185
-
186
-
187
-
188
-
189
541
  import com.linecorp.bot.model.message.Message;
190
542
 
191
- import com.linecorp.bot.model.message.TextMessage;
192
-
193
-
194
-
195
-
196
-
197
- // 予定確認
198
-
199
- public class Verification implements Replier {
200
-
201
-
202
-
203
- @Override
204
-
205
- public Message reply() {
543
+ public interface Replier {
206
-
544
+
207
- List scheduleList = new List();
545
+ Message reply();
208
-
209
- return new TextMessage(scheduleList.getScheduleList());
546
+
210
-
211
- }
547
+ }
212
-
213
-
214
-
215
- }
548
+
216
-
217
-
218
-
219
- ```
549
+ ```
220
-
221
-
222
-
550
+
223
- ```jaca
551
+ ```java
224
552
 
225
553
  package com.example.linebot;
226
554
 
227
-
228
-
229
- import com.example.linebot.replier.*;
230
-
231
- import com.linecorp.bot.model.event.FollowEvent;
232
-
233
- import com.linecorp.bot.model.message.Message;
234
-
235
- import com.linecorp.bot.spring.boot.annotation.EventMapping;
236
-
237
- import com.linecorp.bot.spring.boot.annotation.LineMessageHandler;
238
-
239
- import org.slf4j.Logger;
240
-
241
- import org.slf4j.LoggerFactory;
242
-
243
-
244
-
245
- //オウム返し
246
-
247
- import com.linecorp.bot.model.event.message.TextMessageContent;
248
-
249
- import com.linecorp.bot.model.event.MessageEvent;
250
-
251
-
252
-
253
- //ユーザーの回答に反応
254
-
255
- import com.linecorp.bot.model.event.PostbackEvent;
256
-
257
-
258
-
259
- @LineMessageHandler //LineBotのコントローラー部
260
-
261
- public class Callback {
262
-
263
-
264
-
265
- private static final Logger log = LoggerFactory.getLogger(Callback.class);
266
-
267
-
268
-
269
- // フォローイベントに対応する
270
-
271
- @EventMapping
272
-
273
- public Message handleFollow(FollowEvent event) {
274
-
275
- // 実際はこのタイミングでフォロワーのユーザIDをデータベースにに格納しておくなど
276
-
277
- Follow follow = new Follow(event);
278
-
279
- return follow.reply();
280
-
281
- }
282
-
283
-
284
-
285
- // 文章で話しかけられたとき(テキストメッセージのイベント)に対応する
286
-
287
- @EventMapping
288
-
289
- // MessageEvent<TextMessageContent> は、LineBotに送られたテキスト文章を表すクラス
290
-
291
- public Message handleMessage(MessageEvent<TextMessageContent> event) {
292
-
293
- TextMessageContent tmc = event.getMessage();
294
-
295
- String text = tmc.getText();
296
-
297
- switch (text) {
298
-
299
- case "やあ":
300
-
301
- //時間帯に合わせて返信
302
-
303
- Greet greet = new Greet();
304
-
305
- return greet.reply();
306
-
307
- case "予定確認":
308
-
309
- // リッチメニューから送信
310
-
311
- Verification verification = new Verification();
312
-
313
- return verification.reply();
314
-
315
- default:
316
-
317
- //オウム返し
318
-
319
- Parrot parrot = new Parrot(event);
320
-
321
- return parrot.reply();
322
-
323
- }
324
-
325
- }
326
-
327
-
328
-
329
- // PostBackEventに対応する(ユーザーの回答に反応)
330
-
331
- @EventMapping
332
-
333
- public Message handlePostBack(PostbackEvent event) {
334
-
335
- DialogAnswer dialogAnswer = new DialogAnswer(event);
336
-
337
- return dialogAnswer.reply();
338
-
339
- }
340
-
341
-
342
-
343
- }
344
-
345
- ```
346
-
347
-
348
-
349
- ```java
350
-
351
- package com.example.linebot;
352
-
353
-
354
-
355
- import com.linecorp.bot.client.LineBlobClient;
356
-
357
- import com.linecorp.bot.client.LineMessagingClient;
358
-
359
- import com.linecorp.bot.model.action.DatetimePickerAction;
360
-
361
- import com.linecorp.bot.model.action.MessageAction;
362
-
363
- import com.linecorp.bot.model.response.BotApiResponse;
364
-
365
- import com.linecorp.bot.model.richmenu.*;
366
-
367
- import org.slf4j.Logger;
368
-
369
- import org.slf4j.LoggerFactory;
370
-
371
- import org.springframework.beans.factory.annotation.Autowired;
372
-
373
- import org.springframework.core.io.ClassPathResource;
374
-
375
- import org.springframework.web.bind.annotation.GetMapping;
376
-
377
- import org.springframework.web.bind.annotation.RestController;
378
-
379
-
380
-
381
- import java.io.IOException;
382
-
383
- import java.nio.file.Files;
384
-
385
- import java.time.LocalDateTime;
386
-
387
- import java.util.ArrayList;
388
-
389
- import java.util.List;
390
-
391
- import java.util.concurrent.ExecutionException;
392
-
393
-
394
-
395
- @RestController
396
-
397
- public class RichMenuController {
398
-
399
-
400
-
401
- private static final Logger log = LoggerFactory.getLogger(Push.class);
402
-
403
-
404
-
405
- // push先のユーザID(本来は、友達登録をした瞬間にDBなどに格納しておく)
406
-
407
- private String userId = "xxxxx";
408
-
409
-   // 伏せてありますが、ここにはMessaging APIのチャネル基本設定にある「あなたのユーザーID」を入れています
410
-
411
-
412
-
413
- private final LineMessagingClient messagingClient;
414
-
415
-
416
-
417
- private final LineBlobClient blobClient;
418
-
419
-
420
-
421
- @Autowired
422
-
423
- public RichMenuController(LineMessagingClient lineMessagingClient, LineBlobClient blobClient) {
424
-
425
- this.messagingClient = lineMessagingClient;
426
-
427
- this.blobClient = blobClient;
428
-
429
- }
430
-
431
-
432
-
433
- // リッチーメニューを作成する
434
-
435
- @GetMapping("addRich")
436
-
437
- public String addRichMenu() {
438
-
439
- String text = "リッチメニューを作成し、ユーザーに紐付けます";
440
-
441
-
442
-
443
- // ①リッチメニューを作成
444
-
445
- // それぞれの意味は https://developers.line.me/ja/reference/messaging-api/#rich-menu-object を参照
446
-
447
- RichMenu richMenu = RichMenu.builder()
448
-
449
- .name("リッチメニュー1")
450
-
451
- .chatBarText("コントローラー")
452
-
453
- .areas(makeRichMenuAreas())
454
-
455
- .selected(true)
456
-
457
- .size(RichMenuSize.FULL)
458
-
459
- .build();
460
-
461
-
462
-
463
- try {
464
-
465
-
466
-
467
- // ②作成したリッチメニューの登録( resp1 は作成結果で、リッチメニューIDが入っている)
468
-
469
- RichMenuIdResponse resp1 = messagingClient.createRichMenu(richMenu).get();
470
-
471
- log.info("create richmenu:{}", resp1);
472
-
473
- // ③リッチメニューの背景画像の設定( resp2 は、画像の登録結果)
474
-
475
- // ここでは、src/resource/img/RichMenuSample.jpg(ビルド後は classpath:/img/RichMenuSample.jpg)を指定
476
-
477
- // 画像の仕様は公式ドキュメントを参照されたい
478
-
479
- ClassPathResource cpr = new ClassPathResource("/img/RichMenu.png");
480
-
481
- byte[] fileContent = Files.readAllBytes(cpr.getFile().toPath());
482
-
483
- BotApiResponse resp2 = blobClient.setRichMenuImage(resp1.getRichMenuId(), "image/jpeg", fileContent).get();
484
-
485
- log.info("set richmenu image:{}", resp2);
486
-
487
-
488
-
489
- // ④リッチメニューIdをユーザIdとリンクする( resp3 は、紐付け結果)
490
-
491
- // リンクすることで作成したリッチメニューを使えるようになる
492
-
493
- BotApiResponse resp3 = messagingClient.linkRichMenuIdToUser(userId, resp1.getRichMenuId()).get();
494
-
495
- log.info("link richmenu:{}", resp3);
496
-
497
-
498
-
499
- } catch (InterruptedException | ExecutionException | IOException e) {
500
-
501
- throw new RuntimeException(e);
502
-
503
- }
504
-
505
- return text;
506
-
507
- }
508
-
509
-
510
-
511
- @GetMapping("delRich")
512
-
513
- public String delRichMenu() {
514
-
515
- String text = "リッチメニューをすべて削除します";
516
-
517
- try {
518
-
519
-
520
-
521
- // ①ユーザからリッチメニューを解除する(※Messaging APIで作成したものだけ)
522
-
523
- messagingClient.unlinkRichMenuIdFromUser(userId);
524
-
525
-
526
-
527
- // ②作成されているリッチメニューの取得( resp4 は、リッチメニューの一覧情報)
528
-
529
- RichMenuListResponse resp4 = messagingClient.getRichMenuList().get();
530
-
531
- log.info("get richmenus:{}", resp4);
532
-
533
-
534
-
535
- // ③リッチメニューIdを指定して削除する
536
-
537
- // ここでは resp4 のものをすべて削除しているが、本来はリッチメニューIdと
538
-
539
- // ユーザIDの対応をDBなどに保存しておいて、不要なものだけを削除する
540
-
541
- resp4.getRichMenus().stream()
542
-
543
- .forEach(r -> messagingClient.deleteRichMenu(r.getRichMenuId()));
544
-
545
-
546
-
547
- } catch (InterruptedException | ExecutionException e) {
548
-
549
- throw new RuntimeException(e);
550
-
551
- }
552
-
553
- return text;
554
-
555
- }
556
-
557
-
558
-
559
- // 画像のどの部分(ピクセル)に、どんな動作をするリッチメニューを割り当てるか設定します
560
-
561
- private List<RichMenuArea> makeRichMenuAreas() {
562
-
563
- final ArrayList<RichMenuArea> richMenuAreas = new ArrayList<>();
564
-
565
- // 予定追加
566
-
567
- richMenuAreas.add(makeDateTimeAction(0, 0, 1250, 1686, "予定追加"));
568
-
569
- // 予定確認
570
-
571
- richMenuAreas.add(makeMessageAction(1250, 0, 1250, 1686, "予定確認"));
572
-
573
- return richMenuAreas;
574
-
575
- }
576
-
577
-
578
-
579
- // Botにメッセージを送信する動作をリッチメニューとして割り当てます
580
-
581
- private RichMenuArea makeMessageAction(int x, int y, int w, int h, String label) {
582
-
583
- return new RichMenuArea(new RichMenuBounds(x, y, w, h),
584
-
585
- // 「予定確認」と送信
586
-
587
- new MessageAction(label, label));
588
-
589
- }
590
-
591
-
592
-
593
- // Botに日時イベントを送信する動作をリッチメニューとして割り当てます
594
-
595
- private RichMenuArea makeDateTimeAction(int x, int y, int w, int h, String label) {
596
-
597
- return new RichMenuArea(new RichMenuBounds(x, y, w, h),
598
-
599
- DatetimePickerAction.OfLocalDatetime.builder()
600
-
601
- .label(label)
602
-
603
- .data("DT")
604
-
605
- .initial(LocalDateTime.now())
606
-
607
- .min(LocalDateTime.now().minusYears(10l))
608
-
609
- .max(LocalDateTime.now().plusYears(10l))
610
-
611
- .build());
612
-
613
- }
614
-
615
- }
616
-
617
- ```
555
+ import org.springframework.boot.SpringApplication;
556
+
557
+ import org.springframework.boot.autoconfigure.SpringBootApplication;
558
+
559
+ import org.springframework.scheduling.annotation.EnableScheduling;
560
+
561
+ @SpringBootApplication
562
+
563
+ @EnableScheduling
564
+
565
+ public class LinebotApplication {
566
+
567
+ public static void main(String[] args) {
568
+
569
+ SpringApplication.run(LinebotApplication.class, args);
570
+
571
+ }
572
+
573
+ }
574
+
575
+ ```