2011-02-28 104 views
19

我正在开发使用他们的图形API一个Facebook应用程序。我以前使用弃用的REST API开发了一个应用程序。Facebook Graph API - 如何获取用户国家?

我遇到了一个问题,我无法检索用户的国家,只有他们的“位置” - 这只是城市和州/地区的组合格式(如'德克萨斯州休斯顿') 。

怎么可能使用图形API来获取用户的国家?如果这不是直接可能的话,那么可以通过哪些解决方法来实现呢?

回答

23

https://api.facebook.com/method/fql.query?query=SELECT%20current_location%20FROM%20user%20WHERE%20uid=4&access_token=YOUR_ACCESS_TOKEN

会给你:

<?xml version="1.0" encoding="UTF-8"?> 
<fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true"> 
    <user> 
    <current_location> 
     <city>Palo Alto</city> 
     <state>California</state> 
     <country>United States</country> 
     <zip/> 
     <id>104022926303756</id> 
     <name>Palo Alto, California</name> 
    </current_location> 
    </user> 
</fql_query_response> 

,我可以看到这是对FB稳定的唯一的事情就是FQL

使用这里描述得到你需要的任何信息http://developers.facebook.com/docs/reference/fql/表 - 图api还不好

+1

只是一个小小的贡献:这里是一个关于如何使用Graph API发布FQL查询的官方帖子(它也表示FQL不会被弃用;这是一个常见的误解):https://developers.facebook.com/blog/post/579/ – YOMorales 2012-02-29 22:48:48

+0

虽然位置信息对我测试过的用户是公开的,包括MZ的ID,它是4,但我的ID不是我的ID,而是返回current_location为''。帮帮我。谢谢! – San 2013-06-29 02:51:11

1

这是一个很好的问题。

的问题是,Facebook的在任何应用程序运行都必须通过Facebook的服务器 - FB代理也正因为如此,你获得的IP是不是游客,但Facebook的服务器,而不是它是没有用的。

我还没有看到这方面的解决方案,但除了从用户的个人资料中获取用户的国家,这个用户的国家只有在用户公开或授权许可的情况下才有可能。

这是非常有用的链接,你可能想看看有太多:

+0

谢谢你的信息Sarfraz。我发现令人难以置信的是,Facebook没有在Graph API中提供相应的信息 - 他们正在有效地鼓励用户继续使用退休的REST API。尤其令人沮丧的是,国家是如此基本和无害的信息。您是否有链接通过用户的公开个人资料直接访问该国家的任何信息? – BrynJ 2011-02-28 15:24:55

+0

@BrynJ:我可以找到这些链接:http://stackoverflow.com/questions/2723038/facebook-graph-api-user-gender和http://stackoverflow.com/questions/4609781/facebook-api-can- i-get-detailed-info-about-users-location – Sarfraz 2011-02-28 15:32:40

7

一个解决方案,我发现,这仅仅是一个解决方法,就是使用GeoNames的API - http://www.geonames.org/export/web-services.html

使用类似:

http://api.geonames.org/search?q=houston%2C%20texas&featureClass=P&username=myusername 

返回结果中的XML对象,随着国家作为数据的一部分。

我不是特别满意,这是一个解决方案。然而,因为它在我的应用程序增加了并发症的不必要层 - 加上这个免费服务的要求仅限于2000每小时30,000每天。

+0

+1这是个好消息:) – Sarfraz 2011-02-28 17:10:37

+0

我已经为我的答案添加了更正 - 每小时2000个请求或每天30,000个请求 - 还添加了一个参数这限制了与城市/城镇/村庄的匹配。 – BrynJ 2011-02-28 20:21:58

6

使用PHP SDK:

需要 'facebook.php';

$ = Facebook的新 的Facebook(阵列( 'APPID'=> 'APPID', '秘密'=> 'APPSECRET',
'的Cookie'=>真,));

然后索要签名的请求:

$signed_request = $facebook->getSignedRequest(); 
    $country = $signed_request["user"]["country"]; 

现在$国家有一个字符串,如“我们”的美国和“英国”的英国等。

+2

想要补充一点,英国似乎是“gb”而不是“英国”。 – Ezra 2012-04-20 09:55:22

