Whether it's for pleasure or business, or both, Twitter automation is a must for anyone who wants to use Twitter effectively. GoTwitr is a new site whose primary goal is to make it easy for people to grow and manage their Twitter communities.

It’s also a tool to help new Twitter users get started quickly and easily. GoTwitr’s unique invitation model makes it extremely easy for any Twitter user to get his friends and family connected to Twitter. GoTwitr uses a unique new concept to deliver quality followers, and promote you to other twitter users that share common interests and passions.

GoTwitr was built in Drupal 6. Drupal’s external site integration tools made it easy to bypass the normal Drupal registration and login and use the “Login with Twitter” service.

GoTwitr Technology

GoTwitr uses Twitter’s Oauth API, which means the Drupal registration is 100% automated. This is a first for Twitter Automation sites. Using this technology lets you experience all the advanced automation tools without sharing your Twitter username and password with the site (which can be risky).

For the actual Twitter integration, we tested several Drupal Twitter modules, but ended up using Jaisen Mathai’s excellent EpiTwitter and EpiOauth php library. It uses CURL to make calls to Twitter asynchronously, so it was blazingly fast, and very easy to turn into a Drupal custom module.

Why No Drupal Registration or Login Form?

Since GoTwitr is only useful for working with your Twitter account, we decided to fully automate the Drupal login and registration process by using data from Twitter. This means you can register or sign into the GoTwitr website with a single click. To accommodate this process, the following three functions were used.

First, a call is made to twitter_sign_in() which loads our Twitter API keys and sends them to Twitter. The bulk of the work is done in twitter_validate() which is called by Twitter during the Oauth validation. The call to getAccessToken() returns an individual's security tokens from Twitter, and a single call to get_accountVerify_credentials() not only validates you on Twitter, but it returns the complete Twitter user record in the $response variable. Now, with your Twitter UID we can use user_external_load($token->user_id) to see if you are a current Drupal registered user. If you are a current user, you are immediately logged into the site using user_external_login($account), however if this is your first visit a call is made to new_gotw_account() where a Drupal registration is performed on your behalf using the data Twitter sent us in the $response variable.

No Long Registration Form to Fill Out! Yeah!

  
  function twitter_sign_in() {
  	global $user;
  	if ($user->uid) {
  		drupal_goto("home") ;
    } else {
      $consumer_key = variable_get('twitter_consumer_key', '');
      $consumer_secret = variable_get('twitter_consumer_secret', '');
      $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
      drupal_goto($twitterObj->getAuthenticateUrl()) ;	
    }
  }
  
  function twitter_validate() {
 	 global $user;
  
      $consumer_key = variable_get('twitter_consumer_key', '');
      $consumer_secret = variable_get('twitter_consumer_secret', '');
      $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
      $twitterObj->setToken($_GET['oauth_token']);
      $token = $twitterObj->getAccessToken();
      $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
      $response = $twitterObj->get_accountVerify_credentials();
      try {
          $account = user_external_load($token->user_id);
              if (isset($account->uid)) { // current user
                  user_external_login($account);
                  update_gotw_account($response, $token);
              } else {   // new gotwitr user
                  new_gotw_account($response, $token); 
              }
          } catch (EpiException $e) {
          drupal_set_message("Twitter has an error - please try again: " . $e->getMessage());
          twitter_log_error($user->uid, 'TwitterValidate', $e); 
          }
  drupal_goto("homepage");
  }
  
  function new_gotw_account($response, $token) {
  
  global $user;
  $edit = array(
      'name' => $response['screen_name'],
      'pass' => user_password(),
      'init' => $response['screen_name'],
      'status' => 1,
      "authname_twitter" => $token->user_id,
      'access' => time(),
  );
      $account = user_save('', $edit);
      $user = $account;
      insert_gotw_account($response, $token);
  }

Search Engine Optimization

Drupal is also very SEO friendly. To take advantage of Drupal’s SEO features, we integrated the XML Sitemap, Global Redirect, Pathauto, Page Title, and Sitemap modules. We also used the excellent Google Analytics and Google Adsense module to take advantage of Google’s services.

The Need for Speed

