elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Usas telegram? programa tu bot en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Usas telegram? programa tu bot en C  (Leído 6,057 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
¿Usas telegram? programa tu bot en C
« en: 1 Abril 2016, 06:30 am »

Buen dia compañeros.

Quiero compartirles el proyecto en el que estoy trabajando.

Una interfaz en C para que programen su bot para telegram.

El codigo esta disponible en github, aun lo sigo mejorando y optimizando lo mas que pueda.
Casi todo el programa es memoria dimanica la cual  administra muy bien la aplicacion.

Ejemplo de uso.
Código
  1. /*
  2.  * Luis Alberto
  3.  * Twitter @albertobsd
  4.  */
  5.  
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #include<curl/curl.h>
  10. #include<sys/stat.h>
  11. #include<errno.h>
  12. #include"telegram.h"
  13. #include"jsmn.h"
  14.  
  15. int main() {
  16. Updates *updates;
  17. User *user;
  18. Message *message;
  19. File *file;
  20. char **variables;
  21. char **valores;
  22. int i = 0;
  23. char *filename;
  24. telegram_init("123456789:zwxecrvtbynuyvbnmutyguhjdkeosdgjhfdouhn");
  25. user = telegram_getMe();
  26. if(!telegram_is_error()) {
  27. printf("User: id: %i\nusername: %s\n",user->id,user->username);
  28. telegram_free_user(user);
  29. }
  30. else {
  31. printf("%s\n",telegram_get_error());
  32. }
  33. updates = telegram_getUpdates();
  34. if(!telegram_is_error()){
  35. printf("updates: %i\n",updates->length);
  36. while(i < updates->length) {
  37. if(updates->list[i]->item.message->document) {
  38. printf("Document exits file_id : %s\n",updates->list[i]->item.message->document->file_id);
  39. file = telegram_getFile(updates->list[i]->item.message->document->file_id);
  40. if(!telegram_is_error()) {
  41. filename = telegram_downloadFile(file,updates->list[i]->item.message->document->file_name);
  42. printf("file name : %s\n",filename);
  43. }
  44. else {
  45. printf("%s\n",telegram_get_error());
  46. }
  47. }
  48. i++;
  49. }
  50. telegram_free_updates(updates);
  51. }
  52. else {
  53. printf("%s\n",telegram_get_error());
  54. }
  55. variables = calloc(5,sizeof(char*));
  56. valores = calloc(5,sizeof(char*));
  57. variables[0] = "chat_id";
  58. variables[1] = "text";
  59. valores[0] = "9219883";
  60. valores[1] ="Texto de prueba";
  61. message = telegram_sendMessage(telegram_build_post(variables,valores));
  62. if(!telegram_is_error()) {
  63. printf("OK %s\n",message->text);
  64. telegram_free_message(message);
  65. }
  66. else {
  67. printf("%s\n",telegram_get_error());
  68. }
  69. variables[1] = "caption";
  70. valores[1] = "Envio archivo";
  71. message = telegram_sendDocument("test_telegram",variables,valores);
  72. if(!telegram_is_error()) {
  73. printf("OK %s\n",message->text);
  74. telegram_free_message(message);
  75. }
  76. else {
  77. printf("%s\n",telegram_get_error());
  78. }
  79. return 0;
  80. }
  81.  
  82.  


Para trabajar con este ejemplo tenemos que te generar un token de autorización para nuestro bot y editar la linea de codigo:

Código
  1. telegram_init("123456789:zwxecrvtbynuyvbnmutyguhjdkeosdgjhfdouhn");

en este ejemplo procesamos las peticiciones:

getMe
getUpdates
sendDocument

Tambien que tenemos que sustituir el chat_id por el nuestro
El codigo depende de que tengamos instalado libcurl

Codigo en gihub

https://github.com/albertobsd/libtelegrambot

Saludos!


« Última modificación: 1 Abril 2016, 06:32 am por AlbertoBSD » En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #1 en: 1 Abril 2016, 11:18 am »

Interesante. Un día estaba pensando en hacer un bot en C++ que al final no hice, así que me resultara útil tu aporte por si algún día retomo la idea.

Por cierto, porque usas calloc en vez de malloc?


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #2 en: 1 Abril 2016, 14:32 pm »

Como indica la documentacion de stdlib.

malloc y calloc reservan memoria. sin embargo no hay  garantia que la memoria reservada por malloc este limpia. A veces si a veces no.

calloc por otra parte es como malloc + memset(ptr,0,length). reserva memoria y la limpia. es importante tener la memoria limpia por que a veces haces condicidiones como:

Código:
if(ptr!=NULL)
{
free(ptr);
}

basta que exista un byte de basura en la memoria para que la condicion se cumpla y el programa se cuelgue por tratar de liberar memoria inexistente o en su defecto escribir en un area no reservada.

https://www.freebsd.org/cgi/man.cgi?query=calloc&sektion=3&apropos=0&manpath=redhat


Citar
calloc()    allocates memory for an array of nmemb   elements of size bytes
       each and   returns   a pointer to the allocated memory.  The   memory is  set
       to zero.

       malloc()    allocates  size  bytes   and returns a pointer to the allocated
       memory.   The memory is not cleared.
« Última modificación: 1 Abril 2016, 15:56 pm por AlbertoBSD » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #3 en: 1 Abril 2016, 14:46 pm »

Es todo correcto excepto lo de la condicion, la memoria asignada al puntero no la podes comparar de esa manera, de esa manera estas comparando la direccion a la que apunta el puntero con NULL y sera NULL con malloc o calloc en caso de fallo al reservar.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #4 en: 1 Abril 2016, 14:48 pm »

De la documentación también, si hay un error malloc retorna NULL igual que calloc (se me avanzaron..), no le sacas partido a calloc ya que no veo para que te sirve que inicialize a 0 cuando luego lo sobrescribieras.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #5 en: 1 Abril 2016, 15:38 pm »

no le sacas partido a calloc ya que no veo para que te sirve que inicialize a 0 cuando luego lo sobrescribieras.

No seas vago. Es importante que el area en la que vas a escribir no tenga basura Me a pasado muchas veces que reservo exactamente la memoria que voy a usar + un byte. y algunas veces tu esperas que ese byte sea 0 y te quedas con esa idea y luego el programa empieza a hacer cosas raras y despues de pasara un rato depurando con GDB te das cuenta que la memoria tenia basura. cambias la instruccion a calloc o le agregas un memset despues del malloc y ahora todo funciona al 100.


Es todo correcto excepto lo de la condicion, la memoria asignada al puntero no la podes comparar de esa manera, de esa manera estas comparando la direccion a la que apunta el puntero con NULL y sera NULL con malloc o calloc en caso de fallo al reservar.

entiendo el punto, el codigo mostrado va cuando yo voy a liberar la memoria despues de usarla, si es que se usado,

Por ejemplo las funciones que ofresco para liberar la memoria

Código
  1. void telegram_free_updates(Updates *updates) {
  2. int i = 0;
  3. if(updates) {
  4. while(i < updates->length) {
  5. if(updates->list[i])
  6. telegram_free_update(updates->list[i]);
  7. i++;
  8. }
  9. memset(updates,0,sizeof(Updates));
  10. free(updates);
  11. }
  12. }
  13.  
« Última modificación: 1 Abril 2016, 15:40 pm por AlbertoBSD » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #6 en: 1 Abril 2016, 16:00 pm »

El ejemplo correcto seria una estructura que tiene punteros por ejemplo, ahi el no inicializar la estructura correctamente puede tener graves consecuencias.

Por ejemplo las funciones que ofresco para liberar la memoria

Código
  1. void telegram_free_updates(Updates *updates) {
  2. int i = 0;
  3. if(updates) {
  4. while(i < updates->length) {
  5. if(updates->list[i])
  6. telegram_free_update(updates->list[i]);
  7. i++;
  8. }
  9. memset(updates,0,sizeof(Updates));
  10. free(updates);
  11. }
  12. }
  13.  

No tiene mucho sentido el memset ahi, poner la memoria a cero para inmediatamente liberarla es una perdida de tiempo, salvo que sean datos que querramos asegurarnos de que no queden en memoria por temas de seguridad. Ese memset no va a evitar que la variable con la cual llamaste a telegram_free_updates (en la cual no podes escribir ya que no la pasaste como doble puntero o referencia, updates es una variable local pasada por valor) continue apuntando al mismo bloque de memoria que liberas con free.

Código
  1. Updates *u = (Updates*)malloc(sizeof(Updates));
  2. telegram_free_updates(u);
  3. //u continua apuntando a la direccion de memoria que le haya retornado malloc
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #7 en: 1 Abril 2016, 16:06 pm »


 Ese memset no va a evitar que la variable con la cual llamaste a telegram_free_updates (en la cual no podes escribir ya que no la pasaste como doble puntero o referencia, updates es una variable local pasada por valor) continue apuntando al mismo bloque de memoria que liberas con free.

Código
  1. Updates *u = (Updates*)malloc(sizeof(Updates));
  2. telegram_free_updates(u);
  3. //u continua apuntando a la direccion de memoria que le haya retornado malloc

Tienes razon es lo que me quede pensando cuando respondi hace rato voy a cambiat el tipo de funcion y retornar NULL.
Y quedaria asi:

Código
  1. u= telegram_free_updates(u)
.

Gracias por el aporte :)
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #8 en: 1 Abril 2016, 19:10 pm »

