⛳
Rustで常駐プログラムで𝕏ボット
目的
Rustで常駐プログラムのライブラリ公開でライブラリを公開しました。
実は公開した時点で𝕏ボットのexampleを入れていました。今回はこのプログラムの紹介をします。
𝕏のAPIでは無料版でも1日50ポストまで投稿が可能になっています。そこで毎時15分と45分にポストしていくプログラムを書きます。
コード
cron
15分と45分にポストするスケージュールは以下のようになります。余談ですが一番左を*にしてしまい大量にポストをしてしまい慌てて消しました。
"0 15,45 * * * *",
𝕏 API
APIはtwapi-v2を使います。このライブラリも自分が作成しました。他の𝕏APIv2ライブラリよりも頻繁に更新していて、最新のものになっています。
async fn execute_tweet(now: DateTime<Utc>) -> anyhow::Result<()> {
let auth = OAuthAuthentication::new(
std::env::var("CONSUMER_KEY").unwrap_or_default(),
std::env::var("CONSUMER_SECRET").unwrap_or_default(),
std::env::var("ACCESS_KEY").unwrap_or_default(),
std::env::var("ACCESS_SECRET").unwrap_or_default(),
);
let body = post_2_tweets::Body {
text: Some(format!("botです。{}", now)),
..Default::default()
};
match post_2_tweets::Api::new(body).execute(&auth).await {
Ok((response, rate_limit)) => {
info!(response = ?response, rate_limit = ?rate_limit, "post tweet success");
Ok(())
}
Err(err) => Err(err.into()),
}
}
メイン
メインは以下のようになります。
#[tokio::main]
async fn main() -> anyhow::Result<()> {
prepare_log("bot");
let (_, token) = ctrl_c_handler();
let handles = vec![make_looper(
token.clone(),
"0 15,45 * * * *",
Duration::from_secs(10),
|now| async move {
if let Err(err) = execute_tweet(now).await {
warn!(error = ?err, "execute tweet failed");
}
LoopState::Continue
},
|| async move {
info!("graceful stop looper 1");
},
)];
for handle in handles {
handle.await.unwrap();
}
Ok(())
}
まとめ
コード全体は以下にあります。
リポジトリ
Discussion