@@ -4,59 +4,49 @@ use dotenv::dotenv;
4
4
use std:: env;
5
5
6
6
use line:: bot:: LineBot ;
7
- use line:: events:: messages:: MessageType as EventMessageType ;
7
+ use line:: events:: messages:: MessageType ;
8
8
use line:: events:: { EventType , Events } ;
9
9
use line:: messages:: { SendMessageType , TextMessage } ;
10
+ use line:: support:: actix_support:: Signature ;
11
+ use line:: webhook:: validate_signature;
10
12
11
- use actix_web:: web:: Bytes ;
12
- use actix_web:: { post, App , HttpRequest , HttpResponse , HttpServer , Responder } ;
13
+ use actix_web:: { post, web, App , HttpServer , Responder } ;
13
14
14
15
#[ post( "/callback" ) ]
15
- async fn callback ( req : HttpRequest , bytes : Bytes ) -> impl Responder {
16
- let body: & str = & String :: from_utf8 ( bytes. to_vec ( ) ) . unwrap ( ) ;
17
- let signature: & str = req
18
- . headers ( )
19
- . get ( "x-line-signature" )
20
- . unwrap ( )
21
- . to_str ( )
22
- . unwrap ( ) ;
23
-
16
+ async fn callback (
17
+ signature : Signature ,
18
+ data : web:: Json < Events > ,
19
+ bytes : web:: Bytes ,
20
+ ) -> impl Responder {
24
21
// Get channel secret and access token by environment variable
25
22
let channel_secret: & str =
26
- & env:: var ( "LINE_CHANNEL_RECRET " ) . expect ( "Failed getting LINE_CHANNEL_RECRET " ) ;
23
+ & env:: var ( "LINE_CHANNEL_SECRET " ) . expect ( "Failed getting LINE_CHANNEL_SECRET " ) ;
27
24
let access_token: & str =
28
25
& env:: var ( "LINE_CHANNEL_ACCESS_TOKEN" ) . expect ( "Failed getting LINE_CHANNEL_ACCESS_TOKEN" ) ;
29
26
30
27
// LineBot
31
28
let bot = LineBot :: new ( channel_secret, access_token) ;
32
29
33
- // Request body parse
34
- let result: Result < Events , & ' static str > = bot. parse_event_request ( signature, body) ;
35
-
36
- // Success parsing
37
- if let Ok ( res) = result {
38
- for event in res. events {
39
- // MessageEvent only
40
- if let EventType :: MessageEvent ( message_event) = event. r#type {
41
- // TextMessageEvent only
42
- if let EventMessageType :: TextMessage ( text_message) = message_event. message . r#type {
43
- // Create TextMessage
44
- let message = SendMessageType :: TextMessage ( TextMessage {
45
- text : text_message. text ,
46
- emojis : None ,
47
- } ) ;
48
- // Reply message with reply_token
49
- let _res = bot. reply_message ( & message_event. reply_token , vec ! [ message] ) ;
50
- }
30
+ let body: & str = & String :: from_utf8 ( bytes. to_vec ( ) ) . unwrap ( ) ;
31
+ validate_signature ( & bot. channel_secret , & signature. key , & body) ;
32
+
33
+ for event in & data. events {
34
+ // MessageEvent only
35
+ if let EventType :: MessageEvent ( message_event) = & event. r#type {
36
+ // TextMessageEvent only
37
+ if let MessageType :: TextMessage ( text_message) = & message_event. message . r#type {
38
+ // Create TextMessage
39
+ let message = SendMessageType :: TextMessage ( TextMessage {
40
+ text : text_message. text . to_string ( ) ,
41
+ emojis : None ,
42
+ } ) ;
43
+ // Reply message with reply_token
44
+ let _res = bot. reply_message ( & message_event. reply_token , vec ! [ message] ) ;
51
45
}
52
46
}
53
- return HttpResponse :: Ok ( ) . body ( "OK" ) ;
54
- }
55
- // Failed parsing
56
- else if let Err ( msg) = result {
57
- return HttpResponse :: BadRequest ( ) . body ( msg) ;
58
47
}
59
- HttpResponse :: BadRequest ( ) . body ( "Internal Server Error" )
48
+
49
+ "OK"
60
50
}
61
51
62
52
#[ actix_rt:: main]
0 commit comments