Ir al contenido


Foto

Componente para enviar mensajes a celulares


  • Por favor identifícate para responder
6 respuestas en este tema

#1 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 24 octubre 2011 - 01:30

Buen dia compañeros, alguien sabe de algun componente ya sea Free ó de paga para enviar mensajes de texto a celulares, no importa que se pueda pagar un plan en telcel ó movistar son las 2 empresas de celulares de méxico .

El objetivo es enviar mensajes a celulares por algun componente.

Gracias....

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 octubre 2011 - 03:00

Ya comente un dia que nosotors enviamos mensajes a movil gratis usando las api de windows google.

A grandes rasgos, necesitas que google admita enviar avisos de la agenda al movil, es decir, tienen que tener un acuerdo tu compañia y google para que te permita esto. Según el pais esto es lo normal o lo raro, no se en  mexico como anda pero puedes comprobarlo en tu cuenta de google calendar.

El esquema es simple: Nuestro programa da de alta una cuenta en google a travas de las api, creo que las llamamos usnado indy, le pone el movil y el email en su perfil y en el calendar activa lo de enviar avisos al movil por sms y al email, todo automatico.

El dueño del movil recibe un aviso de que si esta deacuerdo en recibir sms, y un email para activar lo de recibirlos en su email, le dice que si a los dos, y listo.

Cuando tenemos que enviarle algo, creamos un evento en su agenda con el texto, le decimos que avise por email y sms, y le ponemos como fecha y hora de activacion dentro de 2 segundos, enviamos y al cabo de unos segundos nos entra el mensaje sms y el email con el texto.

Los detalles no me los se, no lo programe yo, pero si quereis algun "tip" al respecto, pedirmelo y os busco el trozo de codigo, no es ningun secreto de estado como funcionan estas apis de google, la cosa es solo la idea.
  • 0

#3 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 24 octubre 2011 - 06:32

Si nos puedes hacer el gran favor de poner el trozo de código para el envio del mensaje con delphi - google te lo agradeceríamos muchos  (y)
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 25 octubre 2011 - 06:15

Os copio-pego el trozo, no lo he repasado ni quitado cosas "de la casa", quiero decir que bueno, que si algo no complia a la primera, que useis la intuicion  *-)

Por ciuerto, Base.CuentaGmail( integer ) y Base.ClaveGamil( integer ) nos da estos dos datos del usuairo numero i, vosotros lo cambiais por vuestras cuentas y claves de gmail.

Primero los uses que tengo, no todos seran necesarios porque mi .pas incluye otra cosas, pero los "Id" de las Indy seguro que los necesitais, y el LibXmlParser tambien:



delphi
  1. uses
  2.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  3.   Grids, DBGrids, CtrlGrid, Menus, IdHTTP,
  4.   IdMultipartFormData, IdIOHandler, IdIOHandlerSocket,
  5.   LibXmlParser, LibXmlComps, IdTCPClient, IdTCPConnection, IdSSLOpenSSL,
  6.   StdCtrls, ExtCtrls, DBCtrls;



Ahora la definicion de los dos componentes (los creamos desde codigo, no los tenemos en la paleta y esas cosas visuales) que tenemos para hacer el trabajo interno:



