example - Facebook Graph API: ¿cómo obtener el país del usuario?
pagination facebook graph api (10)
Estoy desarrollando una aplicación de Facebook usando su Graph API. Desarrollé una aplicación con la API REST en desuso.
Me he encontrado con un problema porque no puedo recuperar el país del usuario, solo su "ubicación", que es solo la ciudad y el estado / región en un formato combinado (como "Houston, Texas").
¿Cómo es posible recuperar el país del usuario usando Graph API? Si esto no es directamente posible, ¿qué soluciones podría haber para lograr esto?
Esa es una buena pregunta.
El problema es que cualquier aplicación que se ejecute en Facebook tiene que ir a través de los servidores de Facebook - fb proxy y debido a esto, la IP que obtienes no es la de los visitantes sino la de los servidores de Facebook, que no sirve de nada.
Todavía no he visto ninguna solución para esto, excepto para obtener el país del usuario de su perfil, que nuevamente solo es posible si el usuario lo hizo público o si autorizó su permiso.
Aquí hay un enlace útil que tal vez quiera consultar también:
Una solución que he encontrado, que no es más que una solución, es utilizar la API GeoNames - http://www.geonames.org/export/web-services.html
Usando algo como:
http://api.geonames.org/search?q=houston%2C%20texas&featureClass=P&username=myusername
Devuelve resultados en un objeto xml, con el país como parte de los datos.
Sin embargo, no estoy particularmente contento con esto como una solución, ya que agrega una capa innecesaria de complicaciones a mi solicitud, además de que las solicitudes para estos servicios gratuitos están limitadas a 2000 por hora y 30.000 por día.
Use el php sdk:
requiere ''facebook.php'';
$ facebook = new Facebook (array (''appId'' => ''APPID'', ''secret'' => ''APPSECRET'',
''cookie'' => true,));
Luego solicite una solicitud firmada:
$signed_request = $facebook->getSignedRequest(); $country = $signed_request["user"]["country"];
Ahora $ country tiene una cadena como "us" para Estados Unidos y "uk" para Reino Unido, etc.
para las aplicaciones iframe, los servidores FB no ocultan la ip, lo que significa que puede hacer una búsqueda de dirección IP
http://phpweby.com/software/ip2country
el guión fue un poco problemático para mí, pero hizo el trabajo.
De acuerdo con la documentación de Facebook, puede obtener el código de país ISO 3166-1 de 2 letras de la configuración locale
del usuario.
Las configuraciones regionales de Facebook siguen el idioma ISO y los códigos de país respectivamente, concatenados por un guión bajo. El formato básico es '''' ll_CC '''', donde '''' ll '''' es un código de idioma de dos letras, y '''' CC '''' es un código de país de dos letras. Por ejemplo, ''en_US'' representa el inglés de EE. UU.
Ejemplo FQL:
SELECT locale FROM user WHERE uid = me()
Respuesta:
{
"data": [
{
"locale": "en_US"
}
]
}
Puede ver el número de seguidores de por vida (por "Me gusta" en su página FB) por país usando una consulta FQL. Configure una consulta JSON utilizando el valor de la sesión tokenizada y envíe una consulta FQL a través de PHP con el object_ID de la página a la que apunta y un período de vigencia. seleccione métrica y establezca la métrica en page_fans_country, y vacíe los datos en un archivo CSV. Debería obtener una lista de seguidores totales de por vida (por me gusta) por código de país (varias filas). Configure una tabla dinámica para obtener un índice agregado en varias páginas de datos y clasifique por código de país. Aquí hay un ejemplo de la consulta FQL:
SELECCIONAR métrica, valor FROM insights DONDE object_id = [su ID de página va aquí] AND metric = ''page_fans_country'' AND end_time = end_time_date (''2013-04-28'') AND period = period (''lifetime'')
Te regalaré :
<?xml version="1.0" encoding="UTF-8"?>
<fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true">
<user>
<current_location>
<city>Palo Alto</city>
<state>California</state>
<country>United States</country>
<zip/>
<id>104022926303756</id>
<name>Palo Alto, California</name>
</current_location>
</user>
</fql_query_response>
Como puedo ver, lo único que es estable en fb es FQL
Utiliza http://developers.facebook.com/docs/reference/fql/ tablas descritas aquí para obtener la información que necesites, la API del gráfico aún no está bien.
Deberías intentarlo así:
/* 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;
}
usa el gráfico API / me? fields = hometown te devolverá, por ejemplo, "Praga, República Checa". Creo que puedes explotar el hilo con la aguja "," y el último elemento debería ser el país
La respuesta publicada por Valerchik es la correcta, pero en caso de que alguien busque una solución PHP, terminé con algo como esto:
$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)) {
...
La lista de todos los atributos del usuario se puede encontrar aquí:
https://developers.facebook.com/docs/reference/fql/user/
Espero que ayude a alguien :)