Page 1 of 3

API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 8:32 am
by softruz
Muy buenas Compañeros,
abro este hilo para compartir todo lo que sepamos sobre la API de Google, en este caso comparto una pequeña parte de la API de Google Calendar, para poder leer y insertar eventos en nuestros calendarios.

Teneis que configurar las variables myEmail (email de gmail),myPassword (password del email)

Si teneis mas informacion



////////////////////////////////
// Codigo Fuente
////////////////////////////

#include "FiveWin.ch"

Function Main()
local strURL:= "https://www.google.com/accounts/ClientLogin",AuthCode:=""
local strFormData,myEmail:="",myPassword:="",mySource:="project-example-1",cRespone:=""
strFormData = "Email=" + myEmail + "&Passwd=" + myPassword + "&source=" + mySource + "&service=cl"
cResponse:=SendPostToUrl( strURL, strFormData )
AuthCode = Right(cResponse, Len(cResponse) - at("Auth=",cResponse) - 4)

cEventCode:=getEventCode(date(),"Test Event","Event Description","Your Name","Email","Cordoba")

// Añadir un nuevo evento
strURL = "http://www.google.com/calendar/feeds/default/private/full"
strFormData = cEventCode
cResponse:=SendPostToUrl( strURL, strFormData,"application/atom+xml","GoogleLogin auth=" + AuthCode)

// Recivir los calendarios
strURL:="https://www.google.com/calendar/feeds/default/allcalendars/full"
strFormData = cEventCode
cResponse:=SendPostToUrl( strURL, strFormData,"application/atom+xml","GoogleLogin auth=" + AuthCode)
msginfo(cResponse)
Return Nil

Function SendPostToUrl( cUrl, cParams,cContentType,cAuthorization )
Local oOle,cRet:='',uRet
default cContentType:="application/x-www-form-urlencoded"
default cAuthorization:=""
Try
oOle := CreateObject( 'MSXML2.XMLHTTP' )
Catch
oOle := CreateObject( 'Microsoft.XMLHTTP' )
End
oOle:Open( 'POST', cUrl, .f. )

oOle:SetRequestHeader( "Content-Type",cContentType)
if !empty(cAuthorization)
oOle:SetRequestHeader( "Authorization",cAuthorization)
end if

oOle:Send( cParams )
SysRefresh()

#ifdef __XHARBOUR__
cRet := oOle:ResponseBody
#else
AEval(oOle:ResponseBody,{|uRet|cRet+=Chr(uRet)})
#endif
Return cRet

function dtos_format(fecha)
local cadena
if valtype(fecha) = "D"
cadena:=dtos(fecha)
if !empty(cadena)
return substr(cadena,1,4) + "-" + substr(cadena,5,2) + "-" + substr(cadena,7,2)
else
return "0000-00-00"
end if
else
return "0000-00-00"
end if
return "0000-00-00"

static function getEventCode(dDate,cEventName,cEventDescription,cYourName,cEmailAddress,cLocation,cStartTime,cEndTime)
local formattedDate:=""
default cStartTime:="17:00:00",cEndTime:="18:00:00"

// 'change the date into Google's yyyy-mm-dd format
formattedDate = dtos_format(dDate)

getEventCode = "<entry xmlns='http://www.w3.org/2005/Atom'" + CRLF +;
"xmlns:gd='http://schemas.google.com/g/2005'>" + CRLF +;
" <category scheme='http://schemas.google.com/g/2005#kind'" + CRLF +;
"term='http://schemas.google.com/g/2005#event'></category>" + CRLF +;
" <title type='text'>" +cEventName+ "</title>" + CRLF +;
"<content type='text'>" +cEventDescription+ "</content>" + CRLF +;
"<author>" + CRLF +;
"<name>" +cYourName+ "</name>" + CRLF +;
"<email>" +cEmailAddress+ "</email>" + CRLF +;
"</author>" + CRLF +;
"<gd:transparency" + CRLF +;
"value='http://schemas.google.com/g/2005#event.opaque'>" + CRLF +;
"</gd:transparency>" + CRLF +;
"<gd:eventStatus" + CRLF +;
"value='http://schemas.google.com/g/2005#event.confirmed'>" + CRLF +;
"</gd:eventStatus>" + CRLF +;
"<gd:where valueString='" +cLocation+ "'></gd:where>" + CRLF +;
"<gd:when startTime='" + formattedDate + "T" + cStartTime+"'" + CRLF +;
"endTime='" + formattedDate + "T" + cEndTime+"'></gd:when>" + CRLF +;
"</entry>"
return getEventCode

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 11:30 am
by anserkk
Very good

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 12:07 pm
by Antonio Linares
Gracias por compartirlo! :-)

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 12:16 pm
by softruz
Para eso estamos, para Compartir.