Everything related to Twitter eats bandwidth, so we knew site optimization would be important. To keep overhead as low as possible, we used only the Drupal libraries that were absolutely necessary. Next we installed APC so our php would execute faster. Memcached was installed next, and we used the excellent Memcache module to integrate Memcached with Drupal. APC + Memcached = approximately 300% increase in speed.

Drupal may be Fast, but Twitter can be slow

We set a goal to have all pages load in less than a second. But no matter how much caching or query optimization we do, when we use the Twitter API to send a lot of data back and forth between Twitter, it can take some time. For example, our "Smart Follow" routine finds all users that are following you that you are not following back. This is done by first retrieving a list of all Friend and Follower ID from Twitter. We then use array_diff() to find the Twitter IDs that are followers and not friends. The first 30 of these users are then individually retrieved from Twitter for your review.

If you have several thousand friends and followers, then this process can take SEVERAL seconds. We needed an easy way to tell the user that we were busy talking to Twitter. We found a very simple way to do this with the Forms API and a single line of Javascript.

Take a look at the form definition below. First, the submit button has '#attributes' => array('onclick' => "standby();" which tells it to run the standby() js function. Secondly, we have a hidden markup field at the bottom of the form. This contains a big red message that says we are talking to Twitter. This is displayed when the button is pressed, and lets the user know we are busy. The new page loads when the function is complete, which clears the message. Simple, but effective.

 function smart_follow_start_form($form_state) {
  
  $form['markup'] 	= array(
  '#type' => 'markup',
'#value' => '

Smart Follow


Smart Follow is a powerful feature that will analyze all your Twitter Followers and notify you of the ones which you are not following. This function makes numerous Twitter API calls, and may take a few moments to run.
', ); $form['submit'] = array( '#type' => 'submit', '#value' => 'Run Smart Follow', '#attributes' => array('onclick' => "standby();"), ); $form['cancel'] = array( '#type' => 'submit', '#value' => 'Cancel', ); $form['standby'] = array( '#type' => 'markup', '#value' => '

', ); return $form; } // This function is Javascript and is placed in an external js file function standby() { $('#stand_by').css('visibility', 'visible'); }

GoTwitr AHAH!

There are many places on GoTwitr we found that the AHAH capabilities of Drupal 6 added great usability. For example, when you want to send a tweet, it is customary to have the Tweet include a shortened URL. We did not want to reload an entire page to alter one field, so we created an AHAH call to do the URL shortening. When we were initially programming the AHAH code, we found several AHAH examples, but most were very complex. Since this was a pretty simple example of using AHAH, we thought we'd include it for your review.

First, in the form definition for tweet_form, you will see that we have added the AHAH attribute to the submit button. We tell it to call shorten_url_callback() when the button is pressed, and replace the short_text wrapper in the HTML. Next, look at the form field definition for 'tweet'. You'll notice that it's a textarea to hold the text of the tweet, but you also see a #prefix and #suffix which are the wrappers for the AHAH call.

When the user presses the shorten_url button, the shorten_url_callback() is called. This reads the URL from $form_state and calls the URL shortening function. The shortened URL is then appended to the value in the Tweet textarea. Finally, the callback replaces the entire textarea (remember the short_text wrapper) with the modified textarea. Now the shortened URL is appended to the end of their tweet, all done with AHAH without submitting the form.

  
function tweet_form($form_state) {
	
	 $form['tweet'] = array(
    '#type' => 'textarea',
	'#title' => 'Message',
	'#attributes' => array('onkeyup' => "CheckFieldLength(tweet,  'remaining', 140);",
	'onkeydown' => "CheckFieldLength(tweet,  'remaining', 140);",	
	'onmouseout' => "CheckFieldLength(tweet,  'remaining', 140);",
 	'#prefix' => '
', '#rows' => '3', '#cols' => '20', '#suffix' => '
', ); $form['url'] = array( '#type' => 'textfield', '#title' => 'URL', '#size' => 30, ); $form['submit'] = array( '#type' => 'submit', '#value' => 'Send Tweet', ); $form['shorten'] = array( '#type' => 'submit', '#value' => 'Shorten Url', '#suffix' => ' 140
', '#ahah' => array( 'path' => 'shorten_url_callback', 'wrapper' => 'short_text', ), ); return $form; } function shorten_url_callback() { $form_state = array('storage' => NULL, 'submitted' => FALSE); $form_build_id = $_POST['form_build_id']; $form = form_get_cache($form_build_id, $form_state); $args = $form['#parameters']; $form_state['rebuild'] = TRUE; $form_id = array_shift($args); $form_state['post'] = $form['#post'] = $_POST; $form['#programmed'] = $form['#redirect'] = FALSE; drupal_process_form($form_id, $form, $form_state); $short = shorten_url($form_state[values][url]); $myvalue = $form_state[values][tweet] . ' ' . $short; $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id); $output = '
'; print drupal_json(array('status' => TRUE, 'data' => $output)); exit(); }

Drupal Keystroke Counter

With Tweets being limited to 140 characters, we thought it was important to put a Keystroke counter on the Tweet field in the above form. This was easy to accomplish once we found the right Javascript. You may have noticed the extra #attributes added to the textarea above. This calls the CheckFieldLength js code when you type a keystroke into the textarea. Now, look at the definition for the shorten_url button above. You'll see a #suffix that adds a span tag called "remaining". The CheckFieldLength function below, counts the characters remaining, and replaces the text in the span tag.

  

// fieldname,  remainingname, maxchars
function CheckFieldLength(fn,rn,mc) {
  var len = fn.value.length;
  if (len > mc) {
    fn.value = fn.value.substring(0,mc);
    len = mc;
  }
  document.getElementById(rn).innerHTML = mc - len;
}

So What's Unique about GoTwitr?

  • GoTwitr lets you preview everyone you follow or unfollow. Other Twitter automation tools bulk follow people. This unique feature ensures that you get a chance to decide if you want to follow or not. MUCH better than a blind follow based on ANY search result.
  • GoTwitr delivers people to your website. Every invitation accepted will take your recipient to YOUR website, blog, profile, or any other URL.
  • 100% Oauth - You don't have to give away your Twitter password to use all the features of our service. This also provide you with easy sign in and registration.
  • Attract Followers by Invitation, not by bulk following. GoTwitr is the first Twitter application designed to build your community by sending out beautiful HTML invitations to your prospects. You can email, post on a website or blog, or even send invitations to existing Twitter users.
  • Promote your friends. Add your favorite friends to a group, and attach them to your invitations. This way, not only can your invitee follow you, they can also follow all your friends. Establishing an initial Twitter community has never been easier.
  • Plus so much more.....

If you've never heard of Twitter until now then you've been missing out on the newest craze in social networking. It’s time to get started. Go to www.gotwitr.com and have fun.

Happy Tweeting, and GO TWITTER!

GoTwitr.com - Visit GoTwitr Today!

Comments

pushkar’s picture

That is a cool one. OAuth is the next big thing.

Curious to know why you didnt choose the Gigya Socialize module?

phazer’s picture

I installed and evaludated the Gigya Socialize module. They have lots of great features, but they have architected their package to be a middle layer and attached to lots of providers, facebook, twitter, etc. Since this was a total twitter solution, it did not make sense in this instace to have a middle tier interfacing. Twitter is down quite often due to capacity issues, and I ddin't want to introduce another failure point. However, if you're doing an app and need to push data to lots of social netwroks, Socialoze is probbably the best way to go.

Anonymous’s picture

wow, thats amazing the first drupal site i see using oauth in a very nice and fast way.
have to agree, gigya is nice, but it seems clunky, slow and yet still too buggy.
feels like you want to cut out the middleman.
i yet have to understand the purpose of your site though, but i'm sure i will get it shortly :)

thanks for making the code available. can't wait to try it out.

do you plan to release it as a module? that would be epic.

phazer’s picture

I understand your question on what we do. Which means we need to keep improving the UI and landing page.. :) Basically, we do three things on GoTwitr.

1. Provide tools to manage your Twitter followers and friends - For example, smart follow shows you everyone that is following you that you are not following back. Then you can follow them back easily after previewing them. This could take hours on Twitter, but can be done in 15 seconds with GoTwitr. We also have tools to find local twitter users, find users on keyword, etc.

2. Twitter Invitations - This is something we do that no one else does. It lets you send out invitations to people to invite them to your twitter community. Not only can you send out postcard style invitations, you can reccomend your freinds to them as well which lets people setup a Twitter group very easily. Plus, once GoTwitr invitation is complete, they are delievered to YOUR website (which is what most people using Twitter want you to do anyway is look at their website).

3. Twitter Client - This is the least important section of our site since there are dozens of great clients out there. We fielt we needed to let users send tweets, etc. But we do have a nice feature that lets' you see only tweets by your friends, and we let you send a DM to a group which is quite handly.

Thanks for the notes, and I hope you enjoy using our site.

Jim

Anonymous’s picture

In the meantime i registered and it's quite clear what you do.

if i may add:

the site has a very nice design and layout at the frontpage.
But when i login the content that i see looks a bit unformated. thats basically my twitter details and when i create lists. could need some css formating. bit smaller font, etc. to keep up with the nice frotpage design.

AdrianB’s picture

Thanks for providing code examples. It's always nice to "look under the hood" and actual working code is great for learning.

JBI’s picture

Promote your freinds/Promote your frIEnds

Is there a profile ?

phazer’s picture

There is a profile, like on all drupal sites, but it's pretty much un-needed and hidden. All you can modify on the profile is your email :) You can visit your profile by visiting /user after logging in, but since all your profile data is stored on Twitter, we direct people to the Twitter site to manage their profiles. We also have it set so that every time you login, all the profile information is downloaded and refereshed from Twitter, so you will always see your current followers, etc.

bensnyder’s picture

Looks awesome!

Just want to note though that the site could use some typographical enhancements ;)

Summit’s picture

Subscribing, great site, wandering what is exactly drupal out of the box and modules you used and what's not..
greetings, Martijn

phazer’s picture

Programmers can't spell, and editors can't program.... (grin) But we'll find them, thanks for checking out the site.

Anonymous’s picture

Just to let you know, the Oauth process resulted in a FatalException error blah blah blah, though it did complete the process in the background. That didn't look very professional, and combined with the horrid looking (constructive criticism here) adsense and other advertising, plus the also horrid looking 'Welcome to Gotwitr' and features section, PLUS the very cliche RGB style 'Grow twitter with Gotwitr' section, I have trouble imagining this application taking off.

I do, however, understand that it's a new application and all these criticisms are probably already on your to-do list which you're frantically working through.

What I'd like to know though, and I think is much more important than the code for Oauth implementation, is how do you plan to deal with performance issues if the application does go gangbusters i.e. become a favourite of the twitter community? Please understand this is not an attack but an important part of any affiliate supported web application, especially one built on a CMS, and something that I'd like to hear more examples of.

I'd also love to hear the reasoning behind using Drupal for this style of application over some other platform/framework.

Regards

Steve

phazer’s picture

Steve,
Sorry you experienced and Oauth error. Error trapping with Twitter's Over Capacity issues and using Async curl callls is quite a challenge :) Thanks for letting us know that you hit it though, that means we have missed a try / catch loop otherwise you would not see a fatal error.
Give the site a look a little later at night when Twitter is less busy. We tried to make every page load in less than a second, but when we call Twitter's API, we may not get what we expect. (and often don't)

Anonymous’s picture

I'm experienced with the Twitter API and Oauth and yeah obviously you're dealing with a 3rd party source that you can't control.

I would still like to know more about performance though. Considering the nature of your application, I'm sure many Drupalers would love to hear some traffic stats, performance issues so far, potential bottlenecks, server credentials, etc.

This is an area that I only hear anything about from Drupals critics, whereas a fan will just say Drupal is great! It can do anything!.

Regards

Steve

wallbay1’s picture

fantastic job but i am curious what is APC?

sajalsoni’s picture

This is one of the greatest website I have ever seen and worked with. It's really amazing to see the power of Drupal and Twitter together forming the finest community site ever.

I really want to congratulate the owner of the site Mr. Jim Fulford for his amazing concept and work. He has proven again with this site as he did for the http://ipodfitnesscenter.com, another beautiful site in Drupal provided superb flavour of community features with e-commerce.

Although, there are lots of features provided by the gotwitr but I am particularly impressed with the Smart follow and the invitation feature. First one gives us the choice to follow our friends while later one gives us more power and flexibility while sending the invitations to the friend Or group of friends instead of that traditional invitaions with the other community websites. Concept is great which really attract more and more users to the site everytime. There are lot more feature.. plz check the site for the same.

I wish best of luck to the GoTwitr Team. Hope we have some more new concepts in the near future from the team of Jim.

Thanks,

Sajal

Anonymous’s picture

So can we safely assume that you're going to keep with the Drupal trend and not provide any tangible performance statistics or figures, or even comment on this very important aspect at all? Shame because you're really in a great position to do so.

phazer’s picture

Before I talk about performance and scalability, let me mention who and what this site is for. GoTwitr is not for the everyday Twitter user. There are tons of great Twitter Clients out there (TweetDeck, HootSuite, etc.), GoTwitr is designed for a more specific audience - specifically people and/or businesses that want to promote themsevles, their business, or their website by building a strong Twitter community. In this marketspace, it excels beyond all other current offerings in some distinct ways.

-- Why do people put URLs into just about every tweet? Simple, because they want to direct people to their website. When someone accepts a GoTwitr Invitation, not only do they follow the sender, they are also directed to the sender's website (or page) automatically (using drupal_goto).

-- Why do Twitter people follow 100s (or 1000s) or other Twitter users. Because they want them to follow them back. GoTwitr lets you preview everyone before you follow them (unlike other Tiwtter automation tools). In our testing this simple change has resulted in a 45% better follow back ratio. Why? Simple, a quick preview prevents you from following accounts that have not tweeted in 6 months, don't have a bio or photo, or have never even sent a tweet. For example, lets say you have a passion for iPhones and want to attact iPhone users to your community. A keyword search / follow using the keyword 'iphone' makes great sense. But you will find accounts that tweet something like this. "BuyVi - #iphone, #ipod, #windows7, #swineflu - Viagra $1.99 www.xxx.com" They are trolling with keywords hoping to get you to see their ad. With other automation tools you would now be following BuyVi, but GoTwitr prevents this from happening.

So, if your main use for Twitter is to invite your friends to join you for Sushi, then GoTwitr may not be for you, on the other hand, if you own the local Pizza Palace and you want to create a community of every Twitter user living in a 5 mile radius from your store so you can send them weekly coupons, and announce speical events ---- GoTiwtr can build this community for your FAST.

Now back to performace. This app was not designed to send out millions of Tweets for millions of Twitter users, it was designed to make very complex community building tasks simple, quick, and easy for the 1000s of people wanting to build a strong and profitable Twitter community. With this in mind we did several things to make sure it had good performance and would be scalable.

First, we installed a new dedicated server for GoTwiter. We selected a dual core xxl package from 1and1 as shown here. http://order.1and1.com/xml/order/ServerPremiumDualCoreXXL;jsessionid=423...
We liked this packaged due to 8GB of RAM and fast dual processors (2x AMD Opteron 2216 HE). They also have 100MB connection to the backbone as a standard feature which was important to us since we were going to be make 1000s and 1000s of API calls to twitter every day.

Next we installed APC and Memcache to lower our CPU load and increase performace. Our site has only been open 2 weeks, and we have over 1000 users, but CPU utilization is still below 1% (peak is only about 5%). But this will change as more users come on.

We also tested Twitter communications using a few different technologies. In our testing Async Curl was the fastest by far.

Query and Page Optimization - It is my belief that most bottlenecks in today's programs are not hardware or platform related, but are due to poor design and coding. During a typical GoTwitr sesssion, we may run 1000s of queries on an indiviuals behalf - so we spend a good deal of time on query optimization. For example, on smart invite, we look at all your followers, see if you have ever sent them an invitation in the past, see if they are already using GoTwitr, etc. If you have 1000s of followers and ran a query for each, it could take some time. We do it with 1 smart mysql query, so the results appear to be instantaneous to the user. We LOVE the devel module for it easy assistance in optimizing queries. But more importantly, we start with a good normalized database design and build from there.

A Drupal Downside (or upside) - Drupal has a module for just about everything... This makes is a great building block for applications, but also it can easily become a crutch for developers. We reccomend using only the modules you need. For example, one of our inistal drupal challenges was in having a dynamic URL for every user as their default invitaiton. For example. www.gotwitr.com/jim_fulford will pull up my invitation. On a php only site, we would probably have built this into our index.php logic, but we don't like to ever hack core. So we needed another way to send people to a personalized page based on a database lookup. During our initial development we solved this problem by using the custom_error module. This had hooks to run php code for pages that did not exist. So when someone would visit www.gotwitr.com/jim_fulford the custom_error would process this as a 404 not found, and then send them to our new page that would handle the lookup with jim_fulford being passed as arg(1). This worked, but was a lot of code that was un-needed. So we found we could remove the custom_error module and replace it with 3 lines of code.

function redirect() {
   $path = $_REQUEST['destination'];
   unset($_REQUEST['destination']);
   drupal_goto('go/'. $path);
}

These 3 lines of code would take www.gotwitr.com/jim_fulford and redirect it to www.gotwtir.com/go/jim_fulford.
This worked well, and used only a few lines of code instead of a much larger module with features we did not need. It is SO easy for us Drupal coders to have dozens of modules on a site, and then find out we have an entire custom module for displaying 1 block, or even a huge (but fantastic) module like Views to display a block or page that could be created with just a few lines of code. Don't bloat your site with lots of modules, this slows things down. Use just the ones you need, and optimze the ones that are used 95% of the time.

In answer to the question, why Drupal - versus another platfom? I've written sites in Classic ASP, dot.net, Cold Fusion, pure PHP, and a few other platforms. I find that my Drupal sites continue to improve due to the Drupal community constantly improving not only on the Drupal core, but also on Drupal themes and modules. I have sites that I have written in pure PHP that have not changed in 4 years. I don't have a Drupal site that doe not get updated every month. Like all applications, we will deal with scalabilty issues when an if they arrive. It is always easy to throw hardware at a problem, but tight code with good optimization is an important foundation to create for any applicaiton.

Drupal is Great Community Plumbing, and a great tool for working with Twitter - another Great Community.

Anonymous’s picture

Excellent. Thanks for giving us some real figures which are bound to help give people an idea about the performance capabilities of different systems and coding styles.

I especially like that you've mentioned about building elegant code and optimising/customising rather than just adding bulk modules. I think the biggest crime is when inexperienced people are led to believe that using Drupal and filling it full of bulky modules has no impact on performance. This is especially ridiculous for affiliate supported sites, when revenue is directly linked to the 'cost' of loading each page.

I'd certainly like to hear more about gotwitr's growth over the next few weeks/months in regards to average daily visits and performance issues, if any arise. Will you be blogging about the progress? or twittering?

Regards

Steve

phazer’s picture

APC is Alternative PHP Cache - you can read about it here - http://us.php.net/manual/en/book.apc.php

also check out the Drupal discussion - http://groups.drupal.org/node/23914

APC basically is an Op Code cache for php. Really has nothing to do with Drupal, it compiles your php scripts and then serves the pages without having to complie the page on each load. There are other op code caches, I installed APC based on reccomendations on stability of several of the others.

pampo’s picture

That simply seems to ROCK !
pompe a chaleur

NikLP’s picture

What would be really nice is if you could package up the Twitter/OAuth integration into a package that could go into drupal.org contrib. We already have modules for both Twitter AND OAuth, but there's no integration between these as yet. I know a few people, myself included, who are desperately seeking this feature.

Anonymous’s picture

The trick is to introduce that functionality in a way that doesn't split existing modules into further divided groups. I haven't looked at either modules but I'd say the OAuth module would have to stay separate and independent of any individual service (like twitter) in order to maximise it's user-base, lest it wither and die, and then the twitter connect module be built/modified to require it, or simply use it if available (not that you'd ever want to create twitter integration that asks for a password).

Regards

Steve

NikLP’s picture

I meant a new module called twitter_oauth or something, not some evil hybrid bastard code that lives in one of the existing ones. That would be awful :) Although this is in fact already a requested feature on the twitter module... It belongs there if indeed it *does* belong in one of those modules.

ipsitamishra’s picture

I would say your website is a great show piece in the Drupal Showcase. You have covered all the aspect of your site very nicely. I was looking for how to do Twitter Oauth integration so that my site users can login with their Twitter account. Your article is a timely help. :)

And thanks for sharing the Code snippets, they are really helpful.

Hey, I registered at your site too. :)

Warmly,

JayNL’s picture

... but that's one ugly website. Typography is terrible, text spacing is missing, font-size increase on hover is annoying as well, and the piece of code above contains HTML to simply cry about.

Doesn't look at all trustworthy or professional to me, sorry.

Oh and font tags? Where have you been the last 4 years?

Furthermore about all paddings are off. On this page: http://www.gotwitr.com/content/grow-your-twitter-community-automatically... (which is a URL that's a PITA to share over e-mail or IM) the left column is just plain ugly and positioned in a strange way. also you don't see that those are links, because they're normal white fonts.

The adbanners are sad. Nuff said.

The pop-out menu on left top doesn't align with its parent link

Don't link to pages which I'm not allowed to see, or at least use LoginToBoggan.module to catch such links and redirect to a login page. All links on the bible of text on the homepage lead to a 'not allowed' page, which is motivation #1 to just leave your site.

Don't like one single thing of your site, sorry.

phazer’s picture

Wow Jay, I'm Sorry you don't like it - I guess my design skills aren't up to standard. Keep Coding....
JF

NikLP’s picture

Let's try and make the feedback more constructive. Here's an article I wrote about making those 403's a bit more friendly, among other things! :)

http://www.kinetasystems.com/blog/creating-custom-error-pages-in-drupal

Anonymous’s picture

The point is, a twitter_oauth module would be confined to use (and thereby upkeep) by only the people that are using twitter AND OAuth, and nothing else. To keep these modules survivable, you'd have to concentrate on keeping one implementation of the OAuth functionality, that can be used with plugin modules for specific implementation (twitter).

You're suggesting having an OAuth, Twitter, then OAuth + Twitter module. This will, best case scenario, result in a huge dilution of interest and motivation, which means lower quality coding all round, huge confusion for people investigating solutions (v bad for Drupal in general), and if you're lucky, only one lot of modules will wither and die.

OAuth is a standard, and not a complicated one either. It should be built so that anything needing an OAuth authentication can be covered with a simple contrib module.

Regards

Steve

Anonymous’s picture

Sorry that was meant to be a reply to NikLP. Don't know what happened there.

Jay August is right though....

For such an ambitious idea, the appearance/layout/html/type lets the site down in such a fundamental way. A huge part of making good internet is knowing what you can do yourself, and what you need to out source. So maybe you should have stuck to the development, and just paid a thousand dollars or so to have a theme/design wizard go over it (I'd be getting that done right now if I was you).

And the ads... Let me ask you a question. Do you have some marketing data that indicates that your twitter demographic consists largely of joint pain suffering amazon shoppers?? Off the top of my head I'd say that twitter users are much more likely to shop straight from the apple web-store than from Amazon, and would hardly be taken in by a ugly, 90's style ad for an unnamed cure for joint pain.

The best ad you have there is your 1&1 affiliate link. It seems to fit with the twitter demographic better than the others, and probably pays a good rate too right?

Now it's all well and good to ask that we provide 'constructive criticism', but pretty much everyone so far sounds like they're seeing a couple's ugly baby for the first time. "Oh how amazing!!!!! This is awesome!! I can't wait to one as nice as yours!!" Exclamation mark exclamation mark.

This isn't a baby though. It's a web-application, with a place and purpose, a concept and a plan and especially for a community oriented site, usability and UI comfort is integral. You think the users are going to care how nice the OAuth implementation is? Or how much of a good example of Drupal's strengths this is?

I hope the developer/owner/team can get on top of these neglected aspects of the site, and then we'd see some good internet.

Regards

Steve

JayNL’s picture

that's very, very well said. Your English is way better than mine, so expressing yourself must be easier ;)

And I tried logging in with Twitter oauth, and I got this dirty error:


Fatal error: Uncaught exception 'EpiTwitterException' with message '{"text":"An exception occurred in EpiTwitter","response":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\">\n<html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" lang=\"en\" xml:lang=\"en\">\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\" \/>\n <meta http-equiv=\"Content-Language\" content=\"en-us\" \/>\n <title>Twitter \/ Error<\/title>\n <link href=\"http:\/\/s.twimg.com\/images\/favicon.ico\" rel=\"shortcut icon\" type=\"image\/x-icon\" \/>\n\n <style type=\"text\/css\">\n \/* Page\n ----------------------------------------------- *\/\n * { border: 0; padding: 0; margin: 0; }\n body{ margin: 10px 0; background:#C0DEED url(http:\/\/s.twimg.com\/images\/bg-clouds.png) repeat-x; color:#333; font: 12px Lucida Grande, Arial, sans-serif; text-align:center }\n #container { width: 755px; margin: 0 auto; in /var/www/vhosts/gotwitr.com/httpdocs/sites/all/modules/phpTwit/EpiTwitter.php on line 184

Phazer, you might wanna have a look at that :)

phazer’s picture

Steve,
That is good feedback and is appreciated. We updated the ads which does look cleaner. We'll check with some skinners that have the design skills to clean up the HTML / CSS. However, our primary goal is to get people who use the site to grow their Twitter communities easily and professionally. We took great pains to make sure people would not use our site to spam or slam the twitter api, and also tried to deliver better tools than are available elsewhere.
The feedback we most appreciate is from users that are using it every day and asking for enhancments like....
- Can you let me schedule tweets.
- Can you provide me URL tracking and reporting.
- Can you let me purge more than 30 users at a time.... etc.

Like most inventors, we created something that we needed ourselves and could not find a tool that fit the need just right. We built it with Drupal becuase we love Drupal, and we shared it with the Drupal community because we appreciate the Drupal community.

GoTwitr Version 2 will have more features, look better, run faster, and hopefully meet the needs of more users. But like most things in life, we have to focus on the 80/20 rule. I saw Zig Ziglar in Jacksonville today, he's 83 now and still sharing his motivational and inspirational words. (From Zig)
- Get in the game
- Smile more (I liked this)
- Set Goals
- Help Other People reach their goals.

Drupal Comm does that pretty well....

JF

Dubber Dan’s picture

I've just used the site to purge a load of people and have to say that's the easiest solution I've found for that to date.

But, the site is really in need of attention to the design and typography. I'd concentrate on sorting that out before adding new features.

ipsitamishra’s picture

As many of them commented about the appearance of the site, anyone looking at the pages can say that it needs a lot of improvement. At many places the images are stretched and blurred. On home page itself the "Tweet image in third column" (http://www.gotwitr.com/images/tweet_img_main.jpg) is given a width/height value unnecessarily, which is stretching up the image. :p

At my first visit I had a sense that the site is launched before it's completely ready. But just a bit surprised to see no improvement after that.

kevinsteger’s picture

This is exactly the kind of "sign on with twitter" functionality I would like for a drupal site I am doing. I have not done anything outside of modules with Drupal and I have some concerns before I attempt this.

Just to be clear. Is this what is needed to do this?

1) Install EpiTwitter and EpiOauth.
2) Replace the Drupal login "stuff" with the functions you provided above?

Thanks for any tips you have for a noob. I'm a little confused on this.

Also.. I'd like to add a vote for making this a module that replaces the Drupal login with a Twitter oAuth. I think you'll find the audience far bigger than you thought.

cerup’s picture

I agree.

Releasing the twitter registration/login module that you created would be a great addition to the drupal community and probably something that would be standard for a lot of drupal developers. The current twitter module is too heavy and buggy and what you've done is much simpler and effective.

Is there any chance you would release 'sign in with twitter' as it's own module? The provided code in this article is missing a decent amount of information and therefore providing the module would be a better contribution to the community.

cerup’s picture

Any updates on this? Would you be able to provide the module?