google - Intentando importar contactos de gmail usando node.js
node js gmail api (1)
Estoy tratando de importar contactos de Gmail. He obtenido con éxito el access_token, pero al intentar obtener el navegador de contactos sigue arrojando el error. invalid_grant
mis códigos a continuación.
para autenticación y devolución de llamada.
authorize: function(req, res){
var CLIENT_ID = ''927112080821-vhsphqc79tb5ohfgpuvrp8uhh357mhad.apps.googleusercontent.com'';
var CLIENT_SECRET = ''gdgofL0RfAXX0in5JEiQiPW8'';
var SCOPE = ''https://www.google.com/m8/feeds'';
oa = new oauth.OAuth2(CLIENT_ID,
CLIENT_SECRET,
"https://accounts.google.com/o",
"/oauth2/auth",
"/oauth2/token");
res.redirect(oa.getAuthorizeUrl({scope:SCOPE, response_type:''code'', redirect_uri:''http://localhost:1234/callback''}));
},
callback: function(req, res){
console.log(req.query.code);
oa.getOAuthAccessToken(req.query.code, {grant_type:''authorization_code'', redirect_uri:''http://localhost:1234/callback''}, function(err, access_token, refresh_token) {
if (err) {
res.end(''error: '' + JSON.stringify(err));
} else {
getContactsFromGoogleApi(access_token);
//res.write(''access token: '' + access_token + ''/n'');
//res.write(''refresh token: '' + refresh_token);
//res.end();
}
});
},
para importar contactos
function getContactsFromGoogleApi (access_token, req, res, next) {
console.log(''access_token '' + access_token);
request.get({
url: ''https://www.google.com/m8/feeds/contacts/default/full'',
qs: {
alt: ''json'',
''max-results'': 1000,
''orderby'': ''lastmodified''
},
headers: {
''Authorization'': ''OAuth '' + access_token,
''GData-Version'': ''3.0''
}
}, function (err, res, body) {
if(res.statusCode === 401){
return res.redirect(''index'');
}
var feed = JSON.parse(body);
var users = feed.feed.entry.map(function (c) {
var r = {};
if(c[''gd$name''] && [''gd$fullName'']){
r.name = c[''gd$name''][''gd$fullName''][''$t''];
}
if (c[''gd$email''] && c[''gd$email''].length > 0) {
r.email = c[''gd$email''][0][''address''];
r.nickname = r.email;//c[''gd$email''][0][''address''].split(''@'')[0];
}
if(c[''link'']){
var photoLink = c[''link''].filter(function (link) {
return link.rel == ''http://schemas.google.com/contacts/2008/rel#photo'' &&
''gd$etag'' in link;
})[0];
if(photoLink) {
r.picture = ''/users/photo?l='' + encodeURIComponent(photoLink.href);
} else if (r.email) {
r.picture = gravatar.url(r.email, {
s: 40,
d: "https://ssl.gstatic.com/s2/profiles/images/silhouette80.png"});
}
}
return r;
}).filter(function (u) {
return !!u.email && //we can only give access to persons with email at this point
!~u.email.indexOf(''@reply.''); //adress with @reply. are usually temporary reply address for forum kind of websites.
});
res.json(users);
});
}
Realmente aprecio ayuda.
En su función getContactsFromGoogleApi cambie el encabezado Authorization a lo siguiente;
headers: {
''Authorization'': ''Bearer '' + access_token,
''GData-Version'': ''3.0''
El siguiente es el código en C # para hacer lo mismo
webClient = new WebClient();
webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
webClient.Headers.Add(HttpRequestHeader.Authorization, String.Format("Bearer {0}", AccessToken));
do
{
contactStream = webClient.DownloadData(String.Format("{0}?start-index={1}", BaseApiEndpoints[Applications.Contacts], startIndex));
contactDocument = System.Text.Encoding.Default.GetString(contactStream);
contacts = new XmlDocument();
contacts.LoadXml(contactDocument);
// TODO: use xsl to convert results to ContactSearchResults
xslt = new XslCompiledTransform();
resultStream = new MemoryStream();
writer = new XmlTextWriter(resultStream, Encoding.ASCII);
translateContact = new XmlDocument();
xslStream = GetRequest("GoogleContacts.xslt");
xslStream.Seek(0, SeekOrigin.Begin);
templateReader = XmlReader.Create(xslStream);
xslt.Load(templateReader);
xslt.Transform(contacts,writer);
resultStream.Seek(0, SeekOrigin.Begin);
TranslatedContacts = ConvertByteArrayToString(ReadFully(resultStream));
csr = (ContactSearchResults)Deserialize(typeof(ContactSearchResults), TranslatedContacts);
foreach (Contact contact in csr.Contacts)
{
contact.RecordId = Guid.NewGuid();
// now we want to get the image
contact.Picture = GetImage(contact.PictureUrl, AccessToken);
if ((!String.IsNullOrEmpty(contact.Name)) || (!String.IsNullOrEmpty(contact.Email)))
results.Add(contact);
}
startIndex += csr.ItemsPerPage;
} while (startIndex < totalResults);
La URL que utilicé aquí es la misma que tu código; http://www.google.com/m8/feeds/
Cuando hice esto en C #, no tuve que pasar la versión.