0

iframe的应用程序,那么IP不会被FB服务器隐藏的,这意味着你可以做IP地址查询

http://phpweby.com/software/ip2country

的剧本有一些车的我,但做的工作。

-1

根据Facebook的documentation,你可以得到两个字母ISO 3166-1国家代码来自用户的locale

Facebook语言环境分别遵循ISO语言和国家代码, 由下划线连接起来。基本格式是''ll_CC'',其中 'll''是一个双字母语言代码,'CC'是两个字母的国家代码 。例如,'en_US'代表美国英语。

例FQL:

SELECT locale FROM user WHERE uid = me() 

响应:

{ 
    "data": [ 
    { 
     "locale": "en_US" 
    } 
    ] 
} 
+4

此信息可能与它们与其个人资料相关联的位置信息不同,并且是两个不同的个人资料设置。 – Keith 2013-05-10 18:29:19

+3

同意@Keith。我住在德国,但我的地区是en_US--就因为我选了它! – BlaM 2013-07-26 15:51:26

+0

很多南美国家都有相同的语言环境es_LA – Robertiano 2014-06-13 09:38:30

0

您可以通过国家使用FQL查询看到的追随者的寿命号码(由喜欢到你的FB页)。使用标记化的会话值设置JSON查询,并通过PHP通过您所针对的页面的object_ID和生命周期发送FQL查询。选择度量标准,并将度量标准设置为page_fans_country - 并将数据转储为CSV文件。您应该按照国家/地区代码(多行)获取总生命追随者列表(按赞)。设置数据透视表以获取跨多页数据的聚合索引,并按国家/地区代码进行排名。下面是FQL查询的示例:

SELECT metric,value FROM insight WHERE object_id = [您的页面ID出现在这里] AND metric ='page_fans_country'AND end_time = end_time_date('2013-04-28')AND period = period (“终身”)

0

答案张贴Valerchik确实是正确的,但是万一有人会找PHP的解决方案,然后我结束了这样的事情:

$token = Yii::app()->facebook->getAccessToken(); 
$fqlRequest = 'https://api.facebook.com/method/fql.query?query=' . 
       'SELECT%20' . $fqlAttributeName . '%20FROM%20user%20WHERE%20' . 
        'uid=' . $fbUserId . '&access_token=' . $token; 
$ret = file_get_contents($fqlRequest); 

if (!empty($ret)) { 
    ... 

所有用户的属性列表可以在这里找到:
https://developers.facebook.com/docs/reference/fql/user/

我希望这会帮助别人:)

1

你应该尝试这样的:?

/* make the API call */ 
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, 
                  NSDictionary<FBGraphUser> *user, 
                  NSError *error) 
    { 
     if (!error) 
     { 
      self.countryName = [[[user objectForKey:@"location"] valueForKey:@"name"] componentsSeparatedByString:@", "][1]; 
      self.countryCode = [self getCountryCodeForCountry:STUser.countryName]; 
     } 
}]; 

-(NSString *)getCountryCodeForCountry:(NSString*)country 
{ 
    NSMutableArray *countries = [self getCountries]; 
    NSArray *countryCodes = [NSLocale ISOCountryCodes]; 

    NSDictionary *codeForCountryDictionary = [[NSDictionary alloc] initWithObjects:countryCodes forKeys:countries]; 

    return [codeForCountryDictionary objectForKey:country]; 
} 

+(NSMutableArray *)getCountries 
{ 
    NSMutableArray *countries = [NSMutableArray array]; 

    NSArray *countryCodes = [NSLocale ISOCountryCodes]; 
    countries = [NSMutableArray arrayWithCapacity:[countryCodes count]]; 

    for (NSString *countryCode in countryCodes) 
    { 
     NSString *identifier = [NSLocale localeIdentifierFromComponents:[NSDictionary dictionaryWithObject: countryCode forKey: NSLocaleCountryCode]]; 
     NSString *country = [[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier]; 
     [countries addObject: country]; 
    } 

    return countries; 
} 
1

使用图形API /我场=家乡 它会回报你如 “布拉格,捷克共和国” 我相信你可以通过针爆炸字符串','最后一个元素应该是国家

相关问题