目的
TwitterのOAuthはユーザーの認証にはOAuth1.1を、アプリケーションの認証にはOAuth2が使われます。
OAuth1.1の計算はめんどくさいけど、OAuth2の計算は楽なのでライブラリを使わずともTwitterAPIがコールできます。
以下のページを参考にプログラムを書いてみました。
Application-only authentication
利用ライブラリ
通信のためにreqwestを、キーを作るためにbase64を、JSONを解析するためにserde_jsonを使っています。
コード
Cargo.toml
[package]
name = "oauth"
version = "0.1.0"
[dependencies]
reqwest = "*"
base64 = "*"
serde = "*"
serde_json = "*"
serde_derive = "*"
main.rs
extern crate reqwest;
extern crate base64;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
use reqwest::header::{Headers, Authorization, ContentType};
use serde_json::{Value};
#[derive(Deserialize,Debug)]
struct Token {
access_token: String,
token_type: String
}
#[derive(Deserialize,Debug)]
struct SearchResult {
search_metadata: Value,
statuses: Vec<Value>
}
fn get_token() -> Token {
let consumer_key = "xxxxxx";
let consumer_secret = "xxxxxx";
let auth = base64::encode(&format!("{}:{}", consumer_key, consumer_secret));
let endpoint = "https://api.twitter.com/oauth2/token";
let mut headers = Headers::new();
headers.set(Authorization(format!("Basic {}",auth)));
headers.set(ContentType::form_url_encoded());
let client = reqwest::Client::new();
client
.post(endpoint)
.body("grant_type=client_credentials")
.headers(headers)
.send()
.unwrap()
.json()
.unwrap()
}
fn search(token: &Token) -> SearchResult {
let endpoint = "https://api.twitter.com/1.1/search/tweets.json";
let mut headers = Headers::new();
headers.set(Authorization(format!("Bearer {}", token.access_token)));
let client = reqwest::Client::new();
client
.get(endpoint)
.query(&[("q", "新宿"), ("count", "2")])
.headers(headers)
.send()
.unwrap()
.json()
.unwrap()
}
fn main() {
let token = get_token();
let res = search(&token);
for status in res.statuses {
println!("{}", status["text"].as_str().unwrap());
}
}