|
| 1 | +extern crate line_bot_sdk_rust as line; |
| 2 | + |
| 3 | +use dotenv::dotenv; |
| 4 | +use std::env; |
| 5 | + |
| 6 | +use line::bot::LineBot; |
| 7 | +use line::events::messages::MessageType as EventMessageType; |
| 8 | +use line::events::{EventType, Events}; |
| 9 | +use line::messages::{SendMessageType, TextMessage}; |
| 10 | + |
| 11 | +use actix_web::web::Bytes; |
| 12 | +use actix_web::{post, App, HttpRequest, HttpResponse, HttpServer, Responder}; |
| 13 | + |
| 14 | +#[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 | + |
| 24 | + // Get channel secret and access token by environment variable |
| 25 | + let channel_secret: &str = |
| 26 | + &env::var("LINE_CHANNEL_RECRET").expect("Failed getting LINE_CHANNEL_RECRET"); |
| 27 | + let access_token: &str = |
| 28 | + &env::var("LINE_CHANNEL_ACCESS_TOKEN").expect("Failed getting LINE_CHANNEL_ACCESS_TOKEN"); |
| 29 | + |
| 30 | + // LineBot |
| 31 | + let bot = LineBot::new(channel_secret, access_token); |
| 32 | + |
| 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 | + } |
| 51 | + } |
| 52 | + } |
| 53 | + return HttpResponse::Ok().body("OK"); |
| 54 | + } |
| 55 | + // Failed parsing |
| 56 | + else if let Err(msg) = result { |
| 57 | + return HttpResponse::BadRequest().body(msg); |
| 58 | + } |
| 59 | + HttpResponse::BadRequest().body("Internal Server Error") |
| 60 | +} |
| 61 | + |
| 62 | +#[actix_rt::main] |
| 63 | +async fn main() -> std::io::Result<()> { |
| 64 | + dotenv().ok(); |
| 65 | + HttpServer::new(|| App::new().service(callback)) |
| 66 | + .bind("127.0.0.1:8000")? |
| 67 | + .run() |
| 68 | + .await |
| 69 | +} |
0 commit comments