DABR Twitter Web Client Mini Blog Yo Mama Jokes Sports Bookmarklets About Us

November 24, 2009

More DABR Goodness: Unshortening Short URLs



 

I’m loving DABR – makes me want to find a way to load XAMPP on my phone. Anyways I’ve made a few more tweaks to my codebase recently. Inspired by this Terrence Eden post…:Expanding URLs in Dabr / Twitter – Terence Eden’s Blog

I hate shortened URLs with a passion. It makes it hard to see what a link is and whether I’ve visited it before. If they fail – like tr.im threatened to do – you lose your links with no way to see where they once went.

So, hurrah for LongURLPlease – a service which takes those horrid little links and turns them in to full sized URLs.

…I went about implementing this longurl scheme and having the long URL show in the tweet. But to make it so that it the tweet isn’t dominated by a 600 character URL (and reduce some of the benefit of short URLs) I figured I could try to make it only display the domain name of each link while still keeping the actual link in the HTML – much like they do at slashdot. Easy peasy, I thought. Just uncomment the LONGURL_KEY in config.php and move the gwt code from the twitter_parse_links_callback function to the theme_external_link function in common/twitter.php. Right?

function twitter_parse_links_callback($matches) {
  $url = $matches[1];
  if (substr($url, 0, strlen(BASE_URL)) == BASE_URL) return "<a href='$url'>$url</a>";
  return theme('external_link', $url);
}

function theme_external_link($url, $content = null) {
     //Long URL functionality.  Also uncomment function long_url($shortURL)
     if (!$content)
     {
          $longurl = long_url($url);
          $domain = parse_url($longurl,PHP_URL_HOST);
          if (setting_fetch('gwt') == 'on') {
               $encoded = urlencode($longurl);
               $longurl = "http://google.com/gwt/n?u=$encoded";
          }
          return "<a href='$longurl' target='_blank'>[".$domain."]</a>";
     }
     else
     {
          return "<a href='$url' target='_blank'>$content</a>";
     }
}

Well, not so much. Because of some of the mechanisms in identifying links and adding the appropriate HTML, I broke the image-service thumbnail code and had to think through how this was going to work out. It ended up with me changing the twitter_photo_replace and my twitlonger_replace functions to only return the addendums (if any) and not the entire tweet text

function twitter_photo_replace($text) {

.
.
.

  if (!empty($images)) 
     return implode(' ', $images).'<br />';
}  

function twitlonger_replace($text) {
  $tmp = strip_tags($text);

  if (preg_match('#http://tl.gd/([dw]+)#', $tmp, $matches)) {
.
.
.
     $returntext = "<p style="padding:5px;margin:5px;border:thin dashed;">$longtweet</p>";//$text";
    return theme('external_link', $matches[0], $returntext);
  } else {
     return "";
  }
}

then I changed how the twitter_parse_tags function called them and appended the data. Also important is to make it use the original unaltered tweet ($input) as a source rather than the modified one with the links ($out).

function twitter_parse_tags($input) {
.
.
.

  if (!in_array(setting_fetch('browser'), array('text', 'worksafe'))) {
    $twitlonger = twitlonger_replace($input);
    $out = twitter_photo_replace($twitlonger.$input).$twitlonger.$out;
  }
  return $out;
}

Dabr Decoding Short URLs

The results, though, are great . Nice and clean. As mentioned on other pages, the overhead may be a bit much for more than your personal web server, but I love the change. One byproduct as well is that now any posts with images in Twitlonger that don’t get into the original tweet will have their photo thumbnail displayed too. 5% scenario – yes, but still icing :)

Bookmark and Share Blog This Facebook Twiit Google Yahoo! Buzz Ping StumbleUpon Fark Propellor Netvouz Newsvine reddit Simpy Blinklist Blogmarks Mr Wong Startaid Segnalo Wists Boxed Up

Popularity: unranked [?]

November 15, 2009

