READING

When writing an Android application program in the Android Studio programming environment, I spent a significant amount of time developing subroutines for exchanging application text data with a specific Telegram channel. Perhaps this is due to my little experience in java programming or poor coverage of this moment on the Internet. In short, for the possible reduction of time costs for beginners to develop programs for connecting an Android application to Telegram, this tutorial is offered.

The proposed program is based on one of the ways to exchange information in Bot API requests: the URL query string. HTTP methods GET and POST are used for requests. Text data is received/transmitted in the background using the AsyncTask class, which is set as an internal class of the main application class.

Data transfer is performed by means of the class: SendMessageTelegram.

Data is received through the class: GetMessageTelegram.

In the main program (for example, MainActivity), before calling objects based on these classes, you must define variables:

private String outMesRemember = “”;//last saved transmitted message

public static String token = “bot_token”;

public static String id = “chat_id”;

private String updateTelegram = “”;// new message in the channel

Values bot_token and chat_id are registered from the Telegram channel you created. How to create a channel is described in many sources. The procedure for Reading/Writing text to a channel is initiated by calling:

//sending a message to telegram

new SendMessageTelegram().execute();

//getting a new message from a telegram channel

new GetMessageTelegram().execute();

The following are listings of programs with detailed comments on the actions performed:

 //=====внутренний класс передачи сообщений в интернет на канал telegram=============
        private  class SendMessageTelegram extends AsyncTask<Void, Void, Void> {
        private String resultString = null;
//метод для отображения индикатора выполнения в пользовательском интерфейсе 
          //не используется
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        // метод для выполнения задач в фоновом режиме
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                //адрес бота "телеграмм"
                String myURL =
                        "https://api.telegram.org/bot" + token +"/sendMessage";
                String param = "chat_id=" + id + "&text=" + outMesRemember;
                byte[] data;
                try {//подключаемся к серверу
                    URL url = new URL(myURL);
                  HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                    conn.setReadTimeout(5000);//тайм-аут чтения в мс
                    conn.setConnectTimeout(10000);//тайм-аут соединения в мс
                    conn.setRequestMethod("POST");
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    //задать общее свойство запроса:
                    // - повторное использование соединений HTTP "Keep-Alive";
                    // - тип формата отправки запроса по умолчанию (можно не указывать)
          conn.setRequestProperty("Connection", "Keep-Alive");
          conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                    //определяем длину передаваемого сообщения
               conn.setRequestProperty("Content-Length", "" + param.getBytes().length);
                    OutputStream os = conn.getOutputStream();
                    // конвертируем передаваемую строку в UTF-8
                    data = param.getBytes(StandardCharsets.UTF_8);
                    //передаем данные на сервер
                    os.write(data);
                    os.flush();
                    os.close();
                    conn.connect();
  int responseCode = conn.getResponseCode();//Представляющие три цифры HTTP Status-Code
                    resultString = Integer.toString(responseCode);
                    conn.disconnect();//отключение соединения
                } catch (MalformedURLException e) {//неправильный адрес сайта
                    resultString = "MalformedURLException:" + e.getMessage();
                } catch (IOException e) {//неудачная операция ввода/вывода
                    resultString = "IOException:" + e.getMessage();
                } catch (Exception e) {//что-то пошло не так
                    resultString = "Exception:" + e.getMessage();
                }
            } catch (Exception e) {
                //e.printStackTrace();
            }
            return null;
        }
    // метод для обработки результата выполнения фоновых задач
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // для отладки
            if (resultString != null) {
             //вывод результата на экран
             Toast.makeText(MainActivity.this, resultString, Toast.LENGTH_LONG).show();
            } else {
             Toast.makeText(MainActivity.this, "no result", Toast.LENGTH_SHORT).show();
            }
         if (resultString.equals("200")) {//kod '200' - ok сообщение доставлено успешно
      Toast.makeText(MainActivity.this, "СООБЩЕНИЕ:" +
      outMesRemember  + "\r\n" + " ОТПРАВЛЕНО  B TELEGRAM", Toast.LENGTH_LONG).show(); 
            } else {
   Toast.makeText(MainActivity.this, "СООБЩЕНИЕ:" +
   outMesRemember  + "\r\n" + " ОШИБКА отправки ИНТЕРНЕТ ", Toast.LENGTH_LONG).show();                
                }
        }
    }
  //=====внутренний класс приема новых сообщений через интернет с канала telegram=============
        private class GetMessageTelegram extends AsyncTask<Void, Void, Void> {
        private String resultString = null;
        // метод для выполнения задач в фоновом режиме
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                //адресс бота "телеграмм"+получение последнего сообщения
        String myURL = "https://api.telegram.org/bot" + token +"/getUpdates?offset=-1";
                byte[] data;
                try {//подключаемся к серверу
         URL url = new URL(myURL);//создаем объект класса указателя ресурса в интернете
         //создание объекта соединения  с удаленным объектом, на который ссылается URL.
               //Приведение его к протоколу обмена HTTPs
                  HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                        //прописываем параметры соединения
                    conn.setReadTimeout(5000);//тайм-аут чтения в мс
                    conn.setConnectTimeout(10000);//тайм-аут соединения в мс
                    conn.setRequestMethod("GET");
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    conn.connect();//подключаемся к ресурсу
      InputStream is = conn.getInputStream();//открыть входной поток для чтения из URL
            //BufferedReader - Читаем текст из потока ввода символов, буферизуя символы.                    //
            //Можно указать размер буфера или использовать размер по умолчанию.
            // Значение по умолчанию достаточно велико для большинства целей.
               BufferedReader reader = new BufferedReader(new InputStreamReader(is));
               StringBuilder buf = new StringBuilder();//спец.буфер для хранения строк
                    String line;
                    //Чтение строк текста пока не появится нулевая
                    while ((line=reader.readLine()) != null) {
              buf.append(line).append("\n");//в конце каждой строки доб. символ перевод строки
                    }
                   //полученное новое сообщение из телеграм-канала, ввиде JSONObject
                   //со вложенными JSONObject внутри JSONArray (массива)
                    String newMesTelegram = buf.toString();
           //выделение текста из сообщения
                    JSONObject jo = new JSONObject(newMesTelegram);
                    JSONArray ja = jo.getJSONArray("result");//первое вложение
                    String sj = ja.toString();
                        //удаление признаков массива
                    sj = sj.replace("[","");
                    sj = sj.replace("]","");
                 //если текст в сообщении присутствует, производим дальнейшую обработку
                    if(!sj.equals("")) {
                        JSONObject jon = new JSONObject(sj);
                 JSONObject jonm = jon.getJSONObject("channel_post");//второе вложение
                    //выделение текста из последнего JSONObject и преобразование его в
                        //строку из UTF_8 кода
                 updateTelegram = new String(jonm.getString("text").getBytes(), UTF_8);
                    } else {
                        updateTelegram = "";
                    }
                    is.close();
     responseCode = conn.getResponseCode();//Представляющие три цифры HTTP Status-Code
                    resultString = Integer.toString(responseCode);
                    conn.disconnect();//отключение соединения
                } catch (MalformedURLException e) {//неправильный адрес сайта
                    resultString = "MalformedURLException:" + e.getMessage();
                } catch (IOException e) {//неудачная операция ввода/вывода
                    resultString = "IOException:" + e.getMessage();
                } catch (Exception e) {//что-то пошло не так
                    resultString = "Exception:" + e.getMessage();
                }
            } catch (Exception e) {
                //e.printStackTrace();
            }
            return null;
        }
        // метод для обработки результата выполнения фоновых задач
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // для отладки
            if (resultString != null) {
                //вывод результата на экран
           Toast.makeText(MainActivity.this, resultString, Toast.LENGTH_LONG).show();
            } else {
           Toast.makeText(MainActivity.this, "no result", Toast.LENGTH_LONG).show();
            }
          if (resultString.equals("200")) {//kod '200' - ok сообщение получено успешно
           Toast.makeText(MainActivity.this, "СООБЩЕНИЕ:" +
           updateTelegram + "\r\n" + "ПОЛУЧЕНО ОТ TELEGRAM", Toast.LENGTH_LONG).show();               
            }
        }
    }

The data exchange is presented as two separate classes so that it is possible to use the program only to receive or transmit text to the channel.

The program was written without the use of additional libraries when decoding received messages from the Telegram channel as a JSON object and without the use of web hooks (webhook). But there is a drawback in the presented method of obtaining data from the channel – the need to poll it periodically.

When developing the program, the examples described in these sources were taken as a basis:

https://ds-release.ru/kak-v-android-studio-peredavat-dannye-na-server-v-internete/

https://metanit.com/java/android/15.1.php

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *