Skip to content

nanato12/line-bot-sdk-rust

Repository files navigation

LINE Messaging API SDK for Rust

Crates.io docs.rs

Introduction

The LINE Messaging API SDK for Rust makes it easy to develop bots using LINE Messaging API, and you can create a sample bot within minutes.

Documentation

See the official API documentation for more information.

Requirements

  • Rust 1.75.0 or later (stable)

Installation

$ cargo add line-bot-sdk-rust

Web framework support

Extract x-line-signature from the request header.

Use rocket framework

[dependencies.line-bot-sdk-rust]
version = "3.0.0"
features = ["rocket_support"]
use line_bot_sdk_rust::support::rocket::Signature;
use rocket::{http::Status, post};

#[post("/callback", data = "<body>")]
async fn world(signature: Signature, body: String) -> (Status, &'static str) {
    ...
}

Use actix_web framework

[dependencies.line-bot-sdk-rust]
version = "3.0.0"
features = ["actix_support"]
use actix_web::{post, web, Error, HttpResponse};
use line_bot_sdk_rust::support::actix::Signature;

#[post("/callback")]
async fn callback(signature: Signature, bytes: web::Bytes) -> Result<HttpResponse, Error> {
    ...
}

Use axum framework

[dependencies.line-bot-sdk-rust]
version = "3.0.0"
features = ["axum_support"]
use line_bot_sdk_rust::support::axum::Signature;

async fn callback(
    signature: Signature,
    body: String,
) -> Result<&'static str, (axum::http::StatusCode, String)> {
    ...
}

Configuration

use line_bot_sdk_rust::client::LINE;
use std::env;

fn main() {
    let access_token: &str =
        &env::var("LINE_CHANNEL_ACCESS_TOKEN").expect("Failed to get LINE_CHANNEL_ACCESS_TOKEN");

    let line = LINE::new(access_token.to_string());
}

With timeout

use line_bot_sdk_rust::client::LINE;
use std::time::Duration;

fn main() {
    let line = LINE::builder(access_token.to_string())
        .timeout(Duration::from_secs(30))
        .build();
}

How to use

The LINE Messaging API uses the JSON data format.

Example. Parse body (&str) into Result<CallbackRequest, serde_json::Error>.

let request: Result<CallbackRequest, serde_json::Error> = serde_json::from_str(body);
match request {
    Err(err) => {
        // error handling
    },
    Ok(req) => {
        for e in req.events {
            // Processing for various events
        }
    }
}

Examples

All examples require LINE_CHANNEL_SECRET and LINE_CHANNEL_ACCESS_TOKEN environment variables. Create an .env file inside the examples/ directory:

LINE_CHANNEL_SECRET=your_channel_secret
LINE_CHANNEL_ACCESS_TOKEN=your_channel_access_token

Echo bot (Rocket)

$ cd examples
$ cargo run --bin rocket

source: rocket example

Echo bot (actix-web)

$ cd examples
$ cargo run --bin actix_web

source: actix-web example

Full-featured bot (Axum)

A comprehensive example demonstrating multiple event handlers and slash commands (/help, /profile, /botinfo, /ginfo, /flex, /leave).

The /flex command loads a Flex Message from an external JSON file (static/flex_sample.json), so you can customize the message design without recompiling.

$ cd examples
$ cargo run --bin axum

source: axum example

Contributing

Please make a contribution!

License

Copyright 2023-2026 nanato12

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.