rusty_meta_threads 0.8.1

Community Rust SDK for integrating with Meta Threads API
Documentation
use log::debug;
use serde::Deserialize;
use urlencoding::encode;

#[derive(Deserialize, Debug)]
pub struct OembedResponse {
    pub version: Option<String>,
    pub provider_name: Option<String>,
    pub provider_url: Option<String>,
    pub width: Option<u64>,
    pub html: Option<String>,
}

pub async fn get_oembed_html(
    post_url: &str,
    token: &str,
) -> Result<OembedResponse, reqwest::Error> {
    let the_post_url = encode(post_url);
    let url = format!("https://graph.threads.net/v1.0/oembed?url={the_post_url}");

    debug!("requesting oembed for: {:?}", &url);

    let res = reqwest::Client::new()
        .get(&url)
        .bearer_auth(token)
        .send()
        .await? // @TODO don't silently fail on expired token (see profiles.rs example)
        .json::<OembedResponse>()
        .await?;

    Ok(res)
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::utils::read_dot_env;
    use log::debug;

    #[tokio::test]
    async fn test_get_oembed_html() {
        let should_log_verbose = true;
        let _ = env_logger::builder()
            .is_test(!should_log_verbose)
            .try_init();

        let env = read_dot_env();
        let token = env.get("ACCESS_TOKEN").unwrap();

        let res = get_oembed_html("https://www.threads.net/@threads/post/DHvtwr8g63f", token).await;

        debug!("oembed response fetched: {:?}", res);

        assert_eq!(true, res.is_ok());

        let resp_data = res.unwrap();
        assert_eq!(true, resp_data.provider_url.is_some());
        assert_eq!(resp_data.provider_url.unwrap(), "https://www.threads.com/");
    }
}