Código
  1. u = telegram_free_updates(u)
Ese código es extraño y se ve forzado y tienes muy en cuenta la buena voluntad del cliente de tu función, cuándo debería ser al revés y pensar en el peor de los casos.
Si esa persona hace lo siguiente
Código
  1. telegram_free_updates(u)
u seguirá apuntando a algún sitio.
Debería ser la función mismo la que llevara u a NULL.
Tendría que estar definida tal que así
Código
  1. void telegram_free_updates(Updates **updates) {
  2.    Updates *u = *updates;
  3.    if(u) {
  4.        int i;
  5.        for(i = 0; i < u->length; ++i)
  6.            if(u->list[i])
  7.                telegram_free_updates(&u->list[i]);
  8.    }
  9.    *updates = NULL;
  10. }
Con esto la variable obtendrá el valor NULL.

Una cosa más. Para que esto tenga sentido entiendo que has definido Updates de la siguiente forma
Código
  1. typedef struct updates_t {
  2.    /*
  3.      * Aquí van definidos
  4.      * campos para el uso
  5.      * del programa
  6.      */
  7.    unsigned length;
  8.    struct updates_t **list;
  9. } Updates;
De nuevo el código me parece extraño pues el mismo tipo de datos contiene un array dinámico de sí mismo. De esta manera uno puede meter Updates dentro de Updates dentro de Updates... con lo que se pierde rápidamente el control de lo que ocurre.
Podrías implementar un tipo de dato contenedor de Updates, para que te sirviera de array dinámico, y el tipo Updates por otra parte. Con un struct anónimo tal que así
Código
  1. typedef struct update_t {
  2.    /*
  3.      * Aquí van definidos
  4.      * campos para el uso
  5.      * del programa
  6.      */
  7. } Update;
  8.  
  9. struct {
  10.    unsigned length;
  11.    Update **list;
  12. } Updates;
  13.  