delphi
  1.   TGoogleCalendar = class(TComponent)
  2.   private
  3.     cliente: TIdHTTP;
  4.     IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
  5.     datosPost: TStringList;
  6.     Frespuesta: TStringList;
  7.     datosAutenticacion: TStringList;
  8.     auth: string;
  9.     Parser: TXmlParser;
  10.     FAvisoEmail: boolean;
  11.     FAvisoSMS: boolean;
  12.     FTitulo: string;
  13.     FTexto: string;
  14.     //FDonde: string;
  15.     FFechaEvento: TDateTime;
  16.     FHoraEvento: TDateTime;
  17.     FJustoAhora: boolean;
  18.     //FHoraEvento: TTime;
  19.     FCorreo: string;
  20.     FClave: string;
  21.     FActivo: boolean;
  22.     function  toGoogleDate(value: TDateTime): string;
  23.     procedure SetCorreo(value: string);
  24.   public
  25.     constructor Create(AOwner: TComponent); override;
  26.     destructor  Destroy; override;
  27.     function Conectar: boolean;
  28.     function NuevaEntrada: string; //Devuelve el identificador de google para la nueva entrada o ''
  29.     function ActualizaEntrada(idEntrada: string): string; //Devuelve el identificador de google para la nueva entrada o ''
  30.     property Respuesta: TStringList read Frespuesta;
  31.     property AvisoEmail: boolean read FAvisoEmail write FAvisoEmail;
  32.     property AvisoSMS: boolean read FAvisoSMS write FAvisoSMS;
  33.     property Titulo: string read FTitulo write FTitulo;
  34.     property Texto: string read FTexto write FTexto;
  35.     //property Donde: string read FDonde write FDonde;
  36.     property FechaEvento: TDateTime read FFechaEvento write FFechaEvento;
  37.     property HoraEvento:  TDateTime read FHoraEvento write FHoraEvento;
  38.     //property HoraEvento: TTime read FHoraEvento write FHoraEvento;
  39.     property JustoAhora: boolean read FJustoAhora write FJustoAhora;
  40.     property Correo:string read FCorreo write SetCorreo;
  41.     property Clave:string read FClave write FClave;
  42.     property Activo: boolean read FActivo;
  43.   end;
  44.  
  45.   //Envío de SMS a través de google calendar
  46.   TSMS = class(TComponent)
  47.   private
  48.     FUsuario: integer;
  49.     FTexto: string;
  50.     Mensajes: TStringList;
  51.     FLog: TStringList;
  52.     googleCalendar: TGoogleCalendar;
  53.     procedure SetTexto(value: string);
  54.   public
  55.     constructor Create(AOwner: TComponent); override;
  56.     destructor  Destroy; override;
  57.     property Usuario: integer read FUsuario write FUsuario;
  58.     property Texto: string read FTexto write SetTexto;
  59.     property Log: TStringList read FLog;
  60.     function enviar: boolean;
  61.   end;



Ahora lo importante, el codigo de los dos componentes:



