【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