Roll Your Own Twitter Web Client



 

As I get more and more into this Twitter thing, I’ve struggled like everyone else to find the perfect web client. I prefer web clients over heavy desktop apps because they can be used on any platform from mobile phone to Windows, Mac or Linux browser. The Twitter web client (both the regular and the mobile versions) just don’t work. Too much of one thing and not enough of another.

In my searching, I came across one mobile effort that seemed to combine the best features of the best desktop apps with the ease and flexibility of a web client. And better yet for a tinkerer like me – it was open source:dabr.co.uk – About

Dabr is a mobile web interface to Twitter’s API. It has been described as m.twitter.com on steroids, and tries to provide as much mobile functionality as possible.

It’s an open source project created and maintained by @davidcarrington, inspired by some suggestions from @whatleydude – who remains a keen user and strategic advisor on many of the features that make dabr what it is today.

The project is built on your feedback, literally! Your ideas aren’t just welcome, but are the driving force that makes Dabr improve and hopefully be your mobile twitter client of choice. So please get in touch :)

Great. This is a quality effort that includes tweeting, deleting, retweeting, replying, favoriting, following and unfollowing, blocking, searching, trends, hashtags, and even Twitpic! So immediately when loading this code on my machine (code and instructions here) I set about implementing a different url shortening service – u.nu. Not only are url’s shorter than the default bit.ly service, it also doesn’t require me to set up an account. If it’s free it’s me! The other feature I wanted to add in was calling TweetShrink for tweets over 140 characters. I add some code also to truncate with ellipses if Tweetshrink doesn’t achieve the desired savings, but this could easily be changed to do multiple tweets. Maybe that’s the next tweak!

UPDATE (Nov 19): Added decoding for imgur images and TwitLonger tweets.

Here are the code changes (in bold) that I made to twitter.php. just do a find for the function names as the file is quite large:

function twitter_url_shorten_callback($match) {
  if (preg_match('#http://www.flickr.com/photos/[^/]+/(\d+)/#', $match[0], $matches)) {
    return 'http://flic.kr/p/'.flickr_encode($matches[1]);
  }
  return file_get_contents("http://u.nu/unu-api-simple?url=" . $match[0]);
}

function twitter_update() {
  twitter_ensure_post_action();
  $status = twitter_url_shorten(stripslashes(trim($_POST['status'])));
  if ($status) {
    if (strlen($status)>140)
    	$status1 = file_get_contents("http://tweetshrink.com/shrink?format=string&text=" . urlencode($status));
    if ($status1 && strlen($status1)<141)
    	$status=$status1;
    if (strlen($status)>140)
    	$status=substr($status,0,137) . "...";

    $request = 'http://twitter.com/statuses/update.json';
    $post_data = array('source' => 'dabr', 'status' => $status);
    $in_reply_to_id = (string) $_POST['in_reply_to_id'];
    if (is_numeric($in_reply_to_id)) {
      $post_data['in_reply_to_status_id'] = $in_reply_to_id;
    }
    $b = twitter_process($request, $post_data);
  }
  twitter_refresh($_POST['from'] ? $_POST['from'] : '');
}

function twitter_parse_tags($input) {
  $out = preg_replace_callback('#(\w+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)(?<![.,])#is', 'twitter_parse_links_callback', $input);
  $out = preg_replace('#(^|\s)@([a-z_A-Z0-9]+)#', '$1@<a href="user/$2">$2</a>', $out);
  $out = preg_replace('#(^|\s)(\\#([a-z_A-Z0-9:_-]+))#', '$1<a href="hash/$3">$2</a>', $out);
  if (!in_array(setting_fetch('browser'), array('text', 'worksafe'))) {
    $out = twitter_photo_replace($out);
    $out = twitlonger_replace($out);
  }
  return $out;
}

