问题
I developed a simple free game for Windows 8 Store and now I want to ask my users to give the game a rating and possibly write it a review.
How can I check if they already did this (i.e. rated the game or wrote a review), so I do no not ask again?
回答1:
Jared has pretty much nailed it. I don't think you can unless there is a Windows Store API that provides that information to your app. The user information and his/her rate and review status and data is stored outside of your app and therefore you have to query the external data source (Windows Store in this case) to know whether he or she has rated and reviewed your app yet. The Windows Store API in its current version provides no direct access to that info.
Here is one simple but not so accurate workaround. You can remind users to provide their feedback if they haven't done so by providing a button that links to the review web page and a quick Yes/No question in your app and storing the answer locally. In a perfect world, the user has done the review and s/he answers Yes to your question and they are not bothered with another reminder.
回答2:
You can access store information as outlined below, including reviews and data about the users that wrote the review. You could then attempt to match that information up with the user information available through the Live SDK for the current user. You will only be able to match up FirstName LastName, there is no common unique ID available, or maybe there is, the user image icon URL might match between the two, but I have not verified.
https://services.apps.microsoft.com/4R/6.2.9200-1/1/en-US/m/US/Apps/f514d64b-8705-43b7-a400-c4f4f3dedfc0/Reviews/all/s/date/1/pn/1
http://jasonthomascarter.blogspot.com/2013/08/the-friendly-developers-guide-to.html
Today I received an inquiry from a fellow developer on the support email for one of my Windows Store apps App Roulette. That was pretty refreshing, and I'm pretty open to sharing information with other developers. I get more excited to see what they will create than worried over the potential for competition. So I'm here to share with you all. Anyhow, this developer was wondering how to get this App information and I'll explain how I access that and how you can too.
First a little self promotion, in addition to App Roulette I use this information in a few other apps. Developer Dashboard a one stop shop to view the reviews from all countries for all of your apps with a simple tap to translate each review, Windows Store Developers a directory of all the developers in the Windows Store (over 10000) and their apps, Most Active Reviewers a directory of the most prolific app reviewers and their reviews, and in my own portfolio app Software Developer which lists out all the other apps I have published in the Windows Store, please give some of them a try.
Here we go! First we will start with Robots.txt file for the Windows Store website. http://apps.microsoft.com/robots.txt
Websites use robots.txt to guide web crawlers on how to behave, what they want them to see, and what they don't want them to see.
http://www.robotstxt.org/
Web Robots (also known as Web Wanderers, Crawlers, or Spiders), are programs that traverse the Web automatically. Search engines such as Google use them to index the web content, spammers use them to scan for email addresses, and they have many other uses.
In this case the Sitemaps.xml index file is what we are interested in. http://apps.microsoft.com/windows/sitemap_index.xml
http://www.sitemaps.org/
Sitemaps are an easy way for webmasters to inform search engines about pages on their sites that are available for crawling. In its simplest form, a Sitemap is an XML file that lists URLs for a site along with additional metadata about each URL (when it was last updated, how often it usually changes, and how important it is, relative to other URLs in the site) so that search engines can more intelligently crawl the site.
The Sitemap Index file lists out each of the individual Sitemap XML files. As of this writing, the apps.microsoft.com website has 141 individual Sitemap XML files.
Inside the individual files are thousands of URL's to the web pages of Windows Store apps. Such as this URL to the PlayTo Receiver app: http://apps.microsoft.com/windows/en-us/app/playto-receiver/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e
These webpages for the apps do include a good bit of information that we could scrape from the HTML but we can do better.... The key information we are getting here is the App ID's and which geographies those App ID's are published to in the store. For example: 72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e and en-us etc...
And now to the good stuff, there a few web services we can call using our newly found App Id's and geography information.
https://services.apps.microsoft.com/browse/6.2.9200-1/615/en-US_en-US/c/US/cp/10005001/Apps/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e
There is plenty of information available through this web service but it's not clearly spelled out by the element names. Here is my interpretation of many (not all) of them to start you off.
sSubCategoryName = rawXML.getElementsByTagName('Sc')[0].getElementsByTagName('N')[0].childNodes[0].nodeValue; sSubCategoryId = rawXML.getElementsByTagName('Sc')[0].getElementsByTagName('I')[0].childNodes[0].nodeValue; sHasTrial = rawXML.getElementsByTagName('Try')[0].childNodes[0].nodeValue; sDescription = rawXML.getElementsByTagName('D')[0].childNodes[0].nodeValue; sDeveloper = rawXML.getElementsByTagName('Dev')[0].childNodes[0].nodeValue; sWebsite = rawXML.getElementsByTagName('Ws')[0].childNodes[0].nodeValue; sSupport = rawXML.getElementsByTagName('Sws')[0].childNodes[0].nodeValue; sPrivacy = rawXML.getElementsByTagName('Pu')[0].childNodes[0].nodeValue; sCategoryName = rawXML.getElementsByTagName('C')[0].getElementsByTagName('N')[0].childNodes[0].nodeValue; sCategoryId = rawXML.getElementsByTagName('C')[0].getElementsByTagName('I')[0].childNodes[0].nodeValue; sPrice = rawXML.getElementsByTagName('P')[0].childNodes[0].nodeValue; sForegroundColor = rawXML.getElementsByTagName('Fg')[0].childNodes[0].nodeValue; sBackgroundColor = rawXML.getElementsByTagName('Bg')[0].childNodes[0].nodeValue; sAppIcon = rawXML.getElementsByTagName('Ico')[0].childNodes[0].nodeValue; sAppName = rawXML.getElementsByTagName('T')[0].childNodes[0].nodeValue; sPackageFamilyName = rawXML.getElementsByTagName('Pfn')[0].childNodes[0].nodeValue; sResourceId = rawXML.getElementsByTagName('R')[0].childNodes[0].nodeValue; sId = rawXML.getElementsByTagName('I')[0].childNodes[0].nodeValue; sCapabilities = sCapabilities + arrCapabilities[k].childNodes[0].nodeValue+","; sUpdate = rawXML.getElementsByTagName('Ud')[0].childNodes[0].nodeValue; sFeatures1 = rawXML.getElementsByTagName('Dbp')[0].childNodes[0].nodeValue; sFeatures2 = rawXML.getElementsByTagName('Dbp')[1].childNodes[0].nodeValue; sFeatures3 = rawXML.getElementsByTagName('Dbp')[2].childNodes[0].nodeValue; sFeatures4 = rawXML.getElementsByTagName('Dbp')[3].childNodes[0].nodeValue; sFeatures5 = rawXML.getElementsByTagName('Dbp')[4].childNodes[0].nodeValue; sFeatures6 = rawXML.getElementsByTagName('Dbp')[5].childNodes[0].nodeValue; sFeatures7 = rawXML.getElementsByTagName('Dbp')[6].childNodes[0].nodeValue; sFeatures8 = rawXML.getElementsByTagName('Dbp')[7].childNodes[0].nodeValue; sFeatures9 = rawXML.getElementsByTagName('Dbp')[8].childNodes[0].nodeValue; sScreenshot1 = rawXML.getElementsByTagName('Ss')[0].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot2 = rawXML.getElementsByTagName('Ss')[1].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot3 = rawXML.getElementsByTagName('Ss')[2].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot4 = rawXML.getElementsByTagName('Ss')[3].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot5 = rawXML.getElementsByTagName('Ss')[4].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot6 = rawXML.getElementsByTagName('Ss')[5].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot7 = rawXML.getElementsByTagName('Ss')[6].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot8 = rawXML.getElementsByTagName('Ss')[7].getElementsByTagName('U')[0].childNodes[0].nodeValue sScreenshot9 = rawXML.getElementsByTagName('Ss')[8].getElementsByTagName('U')[0].childNodes[0].nodeValue sCaption1 = rawXML.getElementsByTagName('Ss')[0].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption2 = rawXML.getElementsByTagName('Ss')[1].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption3 = rawXML.getElementsByTagName('Ss')[2].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption4 = rawXML.getElementsByTagName('Ss')[3].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption5 = rawXML.getElementsByTagName('Ss')[4].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption6 = rawXML.getElementsByTagName('Ss')[5].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption7 = rawXML.getElementsByTagName('Ss')[6].getElementsByTagName('Cap')[0].childNodes[0].nodeValue sCaption8 = rawXML.getElementsByTagName('Ss')[7].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
There is more to the Windows Store than just apps, there are also reviews, and lots of them. There are currently over 210,000 reviews for apps in the Windows Store. These reviews come from all over the world, so you'll need some country codes, your handy dandy App Id's and pay attention to the pn/1 at the end, you will find that this service only returns 10 reviews per page, just increment this value to pn/2, pn/3 etc.. until you run out of reviews.
var arrCounntryCodes = ["AE", "AR", "AT", "AU", "BE", "BG", "BH", "CA", "CH", "CL", "CN", "CO", "CR", "CY", "CZ", "DE", "DK", "DZ", "EE", "EG", "ES", "FI", "FR", "GB", "GR", "HK", "HR", "HU", "ID", "IE", "IL", "IN", "IQ", "IT", "JO", "JP", "KW", "KZ", "LB", "LK", "LT", "LU", "LV", "LY", "MA", "MT", "MX", "MY", "NL", "NO", "NZ", "OM", "PE", "PH", "PK", "PL", "QA", "RO", "RS", "RU", "SA", "SE", "SG", "SI", "SK", "TH", "TN", "TR", "TT", "UA", "US", "UY", "VE", "VN"];
https://services.apps.microsoft.com/4R/6.2.9200-1/1/en-US/m/US/Apps/f514d64b-8705-43b7-a400-c4f4f3dedfc0/Reviews/all/s/date/1/pn/1
This one is much more descriptive with the element names, so I don't see any need for further explaination of this. You can see the full name, display name, the image the user has chosen to represent themselves with.
Next up we can do a little bit of seaching... https://services.apps.microsoft.com/search/6.2.9200-1/615/en-US_en-US/m/US/c/US/il/en-US/cp/10005001/query/cid/0/pf/1/pc/0/pt/x64/af/0/lf/0/s/0/2/pn/0?phrase=Software Developer
Here it gets a little cryptic again, but by now you should be used to it. You can get the App ID from the I element and take it from there back to the browse service f514d64b-8705-43b7-a400-c4f4f3dedfc0
So there you have it, the basics of pulling tons of information out of the Windows Store that you can then do what you please with. If you find this useful and/or make some apps utilizing the information, have some additional information to share or otherwise please let me know in the comments.
回答3:
There does not appear to be an API to do this. If there was it would likely be part of the CurrentApp class, which tells you information like whether the app has been purchased.
If you want to prompt the user to fill out a rating (which they may have already done) you can follow the instructions outlined in this thread:
http://social.msdn.microsoft.com/Forums/en-SG/winappswithcsharp/thread/3cba0db4-c2f6-4c79-98a9-0f740dfacf61
I like the last message which shows you how to link directly to the review tab.
来源:https://stackoverflow.com/questions/15142367/how-to-check-if-a-user-rated-my-app