Integrar el API de Telegram con PHP

  • 1) Cuando hablo del API de Telegram no me estoy refiriendo a la creación de Bot’s, sino al uso del API ‘real’ que ofrece y que te da la oportunidad de crear tu propio cliente de mensajería.
  • 2) El objetivo de este artículo es intentar ofrecer al menos un punto de partida inicial para saber más o menos cómo empezar a usar el API de Telegram con PHP. Lo que se suele conocer como ‘saber por dónde van los tiros’…o el post que a mi me hubiera gustado leer cuando empecé.
  • 3) Por lo tanto…‘disclaimer’: lo que vas a leer a continuación es parte de mi experiencia con este API. Aún hay partes (muchas) que desconozco y a día de hoy todavía sigo aprendiendo y pegándome (mucho…muchísimo) con él para seguir integrando parte de la aplicación PHP.

¿Para qué usar el API de Telegram? Problema a resolver

Contexto inicial

Problema

Misión

  • Grupo nuevo en PHP -> canal de difusión privado nuevo en app mensajería.
  • Alumno nuevo en PHP -> contacto nuevo en app mensajería.
  • Alumno entra en un grupo -> contacto entra al canal privado del grupo.
  • Alumno sale de un grupo -> contacto sale del canal privado del grupo.
  • Alumno cambia de grupo -> contacto sale del canal privado del primer grupo y entra al segundo.
  • …etc, etc.

Búsqueda de soluciones

Whatsapp

Otras aplicaciones de mensajería

Aplicación propia

Telegram

Primeros pasos

Crear aplicación en Telegram

composer require danog/madelineproto

Nota

Iniciar sesión en Telegram con PHP y MadelineProto

  • Paso 1: En primer lugar deberemos indicar api_id y el api_hash que obtuvimos al crear la aplicación. Podemos hacerlo de forma manual o automática. Si elegimos ‘Automatically’, únicamente tendremos que poner el número de teléfono con el que creamos la aplicación…así que esta será nuestra opción:
  • Paso 2: Indicamos el número de teléfono con el que creamos la aplicación.
  • Paso 3: Nos llegará un mensaje de aviso a nuestro Telegram con un código de inicio de sesión
  • Paso 4: Introduciremos el código recibido.
  • Paso 5: A continuación nos preguntará si queremos iniciar sesión como ‘user’ o como ‘bot’. En nuestro caso, como ‘User’.
  • Paso 6: Volvemos a introducir el número de teléfono.
  • Paso 7: Y recibiremos ahora otro mensaje con el código de inicio de sesión.
  • Paso 8: A continuación indicamos el código recibido
  • Paso 9: …y si todo ha ido bien, veremos que en la carpeta de nuestro proyecto tenemos creados los archivos de sesión de MadelineProto.

Primera solicitud al API de Telegram con PHP

Otras llamadas al API de Telegram desde PHP

return $this->madelineProto->loop(function () { 
...
ejemplos de código
...
});

Crear un canal

$response = yield $this->madelineProto->channels->createChannel([
'title' => 'título del canal',
'about' => 'texto con alguna descripción'
]);

Invitar a participantes a un canal

$response = yield $this->madelineProto->channels->inviteToChannel( ['channel' => InputChannel, 'users' => [InputUser, InputUser], ]);
  • La primera es que fueran contactos conocidos y ya hubiéramos obtenido anteriormente sus ‘userId’ de Telegram en alguna otra operación. En este caso no tendríamos más que especificar un array de usuarios del tipo ‘user#ID’, de la forma:
$inputUsers = ['user#123', 'user#456', 'user#789', ...]
  • La segunda es que sean contactos ‘anónimos’, es decir, no los tengamos aún en nuestra ‘agenda’ y desde Telegram no hubiéramos interactuado nunca con ellos. En este caso tendremos que importarlos previamente usando la llamada a importContacts. Para esto, deberíamos hacer algo parecido a lo siguiente:
//supongamos que hemos recibido una petición POST la siguiente información:
$_POST['channel_id'] = 123456;
$_POST['participants = [
['phone'=>'6123','first_name'=>'Manu','second_name'=>'Pijierro'
['phone'=>'6456','first_name'=>'Leo','second_name'=>'Messi'],
['phone'=>'6789','first_name'=>'Cris','second_name'=>'Ronaldo'],
];
//obtenemos nuestro propio ID
$me = yield $this->madelineProto->getSelf();
//configuramos la identificación del canal al que vamos a invitar
$channelKey = 'channel#'.$_POST['channel_id'];
//configuramos el array para la llamada a importContacts
$inputContacts = [];
foreach ($POST['participants] as $participant){
$inputContacts[] = [
'_' => 'inputPhoneContact',
'client_id' => $me['id'],
'phone' => $participant['phone'],
'first_name' => $participant['first_name'],
'second_name' => $participant['second_name']
];
}
//importamos los contactos a nuestra 'agenda'
$contacts = yield $this->madelineProto->contacts->importContacts(['contacts' => $inputContacts]);
//...y con la información recibida, construímos el array con los userId
$keyUsers = [];
foreach ($contacts['users'] as $contact) {
$keyUsers[] = 'user#'.$contact['id'];
}
//Finalmente, invitamos a los contactos al canal
return yield $this->madelineProto->channels->inviteToChannel(['channel' => $channelKey, 'users' => $keyUsers]);

Expulsar a un contacto de un canal

Enviar un mensaje a un contacto

$response = yield $this->madelineProto->messages->sendMessage([
'peer' => $peer,
'message' => 'mensaje a enviar',
'parse_mode' => 'Markdown'
]);

Enviar un mensaje a un canal

Obtener información de todos los contactos

$response =  yield $this->madelineProto->contacts->getContacts();

Obtener información de un contacto

$responseContact =  yield $this->madelineProto->getFullInfo($inputPeer);

Otras operaciones…

Obtener actualizaciones desde Telegram

--

--

--

Dad and developer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Manu Pijierro

Manu Pijierro

Dad and developer

More from Medium

Stripe ACH implementation in laravel

Setup Redis on Laravel project 💡

Laravel VS Symfony

Sharing data to all view Laravel Blade