Get a URL’s Reddit Score Using PHP and JSON

By  on  
Reddit Guy

Since we can see Digg turning more into a funny-pic-and-vid site each day, I've turned my attention to Reddit. Reddit just seems more controlled and programmer-friendly. Since I have respect for Reddit I thought I'd put together a quick tutorial on how you can retrieve a URL's Reddit score using PHP.

The PHP

<?php

	/* settings */
	$url = 'https://davidwalsh.name/9-signs-not-to-hire-that-web-guy';
	$reddit_url = 'http://www.reddit.com/api/info.{format}?url='.$url;
	$format = 'json'; //use XML if you'd like...JSON FTW!
	$score = $ups = $downs = 0; //initialize

	/* action */
	$content = get_url(str_replace('{format}',$format,$reddit_url)); //again, can be xml or json
	if($content) {
		if($format == 'json') {
			$json = json_decode($content,true);
			foreach($json['data']['children'] as $child) { // we want all children for this example
				$ups+= (int) $child['data']['ups'];
				$downs+= (int) $child['data']['downs'];
				//$score+= (int) $child['data']['score']; //if you just want to grab the score directly
			}
			$score = $ups - $downs;
		}
	}

	/* output */
	echo "Ups: $ups<br />"; //21
	echo "Downs: $downs<br />"; //8
	echo "Score:  $score<br />"; //13

	/* utility function:  go get it! */
	function get_url($url) {
		$ch = curl_init();
		curl_setopt($ch,CURLOPT_URL,$url);
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,1);
		$content = curl_exec($ch);
		curl_close($ch);
		return $content;
	}

?>

Parsing the JSON is simple using json_encode with the value of true to make turn the JSON into an associate array. My example shows how you can grab the number of "ups" and "downs" -- not just the score. As with every API/web service, I highly recommend caching the result of your request.

Recent Features

  • By
    From Webcam to Animated GIF: the Secret Behind chat.meatspac.es!

    My team mate Edna Piranha is not only an awesome hacker; she's also a fantastic philosopher! Communication and online interactions is a subject that has kept her mind busy for a long time, and it has also resulted in a bunch of interesting experimental projects...

  • By
    JavaScript Promise API

    While synchronous code is easier to follow and debug, async is generally better for performance and flexibility. Why "hold up the show" when you can trigger numerous requests at once and then handle them when each is ready?  Promises are becoming a big part of the JavaScript world...

Incredible Demos

  • By
    MooTools Window Object Dumping

    Ever want to see all of the information stored within the window property of your browser? Here's your chance. The XHTML We need a wrapper DIV that we'll consider a console. The CSS I like making this look like a command-line console. The MooTools JavaScript Depending on what you have loaded...

  • By
    jQuery Countdown Plugin

    You've probably been to sites like RapidShare and MegaUpload that allow you to download files but make you wait a specified number of seconds before giving you the download link. I've created a similar script but my script allows you to animate the CSS font-size...

Discussion

  1. David, this doesn’t have anything to do with the article (which I’m sure is good but my JSON knowledge is null)… but man that top bar that follows is really funky. In my opinion, it’s distracting to the viewer who just scrolled a little and it follows but also makes it blurry up top. Now when you mouse over it, it’s great and really functional… but I don’t know if it needs to follow me as I scroll down. It reminds me of a frame but it’s even more distracting because of the aforementioned blur.

    But of course that’s just me. I also loved the old bottom nav that had little icons next to AJAX, PHP, etc. Like Stewie from Family Guy once said, “I don’t like change!” … especially when it’s a distraction to the main content. But I’m sure there’ll be a lot more iterations of the site (since I’m assuming this is your playground for cool new features… and as I say that, a little cartoon David Walsh popsup as I highlight a word on the page…) so I look forward to what you come up with next =)

  2. Deniz

    very good, thanks David

  3. get_url(str_replace('{format}',$format,$reddit_url));
    

    You know your script wont inject itself?

    $format = 'json';
    $reddit_url = "http://www.reddit.com/api/info.{$format}?url=".$url;
  4. @Chris the Developer: Ummm, come again? Looks good to me.

  5. I just means that you could save on the str_replace by using string variable substitution supported by php…

    $a = ‘foo’;
    $b = “hello {$a}”;

  6. Thorsten

    David,

    could you provide a workaround because of the great topbar??? I really like it!

  7. @Chris the Developer: Oh. I like my mini templating system. A minor detail/preference, in my opinion.

  8. ‘http://www.reddit.com/api/info.{format}?url={url}’ :P

  9. @Chris the Developer: Damnit, you got me! :)

  10. Al

    reddit reddit reddit. oh david, you’re such a whore.

  11. @Al: Thank you, sir.

  12. bob

    urlencode($url) before appending it to the reddit url, or it will break on URLs that contain query string parameters of their own, among other things.

  13. Hayden

    Just to add my 2 cents, it could also be done like so.

    $reddit_url = 'http://www.reddit.com/api/info.%s?url=%s';
    $format = 'json'; //use XML if you'd like...JSON FTW! 
    
    /* action */ 
    $content = get_url(sprintf($reddit_url,$format,urlencode($url)));
    

    but as you stated before, it’s personal preference and I like coming here for tips. ;) Keep up the good articles!

  14. Bouncer

    If I use the format as XML, it doesn’t show me the score or ups & down. Any help !

  15. gabrielem

    And how to insert a new post on reddit? Some one have a script?

  16. Vee

    With this code I get score of http://google.com at 28 score.
    But if I check from https://www.reddit.com/buttonlite.js?i=0&url=http://google.com it is showing 128 score.
    Why is it difference?

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!