/projecte eclipse/TI/data/2012-documentos/76/2012-76-067.html
HTML | 406 lines | 391 code | 11 blank | 4 comment | 0 complexity | 7d0a723e09a31a4784a78ec22ef4021e MD5 | raw file
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
- <head profile="http://gmpg.org/xfn/11">
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>Twitter API Tutorial: Hello Twitter OAuth with PHP</title>
- <meta name="robots" content="noodp, noydir" />
- <meta name="description" content="This is the simplest possible path to using Twitter OAuth with PHP. It’s not that mysterious once you have all the steps in one place." />
- <link rel="stylesheet" href="http://140dev.com/wordpress/wp-content/themes/thesis_18/style.css?021612-154927" type="text/css" media="screen, projection" />
- <link rel="stylesheet" href="http://140dev.com/wordpress/wp-content/themes/thesis_18/custom/layout.css?021612-155018" type="text/css" media="screen, projection" />
- <!--[if lte IE 8]><link rel="stylesheet" href="http://140dev.com/wordpress/wp-content/themes/thesis_18/lib/css/ie.css?021612-155037" type="text/css" media="screen, projection" /><![endif]-->
- <link rel="stylesheet" href="http://140dev.com/wordpress/wp-content/themes/thesis_18/custom/custom.css?021612-155017" type="text/css" media="screen, projection" />
- <link rel="canonical" href="http://140dev.com/twitter-api-programming-tutorials/hello-twitter-oauth-php/" />
- <link rel="alternate" type="application/rss+xml" title="140dev RSS Feed" href="http://140dev.com/feed/" />
- <link rel="pingback" href="http://140dev.com/wordpress/xmlrpc.php" />
- <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://140dev.com/wordpress/xmlrpc.php?rsd" />
- <link href="/blog_images/140dev_logo_favicon.jpg" rel="shortcut icon">
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
- </script>
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js">
- </script>
- <script type="text/javascript" src="/wordpress/js/blog.js">
- </script>
- <script type="text/javascript" src="http://platform.twitter.com/widgets.js">
- </script>
- <script src="http://w.sharethis.com/button/buttons.js" type="text/javascript">
- </script></head>
- <body class="custom hello-twitter-oauth-php">
- <div id="container">
- <div id="page">
- <div style="padding-left: 1.1em;">
- <p style="float:left;"><a href="/" alt="Homepage of 140dev Twitter API Consulting" title="Homepage of 140dev Twitter API Consulting"><img style="margin-right: 4px; margin-bottom: 4px;" src="/blog_images/140dev_logo_icon.jpg"><img src="/blog_images/140dev_logo.png" /></a></p>
- <p style="float:right;width: 288px;text-align: right;color:#555;font-size:12px;margin-right:11px;">
- <span><b>Adam Green</b></span><br/>
- <span>Twitter API Consultant</span><br/>
- <a href="mailto:140dev@gmail.com"><span>140dev@gmail.com</span></a><br/>
- <span>781-879-2960</span><br/>
- <a href="https://twitter.com/intent/user?screen_name=140dev"><span>@140dev</span></a>
- </p>
- </div> <div id="header">
- <form method="get" class="search_form" action="http://140dev.com/">
- <p>
- <input class="text_input" type="text" value="To search, type and hit enter" name="s" id="s" onfocus="if (this.value == 'To search, type and hit enter') {this.value = '';}" onblur="if (this.value == '') {this.value = 'To search, type and hit enter';}" />
- <input type="hidden" id="searchsubmit" value="Search" />
- </p>
- </form>
- <p id="logo"><a href="http://140dev.com">140dev</a></p>
- <p id="tagline">Twitter API Programming Tips, Tutorials, Source Code Libraries and Consulting by Adam Green</p>
- <div style="font-size:0px;height:8px;line-height:8px;border-bottom:3px solid #888;"></div> </div>
- <ul class="menu">
- <li class="tab tab-home"><a href="http://140dev.com">Blog</a></li>
- <li class="tab tab-1 current-parent"><a href"http://140dev.com/twitter-api-programming-tutorials/" title="Twitter API Programming Tutorials">Tutorials</a></li>
- <li class="tab tab-2"><a href="http://140dev.com/free-twitter-api-source-code-library/" title="140dev Twitter Framework">Free Source Code</a></li>
- <li class="tab tab-3"><a href="http://140dev.com/twitter-api-consulting/" title="Hire Adam Green for Twitter API Consulting">Consulting</a></li>
- <li class="tab tab-4"><a href="http://140dev.com/adam-green-resume/" title="Adam Green’s Resume">Adam Green’s Resume</a></li>
- </ul>
- <div class="sidebar_tweetbox tweetbox">
- <textarea id="tweet_text">Tweet or Search here...</textarea>
- <div id="tweet_text_actions" style="display: none;">
- <a id="search_button" href="#" style="float: left;margin-left: 8px;">
- <img border="0" src="/blog_images/search-button.gif" style="margin-bottom: -6px; border: 0px none;">
- </a>
- <span id="tweet_length">140</span>
- <a id="tweet_button" target="_blank" href="http://twitter.com/intent/tweet?related=140dev,140elect,2012twit,140townhall,4more&text=.%40140elect%20">
- <img border="0" src="/blog_images/tweet.png" style="margin-bottom: -6px; border: 0px none;">
- </a>
- </div>
- </div> <div id="content_box">
- <div id="content">
- <div class="post_box top" id="post-941">
- <div class="headline_area">
- <h1>Twitter API Tutorial: Hello Twitter OAuth with PHP</h1>
- </div>
- <div class="format_text">
- <p><em>All of the files mentioned in this tutorial are available as a <a href="http://140dev.com/download/hello_oauth.zip">downloadable zip file</a>.</em></p>
- <p>New <strong>Twitter API developers</strong> approach <strong>OAuth</strong> with a great deal of fear, but it really isn’t that bad, especially if all you need to do is have a server based application communicate directly with the Twitter API. I think the real problem is the way Twitter HQ tries to <a href="http://dev.twitter.com/pages/auth">explain OAuth</a>, especially this amazing diagram:</p>
- <p><img src="http://140dev.com/tutorial_images/oauth_diagram.png" border="1"></p>
- <p><strong>Twitter OAuth programming</strong> doesn’t have to be anywhere near this complex. This tutorial will take you through all the steps you need to follow for any <strong>PHP application</strong> that has to send API requests directly from a Web server on behalf of a single Twitter account. This includes things like tweeting, following, list management, and practically all of the API calls. It’s true that building a full Twitter client that represents many users is more complex, although nothing as frightful as the diagram above, but one server talking to Twitter about one account is easy. </p>
- <h2>Registering a new application</h2>
- <p>You need to create an application before you can communicate with the Twitter API through OAuth. The great thing is that there is no approval process for Twitter applications. You just fill out a simple online form and your application is created. Here are the steps you follow:
- <ol>
- <li>Log into the Twitter account that your application will be working with. This is the Twitter account that will receive tweets, automated follows or any other changes through the API. Even if you just want to extract data about other users without altering this account, you must use an application tied to a valid Twitter account. For this tutorial I’ll register an app for the account @140devdemo, which I use for API programming tests. </li>
- <li>Go to the Twitter developer site at <a href="http://dev.twitter.com">http://dev.twitter.com</a>.
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_1.png" border="1"></p>
- </li>
- <li>Click the link to register an application.
- </li>
- <li>You will see a form that lets you describe the app.
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_2.png" border="1"></p>
- <p>For an application that uses a server script to connect to a single Twitter account you only need to fill out a few of these fields:
- <ul>
- <li>First give the application a name. If you are going to be tweeting through this app, the name is very important, since it will appear as the source of every tweet. You’ve seen this before for tweets sent by clients like Tweetdeck.</li>
- <li>The description field must also be filled out. What you enter here isn’t that important for this type of app. This message appears when someone gives approval for this app to access their account from a Web page. We aren’t writing that type of app here, so enter any kind of descriptive message you want. </li>
- <li>The application website field is used along with the name to create the source link on each tweet created by this app. This is a valuable form of promotion, because when you send a tweet through this app anyone who sees it can click the source link to visit your site. </li>
- <li>You can leave the organization field blank, leave the application field set to its default value of Browser, and leave the callback URL field blank. </li>
- <li>You should set the default access type field to read & write. That will give your app the greatest flexibility.</li>
- <li>The application icon isn’t needed, again because nobody will be signing up with this app through the Web.
- <li>Then you just have to fill in the captcha, and click the register button.</li>
- </ul>
- <li>After a short delay, very short for anyone who has tried getting an app approved for the iPhone or Facebook, you will be presented with an information page for this app. There are some important pieces of data we need from this page. </li>
- </ol>
- <h2>Collecting your OAuth keys</h2>
- <p>An OAuth connection requires four key values called tokens and secrets. The application is identified by a token and a secret, and each user it represents also has a token and secret. I’m not going to go into the theory behind all of these values. If you wanted a bunch of theory, you wouldn’t be reading this tutorial, would you? And frankly, I don’t want to understand the theory myself. I do know that you must tell the Twitter API, “I am this app, acting on behalf of this user,” and these four values let you do that. </p>
- <p>Each application created for Twitter is automatically assigned these four values, and all you have to do is copy them from the right pages, and paste them into your script in the right places. To preserve an air of mystery, Twitter spreads out the values between two pages, because putting them in one place would make it too easy. Also, just to add even more confusion, the names of these four values tend to change randomly in different parts of the docs and interface. So follow very, very closely. </p>
- <p>First we get the consumer OAuth values. These represent the Twitter account that is being changed by your Twitter API calls. Since you registered your app while logged in to this account, Twitter automatically gives you its values. The trick is finding them. </p>
- <p>I registered this test app for the @140devdemo account, so I can find the values on the application’s OAuth Settings page. This page appears immediately after the app is registered. You can always get back to this page by going to <a href="http://dev.twitter.com">http://dev.twitter.com</a> while logged into the app’s Twitter account, clicking the link for Your Apps on the top menu, and then clicking the name of the application. Look for the part of the page that looks like this:</p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_3.png" border="1"></p>
- <p>I’ve blacked out part of these values for secrecy. You should never share your account’s OAuth values, because then people could do nasty things to you. Copy these values and put them in a safe place. Make sure you write down which is the key and which is the secret.</p>
- <p>Next we have to get the application’s OAuth values. To find these we look for the following set of links on the top right of this OAuth Settings page:</p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_4.png" border="1"></p>
- <p>Clicking the link for My Access Token will reveal the next two values we need:</p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_5.png" border="1"></p>
- <p>Again, I’ve blacked out part of them. These should also be copied and saved. Believe me, it gets a lot easier now. But let me take a short digression. I once had a great science teacher in high school who always said that when you read a book that is very confusing it is because the author was confused. I have to believe the Twitter people who designed their OAuth system were confused. There is no reason this whole process must be so byzantine. You have to laugh when contrasting it with the original conception of Twitter itself. Anyway, now we can move on to some programming, which is why you came here in the first place. </p>
- <h2>Getting a Twitter OAuth library</h2>
- <p>There are several good <a href="http://dev.twitter.com/pages/oauth_libraries#php">PHP libraries for OAuth</a>, but if you are just starting out, I recommend the one by <a href="https://github.com/themattharris/tmhOAuth">Matt Harris</a>. I’ve also used Abraham Williams’ library, but it is more of a wrapper for the entire Twitter API. If all you want is a library that makes the OAuth connection for you, and then gets out of your way, start with Matt’s. It’s what I use in my own code. </p>
- <p>All you have to do is <a href="https://github.com/themattharris/tmhOAuth/archives/master">download</a> the compressed files, extract them, and upload them to your server. Then you can include or require the single library script, and create a connection by passing in the OAuth values. Calling the Twitter API with this connection means pulling out the right details from the Twitter API docs, which is much simpler than wrestling with the OAuth docs. </p>
- <h2>Decoding the Twitter API docs</h2>
- <p>We’ll be posting tweets as the example for this tutorial, so let’s move to the <a href="http://dev.twitter.com/doc/post/statuses/update">Twitter docs</a> for this function. API calls are REST URLs, and there is only one portion of the URL we need. </p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_7.png" border="1"></p>
- <p>The version is always 1, at least until version 2 of the Twitter API appears, and the format is set to JSON by default in Matt’s library. Twitter HQ has made it very clear that XML is being phased out in favor of JSON throughout the API. So all we need is the specific part of the API call that applies to tweeting. In this case it is “statuses/update”. </p>
- <p>Next we need the request type, which is either GET or POST. In this case it is POST. </p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_11.png" border="1"></p>
- <p>Finally, we have to find the parameter names for this API call. These are passed with their values to the OAuth connection in an array. The parameter for the tweet text is “status”. </p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_10.png" border="1"></p>
- <h2>Simple tweeting script</h2>
- <p>At last we can write a script to <strong>post tweets through OAuth</strong>. I’ve written it as a function, <code>post_tweet()</code>, so you can include this script, and call the function in your own code. </p>
- <table><tr><td class="line_numbers"><pre>1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- </pre></td><td class="code"><pre><?php
- /**
- * post_tweet.php
- * Example of posting a tweet with OAuth
- * Latest copy of this code:
- * http://140dev.com/twitter-api-programming-tutorials/hello-twitter-oauth-php/
- * @author Adam Green <140dev@gmail.com>
- * @license GNU Public License
- */
-
- $tweet_text = 'Hello Twitter';
- print "Posting...\n";
- $result = post_tweet($tweet_text);
- print "Response code: " . $result . "\n";
-
- function post_tweet($tweet_text) {
-
- // Use Matt Harris' OAuth library to make the connection
- // This lives at: https://github.com/themattharris/tmhOAuth
- require_once('tmhoauth/tmhOAuth.php');
-
- // Set the authorization values
- // In keeping with the OAuth tradition of maximum confusion,
- // the names of some of these values are different from the Twitter Dev interface
- // user_token is called Access Token on the Dev site
- // user_secret is called Access Token Secret on the Dev site
- // The values here have asterisks to hide the true contents
- // You need to use the actual values from Twitter
- $connection = new tmhOAuth(array(
- 'consumer_key' => '******',
- 'consumer_secret' => '******',
- 'user_token' => '******',
- 'user_secret' => '******',
- ));
-
- // Make the API call
- $connection->request('POST',
- $connection->url('1/statuses/update'),
- array('status' => $tweet_text));
-
- return $connection->response['code'];
- }
- ?></pre></td></tr></table>
- <p>You can see from the script that the API response code is available after the call in the connection object as <code>$connection->response['code']</code>. This is either 200 for a successful request, or one of the many possible <a href="http://dev.twitter.com/pages/responses_errors">error codes</a>. </p>
- <p>You can also get the data returned by the API with <code>$connection->response['response']</code>. In the case of a tweet, the response returned is a complete tweet object, just as if you had looked up the tweet from a user’s timeline. </p>
- <h2>Running the test script</h2>
- <p>Post_tweet.php is meant to be used directly from a server, not a Web page. Here is what it looks like when run from a Linux server. </p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_8.png" border="1"></p>
- <p>The Twitter API returned a response code of 200, which means the tweet request was successful. Looking in the @140devdemo account shows the new tweet. Notice that the source listed for the tweet is the same as the name I gave the application. Clicking this source text will open the URL assigned to the application. </p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_6.png" border="1"></p>
- <p>Let’s test the app by running it again. </p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_9.png" border="1"></p>
- <p>This time a 403 code was returned. This is an error code that can have many meanings, but in general it means that the API request was rejected. In this case that is because Twitter doesn’t allow duplicate tweets. </p>
- <p>Now you can include the post_tweet.php script in your own code and pass a string to <code>post_tweet()</code> to have it tweeted. By extracting the proper segment of any API call and getting the right parameter name, as shown above, you can construct equally simple wrapper functions for any part of the Twitter API.</p>
- <h2>Applying this code to other API calls</h2>
- <p>Still a little confused how to map API docs into actual PHP code? This handy, dandy map should help:</p>
- <p><img src="http://140dev.com/tutorial_images/hello_twitter_oauth_12.png" border="1"></p>
- <h2>Download the tutorial files</h2>
- <p>If you want to try out this sample code yourself, you can download this <a href="http://140dev.com/download/hello_oauth.zip">zip file</a> with a copy of the Matt Harris OAuth library and the post_tweet.php script. </p>
- </div>
- </div>
- </div>
- <div id="sidebars">
- <div id="sidebar_1" class="sidebar">
- <ul class="sidebar_list">
- <li id="text-5" class="widget widget_text"><img src="/blog_images/AdamGreen.jpg" style="margin-bottom: 5px; float: left; margin-right: 12px;"><h3 style="font-size:15px;margin-top: 0px;">Hire Adam Green to Develop Custom Twitter Solutions</h3>
- <div class="textwidget">Contact Adam for a free initial consultation
- <br/> by phone at (781) 879-2960
- <br/> or email at <a style="color:#000;text-decoration:none;" href="mailto:140dev@gmail.com">140dev@gmail.com</a>
- <br/> <a href="http://140dev.com/twitter-api-consulting"><u>Learn More</u></a></div>
- </li><li style="height: 30px;"><h3 style="float: left; margin-left: 48px;margin-bottom:0px;">Our Projects</h3><div id="change_proj"><div id="prev_proj"></div><div id="next_proj"></div></div></li>
- <li id="text-9" class="widget widget_text">
- <div id="our_projects" style="">
- <div class="project proj1">
- <b>2012twit</b><br>
- <span><a href="http://2012twit.com" target="_blank">Real-Time Tracking of the 2012 Election</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://2012twit.com" target="_blank"><img src="/blog_images/2012twit_290.png"></a></p>
- </div>
- <div class="project proj2">
- <b>DirectSnap</b><br>
- <span><a href="http://ows.140elect.com/tweet_stats.php">College Football Recruiting</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://directsnap.com/" target="_blank"><img src="/blog_images/directsnap.png"></a></p>
- </div>
- <div class="project proj3">
- <b>2012GOP</b><br>
- <span><a href="http://140elect.com/twitter-political-apps/2012gop-mobile-app/">Follow GOP candidates fighting for <br>the 2012 Presidential Election on Twitter!</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://itunes.apple.com/app/2012gop/id464587875"><img style="border: 0px none;" src="/blog_images/AppStore_290.png"></a></p>
- </div>
- <div class="project proj4">
- <b>This Or That</b><br>
- <span><a href="http://thisrth.at">A fun way to watch a real-time comparison between any two topics on Twitter.</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://thisrth.at" target="_blank"><img src="/blog_images/thsrtht_thumb.png"></a></p>
- </div>
- <div class="project proj5">
- <b>140townhall</b><br>
- <span><a href="http://140townhall.com" target="_blank">The First Presidential Debate on Twitter</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://140townhall.com" target="_blank"><img src="/blog_images/140townhall_290.png"></a></p>
- </div>
- <div class="project proj6">
- <b>Donate Tweets</b><br>
- <span><a href="http://140elect.com/tweet_stats.php">Donate One Tweet a Day to Buddy Roemer 2012</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://buddyroemer.com/node/327/" target="_blank"><img src="/blog_images/donate_tweets_275.png"></a></p>
- </div>
- <div class="project proj7">
- <b>140elect</b><br>
- <span><a href="http://140elect.com/tweet_stats.php">Twitter Campaigns for the 2012 Election - <br/>Tools, Metrics, and Strategy</a></span>
- <p style="text-align: center; margin-top: 8px;"><a href="http://140elect.com/" target="_blank"><img src="/blog_images/140elect_290.png"></a></p>
- </div>
- </div>
- </li>
- <h3 style="">Testimonials</h3>
- <div style="margin-bottom:12px;" id="testimonials">
- <blockquote style="padding-left:12px;">“I have worked with a ton of developers over the years, and the guys at 140dev are as good as it gets. They built exactly what I asked them to, got it done quickly, and communicated consistently throughout the process. Equally impressive was the fact that they took the time up front to explain many of limitations and opportunities with the Twitter API, which not only helped me refine my project, but saved me a considerable amount of time. I hope to work with them again and can not recommend them highly enough."</blockquote>
- <p style="text-align:right;margin-bottom:16px;"><b>- <a href="https://twitter.com/intent/user?screen_name=justinfeinstein">Justin Feinstein</a>, <a target="_blank" href="http://thisrth.at">http://thisrth.at</a></b></p>
- <blockquote style="padding-left:12px;">“Adam and the 140 Dev team are more than just developers. They take ownership over the project in an effort to produce the highest quality code and end-product for users. Their knowledge of the Twitter API, overall system architecture and web-based interface design is top notch. We would highly recommend the 140 Dev team and will be using them on future projects."</blockquote>
- <p style="text-align:right;"><b>- <span>Kevin Duffey</span>, <a target="_blank" href="http://directsnap.com">http://directsnap.com</a></b></p>
- </div> <li class="widget widget_recent_entries" id="recent-posts-3"> <h3>Recent Blog Posts</h3> <ul>
- <li><a href="http://140dev.com/twitter-api-programming-blog/initial-impressions-of-rackspaces-cloud-servers/" title="Initial impressions of Rackspace’s cloud servers">Initial impressions of Rackspace’s cloud servers</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/dealing-with-tweet-bursts/" title="Dealing with tweet bursts">Dealing with tweet bursts</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/tutorial-identifying-the-best-accounts-for-following/" title="Twitter API Tutorial: Identifying the best Twitter accounts for following">Twitter API Tutorial: Identifying the best Twitter accounts for following</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/secrets-of-a-donated-tweet-system/" title="Secrets of a donated tweet system">Secrets of a donated tweet system</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/screening-a-tweet-stream-for-quality-control/" title="Screening a tweet stream for quality control">Screening a tweet stream for quality control</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/exceeding-the-search-api-rate-limit/" title="Exceeding the search API rate limit">Exceeding the search API rate limit</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/dealing-with-500-errors-when-retrieving-user-data/" title="Dealing with 500 errors when retrieving user data">Dealing with 500 errors when retrieving user data</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/new-iphone-app-based-on-the-2012twit-database/" title="New iPhone app based on the 2012twit database">New iPhone app based on the 2012twit database</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/collecting-ows-tweets-with-the-140dev-framework/" title="Collecting #OWS tweets with the 140dev framework">Collecting #OWS tweets with the 140dev framework</a></li>
- <li><a href="http://140dev.com/twitter-api-programming-blog/primer-for-automated-twitter-engagement/" title="Primer for Automated Twitter Engagement">Primer for Automated Twitter Engagement</a></li>
- </ul>
- </li><li class="widget widget_text" id="text-6"><h3>Recent Twitter API Programming Tutorials</h3> <div class="textwidget"><a href="http://140dev.com/twitter-api-programming-blog/tutorial-identifying-the-best-accounts-for-following/" title="Identifying the best Twitter accounts for following">Identifying the best Twitter accounts for following</a><br /><br /><a href="http://140dev.com/twitter-api-programming-tutorials/hello-twitter-oauth-php/" title="How to post tweets with Twitter OAuth and PHP">Hello Twitter OAuth with PHP</a><br /><br /><a href="http://140dev.com/twitter-api-programming-tutorials/identifying-influential-twitter-users/" title="Identifying influential Twitter users">Identifying influential Twitter users</a><br /><br />
- <a href="http://140dev.com/twitter-api-programming-tutorials/aggregating-tweets-search-api-vs-streaming-api/" title="Twitter Search API vs. Streaming API">Aggregating tweets: Search API vs. Streaming API</a><br /><br />
- <a href="http://140dev.com/twitter-api-programming-tutorials/making-aggregated-tweets-visible-to-google-seo/" title="Making aggregated tweets visible to Google for SEO">Making aggregated tweets visible to Google for SEO</a><br /><br />
- <a href="http://140dev.com/twitter-api-programming-tutorials/twitter-api-database-cache/" title="Advantages of a Twitter API database cache">Advantages of a Twitter API database cache</a></div>
- </li><li class="widget widget_categories" id="categories-3"><h3>Blog Categories</h3> <ul>
- <li class="cat-item cat-item-20"><a href="http://140dev.com/twitter-api-programming-blog/category/140dev-source-code/" title="View all posts filed under 140dev Source Code">140dev Source Code</a>
- </li>
- <li class="cat-item cat-item-43"><a href="http://140dev.com/twitter-api-programming-blog/category/api-error/" title="View all posts filed under API error">API error</a>
- </li>
- <li class="cat-item cat-item-29"><a href="http://140dev.com/twitter-api-programming-blog/category/automated-following/" title="View all posts filed under Automated following">Automated following</a>
- </li>
- <li class="cat-item cat-item-14"><a href="http://140dev.com/twitter-api-programming-blog/category/automated-tweets/" title="View all posts filed under Automated Tweets">Automated Tweets</a>
- </li>
- <li class="cat-item cat-item-34"><a href="http://140dev.com/twitter-api-programming-blog/category/church-of-twitter/" title="View all posts filed under Church of Twitter">Church of Twitter</a>
- </li>
- <li class="cat-item cat-item-10"><a href="http://140dev.com/twitter-api-programming-blog/category/consulting-tips/" title="View all posts filed under Consulting Tips">Consulting Tips</a>
- </li>
- <li class="cat-item cat-item-26"><a href="http://140dev.com/twitter-api-programming-blog/category/custom-twitter-client/" title="View all posts filed under Custom Twitter Client">Custom Twitter Client</a>
- </li>
- <li class="cat-item cat-item-13"><a href="http://140dev.com/twitter-api-programming-blog/category/data-mining-tweets/" title="View all posts filed under Data Mining Tweets">Data Mining Tweets</a>
- </li>
- <li class="cat-item cat-item-15"><a href="http://140dev.com/twitter-api-programming-blog/category/database-cache/" title="View all posts filed under Database Cache">Database Cache</a>
- </li>
- <li class="cat-item cat-item-40"><a href="http://140dev.com/twitter-api-programming-blog/category/education/" title="View all posts filed under Education">Education</a>
- </li>
- <li class="cat-item cat-item-16"><a href="http://140dev.com/twitter-api-programming-blog/category/wordpress/" title="View all posts filed under Integrating Twitter with Wordpress">Integrating Twitter with Wordpress</a>
- </li>
- <li class="cat-item cat-item-42"><a href="http://140dev.com/twitter-api-programming-blog/category/iphone-app/" title="View all posts filed under iPhone app">iPhone app</a>
- </li>
- <li class="cat-item cat-item-33"><a href="http://140dev.com/twitter-api-programming-blog/category/msm-on-twitter/" title="View all posts filed under MSM on Twitter">MSM on Twitter</a>
- </li>
- <li class="cat-item cat-item-39"><a href="http://140dev.com/twitter-api-programming-blog/category/phirehose/" title="View all posts filed under Phirehose">Phirehose</a>
- </li>
- <li class="cat-item cat-item-44"><a href="http://140dev.com/twitter-api-programming-blog/category/quality-control/" title="View all posts filed under Quality Control">Quality Control</a>
- </li>
- <li class="cat-item cat-item-9"><a href="http://140dev.com/twitter-api-programming-blog/category/rate-limits/" title="View all posts filed under Rate Limits">Rate Limits</a>
- </li>
- <li class="cat-item cat-item-18"><a href="http://140dev.com/twitter-api-programming-blog/category/sales-leads/" title="View all posts filed under Sales Leads">Sales Leads</a>
- </li>
- <li class="cat-item cat-item-17"><a href="http://140dev.com/twitter-api-programming-blog/category/search-api/" title="View all posts filed under Search API">Search API</a>
- </li>
- <li class="cat-item cat-item-45"><a href="http://140dev.com/twitter-api-programming-blog/category/server-configuration/" title="View all posts filed under Server configuration">Server configuration</a>
- </li>
- <li class="cat-item cat-item-7"><a href="http://140dev.com/twitter-api-programming-blog/category/streaming-api/" title="View all posts filed under Streaming API">Streaming API</a>
- </li>
- <li class="cat-item cat-item-35"><a href="http://140dev.com/twitter-api-programming-blog/category/the-future-of-twitter/" title="View all posts filed under The future of Twitter">The future of Twitter</a>
- </li>
- <li class="cat-item cat-item-22"><a href="http://140dev.com/twitter-api-programming-blog/category/the-next-wave/" title="View all posts filed under The next wave">The next wave</a>
- </li>
- <li class="cat-item cat-item-28"><a href="http://140dev.com/twitter-api-programming-blog/category/truthytweets/" title="View all posts filed under Truthytweets">Truthytweets</a>
- </li>
- <li class="cat-item cat-item-8"><a href="http://140dev.com/twitter-api-programming-blog/category/tweet-aggregation/" title="View all posts filed under Tweet Aggregation">Tweet Aggregation</a>
- </li>
- <li class="cat-item cat-item-25"><a href="http://140dev.com/twitter-api-programming-blog/category/tweet-display/" title="View all posts filed under Tweet Display">Tweet Display</a>
- </li>
- <li class="cat-item cat-item-32"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-advertising/" title="View all posts filed under Twitter Advertising">Twitter Advertising</a>
- </li>
- <li class="cat-item cat-item-31"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-analytics/" title="View all posts filed under Twitter Analytics">Twitter Analytics</a>
- </li>
- <li class="cat-item cat-item-4"><a href="http://140dev.com/twitter-api-programming-blog/category/tutorials/" title="View all posts filed under Twitter API Tutorials">Twitter API Tutorials</a>
- </li>
- <li class="cat-item cat-item-5"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-developers/" title="View all posts filed under Twitter Developers">Twitter Developers</a>
- </li>
- <li class="cat-item cat-item-23"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-ecosystem/" title="View all posts filed under Twitter Ecosystem">Twitter Ecosystem</a>
- </li>
- <li class="cat-item cat-item-41"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-engagement-campaign/" title="View all posts filed under Twitter Engagement Campaign">Twitter Engagement Campaign</a>
- </li>
- <li class="cat-item cat-item-11"><a href="http://140dev.com/twitter-api-programming-blog/category/marketing/" title="View all posts filed under Twitter Marketing">Twitter Marketing</a>
- </li>
- <li class="cat-item cat-item-27"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-oauth/" title="View all posts filed under Twitter OAuth">Twitter OAuth</a>
- </li>
- <li class="cat-item cat-item-24"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter_politics/" title="View all posts filed under Twitter Politics">Twitter Politics</a>
- </li>
- <li class="cat-item cat-item-36"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-seo/" title="View all posts filed under Twitter SEO">Twitter SEO</a>
- </li>
- <li class="cat-item cat-item-37"><a href="http://140dev.com/twitter-api-programming-blog/category/twitter-server-errors/" title="View all posts filed under Twitter Server Errors">Twitter Server Errors</a>
- </li>
- <li class="cat-item cat-item-1"><a href="http://140dev.com/twitter-api-programming-blog/category/uncategorized/" title="View all posts filed under Uncategorized">Uncategorized</a>
- </li>
- <li class="cat-item cat-item-21"><a href="http://140dev.com/twitter-api-programming-blog/category/user-ranking/" title="View all posts filed under User Ranking">User Ranking</a>
- </li>
- </ul>
- </li> </ul>
- </div>
- </div>
- </div>
- <div id="footer">
- <p>© 2010 by 140 Dev, LLC</p> </div>
- </div>
- </div>
- <!--[if lte IE 8]>
- <div id="ie_clear"></div>
- <![endif]-->
- <script type="text/javascript">
-
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-19021021-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-
- </script>
- </body>
- </html>