如何检查用户是否评价了我的应用

时间:2013-02-28 17:57:05

标签: c# windows-8 microsoft-metro

我为Windows 8商店开发了一款简单的免费游戏,现在我想让我的用户给游戏一个评级,并可能写一篇评论。

我如何检查他们是否已经这样做(即评价游戏或撰写评论),所以我不会再问了什么?

3 个答案:

答案 0 :(得分:1)

您可以访问以下概述的商店信息,包括撰写评论的用户的评论和数据。然后,您可以尝试将该信息与通过Live SDK为当前用户提供的用户信息进行匹配。您将只能匹配FirstName LastName,没有可用的公共唯一ID,或者可能存在,用户图像图标URL可能在两者之间匹配,但我尚未验证。

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

今天我收到了一位开发人员关于我的一个Windows应用商店应用轮盘的支持电子邮件的询问。这非常令人耳目一新,我非常愿意与其他开发人员分享信息。我很高兴看到他们会创造什么,而不是担心竞争的可能性。所以我在这里与大家分享。无论如何,这位开发人员想知道如何获取这些应用程序信息,我将解释如何访问它以及如何访问它。

首先是一个小小的自我推广,除了App轮盘我在其他几个应用程序中使用这些信息。开发人员仪表板一站式商店查看所有国家/地区对所有应用的评论,只需点击即可翻译每个评论,Windows应用商店开发人员可以访问Windows应用商店(超过10000个)中所有开发人员的目录及其应用,最活跃审核者了解最多产的应用评论者及其评论的目录,并在我自己的投资组合应用软件开发者中列出我在Windows商店中发布的所有其他应用,请尝试一些。

我们走吧!首先,我们将从Windows Store网站的Robots.txt文件开始。 http://apps.microsoft.com/robots.txt

网站使用robots.txt来指导网络抓取工具如何表现,希望他们看到什么,以及他们不希望他们看到什么。

http://www.robotstxt.org/

Web Robots(也称为Web Wanderers,Crawlers或Spiders)是自动遍历Web的程序。谷歌等搜索引擎使用它们来索引网页内容,垃圾邮件发送者使用它们扫描电子邮件地址,还有许多其他用途。

在这种情况下,我们感兴趣的是Sitemaps.xml索引文件。http://apps.microsoft.com/windows/sitemap_index.xml

http://www.sitemaps.org/

站点地图是网站管理员向搜索引擎通知其网站上可用于抓取的网页的简便方法。在最简单的形式中,Sitemap是一个XML文件,它列出了网站的URL以及有关每个URL的其他元数据(上次更新时间,通常更改的频率以及相对于网站中其他网址的重要性) )以便搜索引擎可以更智能地抓取网站。

站点地图索引文件列出了每个站点地图XML文件。在撰写本文时,apps.microsoft.com网站有141个单独的Sitemap XML文件。

在单个文件中,有数千个URL存储在Windows应用商店应用的网页中。比如PlayTo Receiver应用程序的这个URL: http://apps.microsoft.com/windows/en-us/app/playto-receiver/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e

这些应用程序的网页确实包含了一些我们可以从HTML中获取的信息但我们可以做得更好....我们在这里获得的关键信息是应用程序ID以及哪些地理位置应用程序ID已发布到商店中。 例如: 72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e 和en-us等...

现在,好的东西,我们可以使用我们新发现的应用ID和地理信息来调用一些网络服务。

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

此网络服务提供了大量信息,但元素名称并未明确说明。以下是我对许多(不是全部)启动你的解释。

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 +",&#34 ;; 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

Windows应用商店不仅仅是应用,还有评论,还有很多。目前,Windows Store中的应用程序有超过210,000条评论。这些评论来自世界各地,因此您需要一些国家/地区代码,方便的花花公子应用程序ID并注意最后的pn / 1,您会发现此服务仅返回10每页评论,只需将此值增加到pn / 2,pn / 3等等,直到您用完评论为止。

var arrCounntryCodes = [" AE"," AR"," AT"," AU"," BE&#34 ;," BG"," BH"," CA"," CH"," CL",&#34 ; CN"," CO"," CR"," CY"," CZ"," DE" ," DK"," DZ"," EE"," EG"," ES"," FI"," FR"," GB"," GR"," HK"," HR", " HU"," ID"," IE"," IL"," IN"," IQ& #34;," IT"," JO"," JP"," KW"," KZ",& #34; LB"," LK"," LT"," LU"," LV"," LY&# 34;," MA"," MT"," MX"," MY"," NL",&# 34; NO"," NZ"," OM"," PE"," PH"," PK&#34 ;," PL"," QA"," RO"," RS"," RU",&#34 ; 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

这个元素名称更具描述性,因此我不认为有必要进一步解释这一点。您可以看到全名,显示名称,用户选择用来表示自己的图像。

接下来我们可以做一点点的搜索...... 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开发人员

这里再次有点神秘,但到现在你应该习惯了。您可以从I元素获取App ID并将其从那里带回浏览服务 f514d64b-8705-43b7-a400-c4f4f3dedfc0

所以你有它,从Windows商店中提取大量信息的基础知识,然后你可以随心所欲地做。如果您发现这个有用和/或使某些应用程序利用这些信息,请提供一些其他信息以供分享,或者在评论中告诉我们。

答案 1 :(得分:0)

似乎没有API可以执行此操作。如果有,它可能会成为CurrentApp类的一部分,它会告诉您是否已购买应用程序等信息。

如果您想提示用户填写评级(他们可能已经做过),您可以按照此主题中列出的说明进行操作:

http://social.msdn.microsoft.com/Forums/en-SG/winappswithcsharp/thread/3cba0db4-c2f6-4c79-98a9-0f740dfacf61

我喜欢最后一条消息,告诉您如何直接链接到评论标签。

答案 2 :(得分:0)

贾里德几乎把它钉了出来。除非有Windows Store API向您的应用提供该信息,否则我认为您无法做到。用户信息及其费率和审核状态和数据存储在您的应用程序之外,因此您必须查询外部数据源(在本例中为Windows应用商店),以了解他或她是否已对您的应用进行评级和审核。当前版本中的Windows Store API无法直接访问该信息。

这是一个简单但不那么准确的解决方法。如果用户没有这样做,您可以通过提供链接到评论网页的按钮以及应用中的快速是/否问题并在本地存储答案来提醒他们提供反馈。在一个完美的世界中,用户已经完成了审核,并且他/她对您的问题回答是,并且他们不会被另一个提醒所困扰。