Facebook Graph API - 如何获得用户所在国家/地区?

时间:2011-02-28 14:50:08

标签: facebook facebook-graph-api

我正在使用他们的Graph API开发Facebook应用程序。我以前使用不推荐使用的REST API开发了一个应用程序。

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

如何使用Graph API检索用户的国家/地区?如果这不可能直接实现,那么实现这一目标可能会有什么变通方法呢?

9 个答案:

答案 0 :(得分:24)

https://api.facebook.com/method/fql.query?format=json&query=SELECT%20current_location%20FROM%20user%20WHERE%20uid=4&access_token=<ACCESS_TOKEN>

[
  {
    "current_location": {
      "city": "Palo Alto",
      "state": "California",
      "country": "United States",
      "zip": "",
      "latitude": 37.4441,
      "longitude": -122.163,
      "id": 104022926303756,
      "name": "Palo Alto, California"
    }
  }
]

FQL Documentation

答案 1 :(得分: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次。

答案 2 :(得分:6)

使用php sdk:

  

需要   'facebook.php';

     

$ facebook = new   Facebook(数组('appId'=&gt;   'APPID','secret'=&gt;   'APPSECRET',
  'cookie'=&gt;是的,));

然后要求签名请求:

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

现在$ country有一个字符串,例如美国的“us”和英国的“uk”等。

答案 3 :(得分:1)

这是一个很好的问题。

问题是在facebook下运行的任何应用程序都必须通过facebook服务器 - fb代理,因此你获得的IP不是访客的IP而是facebook的服务器而是没有用。

我还没有看到任何解决方案,除了从他的个人资料中获取用户的国家/地区,只有在用户公开或授权其权限的情况下才能再次使用该国家。

以下是您可能想要查看的有用链接:

答案 4 :(得分: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;
}

答案 5 :(得分:0)

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

http://phpweby.com/software/ip2country

脚本对我来说有点儿麻烦但是做了这个工作。

答案 6 :(得分:0)

根据Facebook的documentation,您可以从用户的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"
    }
  ]
}

答案 7 :(得分:0)

您可以使用FQL查询按国家/地区查看关注者的生命期数(按照您对FB页面的喜欢)。使用标记化的会话值设置JSON查询,并通过PHP发送FQL查询,其中包含您要定位的页面的object_ID和生命周期。选择指标,并将指标设置为page_fans_country - 并将数据转储到CSV文件中。您应该按国家/地区代码(多行)返回总终身粉丝列表(按喜欢)。设置数据透视表以获取跨多个数据页的聚合索引,并按国家/地区代码排名。以下是FQL查询的示例:

SELECT指标,值FROM见解WHERE object_id = [您的页面ID转到此处] AND metric ='page_fans_country'AND end_time = end_time_date('2013-04-28')AND period = period('lifetime')

答案 8 :(得分: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/

我希望它会帮助某人:)