我遇到了一个问题,即无法获取用户的国家,只能获得他们的“位置”-这仅是以组合格式呈现的城市和州/地区(例如“德克萨斯州休斯顿”)。
如何使用Graph API获取用户的国家?如果直接无法实现,有哪些解决方法可以实现这一点?
[
{
"current_location": {
"city": "Palo Alto",
"state": "California",
"country": "United States",
"zip": "",
"latitude": 37.4441,
"longitude": -122.163,
"id": 104022926303756,
"name": "Palo Alto, California"
}
}
]
我找到的一个解决方案(仅仅是一个权宜之计)是使用GeoNames API - http://www.geonames.org/export/web-services.html
可以使用以下方式:
http://api.geonames.org/search?q=houston%2C%20texas&featureClass=P&username=myusername
使用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"代表英国等。。
/* 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;
}
这是一个好问题。
问题在于,任何在Facebook下运行的应用程序都必须通过Facebook服务器-fb代理运行,因此您获得的IP地址不是访问者的IP地址,而是Facebook服务器的IP地址,这对您没有任何用处。
我还没有看到任何解决方案,除了从用户的个人资料中获取用户的国家信息,但这只有在用户将其公开或授权权限时才可能实现。
这里还有一个有用的链接,您也可以查看一下:
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"
}
]
}
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/
希望能对某些人有所帮助 :)
对于iframe应用程序,FB服务器不会隐藏IP地址,这意味着您可以进行IP地址查找
脚本对我来说有点小bug,但完成了任务。您可以使用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')