Rustで常駐プログラムで𝕏ボット

2024/02/26に公開

目的

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