Un Saludo.

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 12:24 pm
by elvira
Gracias!!

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 12:31 pm
by hmpaquito
Muchas gracias por compartirlo.

Estas aportaciones "web" dan mucha "vidilla" a nuestros aplicativos desktop.

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 12:42 pm
by softruz
Ahora estoy con la API de contactos, cuando tenga algo lo comparto.

Un Saludo.

Re: API Google. Ejemplos

PostPosted: Tue Jan 15, 2013 12:59 pm
by driessen
Hello,

Please, could anyone put a translation of this topic in English in the English forum?

Thank you very much in advance.

Re: API Google. Ejemplos

PostPosted: Wed Jan 16, 2013 8:23 am
by Silvio.Falconi
Application
===========
Path and name: C:\work\errori\google\test.Exe (32 bits)
Size: 1,781,248 bytes
Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6715)
FiveWin Version: FWHX 12.03
Windows version: 5.1, Build 2600 Service Pack 2

Time from start: 0 hours 0 mins 0 secs
Error occurred at: 01/16/13, 09:22:34
Error description: Error MSXML2.XMLHTTP/3 DISP_E_MEMBERNOTFOUND: SEND
Args:
[ 1] = C Email=silvio.falconi@gmail.com&Passwd=..............&source=project-example-1&service=cl

Stack Calls
===========
Called from: source\rtl\win32ole.prg => TOLEAUTO:SEND( 0 )
Called from: test.prg => SENDPOSTTOURL( 46 )
Called from: test.prg => MAIN( 13 )

Re: API Google. Ejemplos

PostPosted: Wed Jan 16, 2013 8:37 am
by softruz
Silvio el mismo codigo con la FWH901 y FWH1204 me funciona perfectamente, con la FWH1203 no lo he probado pero supongo que debe funcionar.

Postea tu código y lo miramos.

Un Saludo.

Re: API Google. Ejemplos

PostPosted: Wed Jan 16, 2013 11:29 am
by armando.lagunas
Code: Select all  Expand view

Try
oOle := CreateObject( 'MSXML2.XMLHTTP' )
Catch
oOle := CreateObject( 'Microsoft.XMLHTTP' )
End
 


también me da error...
:(

Re: API Google. Ejemplos

PostPosted: Wed Jan 16, 2013 5:27 pm
by sambomb
Como usar com proxy?

Re: API Google. Ejemplos

PostPosted: Wed Jan 16, 2013 6:13 pm
by hmpaquito
Silvio,

He encontrado este codigo desde https://groups.google.com/forum/?fromgr ... 4IETfJ6e0J

A ver si te puede servir.

But, we can use WebServices
I use for government and for my city
see a example for send a xml with many invoices
Load xml
cXML := memoread('nfse\11072432000124_I_20117-27_26072011.xml')
cXML := STRTRAN( cXML, '<?xml version="1.0" encoding="ISO-8859-1"?>', '' )
cXML := STRTRAN( cXML, "<", "&lt;" )
cXML := STRTRAN( cXML, ">", "&gt;" )
Load DOMDocument
xmldom = win_oleCREATEOBJECT("MSXML2.DOMDocument.5.0")
xmldom:async = .T.
xmldom:validateOnParse = .T.
xmldom:resolveExternals := .T.
xmldom:preserveWhiteSpace = .T.

Load XMLHTTP
xmldoc = win_oleCREATEOBJECT("MSXML2.XMLHTTP.6.0")
url := "http://189.1.164.238:8080/issonline/servlet/anfse"
Conect to WebService
xmldoc:open("POST", url, .F.)
xmldoc:setrequestheader("Content-Type","application/x-www-form-urlencoded")
xmldoc:setRequestHeader("SOAPAction", "nfseaction/ANFSE.Execute" )
Making XML for WebService
Texto := '<?xml version="1.0" encoding="ISO-8859-1"?>'
Texto += '<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"';
+ ' xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="nfse" xmlns:wsdlns="nfse" xmlns:tns1="ISS">'
Texto += '<SOAP-ENV:Body>'
Texto += '<wsdlns:Nfse.Execute xmlns:wsdlns="nfse">'
Texto += '<wsdlns:Operacao>1</wsdlns:Operacao>'
Texto += '<wsdlns:Usuario>21312</wsdlns:Usuario>' //
Texto += '<wsdlns:Senha>321321321321</wsdlns:Senha>'
Texto += '<wsdlns:Webxml>'+cXML+''
Texto += '</wsdlns:Webxml>'
Texto += '</wsdlns:Nfse.Execute>'
Texto += '</SOAP-ENV:Body>'
Texto += '</SOAP-ENV:Envelope>'

xmldom:LoadXML(Texto)
IF xmldom:parseError:errorCode = 0
//"XML Load"
ELSE
lcErrorMsg = "Não foi possível carregar o documento pois ele não corresponde ao seu Schema"
lcErrorMsg = lcErrorMsg + " Linha: " + STR(xmldom:parseError:line)
lcErrorMsg = lcErrorMsg + " Caractere na linha: " + STR(xmldom:parseError:linepos)
lcErrorMsg = lcErrorMsg + " Causa do erro: " + xmldom:parseError:reason;
+"code: "+STR(xmldom:parseError:errorCode)
msginfo(lcErrorMsg)
ENDIF
Send data to WebService
xmldoc:send(xmldom:xml)
Get Result
cResult := xmldoc:responseXML:xml

Best Regards,
Fernando Athayde
From Brazil



Saludos


Silvio.Falconi wrote:Application
===========
Path and name: C:\work\errori\google\test.Exe (32 bits)
Size: 1,781,248 bytes
Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6715)
FiveWin Version: FWHX 12.03
Windows version: 5.1, Build 2600 Service Pack 2

