@@ -4,59 +4,49 @@ use dotenv::dotenv;
44use std:: env;
55
66use line:: bot:: LineBot ;
7- use line:: events:: messages:: MessageType as EventMessageType ;
7+ use line:: events:: messages:: MessageType ;
88use line:: events:: { EventType , Events } ;
99use line:: messages:: { SendMessageType , TextMessage } ;
10+ use line:: support:: actix_support:: Signature ;
11+ use line:: webhook:: validate_signature;
1012
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 } ;
1314
1415#[ 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 {
2421 // Get channel secret and access token by environment variable
2522 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 " ) ;
2724 let access_token: & str =
2825 & env:: var ( "LINE_CHANNEL_ACCESS_TOKEN" ) . expect ( "Failed getting LINE_CHANNEL_ACCESS_TOKEN" ) ;
2926
3027 // LineBot
3128 let bot = LineBot :: new ( channel_secret, access_token) ;
3229
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] ) ;
5145 }
5246 }
53- return HttpResponse :: Ok ( ) . body ( "OK" ) ;
54- }
55- // Failed parsing
56- else if let Err ( msg) = result {
57- return HttpResponse :: BadRequest ( ) . body ( msg) ;
5847 }
59- HttpResponse :: BadRequest ( ) . body ( "Internal Server Error" )
48+
49+ "OK"
6050}
6151
6252#[ actix_rt:: main]
0 commit comments