views:

1160

answers:

4

I need to get an info about the app/song/video by item id from iTunes Store.

I've found this:

http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStoreServices.woa/wa/wsLookup?id=324021811&mt=8

But it doesn't work with apps.

Is there any public API?

UPD: I can get info using this link: http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wa/viewSoftware?id=290777756&mt=8, but this is not a structured data it's just a markup for iTunes to display stuff. I can't rely on that - it can be changed anytime and is hard to parse because it has no consistent structure...

+2  A: 

As far as I know (and I've done a lot of looking), there isn't a public API.

You're right that the HTML isn't semantically structured, so parsing it won't be very robust. But I think it's your only option. Here are a few links which might help :-

A Python script which parses reviews.

An Ars Technica article: Linking to the stars: hacking iTunes to solicit reviews.

An Inside iPhone article: Scraping AppStore Reviews.

floehopper
A: 

That link you have there is JSON! You've got the solution right here. You just need JSON.framework

slf
hmm... I was wrong saying that this doesn't work with Apps. It works for most of them but not for every. I still don't get why it's working for some apps and don't for other...And it doesn't work with albums
quark
A: 

I wrote this script for myself. It's not optimized or future-proof, but it's working for me in the meantime...

<?php
ini_set('display_errors', false);

if(isset($_GET['appID']) && isset($_GET['format']))
{
    $appID = (int)stripslashes($_GET['appID']);
    $format = stripslashes($_GET['format']);

    $url = "http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=$appID&amp;mt=8";
    $useragent = "iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);

    $result = curl_exec($ch); 
    curl_close($ch); 

    $temp = str_replace("&#189;","",strip_tags(substr($result,
        strpos($result,"Average rating for the current version:"),
        strpos($result,"Rate this application:")-strpos($result,"Average rating for the current version:"))));

    $temp1 = explode("ratings",$temp);

    if(strpos($temp1[2], "Average rating for all versions:"))
      $temp1[2] = substr($temp1[2],0,stripos($temp1[2],"Average rating for all versions:"));

    $temp1[2] = preg_replace('/\s\s+/', ' ', $temp1[2]);
    $temp2 = explode(" ",$temp1[2]);

    $ratings[0] = $temp2[1];
    $ratings[1] = $temp2[2];
    $ratings[2] = $temp2[3];
    $ratings[3] = $temp2[4];
    $ratings[4] = $temp2[5];

    if($format == "prettyPrint")
     printRatings($ratings);
    else if($format == "XML");
     getXML($ratings);
}
else
{
    echo "Enter the app id and format (http://iblackjackbuddy.com/getAppRatings.php?appID=###&amp;format=###"; 
}

function printRatings($ratings)
{
    echo "Five stars: " . $ratings[0];
    echo "<br>Four stars: " . $ratings[1];
    echo "<br>Three stars: " . $ratings[2];
    echo "<br>Two stars: " . $ratings[3];
    echo "<br>One star: " . $ratings[4];

    echo "<hr>Total ratings: " . getTotalRatings($ratings);

    echo "<br>Average rating: " . getAverageRating($ratings);
}

function getTotalRatings($ratings)
{
    $temp = 1;

    for($i=0; $i < count($ratings); ++$i) 
     $temp+=$ratings[$i];

    return $temp;
}

function getAverageRating($ratings)
{
    $totalRatings = getTotalRatings($ratings);
    return round(5*($ratings[0]/$totalRatings) 
           + 4*($ratings[1]/$totalRatings) 
            + 3*($ratings[2]/$totalRatings)
             + 2*($ratings[3]/$totalRatings) 
              + 1*($ratings[4]/$totalRatings),2);
}

function getXML($ratings)
{   
    header('Content-type: text/xml');
    header('Pragma: public');        
    header('Cache-control: private');
    header('Expires: -1');
    echo '<?xml version="1.0" encoding="utf-8"?>';
    echo '<Rating>';
    echo '<FiveStars>'.$ratings[0].'</FiveStars>';
    echo '<FourStars>'.$ratings[1].'</FourStars>';
    echo '<ThreeStars>'.$ratings[2].'</ThreeStars>';
    echo '<TwoStars>'.$ratings[3].'</TwoStars>';
    echo '<OneStar>'.$ratings[4].'</OneStar>';
    echo '<TotalRatings>'.getTotalRatings($ratings).'</TotalRatings>';
    echo '<AverageRating>'.getAverageRating($ratings).'</AverageRating>';
    echo '</Rating>';
}

?>
john
Read my "UPD: ..." part of the question and floehopper's answer.
quark
+1  A: 

There is a public API into iTunes called "iTunes Store Web Service Search API" that returns quite a bit of information. Some of it is documented here but that documentation is incomplete.

You can use the API to get information about everything for sale in iTunes Store and App Store including urls for the artwork, links directly into iTunes, all the apps by a developer, and so on. It's very robust and I'd love to find updated documentation.

I'm currently writing an article at the iPhone Dev FAQ to show how a few things are done and extend the available documentation.

John Fricker
I've read that document already and mentioned it in "UPD" part. There is possibility to search by itemId but not every item in the store can be found. As example, try to use that and get info about any random Albums or Songs you'll see that some of them returns a result and some - not.
quark
In my experience the Search API is completely reliable and accurate. Perhaps you are using the wrong id.And the search you reference in UPD is not at all what is documented in the Search API.
John Fricker
Sorry, my fault, I mentioned it in main part of the question. Nevertheless the wsLookup works for some IDs and doesn't work for other. And I still don't get why...
quark
pms1969