Time from start: 0 hours 0 mins 0 secs
Error occurred at: 01/16/13, 09:22:34
Error description: Error MSXML2.XMLHTTP/3 DISP_E_MEMBERNOTFOUND: SEND
Args:
[ 1] = C Email=silvio.falconi@gmail.com&Passwd=..............&source=project-example-1&service=cl



Stack Calls
===========
Called from: source\rtl\win32ole.prg => TOLEAUTO:SEND( 0 )
Called from: test.prg => SENDPOSTTOURL( 46 )
Called from: test.prg => MAIN( 13 )

Re: API Google. Ejemplos

PostPosted: Thu Jan 17, 2013 1:13 pm
by acuellar
Gracias Softru por compartir.

Funciona perfecto.

Saludos,

Adhemar

Re: API Google. Ejemplos

PostPosted: Sun Jan 20, 2013 9:33 am
by Andrés González
Softruz, no sé quien eres, pero te agradezco esta contribución, creo que este es el camino que debemos seguir y recuerdo un mensaje que puse en el 2010, referente a este tema: http://forums.fivetechsupport.com/viewtopic.php?f=6&t=18785&start=15#p98540.

Bien, este es un buen punto de partida y ya veo que mis palabras ya tenían sentido, quiero hacerte un par de consultas, a ver si puedes ilustrarme. El ejemplo me ha funcionado perfecto y ya lo tengo implementado para que funcione en mi calendario particular. Una cosa que no he resuelto es el tema del calendario y la contraseña de cada uno, si quiero que se haga de forma automática en cada uno. Te cuento las variantes que tengo a ver si me puedes decir como hacerlo.

He desarrollado un gestor de tareas corporativo con FW y tiro de una base de datos donde tengo los usuarios, supongo que ahí es el lugar indicado para que cada uno se identifique y guarde los datos encriptados de cada uno, a no ser que creas mejor una opción como cookies o algo parecido. Cuando he dado de alta tu ejemplo en mi calendario, me he dado cuenta que también contamos con un gestor de tareas con nuestro gmail. ¿Sabes cual es el método para dar de alta la tarea en este proceso? Supongo que has investigado mas que yo y igual podemos reciclar el ejemplo para dar las tareas en este nuevo calendario. Esto aparece en la parte izquierda de tu gmail y te añade el calendario de tareas pero no es una dirección de correo, tan solo pone lista de tareas cuando vas a Calendar. Tiene su propio gestor, pero me imagino que ahí también lo podemos referenciar para dar de alta tareas desde un programa FW.

PD.: http://support.google.com/calendar/bin/answer.py?hl=es&answer=106237&topic=1672528&ctx=topic Ahí tenemos la información de tareas.