An unofficial Rust API client for [Facebook](https://facebook.com/) post uploads. ## 🪛 Requirements - Create a Fecebook app on [Developer Page](https://developers.facebook.com/) - Your Facebook app must be in Live mode to make your posts visible for others. - Take ACCESS_TOKEN from [Graph API Explorer](https://developers.facebook.com/tools/explorer/). You can get 2 months token by pressing info icon. - Add the desired permissions to allow your app to make posts. - ```pages_manage_engagement``` - ```pages_manage_posts``` - ```pages_read_engagement``` - ```pages_read_user_engagement``` - ```publish_video``` permission, if you need to publish a video - Take PAGE_ID from page that you planning to do post. - More useful information you can find in [Offical Facebook API Documentation](https://developers.facebook.com/docs/graph-api/) Current version v19.0. ## 🪧 Usage ### Post ```rust use fb_poster::*; use anyhow::{Ok, Result}; const ACCESS_TOKEN: &str = "YOUR_ACCESS_TOKEN"; const PAGE_ID: &str = "YOUR_PAGE_ID"; #[tokio::main] async fn main() -> Result<()> { // Bring your secrets into a scope let secrets = Secrets::new(ACCESS_TOKEN, PAGE_ID); let message = "Your message".to_string(); let link = "https://your_link".to_string(); // Build a body for a request let body = Post::new(secrets) .with_message(message) .with_link(link); // Sending and get repsonse body.send().await?; Ok(()) } ``` ### Photo ```rust use fb_poster::*; use anyhow::{Ok, Result}; const ACCESS_TOKEN: &str = "YOUR_ACCESS_TOKEN"; const PAGE_ID: &str = "YOUR_PAGE_ID"; #[tokio::main] async fn main() -> Result<()> { // Bring your secrets into a scope let secrets = Secrets::new(ACCESS_TOKEN, PAGE_ID); let path = "/path/to/photo.png".to_string(); // Build a body for a request let body = Photo::new(secrets, path); // Sending and get repsonse body.send(&secrets).await?; Ok(()) } ``` ### Video ```rust use fb_poster::*; use anyhow::{Ok, Result}; const ACCESS_TOKEN: &str = "YOUR_ACCESS_TOKEN"; const PAGE_ID: &str = "YOUR_PAGE_ID"; #[tokio::main] async fn main() -> Result<()> { // Bring your secrets into a scope let secrets = Secrets::new(ACCESS_TOKEN, PAGE_ID); let path = "/path/to/video".to_string(); // or url for .hosted_video() let title = "Title".to_string(); let description = "Description".to_string(); let thumb = "path/to/thumb".to_string(); // Build a body for a request let body = Video::new(secrets) .local_video(path) .with_title(title) .with_description(description) .with_thumbnail(thumb) // Sending and get repsonse body.send().await?; Ok(()) } ``` ### Reels ```rust use fb_poster::*; use anyhow::{Ok, Result}; const ACCESS_TOKEN: &str = "YOUR_ACCESS_TOKEN"; const PAGE_ID: &str = "YOUR_PAGE_ID"; #[tokio::main] async fn main() -> Result<()> { // Bring your secrets into a scope let secrets = Secrets::new(ACCESS_TOKEN, PAGE_ID); let path = "/path/to/video".to_string(); // or url for .hosted_video() let title = "Title".to_string(); let description = "Description".to_string(); let thumb = "path/to/thumb".to_string(); // Build a body for a request let body = Reels::new(secrets) .local_video(path) .with_description(description) // Sending and get repsonse body.send().await?; Ok(()) } ``` ## ✅ Features - [x] Post - [x] With Message - [x] With Link - [x] Photo - [x] With Message **Non-Resumable Upload (Video limitation is 1GB 20min)** - [x] Video - [x] Local Video - [x] Hosted Video - [x] With Title - [x] With Description - [x] With Thumbnail - [x] Reels - [x] Local Reels - [x] Hosted Reels - [x] With Description