@twitterapi at socialapp workshop
DESCRIPTION
Presented 24 July 2010 at the Heroku Offices, San FranciscoTRANSCRIPT
![Page 1: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/1.jpg)
TM
Saturday, July 24, 2010
![Page 2: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/2.jpg)
TM
@twitterapi
@herokuJuly 24, 2010
#appworkshop @themattharris @heroku
Saturday, July 24, 2010
![Page 3: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/3.jpg)
TM
About us
Saturday, July 24, 2010
![Page 4: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/4.jpg)
TM
The team
Saturday, July 24, 2010
![Page 5: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/5.jpg)
TM
@themattharrisAbout me
Saturday, July 24, 2010
![Page 6: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/6.jpg)
TM
What is ? The Twitter Platform
Saturday, July 24, 2010
![Page 7: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/7.jpg)
TM
What is ? ‣ REST API
‣ provides the “basic” Twitter functionality - tweet, follow, etc.
‣ all functions available on your timeline on twitter.com
‣ Search API
‣ real-time search index
‣ get “top tweets” / relevant search results
‣ Streaming API
‣ HTTP long-poll connection
‣ tweets come out of the system in real-time
Saturday, July 24, 2010
![Page 8: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/8.jpg)
TM
Limits‣ 350 API calls/hour using OAuth against api.twitter.com
‣ Unauthenticated it goes against the source IP address
‣ Authenticated it goes against the calling user
‣ “Natural” limits on
‣ number of tweets sent
‣ number of DMs sent
‣ number of followings / unfollowings
‣ Status limits
‣ No duplicate tweets
‣ No malware links in tweets
Saturday, July 24, 2010
![Page 9: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/9.jpg)
TM
dev.twitter.comThe developer portal
Saturday, July 24, 2010
![Page 10: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/10.jpg)
TM
Creating an appYour own small playground
Saturday, July 24, 2010
![Page 11: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/11.jpg)
TM
Saturday, July 24, 2010
![Page 12: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/12.jpg)
TM
Saturday, July 24, 2010
![Page 13: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/13.jpg)
TM
Saturday, July 24, 2010
![Page 14: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/14.jpg)
TM
Browsing docs
Saturday, July 24, 2010
![Page 15: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/15.jpg)
TM
Saturday, July 24, 2010
![Page 16: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/16.jpg)
TM
Saturday, July 24, 2010
![Page 17: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/17.jpg)
TM
Saturday, July 24, 2010
![Page 18: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/18.jpg)
TM
OAuthpocalypseThe day is 30th June 16th August 2010
Saturday, July 24, 2010
![Page 19: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/19.jpg)
TM
What you need to know‣ All applications must be using OAuth for the REST API
‣ Streaming API will still support Basic Auth
‣ Search API has no auth
‣ Replace curl with twurl for debugging
http://dev.twitter.com/pages/auth_overview
http://github.com/marcel/twurl
Saturday, July 24, 2010
![Page 20: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/20.jpg)
TM
OAuth Methods‣ Web must use three legged OAuth
‣ Desktop and mobile apps can also use out-of-band OAuth
‣ Some desktop and mobile apps will be considered for xAuth
Saturday, July 24, 2010
![Page 21: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/21.jpg)
TM
xAuth not XAuth
xAuth is OAuth
http://dev.twitter.com/pages/xauth
Saturday, July 24, 2010
![Page 22: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/22.jpg)
TM
Check your host!
api.twitter.com
twitter.com
Saturday, July 24, 2010
![Page 23: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/23.jpg)
TM
Libraries
http://dev.twitter.com/pages/oauth_libraries
ActionScript/FlashC/C++C#/.NETClojureErlangJavaJavaScript
Objective-C/Cocoa & iPhone ProgrammingPerlPHPPythonQtRubyScala
Saturday, July 24, 2010
![Page 24: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/24.jpg)
TM
twurl‣ http://github.com/marcel/twurl
‣ Command line tool to interact with using OAuth
‣ Transparently handles OAuth signing against
‣ POST and GET data
‣ Trace requests
Saturday, July 24, 2010
![Page 25: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/25.jpg)
TM
Timelines
Saturday, July 24, 2010
![Page 26: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/26.jpg)
TM
Timeline Endpoints‣ /1/statuses/public_timeline
‣ /1/statuses/home_timeline
‣ /1/statuses/friends_timeline
‣ /1/statuses/user_timeline
‣ /1/statuses/mentions
‣ /1/statuses/retweeted_by_me
‣ /1/statuses/retweeted_to_me
‣ /1/statuses/retweets_of_me
Saturday, July 24, 2010
![Page 27: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/27.jpg)
TM
Modifiers‣ include_rts
Accepted values: true, 1, t
Saturday, July 24, 2010
![Page 28: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/28.jpg)
TM
Modifiers‣ include_rts
‣ include_entities
Accepted values: true, 1, t
Saturday, July 24, 2010
![Page 29: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/29.jpg)
TM
Modifiers‣ include_rts
‣ include_entities
‣ trim_user
Accepted values: true, 1, t
Saturday, July 24, 2010
![Page 30: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/30.jpg)
TM
Geo
Saturday, July 24, 2010
![Page 31: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/31.jpg)
TM
Endpoints‣ /1/geo/search
‣ /1/geo/similar_places
‣ /1/geo/reverse_geocode
‣ /1/geo/id/:id
‣ /1/geo/place
Saturday, July 24, 2010
![Page 32: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/32.jpg)
TM
Create a place‣ /1/geo/search
‣ show what’s nearby
‣ /1/geo/similar_places
‣ not found in search, find by name
‣ /1/geo/place
‣ still not found, create a new place
http://api.twitter.com/1/geo/place
Saturday, July 24, 2010
![Page 33: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/33.jpg)
TM
Get location (if allowed)
Saturday, July 24, 2010
![Page 34: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/34.jpg)
TM
Get location (if allowed)
Saturday, July 24, 2010
![Page 35: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/35.jpg)
TM
/1/geo/search - suggest nearby
Saturday, July 24, 2010
![Page 36: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/36.jpg)
TM
/1/geo/search - suggest nearby
Saturday, July 24, 2010
![Page 37: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/37.jpg)
TM
/1/geo/similar_places - find by name
Saturday, July 24, 2010
![Page 38: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/38.jpg)
TM
/1/geo/similar_places - find by name
Saturday, July 24, 2010
![Page 39: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/39.jpg)
TM
/1/geo/place - not it? create it
Saturday, July 24, 2010
![Page 40: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/40.jpg)
TM
Technical Info ...‣ /1/geo/similar_places
‣ must run this first to get a creation_token
Saturday, July 24, 2010
![Page 41: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/41.jpg)
TM
Technical Info ... ], "full_name": "Twitter HQ, San Francisco", "place_type": "poi" } ], "token": "36179c9bf78835898ebf521c1defd4be" }, "query": { "url": "http://api.twitter.com/1/geo/similar_places.json?query=&contained_within=&lat=37.7821120598956&accuracy=&autocomplete=&long=-‐122.400612831116&granularity=&name=Twitter", "type": "similar_places",
Saturday, July 24, 2010
![Page 42: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/42.jpg)
TM
More Info... Check outbit.ly/twitter-api-geo
Saturday, July 24, 2010
![Page 43: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/43.jpg)
TM
@anywhere
Saturday, July 24, 2010
![Page 44: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/44.jpg)
TM
Core Features‣ Hovercards
‣ Tweet Box
‣ Follow Buttons
‣ Linkify
‣ Connect with Twitter
Saturday, July 24, 2010
![Page 45: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/45.jpg)
TM
Easiest Example
<head> <script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"> </script> <script type="text/javascript"> twttr.anywhere(function(T) { T.hovercards(); T("#follow-placeholder").followButton('themattharris'); T("#tbox").tweetBox(); }); </script> </head>
Saturday, July 24, 2010
![Page 46: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/46.jpg)
TM
Easiest Example
<head> <script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"> </script> <script type="text/javascript"> twttr.anywhere(function(T) { T.hovercards(); T("#follow-placeholder").followButton('themattharris'); T("#tbox").tweetBox(); }); </script> </head>
Saturday, July 24, 2010
![Page 47: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/47.jpg)
TM
Easiest Example
<head> <script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"> </script> <script type="text/javascript"> twttr.anywhere(function(T) { T.hovercards(); T("#follow-placeholder").followButton('themattharris'); T("#tbox").tweetBox(); }); </script> </head>
Saturday, July 24, 2010
![Page 48: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/48.jpg)
TM
Easiest Example
<head> <script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"> </script> <script type="text/javascript"> twttr.anywhere(function(T) { T.hovercards(); T("#follow-placeholder").followButton('themattharris'); T("#tbox").tweetBox(); }); </script> </head>
Saturday, July 24, 2010
![Page 49: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/49.jpg)
TM
Easiest Example
<head> <script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"> </script> <script type="text/javascript"> twttr.anywhere(function(T) { T.hovercards(); T("#follow-placeholder").followButton('themattharris'); T("#tbox").tweetBox(); }); </script> </head>
Saturday, July 24, 2010
![Page 50: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/50.jpg)
TM
More Info... Check outbit.ly/anywhere-begin
Saturday, July 24, 2010
![Page 51: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/51.jpg)
TM
Bridge Code@anywhere to api.twitter.com
Saturday, July 24, 2010
![Page 52: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/52.jpg)
TM
Overview
‣ Use connect with Twitter
‣ Hook into authComplete
‣ Send the bridge code to your server
‣ Exchange the bridge code using /oauth/access_token
‣ Verify
Saturday, July 24, 2010
![Page 53: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/53.jpg)
TM
Use connect with Twitter
T("#connect-placeholder").connectButton({ authComplete: function(user, bridge_code) { $.post('/mypage.php', { 'bridge_code' : bridge_code }); }});
Saturday, July 24, 2010
![Page 54: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/54.jpg)
TM
Hook into authComplete
T("#connect-placeholder").connectButton({ authComplete: function(user, bridge_code) { $.post('/mypage.php', { 'bridge_code' : bridge_code }); }});
Saturday, July 24, 2010
![Page 55: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/55.jpg)
TM
Hook into authComplete
T("#connect-placeholder").connectButton({ authComplete: function(user, bridge_code) { $.post('/mypage.php', { 'bridge_code' : bridge_code }); }});
Saturday, July 24, 2010
![Page 56: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/56.jpg)
TM
Send to your server
T("#connect-placeholder").connectButton({ authComplete: function(user, bridge_code) { $.post('/mypage.php', { 'bridge_code' : bridge_code }); }});
Saturday, July 24, 2010
![Page 57: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/57.jpg)
TM
Exchange the bridge code
‣ POST to https://api.twitter.com/oauth/access_token
‣ Parameter is oauth_bridge_code
‣ Sign with your applications consumer token and secret
Saturday, July 24, 2010
![Page 58: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/58.jpg)
TM
Exchange the token - PHP
$http->request( 'POST', 'https://api.twitter.com/oauth/access_token', array( 'oauth_bridge_code' => $_REQUEST['bridge_code'] ));
Saturday, July 24, 2010
![Page 59: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/59.jpg)
TM
Verify
‣ Using the user tokens call /1/account/verify_credentials.json
‣ Generate the signature sha1( user_id + consumer_secret )
‣ Compare the signature with the cookie value in twitter_anywhere_identity
Saturday, July 24, 2010
![Page 60: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/60.jpg)
TM
Streaming APINear-Realtime Access to Public Statuses
Saturday, July 24, 2010
![Page 61: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/61.jpg)
TM
Streaming API‣ A persistent connection to Twitter servers
‣ Get pushed a tweet that matches your predicate in “real-time”
‣ Server to server integrations
Saturday, July 24, 2010
![Page 62: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/62.jpg)
TM
Basic Usage‣ Curl with Basic Auth or Twurl with OAuth
‣ One connection per username permitted
http://stream.twitter.com/1/statuses/sample.json
Saturday, July 24, 2010
![Page 63: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/63.jpg)
TM
Follow some users‣ Curl with Basic Auth or Twurl with OAuth
‣ One connection per username permitted
‣ Pass up to 400 user_ids, comma seperated
http://stream.twitter.com/1/statuses/filter.json
Saturday, July 24, 2010
![Page 64: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/64.jpg)
TM
Filter by keyword‣ Curl with Basic Auth or Twurl with OAuth
‣ One connection per username permitted
‣ Pass up to 200 keywords, comma seperated
‣ Example: Twitter will return statuses which contain: TWITTER, twitter, "Twitter", twitter., #twitter and @twitter
http://stream.twitter.com/1/statuses/filter.json
Saturday, July 24, 2010
![Page 65: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/65.jpg)
TM
Streaming API - Default Level‣ 200 x Keywords
‣ 400 x Follow userids
‣ 10 x 1-degree location boxes
Saturday, July 24, 2010
![Page 66: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/66.jpg)
TM
More Info... Check outbit.ly/streaming_api
Saturday, July 24, 2010
![Page 67: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/67.jpg)
TM
Stay Informed... Joinbit.ly/twitter-anywhere-talkbit.ly/twitter-dev-talk
Important [email protected]/twitter-api-announce
Saturday, July 24, 2010
![Page 68: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/68.jpg)
TM
Help... Check outdev.twitter.com
Saturday, July 24, 2010
![Page 69: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/69.jpg)
TM
Questions? Follow us attwitter.com/twitterapitwitter.com/themattharris
Saturday, July 24, 2010
![Page 70: @twitterapi at SocialApp Workshop](https://reader035.vdocument.in/reader035/viewer/2022081519/555a88ffd8b42a98568b52e6/html5/thumbnails/70.jpg)
TM
Saturday, July 24, 2010