Facebook Graph API - 如何获取用户所在国家?

20
我正在使用Facebook的Graph API开发一个应用程序。之前我使用过被弃用的REST API开发了一个应用程序。
我遇到了一个问题,即无法获取用户的国家,只能获得他们的“位置”-这仅是以组合格式呈现的城市和州/地区(例如“德克萨斯州休斯顿”)。
如何使用Graph API获取用户的国家?如果直接无法实现,有哪些解决方法可以实现这一点?
10个回答

23

1
只是一个小贡献:这里有一篇官方文章,介绍如何使用Graph API来发出FQL查询(并且它还说FQL不会被弃用;这是一个常见的误解):https://developers.facebook.com/blog/post/579/ - YOMorales
Facebook返回current_location为'<current_location xsi:nil="true"/>',除了我的ID之外,尽管我测试过的用户的位置细节是公开的,包括MZ的ID,它是4。请帮忙。谢谢! - lupchiazoem

6

我找到的一个解决方案(仅仅是一个权宜之计)是使用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次。

我已经对我的回答进行了更正 - 每小时为2000个请求,或每天为30,000个请求 - 并且还添加了一个参数,限制匹配到城市/镇/村庄。 - BrynJ

6

使用php sdk:

require 'facebook.php';

$facebook = new Facebook(array('appId' => 'APPID', 'secret' => 'APPSECRET', 'cookie' => true));

然后请求签名的请求:

  $signed_request = $facebook->getSignedRequest();
  $country = $signed_request["user"]["country"];
现在$country有一个字符串,比如"us"代表美国,"uk"代表英国等。

2
想要补充一下,英国似乎是“gb”,而不是“uk”。 - Ezra

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
使用官方的Facebook Graph API /me?fields=hometown,它会返回例如 "Prague, Czech Republic"。
我认为您可以通过逗号','将字符串分解,并且最后一个元素应该是国家。

1

这是一个好问题。

问题在于,任何在Facebook下运行的应用程序都必须通过Facebook服务器-fb代理运行,因此您获得的IP地址不是访问者的IP地址,而是Facebook服务器的IP地址,这对您没有任何用处。

我还没有看到任何解决方案,除了从用户的个人资料中获取用户的国家信息,但这只有在用户将其公开或授权权限时才可能实现。

这里还有一个有用的链接,您也可以查看一下:


感谢您提供的信息,Sarfraz。我发现Facebook没有在Graph API中提供等效的信息非常令人沮丧 - 他们实际上鼓励用户继续使用已停用的REST API。这尤其令人沮丧,因为国家是如此基本和无害的信息。您是否有任何关于直接通过用户公共资料访问国家信息的链接? - BrynJ
@BrynJ: 我找到了这些链接:https://dev59.com/E3E85IYBdhLWcg3wikO-和https://dev59.com/g1PTa4cB1Zd3GeqPgibC - Sarfraz

0
根据Facebook的文档,您可以从用户的locale中获取2个字母的ISO 3166-1国家代码。

Facebook语言环境遵循ISO语言和国家代码分别用下划线连接的规则。基本格式为“ll_CC”,其中“ll”是两个字母的语言代码,“CC”是两个字母的国家代码。例如,“en_US”代表美式英语。

示例FQL:

SELECT locale FROM user WHERE uid = me()

响应:

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

4
这些信息可能与他们关联的个人资料位置信息不同,它们是两个不同的个人资料设置。 - Keith
3
同意@Keith。我住在德国,但我的语言环境设置是en_US,这只是因为我选择了它! - BlaM
许多南美洲国家都使用相同的本地化 es_LA。 - Robertiano
Locale 实际上代表你在 Facebook 上使用的语言。如果我更改为美式英语,我的 locale 就会变成 "en_US",如果我更改为巴西葡萄牙语,则变成 "pt_BR"。 - Danilo Lima

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/

希望能对某些人有所帮助 :)


0

对于iframe应用程序,FB服务器不会隐藏IP地址,这意味着您可以进行IP地址查找

http://phpweby.com/software/ip2country

脚本对我来说有点小bug,但完成了任务。

0

您可以使用FQL查询按国家查看粉丝(通过对您的FB页面的点赞)的终身数量。使用令牌化的会话值设置JSON查询,并通过PHP发送FQL查询,其中包括您正在定位的页面的object_ID和终身期。选择指标,并将指标设置为page_fans_country-并将数据转储到CSV文件中。您应该得到一个按国家代码(多行)列出的总终身关注者(按喜欢)列表。设置数据的多个页面上的汇总指数的透视表,并按国家代码排名。以下是FQL查询的示例:

SELECT metric,value FROM insights WHERE object_id=[您的页面ID在此处] AND metric ='page_fans_country' AND end_time = end_time_date('2013-04-28') AND period = period('lifetime')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接