3日で作るtwitterクライアント clown (tt_clown)

Slides:



Advertisements
Similar presentations
ブロガーのための ソースコード管理システム 紹介 id:hakobe932 はこべ. 突然ですが ブログでソースコード 読んでますか?
Advertisements

UGUI を 使ってみよう ( 導入・紹介?編 ) 1. uGUI とは O Unity 4.6 から使えるようになった UI (ユー ザーインターフェース)システム O 8 月: Unity4.6 β uGUI 試用版公開 O 11 月: Unity4.6 uGUI 正式版公開 正式版公開で、 機能紹介ブロ.
位置情報と私 木村岳文 / 位置情報と私 / はじめに GPS 付き携帯、ハンディ GPS などを使っ て、お手軽に自分が地球上のどこにいる かを調べられるようになってきました。 このデータをつかって何かおもしろいこ とができそうな予感。 具体的にどうしたらおもしろいかはよく.
Copyright © Ariel Networks, Inc. AJAX 勉強会 アリエル・ネットワーク株式会社.
Tt_clown ( 津川 知朗) 俺 Tokenizer を作る ~ Boost.Tokenizer のカスタマイズ~ 2009/12/121 Boost 勉強会.
1 安全性の高いセッション管理方 式 の Servlet への導入 東京工業大学 理学部 千葉研究室所属 99-2270-6 松沼 正浩.
1 PHP プログラムの実行(まと め) 担当 岡村耕二 月曜日 2限 平成 22 年度 情報科学 III (理系コア科目・2年生) 本資料の一部は、堀良彰准教授、天野浩文准教授、菅沼明 准教授等による以前の講義資料をもとにしています。
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作 第4回 マルチスレッドとネットワーク. 今日の内容 マルチスレッド – ローディングの進捗表示とか – 処理高速化も見込めます ネットワーク通信 – 必然的にマルチスレッドを扱います.
1 なんとなく Ajax ~新しくて古い XMLHttp 川合孝典 (Kansai.pm) 2005/5/22.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
・ω・.
Flash 書き換え PHP extension “SWF Editor”
JPAを利用した RESTful Webサービスの開発
富士ソフト株式会社 IT事業本部 テクニカルC&C部 小川直人
2006年11月15日 植田龍男 Webサービス II (第8回) 年11月15日 植田龍男.
東京工科大学 コンピュータサイエンス学部 亀田弘之
WebDAVでOpenOffice.org の文章を共有する
読んだもの P0254R0: Integrating std::string_view and std::string およびその関連スレッド 稲葉 一浩.
マルチプラットフォーム対応 P2Pファイル共有ソフトの開発
REST型Webサービスによる 楽曲検索システムの開発
稲葉 一浩 (k.inaba) Python と プログラミングコンテスト 稲葉 一浩 (k.inaba)
マルチプラットフォーム対応 P2Pファイル共有ソフトの開発
ジオポ 位置情報を短縮して使いやすく (c) creco.
とても使いやすい Boost の serialization
とても使いやすい Boost の serialization
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
自作組込みOSを エミュレータで 動かしてみた 坂井弘亮 (KOZOSプロジェクト) Twitter ID:kozossakai.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
JavaServlet&JSP入門 01K0018 中村太一.
Webコミュニケーショングループ ~PHPの基礎~ M1 宮崎 真.
第4回 個人の動画配信補足のためのWeb構築
Flash 書き換え PHP extension “SWF Editor”
Bottle/Pythonによる Webアプリ入門
JavaScript Language Update
第6章 2重ループ&配列 2重ループと配列をやります.
Plugin を改造してみる 2008/10/18 id:akihirox.
IEのshowModalDialogとCookie(KB831678), デバッ グ用WinInet.dllの紹介
マスタリング バベル Boost.勉強会 #2 ( ).
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
HTTPプロトコルとJSP (1) データベース論 第3回.
JQueryでAjax 藤田@ジャストプレイヤー ※参考しまくり文献 jQuery日本語リファレンス.
HTTPプロトコル J2EE I 第7回 /
実際にたたいてAPI APIの初歩からプログラムまで使用方法のAtoZ.
第8章 Web技術とセキュリティ   岡本 好未.
チーム FSEL 立命館大学情報理工学部 ソフトウェア基礎技術研究室
情報工学部 情報工学科 石原研究室 11A1021 重永 実沙希
EclipseでWekaのAPIを呼び出す
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
Webセキュリティ 情報工学専攻 1年 赤木里騎 P226~241.
デジタル画像とC言語.
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
ネットワークプログラミング (3回目) 05A1302 円田 優輝.
A18 スパムサーバの調査 ~ボットを見抜けるか?~
IBM X-Force Exchange Commercial API試用法
第6回 個人の動画配信補足のためのWeb構築
Twitterクライアントに学ぶASP.NETアプリ
一歩進んだ Views の使い方 スタジオ・ウミ 山中.
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
B演習(言語処理系演習)第2回 田浦.
統計ソフトウエアRの基礎.
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
ASP.NET 2.0による Webサービスの構築 2008年10月18日 こくぶんまさひろ.
Androidアプリの作成 07A1069 松永大樹.
ソフトウェア理解支援を目的とした 辞書の作成法
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
ASP.NET 2.0による Webサービスの構築 2008年10月18日 こくぶんまさひろ.
情報ネットワークと コミュニケーション 数学領域3回 山本・野地.
俺 Tokenizer を作る ~Boost.Tokenizer のカスタマイズ~
HTTPプロトコルの詳細 M1 峯 肇史.
Presentation transcript:

3日で作るtwitterクライアント clown (tt_clown) tt.clown@gmail.com 資料: http://cielquis.net/download/201010_boost.pdf Boost.勉強会 #3 2010/10/23

自己紹介 tt_clown コード その他 tt_ プレフィクスは要らない子 ベンチャー企業で働いてます 最近はフリーソフト作成 コード CLX C++ Libraries ( http://clx.cielquis.net/ ) github ( http://github.com/clown/ ) その他 http://d.hatena.ne.jp/tt_clown/ http://twitter.com/tt_clown Boost.勉強会 #3 2010/10/23

魔導書に記事かきました Boost.Asio のお話 周りの反応 Boost.Asio の使い方の説明用 としてはサンプルコードがしんどい もうちょっと説明に特化した ようなのが良かった ・・・と言うか説明する気ないだろ http://longgate.co.jp/products.html Boost.勉強会 #3 2010/10/23

デスヨネー Boost.勉強会 #3 2010/10/23

OAuth / xAuth 認証クラスを作ろう 言い訳(と発表内容の動機) 単体で完結させたくなかった 「魔導書に載せたコードを使った何か」をやりたかった http 通信を利用した何か・・・ 最近? twitter が人気 何かおーおーす?とか言う認証方式に統一されたらしい OAuth / xAuth 認証クラスを作ろう Boost.勉強会 #3 2010/10/23

背景と動機 (もうちょっと真面目に) ここ 5 年くらい Web(サービス型)アプリが人気 Web アプリのメリット・デメリット SaaS, PaaS, IaaS, … … AaaS から ZaaS まで命名するつもりか! クライアント側の端末が Web ブラウザに固定される cgi (Perl, Ruby, Python, PHP) + JavaScript が主流に Web アプリのメリット・デメリット メリット: OS 非依存, インストール不要, データの共有, … ブラウザ依存問題はあるが,先達がかなり頑張ってくれてる デメリット: 人気になると死ぬ 503 もうずっと犬人大杉 個人レベルでは体力 (金銭) 的に辛い Boost.勉強会 #3 2010/10/23

twitter クライアント 乗るしかない このビッグ?ウェーブに twitter クライアントへの需要 例: Twitterクライアント – Twitter まとめ Wiki http://bit.ly/bxkSMv Web アプリではなく,デスクトップアプリと言う形(が多い) デスクトップ・アプリへの需要も若干復調か? 乗るしかない このビッグ?ウェーブに そう言う訳で OAuth/xAuth のお話 Boost.勉強会 #3 2010/10/23

OAuth 認証とは? ・・・だそうです とりあえずサンプルコードを探そう BASIC 認証は ID やパスワードが一時的にせよ API 利用側に預けられてしまういう問題です。これを回避するために、アカウントの認証処理自体をついったーなどAPI提供側に代わりにやってもらい、API 利用側は認証された結果だけをもらうという形にしたのが OAuth です。 OAuthプロトコルの中身をざっくり解説してみるよ -ゆろよろ日記 http://d.hatena.ne.jp/yuroyoro/20100506/1273137673 ・・・だそうです とりあえずサンプルコードを探そう Boost.勉強会 #3 2010/10/23

サンプルコードをググる 作者より使いこなしてる凄い人 このコードを参考に http 通信部分を Boost.Asio 化 まぁでも一応書いて判断すべきかなと思って、僕的な答えとして、さらーーーっと書いた。CONSUMER_KEY と CONSUMER_SECRET を書き換えて実行して下さい。xAuth認証を使ってtwitterにステータスをポストします。 CLX C++ Library で xAuth し てみた。 - Big Sky http://mattn.kaoriya.net/software/lang/c/20100911222528.htm 作者より使いこなしてる凄い人 このコードを参考に http 通信部分を Boost.Asio 化 本当は他にも Boost 化できそうだけど保留・・・ ※余談: OAuth クラスを作ろうと思った(本当の)きっかけ http://petitbanca.blogspot.com/2009/11/oauthtwitter.html Boost.勉強会 #3 2010/10/23

リクエスト用文字列の生成 リクエスト (POST/GET) 用の文字列の生成が大変 以下の (key, value) で HMAC-SHA1 を計算する key: consumer_secret_ + "&" + oauth_token_secret_ value: 必須パラメータ+Options を辞書順に並べる 必須パラメータ: oauth_consumer_key, oauth_signature_method, oauth_timestamp, oauth_nonce, oauth_version 計算値を base64 でエンコードし oauth_signature の値に 各パラメータは RFC3986 の %xx 形式でエスケープ 非制限文字: ALPHA, DIGIT, '-', '.', '_', '~' Boost.勉強会 #3 2010/10/23

リクエスト用文字列の生成コード http_response post(const string_type& path, const parameter_map& parameters) { parameter_map v = this->merge(parameters); // ソートは std::map に任せる std::basic_stringstream<char_type> ss; bool first = true; for (parameter_map::const_iterator pos = v.begin(); pos != v.end(); ++pos) { if (!first) ss << '&'; else first = false; ss << pos->first << '=' << pos->second; } string_type key = consumer_secret_ + "&" + oauth_token_secret_; clx::uri_encoder f("-._~", false, false); string_type uri = traits::protocol() + string_type("://") + traits::domain(); string_type port = traits::port(); if (port != "80" && port != "443") uri += ":" + port; uri += path; string_type val = "POST&" + clx::convert(uri, f) + "&" + clx::convert(ss.str(), f); const clx::sha1& hmac = clx::hmac<clx::sha1>(key.c_str(), key.size(), val.c_str(), val.size()); string_type hm = clx::base64::encode(reinterpret_cast<const char*>(hmac.code()), 20); ss << "&oauth_signature=" << clx::convert(hm, f); return session_.post(clx::uri::encode(path), ss.str()); http://github.com/clown/cloost/blob/master/oauth_base.h Boost.勉強会 #3 2010/10/23

OAuth/xAuth に必要なもの 最終的に必要なものは以下の 4 パラメータ oauth_consumer_key consumer_secret access_token access_token_secret oauth_consumer_key, consumer_secret は手動で取得 ブラウザ経由で取得 Boost.勉強会 #3 2010/10/23

access_token が分かっていれば・・・ #define CLOOST_NET_MIN_LIB #include <cloost/twitter.h> #include <iostream> #include <string> int main(int argc, char* argv[]) { std::string consumer_key = "b4TQaZGVzuV99e7Jn02u7w"; std::string consumer_secret = "e9uvcsF7S6mNaLxrsIhXqGwmMMvgNIjMlplXlo42Wo"; std::string access_token = "5397032-rnWGj5qCeKiP8w2bOSYTcHwOqWBhSCViLcYoGcw"; std::string access_token_secret = "bSVRsqa60G4CmK1KgjtQkOVIjVw0PIj1zZHEFz3yMIk"; boost::asio::io_service service; boost::asio::ssl::context ctx(service, boost::asio::ssl::context::sslv23); cloost::twitter::oauth_base session(service, ctx, consumer_key, consumer_secret); session.oauth_token(access_token); session.oauth_token_secret(access_token_secret); cloost::twitter::oauth_base::parameter_map params; clx::uri_encoder f("-._~", false, false); params[“status”] = clx::convert(“Hello, OAuth!”, f); // 実際に呟く cloost::http_response response = session.post("/1/statuses/update.json", params); return 0; } http://github.com/clown/cloost_example/blob/master/example_oauth_base.cpp Boost.勉強会 #3 2010/10/23

ミッション: access_token を取得せよ OAuth 認証の道のり ミッション: access_token を取得せよ request_token を取得する ユーザに認証用 URL を提示する ユーザに認証して 「暗証番号」 を取得してもらう 暗証番号を用いて access_token を取得する Boost.勉強会 #3 2010/10/23

request_token の取得 これだけ parse() は,key1=val1&key2=val2&… と言う文字列を分割 http_response get_request_token() { http_response response = this->post(traits::request_token_path(), parameter_map()); this->parse(response.body()); return response; } http://github.com/clown/cloost/blob/master/oauth.h これだけ parse() は,key1=val1&key2=val2&… と言う文字列を分割 その後,oauth_token, oauth_token_secret キーを取得 この oauth_token キーが request_token と呼ばれるもの Boost.勉強会 #3 2010/10/23

ユーザ認証用 URL の提示 https://twitter.com/oauth/authorize?oauth_t oken={request_token} この URL をブラウザで開いて認証してもらう これが暗証番号 Boost.勉強会 #3 2010/10/23

access_token の取得 パラメータが 3 つ増えている ここで parse() すると access_token が手に入る http_response get_access_token(const string_type& pin) { parameter_map params; params["oauth_verifier"] = pin; http_response response = this->post(traits::access_token_path(), params); this->parse(response.body()); return response; } http://github.com/clown/cloost/blob/master/oauth.h パラメータが 3 つ増えている oauth_verifier, oauth_token, oauth_token_secret oauth_token は request_token oauth_token_secret 以外は,& で連結する ここで parse() すると access_token が手に入る Boost.勉強会 #3 2010/10/23

実際に通信する cloost::twitter::oauth::parameter_map params; params[“status”] = “test”; // テストと呟く http_response response = session.post("/1/statuses/update.json", params); http://github.com/clown/cloost_example/blob/master/example_oauth.cpp おつかれさまでした Boost.勉強会 #3 2010/10/23

xAuth 認証とは? 途中でブラウザ上で認証してもらうのはちょっと・・・ 簡略化しました! パスワード・・・? 暗証番号の代わりにユーザ名/パスワードで認証 パスワード・・・? http_response get_access_token(const string_type& user, const string_type& pass) { parameter_map params; params["x_auth_mode"] = "client_auth"; params["x_auth_username"] = user; params["x_auth_password"] = pass; http_response response = this->post(traits::access_token_path(), params); this->parse(response.body()); return response; } http://github.com/clown/cloost/blob/master/xauth.h xAuth 認証用のパラメータ Boost.勉強会 #3 2010/10/23

Client application is not permitted to use xAuth. 実行してみると・・・ Client application is not permitted to use xAuth. 通信させてくれませんでした Boost.勉強会 #3 2010/10/23

Boost で twitter とやり取りする場合 HTTP (HTTPS) 通信 -> Boost.Asio JSON の解析 -> Boost.PropertyTree Boost で(今のところ多分)実現できないもの HMAC-SHA1 base64 エンコーディング URL 周りのエスケープ Boost.勉強会 #3 2010/10/23

今後の予定 OAuth/xAuth のライブラリをもう少し真面目に作る GUI のサンプル作ってみる cpp-netlib を見てみる いくつか適当にしている箇所が GUI のサンプル作ってみる 結局 twitter クライアントまでたどり着きませんでした>< cpp-netlib を見てみる http://mikhailberis.github.com/cpp-netlib/ Boost に提案予定のネットワークプロトコル・ライブラリ Boost.勉強会 #3 2010/10/23

ご清聴ありがとうございました 今回の説明に使っていたソースコード http://github.com/clown/cloost http://github.com/clown/cloost_example Boost.勉強会 #3 2010/10/23