diff options
author | Andy Wortman <me@iximeow.net> | 2017-07-15 20:44:03 -0700 |
---|---|---|
committer | Andy Wortman <me@iximeow.net> | 2017-07-15 20:44:03 -0700 |
commit | ea47395001100144cda08884c614ddba0e8a034b (patch) | |
tree | aecd5dce5066ef0ef602d227224702407a7f5879 |
initial
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Cargo.toml | 28 | ||||
-rw-r--r-- | main.rs | 141 |
3 files changed, 171 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e7caa9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Cargo.lock +target/ diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..1784ff9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,28 @@ +[package] + +name = "twidder" +version = "0.0.1" +authors = [ "iximeow <me@iximeow.net>" ] +license = "MIT" +repository = "lol" +description = """ +a nice twitter +""" + +[[bin]] +name = "twidder" +path = "main.rs" +test = false +bench = false + +[dependencies] +"termios" = "0.2.2" +"termion" = "1.4.0" +"hyper" = "*" +hyper-tls = "*" +"rustc-serialize" = "*" +"oauthcli" = "1.0.6" +"url" = "*" +"tokio-core" = "*" +"futures" = "*" + @@ -0,0 +1,141 @@ +use rustc_serialize::json::Json; +use std::str; +use std::io::BufRead; + +pub trait JsonObjectStreamer: Sized { + fn json_objects(&mut self) -> JsonObjects<Self>; +} + +impl<T: BufRead> JsonObjectStreamer for T { + fn json_objects(&mut self) -> JsonObjects<T> { + JsonObjects { reader: self } + } +} + +pub struct JsonObjects<'a, B> where B: 'a { + reader: &'a mut B +} + +impl<'a, B> Iterator for JsonObjects<'a, B> where B: BufRead + 'a { + + type Item = Json; + + fn next(&mut self) -> Option<Json> { + + let mut buf: Vec<u8> = Vec::new(); + + let _ = self.reader.read_until(b'\r', &mut buf); + + if buf.last() == Some(&b'\r') { + buf.pop(); + let mut b: String = String::new(); + match self.reader.read_line(&mut b) { + Ok(_) => (), + Err(_) => return None, + } + } + + let line = match str::from_utf8(&buf) { + Ok(line) => line, + Err(_) => return None + }; + + Json::from_str(line).ok() + + } + +} + +extern crate url; +#[macro_use] extern crate hyper; +extern crate rustc_serialize; +extern crate oauthcli; +extern crate tokio_core; +extern crate futures; +extern crate hyper_tls; + +use hyper::{Client, Method, Request}; +use hyper::header::Headers; +use std::io::BufReader; +use tokio_core::reactor::Core; +use futures::future::Future; +use futures::Stream; +use hyper::client::FutureResponse; +use hyper_tls::HttpsConnector; +//use json_streamer::JsonObjectStreamer; + +header! { (Authorization, "Authorization") => [String] } +header! { (Accept, "Accept") => [String] } +header! { (ContentType, "Content-Type") => [String] } + +fn main() { + + //Change these values to your real Twitter API credentials + let consumer_key = "0af9c1AoEi5X7IjtOKAtP60Za"; + let consumer_secret = "1fxEzRhQtQSWKus4oqDwdg5DALIjGpINg0PGjkYVwKT8EEMFCh"; + let token = "629126745-VePBD9ciKwpuVuIeEcNnxwxQFNWDXEy8KL3dGRRg"; + let token_secret = "uAAruZzJu03NvMlH6cTeGku7NqVPro1ddKN4BxORy5hWG"; + + //Track words +// let params: Vec<(String, String)> = vec![("track".to_string(), "london".to_string())]; + let params: Vec<(String, String)> = vec![]; +// let url = "https://stream.twitter.com/1.1/statuses/filter.json"; + let url = "https://userstream.twitter.com/1.1/user.json"; +// let url = "https://stream.twitter.com/1.1/statuses/sample.json"; + + let header = oauthcli::authorization_header( + "GET", + url::Url::parse(url).unwrap(), + None, // Realm + consumer_key, + consumer_secret, + Some(token), + Some(token_secret), + oauthcli::SignatureMethod::HmacSha1, + &oauthcli::timestamp(), + &oauthcli::nonce(), + None, // oauth_callback + None, // oauth_verifier + params.clone().into_iter() + ); + + let mut core = Core::new().unwrap(); + + let connector = HttpsConnector::new(4, &core.handle()).unwrap(); + + let client = Client::configure() + .keep_alive(true) + .connector(connector) + .build(&core.handle()); + + let param_string: String = params.iter().map(|p| p.0.clone() + &"=".to_string() + &p.1).collect::<Vec<String>>().join("&"); + + let mut req = Request::new(Method::Get, url.parse().unwrap()); + req.set_body(param_string); + + { + let mut headers = req.headers_mut(); + headers.set(Authorization(header.to_owned())); + headers.set(Accept("*/*".to_owned())); + headers.set(ContentType("application/x-www-form-urlencoded".to_owned())); + }; + + println!("requesting..."); + let work = client.request(req).and_then(|res| { + res.body().for_each(move |body: hyper::Chunk| { + println!("hmmm"); + println!("{}", std::str::from_utf8(&body).unwrap()); + Ok(()) + }) + }); + + println!("Before?"); + let resp = core.run(work).unwrap(); + println!("After?"); + + /* + for obj in BufReader::new(res).json_objects() { + println!("{:?}", obj.as_object().unwrap().get("text").unwrap().as_string().unwrap()); + }*/ + +} |