【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とか入力しなかったんだもん……(言い訳)。
Discussion