Slide 1

Slide 1 text

#twitterflight

Slide 2

Slide 2 text

October 22, 2014 #twitterflight Connecting to the Pulse of the Planet

Slide 3

Slide 3 text

Romain Huet Developer Advocate @romainhuet

Slide 4

Slide 4 text

271M+ 500M+ Active Users Tweets per Day 2006 2014

Slide 5

Slide 5 text

Twitter is global,
 open and real-time

Slide 6

Slide 6 text

Twitter is the shortest distance between @you and your #interests

Slide 7

Slide 7 text

Twitter is there at
 world events

Slide 8

Slide 8 text

Twitter is the pulse
 of the planet

Slide 9

Slide 9 text

How can you use Twitter Data
 to power your apps?

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Data Platform

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

Twitter APIs deal both with the
 right now and what happened

Slide 16

Slide 16 text

Streaming APIs allow you to ingest what’s happening right now

Slide 17

Slide 17 text

Streaming APIs let you ingest what’s happening right now POST https://stream.twitter.com/1.1/statuses/filter.json Returns Tweets matching your criteria. Data follow: 3946301
 track: #twitterflight
 locations: 2.1733,41.3633,2.1933,41.4033 language: fr

Slide 18

Slide 18 text

Streaming APIs let you ingest what’s happening right now GET https://stream.twitter.com/1.1/statuses/sample.json Returns ~1% of all firehose data, statistically relevant. GET https://stream.twitter.com/1.1/statuses/firehose.json Returns all firehose data, requires business deal.

Slide 19

Slide 19 text

