What is this?
WIP Rust bindings for the Reddit API
This is a WIP, you likely won't find it particularly useful
Set up
Follow https://github.com/reddit-archive/reddit/wiki/OAuth2 for set up instructions.
Use
Set up a script with access to a Reddit account, collect the access token, the client ID, and the client secret. Once you have that, get a refresh token. Once you have that you can do:
// pants is mutable so the refresh token can be updated
let mut pants = Pants::new(
USER_AGENT,
"<access-token>",
"<refresh_token>",
"<client-id>",
"<client-secret>",
);
For example, if you're using dotenv and reading values from the environment:
// pants is mutable so the refresh token can be updated
let mut pants = Pants::new(
USER_AGENT,
&env::var("ACCESS_TOKEN").unwrap(),
env::var("REFRESH_TOKEN").unwrap(),
&env::var("CLIENT_ID").unwrap(),
&env::var("CLIENT_SECRET").unwrap(),
);
Then you can invoke things, e.g:
pants.me()
If your refresh token expires, it should automatically refresh.
Currently implemented with (partially) structured response:
Account:
- GET /api/v1/me
- GET /api/v1/me/karma
- GET /api/v1/me/prefs
- GET /prefs/friends
Currently kind of implemented (no query parameters), with JSON response:
Account:
- GET /api/v1/me/trophies
- GET /prefs/blocked
- GET /prefs/messaging
- GET /prefs/trusted
- GET /api/v1/me/friends
- GET /api/v1/me/blocked
Listing
- GET /api/trending_subreddits
- GET /best
- GET /by_id/names
- GET /comments/article
- GET /controversial
- GET /r/{subreddit}/controversial
- GET /duplicates/article
- GET /hot
- GET /r/{subreddit}/hot
- GET /new
- GET /r/{subreddit}/new
- GET /random
- GET /r/{subreddit}/random
- GET /rising
- GET /r/{subreddit}/rising
- GET /top
- GET /r/{subreddit}/top
Links and Comments
- POST /api/submit
- POST /api/del
To submit a post to Reddit:
// Build the submission
let request_body = links_and_comments::ApiSubmit {
ad: "".to_string(),
api_type: "".to_string(),
app: "".to_string(),
collection_id: "".to_string(),
event_end: "".to_string(),
event_start: "".to_string(),
event_tz: "".to_string(),
extension: "".to_string(),
flair_id: "".to_string(),
flair_text: "".to_string(),
g_recaptcha_response: "".to_string(),
kind: "self".to_string(),
nsfw: "".to_string(),
resubmit: "".to_string(),
richtext_json: "".to_string(),
sendreplies: "".to_string(),
spoiler: "".to_string(),
sr: "name_of_subreddit".to_string(),
text: "Here's an example of the post's body".to_string(),
title: "This is the title of the post".to_string(),
uh: "".to_string(),
url: "".to_string(),
video_poster_url: "".to_string(),
};
// then submit the post
let submission_name = pants.submit(request_body).await {
Ok(response) => {
println!("Response to submit is: {}", serde_json::to_string_pretty(&response).unwrap());
response.json.data.name
},
Err(e) => panic!("An error ocurred: {}", e),
};
// remove it if you'd like
let delete_request_body = links_and_comments::ApiDel { id: submission_name };
pants.del(delete_request_body).await;
Streaming support for:
use futures_util::pin_mut;
use futures_util::stream::StreamExt;
...
let stream = pants.stream_subreddit_new("testingground4bots");
pin_mut!(stream);
while let Some(value) = tokio_test::block_on(stream.next()) {
println!("New post: {}", value);
}
All other APIs are not implemented