LoginSignup
7
4

More than 5 years have passed since last update.

RustでTwitterのApplication-only authenticationを試してみた

Posted at

目的

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());
    }
}
7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4