function twitlonger_replace($text) {
  $tmp = strip_tags($text);

  if (preg_match_all('#tl.gd/([\d\w]+)#', $tmp, $matches, PREG_PATTERN_ORDER) > 0) {
    foreach ($matches[1] as $key => $match) {
      $longtweetraw = file_get_contents('http://tl.gd/'.$match);
      $longtweet = preg_replace(array('/\n/','/<br..>/')," ",$longtweetraw);
      $longtweet = preg_replace('/(.*)id="replybutton"(.*)\<p\>(.*)\<\/p\>(.*)p class="clientlink"(.*)/',"$3",$longtweet);
      $longtweets[] = theme('external_link', "http://{$matches[0][$key]}", "<p style=\"padding:5px;margin:5px;border:thin dashed;\">$longtweet</p>");
    }
  }

  if (empty($longtweets)) return $text;
  return implode('', $longtweets).''.$text;
}

function twitter_photo_replace($text) {
  $images = array();
  $tmp = strip_tags($text);

  // List of supported services. Array format: pattern => thumbnail url
  $services = array(
    '#youtube\.com\/watch\?v=([_-\d\w]+)#i' => 'http://i.ytimg.com/vi/%s/1.jpg',
    '#twitpic.com/([\d\w]+)#i' => 'http://twitpic.com/show/thumb/%s',
    '#imgur.com/([\d\w]{5})[ls]?[\.\w]+#i' => 'http://imgur.com/%ss.png',
    '#imgur.com/gallery/([\d\w]{5})#i' => 'http://imgur.com/%ss.png',

.
.
.

Bookmark and Share Blog This Facebook Twiit Google Yahoo! Buzz Ping StumbleUpon Fark Propellor Netvouz Newsvine reddit Simpy Blinklist Blogmarks Mr Wong Startaid Segnalo Wists Boxed Up

Popularity: unranked [?]

Improved Sharing and Twitter Bookmarklet



 

Since my last forays with Mini-blogging (or microblogging) and bookmarkletting, lots of things have changed. Specifically for this purpose, the url-shortening service urlTea was yanked. It forced me to switch to tinyurl and then to tr.im – which also almost went down. Along with increasingly sharing more links on sites other than Twitter, I combined some of my other bookmarklets into an all-in-one server-driven bookmarklet bonanza.

This new server side script will facilitate sharing links via Twitter, Facebook, email, BB Code forums, blogs/Myspace. Since the Twitter explosion this year – many more cool url shortening services have opened and offered API’s like is.gd and u.nu. Twitter now uses bit.ly/j.mp but since it needed a login, I didn’t bother. There is no more JSON, just straight API calls.

This new code still solves the problem of allowing you to provide context for your tweet or other form of sharing – and also integrates flexibility amongst using shortened URLs or not, and which shortening service to use. It can be used as a stand-alone script, or as a bookmarklet. The bookmarklet still captures the link, title, and any selected text on the page you want to share. It can be set to automatically forward to Twitter, or to stay on the helper popup. In the case of the latter, there is still a button that allows you to forward the link, title, and any selected text to Twitter where you handle editing and the character count.

The beauty of this approach is – if you don’t want to share on Twitter, or also want to share on other sites, you can get the code needed to post on MySpace or Facebook or by email or on sites that use BBCode. Here is the bookmarklet. As usual – drag it to your Bookmarks or Links bar, or simply bookmark it.

Twiit or Auto-Twiit

As always, the bookmarklet is a simple link that contains javascript. You click it whenever you’re on a web page that you want to share. Again, I offer no appologies or warranties. Take it and make it yours if you like it. Or just use the bookmarklet here and let me know how it works.

The PHP:

Bookmark and Share Blog This Facebook Twiit Google Yahoo! Buzz Ping StumbleUpon Fark Propellor Netvouz Newsvine reddit Simpy Blinklist Blogmarks Mr Wong Startaid Segnalo Wists Boxed Up

Popularity: unranked [?]

Powered by WordPress

Blog Information