1use std::collections::HashMap;
2use twapi_oauth::calc_oauth_header;
3use ureq::{Error, Response};
4
5pub fn get_bearer_token_response(
6 consumer_key: &str,
7 consumer_secret: &str,
8) -> Result<Response, Error> {
9 let key = base64::encode(&format!("{}:{}", consumer_key, consumer_secret));
10 ureq::post("https://api.twitter.com/oauth2/token")
11 .set(
12 "Content-Type",
13 "application/x-www-form-urlencoded;charset=UTF-8",
14 )
15 .set("Authorization", &format!("Basic {}", key))
16 .send_string("grant_type=client_credentials")
17}
18
19pub fn get_bearer_token(consumer_key: &str, consumer_secret: &str) -> Option<String> {
20 match get_bearer_token_response(consumer_key, consumer_secret) {
21 Ok(response) => match response.into_json::<serde_json::Value>() {
22 Ok(json) => match json["access_token"].as_str() {
23 Some(access_token) => Some(access_token.to_string()),
24 None => None,
25 },
26 Err(_) => None,
27 },
28 Err(_) => None,
29 }
30}
31
32pub fn request_token_response(
33 consumer_key: &str,
34 consumer_secret: &str,
35 oauth_callback: &str,
36 x_auth_access_type: Option<&str>,
37) -> Result<Response, Error> {
38 let uri = "https://api.twitter.com/oauth/request_token";
39 let mut header_options = vec![("oauth_callback", oauth_callback)];
40 if let Some(x_auth_access_type) = x_auth_access_type {
41 header_options.push(("x_auth_access_type", x_auth_access_type));
42 }
43 let signed = calc_oauth_header(
44 &format!("{}&", consumer_secret),
45 consumer_key,
46 &header_options,
47 "POST",
48 uri,
49 &vec![],
50 );
51 ureq::post(uri)
52 .set("Authorization", &format!("OAuth {}", signed))
53 .call()
54}
55
56pub fn request_token(
57 consumer_key: &str,
58 consumer_secret: &str,
59 oauth_callback: &str,
60 x_auth_access_type: Option<&str>,
61) -> Result<HashMap<String, String>, Error> {
62 let response = request_token_response(
63 consumer_key,
64 consumer_secret,
65 oauth_callback,
66 x_auth_access_type,
67 )?;
68 Ok(parse_oauth_body(response))
69}
70
71pub fn access_token_response(
72 consumer_key: &str,
73 consumer_secret: &str,
74 oauth_token: &str,
75 oauth_token_secret: &str,
76 oauth_verifier: &str,
77) -> Result<Response, Error> {
78 let uri = "https://api.twitter.com/oauth/access_token";
79 let signed = calc_oauth_header(
80 &format!("{}&{}", consumer_secret, oauth_token_secret),
81 consumer_key,
82 &vec![
83 ("oauth_token", oauth_token),
84 ("oauth_verifier", oauth_verifier),
85 ],
86 "POST",
87 uri,
88 &vec![],
89 );
90 ureq::post(uri)
91 .set("Authorization", &format!("OAuth {}", signed))
92 .call()
93}
94
95pub fn access_token(
96 consumer_key: &str,
97 consumer_secret: &str,
98 oauth_token: &str,
99 oauth_token_secret: &str,
100 oauth_verifier: &str,
101) -> Result<HashMap<String, String>, Error> {
102 let response = access_token_response(
103 consumer_key,
104 consumer_secret,
105 oauth_token,
106 oauth_token_secret,
107 oauth_verifier,
108 )?;
109 Ok(parse_oauth_body(response))
110}
111
112fn parse_oauth_body(response: Response) -> HashMap<String, String> {
113 let mut result = HashMap::new();
114 match response.into_string() {
115 Ok(body) => {
116 for item in body.split("&") {
117 let mut pair = item.split("=");
118 result.insert(
119 pair.next().unwrap().to_string(),
120 pair.next().unwrap().to_string(),
121 );
122 }
123 }
124 Err(_) => {}
125 }
126 result
127}