Streaming APIs let you ingest what’s happening right now {"created_at":"Sun Dec 01 21:44:59 +0000 2013","id":407264085194330112,"id_str":"407264085194330112","text":"\u201c@DM_Minions: The minion mobile! http:\/\/t.co\/Tq8AQoXcVy\u201d shall I get it, @CourtneyLouu \ud83d\ude0f\ud83d\ude18","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a \u003e","truncated":false,"in_reply_to_status_id":407263303405023232,"in_reply_to_status_id_str":"407263303405023232","in_reply_to_user_id": 948825632,"in_reply_to_user_id_str":"948825632","in_reply_to_screen_name":"DM_Minions","user":{"id": 404024178,"id_str":"404024178","name":"emilyjade","screen_name":"_emilyjade","location":"","url":null,"description":"'what is essential, is invisible to the eye'","protected":false,"followers_count":156,"friends_count":287,"listed_count":0,"created_at":"Thu Nov 03 10:18:49 +0000 2011","favourites_count": 379,"utc_offset":null,"time_zone":null,"geo_enabled":true,"verified":false,"statuses_count": 8506,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"EBEBEB","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme7\/ bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme7\/bg.gif","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/ profile_images\/378800000811908687\/bc82e20db7c7812a1f61f72998f948e9_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/378800000811908687\/ bc82e20db7c7812a1f61f72998f948e9_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/404024178\/ 1385914936","profile_link_color":"990000","profile_sidebar_border_color":"DFDFDF","profile_sidebar_fill_color":"F3F3F3","profile_text_color":"333333","profile_use_background_image":true,"def ault_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":{"type":"Point","coordinates": [51.35264663,-1.15710757]},"coordinates":{"type":"Point","coordinates":[-1.15710757,51.35264663]},"place":{"id":"d009bfdb11c20f3e","url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/ d009bfdb11c20f3e.json","place_type":"city","name":"Basingstoke and Deane","full_name":"Basingstoke and Deane, Hampshire","country_code":"GB","country":"United Kingdom","contained_within": [],"bounding_box":{"type":"Polygon","coordinates":[[[-1.4601689999999998,51.133537999999994],[-1.4601689999999998,51.383949],[-0.9748119999999999,51.383949], [-0.9748119999999999,51.133537999999994]]]},"attributes":{}},"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions": [{"screen_name":"DM_Minions","name":"DespicableMe Minions","id":948825632,"id_str":"948825632","indices":[1,12]},{"screen_name":"CourtneyLouu","name":"coourts","id": 43456930,"id_str":"43456930","indices":[73,86]}],"media":[{"id":407263303325335552,"id_str":"407263303325335552","indices":[33,55],"media_url":"http:\/\/pbs.twimg.com\/media\/ Babj0QzCQAAMrX4.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/Babj0QzCQAAMrX4.jpg","url":"http:\/\/t.co\/Tq8AQoXcVy","display_url":"pic.twitter.com\/ Tq8AQoXcVy","expanded_url":"http:\/\/twitter.com\/DM_Minions\/status\/407263303405023232\/photo\/1","type":"photo","sizes":{"small":{"w":339,"h":236,"resize":"fit"},"large":{"w":958,"h": 666,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":599,"h":417,"resize":"fit"}},"source_status_id": 407263303405023232,"source_status_id_str":"407263303405023232"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en"} {"created_at":"Sun Dec 01 21:44:59 +0000 2013","id":407264086347747328,"id_str":"407264086347747328","text":"@DannyArratoon already eaten it but you can bring me another one?","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id": 407263944844533761,"in_reply_to_status_id_str":"407263944844533761","in_reply_to_user_id":210579473,"in_reply_to_user_id_str":"210579473","in_reply_to_screen_name":"DannyArratoon","user": {"id":495068253,"id_str":"495068253","name":"eleanor","screen_name":"ell_eysselinck","location":"london","url":null,"description":null,"protected":false,"followers_count": 430,"friends_count":345,"listed_count":0,"created_at":"Fri Feb 17 15:23:34 +0000 2012","favourites_count":3934,"utc_offset": 0,"time_zone":"London","geo_enabled":true,"verified":false,"statuses_count": 7800,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/ 635582704\/nud5dpj44ngj5bgv5k55.jpeg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/635582704\/ nud5dpj44ngj5bgv5k55.jpeg","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/378800000812022272\/ b0218f45cb51525440be4f5782aaba6b_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/378800000812022272\/ b0218f45cb51525440be4f5782aaba6b_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/495068253\/ 1378837388","profile_link_color":"EB091C","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"def ault_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":{"type":"Point","coordinates": [51.37097685,-0.21992044]},"coordinates":{"type":"Point","coordinates":[-0.21992044,51.37097685]},"place":{"id":"8840213b5fc1032a","url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/ 8840213b5fc1032a.json","place_type":"city","name":"Sutton","full_name":"Sutton, London","country_code":"GB","country":"United Kingdom","contained_within":[],"bounding_box": {"type":"Polygon","coordinates":[[[-0.24586899999999998,51.321324999999995],[-0.24586899999999998,51.393378999999996],[-0.117306,51.393378999999996], [-0.117306,51.321324999999995]]]},"attributes":{}},"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions": [{"screen_name":"DannyArratoon","name":"Danny","id":210579473,"id_str":"210579473","indices":[0,14]}]},"favorited":false,"retweeted":false,"filter_level":"medium","lang":"en"} {"created_at":"Sun Dec 01 21:44:59 +0000 2013","id":407264087085953025,"id_str":"407264087085953025","text":"@brontemaria22 #firstin","source":"\u003ca href=\"http:\/\/twitter.com\/download \/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id": 407262865251643392,"in_reply_to_status_id_str":"407262865251643392","in_reply_to_user_id":771468884,"in_reply_to_user_id_str":"771468884","in_reply_to_screen_name":"brontemaria22","user": {"id":442104599,"id_str":"442104599","name":"zolf","screen_name":"FleurMarie32","location":"","url":null,"description":null,"protected":false,"followers_count":360,"friends_count": 238,"listed_count":0,"created_at":"Tue Dec 20 19:13:40 +0000 2011","favourites_count":563,"utc_offset":null,"time_zone":null,"geo_enabled":true,"verified":false,"statuses_count":

Slide 20

Slide 20 text

Anatomy of a Tweet { "created_at": "Wed Oct 02 15:53:43 +0000 2013", "id": 385432417126739968, "id_str": "385432417126739968", "text": "Learn more about the powerful #Linux container engine @docker in this video intro with @solomonstre - http:\/\/t.co\/QJLdA1762Y @TwitterOSS", "source": "web", "truncated": false, "in_reply_to_status_id": null, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_user_id_str": null, "in_reply_to_screen_name": null, "user": { "id": 1665823832, "id_str": "1665823832", "name": "Twitter University", "screen_name": "university", "location": "", "description": "Building a culture of learning for @TwitterEng and the world at large", "url": "http:\/\/t.co\/c8IHJLE1Y8", "entities": { "url": { "urls": [{ "url": "http:\/\/t.co\/c8IHJLE1Y8", "expanded_url": "http:\/\/youtube.com\/twitteruniversity", "display_url": "youtube.com\/twitterunivers\u2026",

Slide 21

Slide 21 text

"favorite_count": 25, "entities": { "hashtags": [{ "text": "Linux", "indices": [30, 36] }], "symbols": [], "urls": [{ "url": "http:\/\/t.co\/QJLdA1762Y", "expanded_url": "http:\/\/youtu.be\/Q5POuMHxW-0", "display_url": "youtu.be\/Q5POuMHxW-0", "indices": [102, 124] }], "user_mentions": [{ "screen_name": "docker", "name": "Docker", "id": 1138959692, "id_str": "1138959692", "indices": [54, 61] }, { "screen_name": "solomonstre", "name": "Solomon Hykes", "id": 9551792, "id_str": "9551792", "indices": [87, 99] }, { "screen_name": "TwitterOSS", "name": "Twitter Open Source", "id": 376825877, "id_str": "376825877", "indices": [125, 136] }] }, "favorited": false, "retweeted": true, "possibly_sensitive": false, "lang": "en" }

Slide 22

Slide 22 text

143,199
 Tweets per second 5,700 TPS on average

Slide 23

Slide 23 text

REST APIs let you perform actions and access what happened

Slide 24

Slide 24 text

REST APIs let you perform actions and access what happened Tweets & Media GET statuses/lookup POST statuses/update POST media/upload Timelines GET statuses/home_timeline GET statuses/user_timeline GET statuses/mentions_timeline Search GET tweets/search Following GET friends/list And many more: Users, Favorites, Direct Messages, Followers, Lists, Trends, Geo, Spam Reporting…

Slide 25

Slide 25 text

Demo #twitterflight

Slide 26

Slide 26 text

+

Slide 27

Slide 27 text

+

Slide 28

Slide 28 text

Mobile Platform

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

Fabric Sample App Cannonball Open source for iOS & Android:
 
 github.com/twitterdev

Slide 32

Slide 32 text

NodeCopter.com

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

Demo #twitterflight

Slide 35

Slide 35 text

Sign In with Twitter and Digits @IBAction func signInWithTwitter(sender: UIButton) { Twitter.sharedInstance().logInWithCompletion { (session: TWTRSession!, error: NSError!) -> Void in if session != nil { // Save any useful data from the Twitter session, // then move to the next view controller. } } } @IBAction func signInWithPhone(sender: UIButton) { Digits.sharedInstance().authenticateWithCompletion { (session: DGTSession!, error: NSError!) -> Void in if session != nil { // Save any useful data from the Digits session, // then move to the next view controller. } } }

Slide 36

Slide 36 text

Adding a Tweet View to the View Controller override func viewDidLoad() { super.viewDidLoad() // Request the Twitter API. Twitter.sharedInstance().APIClient.loadTweetWithID(tweetId, completion: { (tweet: TWTRTweet!, error: NSError!) -> Void in // Build the Tweet view. self.tweetView = TWTRTweetView(tweet: tweet, style: .Regular) // Add the Tweet view to the main view. self.view.addSubview(self.tweetView) }) }

Slide 37

Slide 37 text

Sharing a Tweet with the Tweet Composer @IBAction func postTweet(sender: AnyObject) { // Use the TwitterKit to create a Tweet composer. let composer = TWTRComposer() // Prepare the Tweet text with drone commands. composer.setText(droneCommands) // Present the composer to the user. composer.showWithCompletion({ (result: TWTRComposerResult!) -> Void in if result == .Cancelled { println("Tweet composition cancelled") } else { println("Tweeting commands to the drone!") } }) }

Slide 38

Slide 38 text

Displaying Tweets in a Table View override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // Retrieve the Tweet cell. let cell = tableView.dequeueReusableCellWithIdentifier(tweetTableCellReuseIdentifie r, forIndexPath: indexPath) as TWTRTweetTableViewCell // Assign the delegate to control events on Tweets. cell.tweetView.delegate = self // Retrieve the Tweet model object from the array of loaded Tweets. let tweet = tweets[indexPath.row] // Configure the cell with the Tweet. cell.configureWithTweet(tweet) // Return the Tweet cell. return cell }

Slide 39

Slide 39 text

Thank You