delphi
  1. {                                                                              .
  2.                               TGoogleCalendar                                  .
  3.                                                                               }
  4.  
  5. constructor TGoogleCalendar.Create(AOwner: TComponent);
  6. begin
  7.   inherited;
  8.   //Creo objetos
  9.   cliente:= TIdHTTP.Create(self);
  10.   IdSSLIOHandlerSocket:= TIdSSLIOHandlerSocket.Create(self);
  11.   IdSSLIOHandlerSocket.SSLOptions.Method:= sslvTLSv1;
  12.   Parser:= TXmlParser.Create;
  13.   datosPost:= TStringList.Create;
  14.   Frespuesta:= TStringList.Create;
  15.   datosAutenticacion:= TStringList.Create;
  16.   //Configuro objetos
  17.   cliente.AllowCookies:= true;
  18.   cliente.IOHandler:= IdSSLIOHandlerSocket;
  19.   cliente.ProxyParams.BasicAuthentication:= false;
  20.   FAvisoEmail:= false;
  21.   FAvisoSMS:= false;
  22.   //El evento no es inmediato por defecto
  23.   FJustoAhora:= false;
  24.   FActivo:= false;
  25.   FHoraEvento:= Txt2Hora('11:30:00');
  26. end;
  27.  
  28. destructor  TGoogleCalendar.destroy;
  29. begin
  30.   FreeAndNil(cliente);
  31.   FreeAndNil(IdSSLIOHandlerSocket);
  32.   FreeAndNil(datosPost);
  33.   FreeAndNil(Frespuesta);
  34.   FreeAndNil(datosAutenticacion);
  35.   FreeAndNil(Parser);
  36.   inherited;
  37. end;
  38.  
  39. function TGoogleCalendar.Conectar: boolean;
  40. begin
  41.   //Creamos una instancia de la clase TIdMultiPartFormDataStream
  42.   //que nos sirve para determinar luego los distintos pares
  43.   //"claves=valor" de que se compone un supuesto "Post HTTP"
  44.   Result:= true;
  45.   try
  46.     cliente.Request.ContentType := 'application/x-www-form-urlencoded';
  47.     cliente.Request.UserAgent := 'HCSoft';    //Como puede verse añadir pares "clave=valor" no resulta
  48.     cliente.Request.Username:= correo;
  49.     cliente.Request.Password:= clave;
  50.     //nada complicado. Pueden añadirse tantas como sean precisas.
  51.     datosPost.Clear;
  52.     datosPost.Add('Email='+correo);
  53.     datosPost.Add('Passwd='+clave);
  54.     datosPost.Add('source=exampleCo-exampleApp-1');
  55.     datosPost.Add('service=cl');
  56.     datosPost.Add('GData-Version: 2');
  57.     //Y en la siguiente línea se lleva a cabo el "Post HTTP"
  58.     //y además se obtiene su respuesta, que viene dada por el
  59.     //propio método "Post" de la clase "TIdHttp".
  60.     datosAutenticacion.Text := cliente.Post('[url=https://www.google.com/accounts/ClientLogin',]https://www.google.com/accounts/ClientLogin',[/url] datosPost);
  61.     auth:= datosAutenticacion.Values['auth'];
  62.   except
  63.     Result:= false;
  64.   end;
  65. end;
  66.  
  67. function TGoogleCalendar.toGoogleDate(value: TDateTime): string;
  68. begin
  69.   Result:= FormatDateTime('yyyy-mm-dd', value);
  70. end;
  71.  
  72. procedure TGoogleCalendar.SetCorreo(value: string);
  73. begin
  74.   FCorreo:= value;
  75.   FActivo:= FCorreo<>'';
  76. end;
  77.  
  78. function TGoogleCalendar.NuevaEntrada: string;
  79. begin
  80.   Result:= '';
  81.   cliente.Request.ContentType:='application/atom+xml';
  82.   cliente.Request.CustomHeaders.Add('Authorization: GoogleLogin auth='+auth);
  83.   cliente.HandleRedirects:= true;
  84.   cliente.HTTPOptions:= [];
  85.   datosPost.Clear;
  86.   datosPost.Add('<entry xmlns=''[url=http://www.w3.org/2005/Atom'']http://www.w3.org/2005/Atom''[/url] '+
  87.     'xmlns:gd=''[url=http://schemas.google.com/g/2005'']http://schemas.google.com/g/2005''[/url]>'+
  88.   '<category scheme=''[url=http://schemas.google.com/g/2005#kind'''+]http://schemas.google.com/g/2005#kind'''+[/url]
  89.   '  term=''[url=http://schemas.google.com/g/2005#event'']http://schemas.google.com/g/2005#event''[/url]></category>'+
  90.   '<title type=''text''>'+Titulo+'</title>'+
  91.   '<content type=''text''>'+Texto+'</content>'+
  92.   '<gd:transparency'+
  93.   '  value=''[url=http://schemas.google.com/g/2005#event.opaque'']http://schemas.google.com/g/2005#event.opaque''[/url]>'+
  94.   '</gd:transparency>'+
  95.   '<gd:eventStatus'+
  96.   '  value=''[url=http://schemas.google.com/g/2005#event.confirmed'']http://schemas.google.com/g/2005#event.confirmed''[/url]>'+
  97.   '</gd:eventStatus>'+
  98.   //'<gd:where valueString='''+Donde+'''></gd:where>'+
  99.   iif(JustoAhora,
  100.   '<gd:when startTime='''+toGoogleDate(date)+'T'+hora2txt(IncMinute(HoraGMT,2))+'.000Z''>',
  101.   '<gd:when startTime='''+toGoogleDate(FechaEvento)+'T'+hora2txt(HoraGMT(HoraEvento))+'.000Z''>')+
  102.   iif(AvisoEmail,'<gd:reminder minutes=''1'' method=''email'' />','')+
  103.   iif(AvisoSMS,  '<gd:reminder minutes=''1'' method=''sms'' />','')+
  104.   '</gd:when>'+
  105.   '</entry>');
  106.   try
  107.     Respuesta.Text := cliente.Post('[url=http://www.google.com/calendar/feeds/default/private/full',]http://www.google.com/calendar/feeds/default/private/full',[/url] datosPost);
  108.   except
  109.   end;
  110.  
  111.   //Conseguir identificador de entrada
  112.   Parser.LoadFromBuffer(PAnsiChar(Respuesta.text));
  113.  
  114.   //Prepara el escaneo por el documento
  115.   Parser.StartScan;
  116.   // Escaneamos el texto xml
  117.   while Parser.Scan do begin
  118.     //Aquí el parser te dice lo que ha encontrado
  119.     case Parser.CurPartType of
  120.       ptContent,
  121.       ptCData    : begin
  122.                     if (Parser.CurName='id') then begin
  123.                       Result:= Parser.CurContent;
  124.                       Result:= copy(Result,pos('full/',Result)+5,length(Result));
  125.                     end;
  126.                   end;
  127.     end;
  128.   end;
  129. end;
  130.  
  131. function TGoogleCalendar.ActualizaEntrada(idEntrada: string): string;
  132. var
  133.   txt: string;
  134.   s: TMemoryStream;
  135.   urlEdit: string;
  136. begin
  137.   inherited;
  138.   Result:= '';
  139.   cliente.Request.ContentType:='';
  140.   cliente.Request.CustomHeaders.Add('Authorization: GoogleLogin auth='+auth);
  141.   cliente.HandleRedirects:= true;
  142.   try
  143.     //Primero obtengo el evento correspondiente
  144.     Respuesta.Text:= cliente.Get('[url=http://www.google.com/calendar/feeds/default/private/full/'+idEntrada]http://www.google.com/calendar/feeds/default/private/full/'+idEntrada[/url]);
  145.   except
  146.     //Si no encuentro el evento, en lugar de actualizar simplemente creo un evento nuevo.
  147.     Result:= NuevaEntrada;
  148.   end;
  149.   Parser.LoadFromBuffer(PAnsiChar(Respuesta.text));
  150.   //Prepara el escaneo por el documento
  151.   Parser.StartScan;
  152.   // Escaneamos el texto xml para buscar la url del documento en cuestión.
  153.   // Al mismo tiempo, en txt voy guardando el contenido xml del evento a actualizar
  154.   // y colocando los nuevos valores.
  155.   while Parser.Scan do begin
  156.     //Aquí el parser te dice lo que ha encontrado
  157.     case Parser.CurPartType of
  158.       ptStartTag,
  159.       ptEmptyTag : begin
  160.                     if Parser.CurName='gd:when' then begin
  161.                       txt:= txt+iif(JustoAhora,
  162.                                     '<gd:when startTime='''+toGoogleDate(date)+'T'+hora2txt(IncMinute(HoraGMT,2))+'.000Z''>',
  163.                                     '<gd:when startTime='''+toGoogleDate(FechaEvento)+'T'+hora2txt(HoraGMT(HoraEvento))+'.000Z''>');
  164.                       txt:= txt+iif(AvisoEmail,'<gd:reminder minutes=''1'' method=''email'' />','');
  165.                       txt:= txt+iif(AvisoSMS,  '<gd:reminder minutes=''1'' method=''sms'' />','');
  166.                     end
  167.                     else if Parser.curName='gd:reminder' then
  168.                     else begin
  169.                       txt:= txt+copy(Parser.CurStart,1,Parser.CurFinal-Parser.curStart+1);
  170.                       if Parser.CurName='content' then
  171.                         txt:= txt+Texto;
  172.                       //Si es la etiqueta del documento a editar...
  173.                       if (Parser.CurName='link') then
  174.                         if Parser.CurAttr.Value('rel')='edit' then
  175.                           urlEdit:= Parser.CurAttr.Value('href');  //Guardo la url concreta
  176.                     end;
  177.                   end;
  178.       ptContent,
  179.       ptCData    : begin
  180.                     if (Parser.CurName='title') then
  181.                       txt:= txt+Titulo else
  182.                     if (Parser.CurName='content') then
  183.                     //  Evito añadir nada, ya lo he añadido antes (lo he puesto antes porque si la descripcion estaba
  184.                     //vacia, no pasa por este "case".
  185.                     else
  186.                       txt:= txt+copy(Parser.CurStart,1,Parser.CurFinal-Parser.curStart+1);
  187.                   end;
  188.       else
  189.         txt:= txt+copy(Parser.CurStart,1,Parser.CurFinal-Parser.curStart+1);
  190.     end;
  191.   end;
  192.  
  193.   //Ahora modifico la entrada
  194.   cliente.Request.ContentType:='application/atom+xml';
  195.   cliente.Request.CustomHeaders.Add('Authorization: GoogleLogin auth='+auth);
  196.   cliente.Request.CustomHeaders.Add('If-Match: *');
  197.   cliente.HandleRedirects:= true;
  198.   cliente.HTTPOptions:= [];
  199.   datosPost.Clear;
  200.   datosPost.Text:= txt;
  201.  
  202.   s:= TMemoryStream.Create;
  203.   datosPost.SaveToStream(s);
  204.   try
  205.     Respuesta.Text := cliente.put(urlEdit, s);
  206.   except
  207.     FreeAndNil(s);
  208.   end;
  209.   FreeAndNil(s);
  210.  
  211.   //Conseguir identificador de entrada
  212.   Parser.LoadFromBuffer(PAnsiChar(Respuesta.text));
  213.  
  214.   //Prepara el escaneo por el documento
  215.   Parser.StartScan;
  216.   //Escaneamos el texto xml para obtener el identificador del nuevo evento
  217.   while Parser.Scan do begin
  218.     //Aquí el parser te dice lo que ha encontrado
  219.     case Parser.CurPartType of
  220.       ptContent,
  221.       ptCData    : begin
  222.                     if (Parser.CurName='id') then begin
  223.                       Result:= Parser.CurContent;
  224.                       Result:= copy(Result,pos('full/',Result)+5,length(Result));
  225.                     end;
  226.                   end;
  227.     end;
  228.   end;
  229. end;
  230.  
  231. {                                                                              .
  232.                                   TSMS                                        .
  233.                                                                               }
  234.  
  235. constructor TSMS.Create(AOwner: TComponent);
  236. begin
  237.   inherited;
  238.   googleCalendar:= TGoogleCalendar.Create(self);
  239.   FLog:= TStringList.Create;
  240.   Mensajes:= TStringList.Create;
  241. end;
  242.  
  243. destructor  TSMS.destroy;
  244. begin
  245.   FreeAndNil(Mensajes);
  246.   FreeAndNil(FLog);
  247.   FreeAndNil(googleCalendar);
  248.   inherited;
  249. end;
  250.  
  251. //Cuando recibimos el texto a enviar, lo partimos en tantos trozos como sea necesario
  252. //para poder enviar todo el mensaje (de momento, 2/4/2009, 56 caracteres max)
  253. procedure TSMS.SetTexto(value: string);
  254. var
  255.   i, len: integer;
  256.   str: string;
  257.   partido: boolean;
  258. const
  259.   lenSMS=56;
  260. begin
  261.   Mensajes.Clear;
  262.   partido:= false;
  263.   len:= Length(value);
  264.   for i:=1 to len do begin
  265.     if (i mod (lenSMS-6)) = 0 then begin //Podría tener que partir, acabo de llegar al límite
  266.       if (len-i > 6) or partido then begin
  267.         //Guardo un mensaje nuevo y comienzo el siguiente
  268.         Mensajes.Add(str);
  269.         str:= value[i];
  270.         partido:= true;
  271.       end else //Me quedan menos de 5 caracteres, luego caben en el actual
  272.         str:= str+ value[i];
  273.     end else //Caso normal, voy añadiendo al mensaje
  274.       str:= str + value[i];
  275.   end;
  276.   //Finalmente añado el último trozo que quede
  277.   Mensajes.Add(str);
  278.   if Mensajes.Count>1 then begin  //Si hay varios mensajes debo numerarlos
  279.     for i:= 0 to Mensajes.Count-1 do begin
  280.       Mensajes[i]:= Mensajes[i]+'('+intToStr(i+1)+'/'+intToStr(Mensajes.Count)+')';
  281.     end;
  282.   end;
  283. end;
  284.  
  285. function TSMS.Enviar: boolean;
  286. var
  287.   salida: string;
  288.   i: integer;
  289. begin
  290.   Result:= true;
  291.   FLog.Clear;
  292.   googleCalendar.Correo:= Base.CuentaGmail(FUsuario);
  293.   googleCalendar.Clave:= Base.ClaveGmail(FUsuario);
  294.   //Si el usuario tiene cuenta en su ficha --> Está activo
  295.   if googleCalendar.Activo then begin
  296.     googleCalendar.AvisoSMS:= true;
  297.     googleCalendar.JustoAhora:= true;  //Se genera al isntante
  298.     googleCalendar.FechaEvento:= Today;
  299.     //Nos autenticamos
  300.     if googleCalendar.Conectar then begin
  301.       for i:= 0 to Mensajes.Count-1 do begin  //Vamos enviando cada uno de los mensajes
  302.         googleCalendar.Titulo:= Mensajes[i];
  303.         //Intentamos crear la entrada
  304.         salida:= googleCalendar.NuevaEntrada;
  305.         if salida='' then
  306.           FLog.Add(Base.Traduce('No se ha podido enviar el sms.'))
  307.         else
  308.           FLog.Add(Base.Traduce('El sms se ha enviado correctamente'));
  309.       end; //for
  310.     end else
  311.       FLog.Add(Base.Traduce('No se ha podido enviar el sms. Error de autenticación.'));
  312.   end else //No activo
  313.     FLog.Add(Base.Traduce('No se ha podido enviar el sms. El destinatario no tiene '+
  314.                           'cuenta de gmail con calendario asociada en su ficha.'));
  315. end;



Y bueno, usarlo ya es sencillito:



delphi
  1.   sms.Usuario:= Str2Int(EdPara.Text);
  2.   sms.Texto:= EdTexto.Text;
  3.   if not sms.enviar then ShowMessage('Error envio SMS');


  • 0

#5 slimfast

slimfast

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 15 octubre 2012 - 12:29

Está excelente pero desafortunadamente en México no hay convenio entre las operadoras de móviles y gmail, no está México en la lista de operadores. Obviamente no les conviene ya que esto por parte de Gmail no tiene costo.
  • 0

#6 uziel

uziel

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 23 octubre 2012 - 11:53

te equivocas en mexico ya se puede, solo que no entiendo ccomo esta organizado alguien me podria explicar
  • 0

#7 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 23 octubre 2012 - 01:07

Así es uziel gracias por el dato, confirmado.., mande el sms de confirmación para la activación y ahora si me llegó el sms; al igual que los recordatorios de la agenda.  :)


Saludos

  • 0




IP.Board spam blocked by CleanTalk.