【问题标题】:Facebook Graph API - how to get user country?Facebook Graph API - 如何获取用户国家?
【发布时间】:2019-01-29 01:16:16
【问题描述】:

我正在使用他们的 Graph API 开发一个 Facebook 应用程序。我之前使用已弃用的 REST API 开发了一个应用程序。

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

如何使用 Graph API 检索用户所在的国家/地区?如果这不能直接实现,有什么解决方法可以实现这一点?

【问题讨论】:

    标签: facebook facebook-graph-api


    【解决方案1】:

    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

    【讨论】:

    • 只是一个小小的贡献:这是一篇关于如何使用 Graph API 发出 FQL 查询的官方帖子(它还说 FQL 不会被弃用;一个常见的误解):developers.facebook.com/blog/post/579
    • Facebook 将 current_location 返回为 '' 对于我的 id 以外的其他用户,尽管位置详细信息对我测试过的用户是公开的,包括 MZ 的 id,即 4 。 请帮忙。谢谢!
    【解决方案2】:

    我发现的一个解决方案(只是一种变通方法)是使用 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 个请求 - 并且还添加了一个限制匹配城市/城镇/村庄的参数。
    【解决方案3】:

    使用php sdk:

    要求 'facebook.php';

    $facebook = 新的 Facebook(数组('appId' => 'APPID', '秘密' => 'APPSECRET',
    'cookie' => true, ));

    然后请求签名请求:

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

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

    【讨论】:

    • 想补充一点,英国似乎是“gb”而不是“uk”。
    【解决方案4】:

    这是个好问题。

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

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

    这是一个有用的链接,您可能也想在那里查看:

    【讨论】:

    • 感谢萨弗拉兹提供的信息。我发现 Facebook 没有在 Graph API 中提供同等信息令人难以置信的沮丧——他们有效地鼓励用户继续使用已退役的 REST API。尤其令人沮丧的是,国家信息是如此基本且无害的信息。您是否有通过用户的公开资料直接访问该国家/地区的任何信息的链接?
    【解决方案5】:

    你应该这样尝试:

    /* 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;
    }
    

    【讨论】:

      【解决方案6】:

      使用官方 Facebook Graph API /me?fields=hometown 它将返回您,例如“布拉格,捷克共和国”

      我相信你可以通过 needle ',' 来爆炸字符串,最后一个元素应该是国家

      【讨论】:

        【解决方案7】:

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

        http://phpweby.com/software/ip2country

        脚本对我来说有点问题,但完成了工作。

        【讨论】:

          【解决方案8】:

          根据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"
              }
            ]
          }
          

          【讨论】:

          • 此信息可能与他们与个人资料关联的位置信息不同,是两种不同的个人资料设置。
          • 同意@Keith。我住在德国,我的语言环境仍然是 en_US - 只是因为我选择了它!
          • 而且很多南美洲国家都有相同的locale es_LA
          • locale 实际上代表您在 Facebook 上使用的语言。如果我更改为美国英语,我的区域设置将变为“en_US”,如果我更改为巴西葡萄牙语,它将变为“pt_BR”
          【解决方案9】:

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

          SELECT metric, value FROM insights WHERE object_id=[your page ID goes here] AND metric='page_fans_country' AND end_time=end_time_date('2013-04-28') AND period=period('lifetime')

          【讨论】:

            【解决方案10】:

            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/

            我希望它会帮助某人:)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-21
              • 2012-01-10
              • 1970-01-01
              • 1970-01-01
              • 2011-08-12
              相关资源
              最近更新 更多