【Rust】RustでLINE Notifyを使いたい!


C#やPythonなどでLINE Notifyを使用している記事はあったのですが、
Rustでやっている記事が見当たらなかったので
「やってみよう!」と衝動的に思いやってみました。

この記事ではLINE Notifyで
特定のルームにメッセージを送る処理を作成します。

LINE Notifyの登録

以下ページからLINE IDでログインして
「マイページ」から「アクセストークンの発行」をクリックします。
LINE Notify

トークン名とどこに通知を送信するのか聞かれるので
トークン名を入力し
通知先のルームを選択します。

トークン名は通知時にメッセージの先頭に表示される名前です。
また、
通知先がグループの場合は
そのグループに「LINE Notify」を追加しておく必要があります。

入力と選択が終わったら「発行する」をクリックします。
するとアクセストークンが発行されるので
第三者に知られないよう大切に保管しておきます。


コードを書いていく

下準備ができたのでごりごりコードを書いて行きます。
今回はreqwestクレートとtokioクレートを使用するので
Cargo.toml[dependencies]に以下を追加しておきます。

2022年3月末現在で
reqwestの最新バージョンは0.11.10
tokioは1.17.0です
バージョンが変わるとコードの書き方が変わることもあるので
注意してください。

[dependencies]
reqwest = "0.11.10"
tokio = {version = "1.17.0", features = ["full"]}

追加し終わったら
cargo buildを忘れないでおきましょう。

細かい説明は省いてコードは以下です。

use reqwest::{Client, header};
use std::collection::HashMap;

#[tokio::main]
async fn main(){
    match send().await{
        Ok(()) => (),
        Err(e) => println!("error: {}", e);
    }
}

async fn send() -> Result<(), Box<dyn std::error::Error + Send + Sync>>{
    let token = "Bearer [your line notify access token]";
    let url = "https://notify-api.line.me/api/notify";
    let mess = "[your message]";

    let mut message = HashMap::new();
    message.insert("message", mess);

    let mut head = header::HeaderMap::new();
    let token = header::HeaderValue::from_static(token);
    head.insert("Authorization", token);

    let client = Client::new();
    let res = client
        .post(url)
        .headers(head)
        .form(&message)
        .send()
        .await?;

    println!("Status is {:?}", res.status());

    Ok(())
}

実行して送信に成功すれば
ステータスコード200が返ってきます。

そして
LINEでは以下のように
LINE Notifyからメッセージが送信されます。

自分はてっきり
tokenの部分に取得したアクセストークン
header("Bearer", token)とするものだと思い
1日半ぐらいステータスコード401(アクセストークンが無効)の沼にはまっていました……。

だってC#ではAuthorizationとか入力しなかったんだもん……(言い訳)。