Así te aseguras que solo hay un único array de Update en todo el programa.
« Última modificación: 1 Abril 2016, 19:12 pm por MAFUS » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Usas telegram? programa tu bot en C
« Respuesta #9 en: 1 Abril 2016, 19:21 pm »

Tienes razon es lo que me quede pensando cuando respondi hace rato voy a cambiat el tipo de funcion y retornar NULL.
Y quedaria asi:

Código
  1. u= telegram_free_updates(u)
.

Gracias por el aporte :)

De nada pero todo eso es problema del caller y ademas de no asignar el valor de retorno podria tener mas variables apuntando al mismo bloque de memoria  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Así funciona la seguridad de Telegram
Noticias
wolfbcn 8 4,584 Último mensaje 7 Febrero 2014, 21:05 pm
por Platanito Mx
telegram por consola en linux
GNU/Linux
daryo 2 2,629 Último mensaje 3 Marzo 2014, 21:27 pm
por Jenag
grupo telegram para novatos
Programación General
:Luigi 8 7,047 Último mensaje 11 Marzo 2015, 11:50 am
por antoniognzle
Duda privacidad Telegram
Dudas Generales
skan 4 2,925 Último mensaje 28 Diciembre 2014, 02:18 am
por skan
¿Usas Telegram? Tus chats guardados no están cifrados
Noticias
wolfbcn 0 1,118 Último mensaje 31 Octubre 2018, 14:56 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines