[[telegram-component]]
= Telegram Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-telegram/src/main/docs/telegram-component.adoc
:docTitle: Telegram
:artifactId: camel-telegram
:description: Send and receive messages acting as a Telegram Bot Telegram Bot API.
:since: 2.18
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*

The Telegram component provides access to the https://core.telegram.org/bots/api[Telegram Bot API].
It allows a Camel-based application to send and receive messages by acting as a Bot, participating in
direct conversations with normal users, private and public groups or channels.

A Telegram Bot must be created before using this component, following the instructions at the
https://core.telegram.org/bots#3-how-do-i-create-a-bot[Telegram Bot developers home].
When a new Bot is created, the https://telegram.me/botfather[BotFather] provides an
**authorization token** corresponding to the Bot. The authorization token is a mandatory parameter
for the camel-telegram endpoint.

[NOTE]
====
In order to allow the Bot to receive all messages exchanged within a group or channel (not just
the ones starting with a '/' character), ask the BotFather to *disable the privacy mode*, using the
*/setprivacy* command.
====


Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-telegram</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

== URI format

[source,text]
----------------------------------------------------
telegram:type/authorizationToken[?options]
----------------------------------------------------

You can append query options to the URI in the following format,
`?option=value&option=value&...`

== Options

// component options: START
The Telegram component supports 7 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *baseUri* (advanced) | Can be used to set an alternative base URI, e.g. when you want to test the component against a mock Telegram API | https://api.telegram.org | String
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *client* (advanced) | To use a custom AsyncHttpClient |  | AsyncHttpClient
| *clientConfig* (advanced) | To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance. |  | AsyncHttpClientConfig
| *authorizationToken* (security) | The default Telegram authorization token to be used when the information is not provided in the endpoints. |  | String
|===
// component options: END



// endpoint options: START
The Telegram endpoint is configured using URI syntax:

----
telegram:type
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *type* | *Required* The endpoint type. Currently, only the 'bots' type is supported. The value can be one of: bots |  | String
|===


=== Query Parameters (32 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *limit* (consumer) | Limit on the number of updates that can be received in a single polling request. | 100 | Integer
| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
| *timeout* (consumer) | Timeout in seconds for long polling. Put 0 for short polling or a bigger number for long polling. Long polling produces shorter response time. | 30 | Integer
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
| *chatId* (producer) | The identifier of the chat that will receive the produced messages. Chat ids can be first obtained from incoming messages (eg. when a telegram user starts a conversation with a bot, its client sends automatically a '/start' message containing the chat id). It is an optional parameter, as the chat id can be set dynamically for each outgoing message (using body or headers). |  | String
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *baseUri* (advanced) | Can be used to set an alternative base URI, e.g. when you want to test the component against a mock Telegram API |  | String
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *bufferSize* (advanced) | The initial in-memory buffer size used when transferring data between Camel and AHC Client. | 4096 | int
| *clientConfig* (advanced) | To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance. |  | AsyncHttpClientConfig
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *proxyHost* (proxy) | HTTP proxy host which could be used when sending out the message. |  | String
| *proxyPort* (proxy) | HTTP proxy port which could be used when sending out the message. |  | Integer
| *proxyType* (proxy) | HTTP proxy type which could be used when sending out the message. The value can be one of: HTTP, SOCKS4, SOCKS5 | HTTP | TelegramProxyType
| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
| *delay* (scheduler) | Milliseconds before the next poll. | 500 | long
| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
| *initialDelay* (scheduler) | Milliseconds before the first poll starts. | 1000 | long
| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | TRACE | LoggingLevel
| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component. The value can be one of: none, spring, quartz | none | String
| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. The value can be one of: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS | MILLISECONDS | TimeUnit
| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
| *authorizationToken* (security) | *Required* The authorization token for using the bot (ask the BotFather) |  | String
|===
// endpoint options: END





== Message Headers

[width="100%",cols="20%,80%",options="header",]
|=======================================================================
|Name |Description
|`CamelTelegramChatId` |This header is used by the producer endpoint in order to
resolve the chat id that will receive the message. The recipient chat id can be
placed (in order of priority) in message body, in the `CamelTelegramChatId` header
or in the endpoint configuration (`chatId` option).
This header is also present in all incoming messages.

|`CamelTelegramMediaType` |This header is used to identify the media type when
the outgoing message is composed of pure binary data. Possible values are strings or enum values
belonging to the `org.apache.camel.component.telegram.TelegramMediaType` enumeration.

|`CamelTelegramMediaTitleCaption` |This header is used to provide a caption or title
for outgoing binary messages.

|`CamelTelegramParseMode` |This header is used to format text messages using HTML or Markdown (see `org.apache.camel.component.telegram.TelegramParseMode`).

|=======================================================================

== Usage

The Telegram component supports both consumer and producer endpoints.
It can also be used in *reactive chat-bot mode* (to consume, then produce messages).

== Producer Example

The following is a basic example of how to send a message to a Telegram chat through the
Telegram Bot API.

in Java DSL

[source,java]
---------------------------------------------------------
from("direct:start").to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------

or in Spring XML

[source,xml]
---------------------------------------------
<route>
    <from uri="direct:start"/>
    <to uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
<route>
---------------------------------------------

The code `123456789:insertYourAuthorizationTokenHere` is the *authorization token* corresponding to the Bot.

When using the producer endpoint without specifying the *chat id* option, the target chat will be identified using information contained in the body or headers of the message.
The following message bodies are allowed for a producer endpoint (messages of type `OutgoingXXXMessage` belong to the package `org.apache.camel.component.telegram.model`)

[width="100%",cols="40%,60%",options="header",]
|===================================================
| Java Type | Description

| `OutgoingTextMessage` | To send a text message to a chat
| `OutgoingPhotoMessage` | To send a photo (JPG, PNG) to a chat
| `OutgoingAudioMessage` | To send a mp3 audio to a chat
| `OutgoingVideoMessage` | To send a mp4 video to a chat
| `OutgoingDocumentMessage` | To send a file to a chat (any media type)
| `OutgoingStickerMessage` | To send a sticker to a chat (WEBP)
| `OutgoingAnswerInlineQuery` | To send answers to an inline query
| `EditMessageTextMessage` | To edit text and game messages (editMessageText)
| `EditMessageCaptionMessage` | To edit captions of messages (editMessageCaption)
| `EditMessageMediaMessage` | To edit animation, audio, document, photo, or video messages. (editMessageMedia)
| `EditMessageReplyMarkupMessage` | To edit only the reply markup of message. (editMessageReplyMarkup)
| `EditMessageDelete` | To delete a message, including service messages. (deleteMessage)
| `SendLocationMessage` | To send a location (setSendLocation)
| `EditMessageLiveLocationMessage` | To send changes to a live location (editMessageLiveLocation)
| `StopMessageLiveLocationMessage` | To stop updating a live location message sent by the bot or via the bot (for inline bots) before live_period expires (stopMessageLiveLocation)
| `SendVenueMessage` | To send information about a venue (sendVenue)
| `byte[]` | To send any media type supported. It requires the `CamelTelegramMediaType` header to be set to the appropriate media type
| `String` | To send a text message to a chat. It gets converted automatically into a `OutgoingTextMessage`

|===================================================


== Consumer Example

The following is a basic example of how to receive all messages that telegram users are sending to the configured Bot.
In Java DSL

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.bean(ProcessorBean.class)
---------------------------------------------------------

or in Spring XML

[source,xml]
---------------------------------------------
<route>
    <from uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
    <bean ref="myBean" />
<route>

<bean id="myBean" class="com.example.MyBean"/>
---------------------------------------------

The `MyBean` is a simple bean that will receive the messages

[source,java]
---------------------------------------------------------
public class MyBean {

    public void process(String message) {
        // or Exchange, or org.apache.camel.component.telegram.model.IncomingMessage (or both)

        // do process
    }

}
---------------------------------------------------------


Supported types for incoming messages are

[width="100%",cols="40%,60%",options="header",]
|===================================================
| Java Type | Description

| `IncomingMessage` | The full object representation of an incoming message
| `String` | The content of the message, for text messages only

|===================================================




== Reactive Chat-Bot Example

The reactive chat-bot mode is a simple way of using the Camel component to build a simple
chat bot that replies directly to chat messages received from the Telegram users.

The following is a basic configuration of the chat-bot in Java DSL

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.bean(ChatBotLogic.class)
.to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------

or in Spring XML

[source,xml]
---------------------------------------------
<route>
    <from uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
    <bean ref="chatBotLogic" />
    <to uri="telegram:bots/123456789:insertYourAuthorizationTokenHere"/>
<route>

<bean id="chatBotLogic" class="com.example.ChatBotLogic"/>
---------------------------------------------


The `ChatBotLogic` is a simple bean that implements a generic String-to-String method.

[source,java]
---------------------------------------------------------
public class ChatBotLogic {

    public String chatBotProcess(String message) {
        if( "do-not-reply".equals(message) ) {
            return null; // no response in the chat
        }

        return "echo from the bot: " + message; // echoes the message
    }

}
---------------------------------------------------------


Every non-null string returned by the `chatBotProcess` method is automatically routed to the
chat that originated the request (as the `CamelTelegramChatId` header is used to route the message).

== Getting the Chat ID

If you want to push messages to a specific Telegram chat when an event occurs, you need to
retrieve the corresponding chat ID. The chat ID is not currently shown in the telegram client,
but you can obtain it using a simple route.

First, add the bot to the chat where you want to push messages, then run a route like the following one.

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
.to("log:INFO?showHeaders=true");
---------------------------------------------------------

Any message received by the bot will be dumped to your log together with information about the chat (`CamelTelegramChatId`
header).

Once you get the chat ID, you can use the following sample route to push message to it.

[source,java]
---------------------------------------------------------
from("timer:tick")
.setBody().constant("Hello")
to("telegram:bots/123456789:insertYourAuthorizationTokenHere?chatId=123456")
---------------------------------------------------------

Note that the corresponding URI parameter is simply `chatId`.

== Customizing keyboard

You can customize the user keyboard instead of asking him to write an option. `OutgoingTextMessage` has the property `ReplyKeyboardMarkup` which can be used for such thing.

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
    .process(exchange -> {

        OutgoingTextMessage msg = new OutgoingTextMessage();
        msg.setText("Choose one option!");

        InlineKeyboardButton buttonOptionOneI = InlineKeyboardButton.builder()
                .text("Option One - I").build();

        InlineKeyboardButton buttonOptionOneII = InlineKeyboardButton.builder()
                .text("Option One - II").build();

        InlineKeyboardButton buttonOptionTwoI = InlineKeyboardButton.builder()
                .text("Option Two - I").build();

        ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
                .keyboard()
                    .addRow(Arrays.asList(buttonOptionOneI, buttonOptionOneII))
                    .addRow(Arrays.asList(buttonOptionTwoI))
                    .close()
                .oneTimeKeyboard(true)
                .build();

        msg.setReplyKeyboardMarkup(replyMarkup);

        exchange.getIn().setBody(msg);
    })
    .to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------

If you want to disable it the next message must have the property `removeKeyboard` set on `ReplyKeyboardMarkup` object.

[source,java]
---------------------------------------------------------
from("telegram:bots/123456789:insertYourAuthorizationTokenHere")
    .process(exchange -> {

        OutgoingTextMessage msg = new OutgoingTextMessage();
        msg.setText("Your answer was accepted!");

        ReplyKeyboardMarkup replyMarkup = ReplyKeyboardMarkup.builder()
                .removeKeyboard(true)
                .build();

        msg.setReplyKeyboardMarkup(replyMarkup);

        exchange.getIn().setBody(msg);
    })
    .to("telegram:bots/123456789:insertYourAuthorizationTokenHere");
---------------------------------------------------------


== Webhook Mode

The Telegram component supports usage in the *webhook mode* using the *camel-webhook* component.

In order to enable webhook mode, users need first to add a REST implementation to their application.
Maven users, for example, can add *netty-http* to their `pom.xml` file:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-netty-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

Once done, you need to prepend the webhook URI to the telegram URI you want to use.

In Java DSL:

[source,java]
---------------------------------------------------------
from("webhook:telegram:bots/123456789:insertYourAuthorizationTokenHere").to("log:info");
---------------------------------------------------------

Some endpoints will be exposed by your application and Telegram will be configured to send messages to them.
You need to ensure that your server is exposed to the internet and to pass the right value of the
*camel.component.webhook.configuration.webhook-external-url* property.

Refer to the *camel-webhook* component documentation for instructions on how to set it.

include::camel-spring-boot::page$telegram-starter.adoc[]
