我正在使用他们的Graph API开发Facebook应用程序。我以前使用不推荐使用的REST API开发了一个应用程序。
我遇到了一个问题,我无法检索用户的国家/地区,只检索他们的“位置” - 这只是组合格式的城市和州/地区(例如'Houston,Texas')。
如何使用Graph API检索用户的国家/地区?如果这不可能直接实现,那么实现这一目标可能会有什么变通方法呢?
答案 0 :(得分:24)
[
{
"current_location": {
"city": "Palo Alto",
"state": "California",
"country": "United States",
"zip": "",
"latitude": 37.4441,
"longitude": -122.163,
"id": 104022926303756,
"name": "Palo Alto, California"
}
}
]
答案 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'=> 'APPID','secret'=> 'APPSECRET',
'cookie'=>是的,));
然后要求签名请求:
$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/
我希望它会帮助某人:)