Esp32 cam tg foto

Тема в разделе "ESP8266, ESP32", создана пользователем Readerfeeder, 9 мар 2021.

  1. Readerfeeder

    Readerfeeder Нуб

    Нашел интересную библиотеку для работы с telegram. так то все хорошо работает кроме фото. Долго ковырялся перед тем как написать этот пост . И теперь мое терпение лопнуло и я прошу помощи друзья.
    Вобщем проблема заключается в следующем . (самое смешное что при первом запуске все работало ,я даже создал файл worked wersion , чтобы исключить смерть скетча от детских пальчиков.) В библиотеке за отправку фото отвечает несколько функций , а именно

    Код (C++):
    String UniversalTelegramBot::sendPhotoByBinary(
        const String& chat_id, const String& contentType, int fileSize,
        MoreDataAvailable moreDataAvailableCallback,
        GetNextByte getNextByteCallback, GetNextBuffer getNextBufferCallback, GetNextBufferLen getNextBufferLenCallback) {

      #ifdef TELEGRAM_DEBUG
        Serial.println(F("sendPhotoByBinary: SEND Photo"));
      #endif

      String response = sendMultipartFormDataToTelegram("sendPhoto", "photo", "img.jpg",
        contentType, chat_id, fileSize,
        moreDataAvailableCallback, getNextByteCallback, getNextBufferCallback, getNextBufferLenCallback);

      #ifdef TELEGRAM_DEBUG
        Serial.println(response);
      #endif

      return response;
    }
    UniversalTelegramBot::sendPhotoByBinary костыль для следующей
    Код (C++):
    String UniversalTelegramBot::sendMultipartFormDataToTelegram(
        const String& command, const String& binaryPropertyName, const String& fileName,
        const String& contentType, const String& chat_id, int fileSize,
        MoreDataAvailable moreDataAvailableCallback,
        GetNextByte getNextByteCallback,
        GetNextBuffer getNextBufferCallback,
        GetNextBufferLen getNextBufferLenCallback) {

      String body;
      String headers;
     
      const String boundary = F("------------------------b8f610217e83e29b");

      // Connect with api.telegram.org if not already connected
      if (!client->connected()) {
        #ifdef TELEGRAM_DEBUG
            Serial.println(F("[BOT Client]Connecting to server"));
        #endif
        if (!client->connect(TELEGRAM_HOST, TELEGRAM_SSL_PORT)) {
          #ifdef TELEGRAM_DEBUG
            Serial.println(F("[BOT Client]Conection error"));
          #endif
        }
      }
      if (client->connected()) {
        String start_request;
        String end_request;
       

        start_request += F("--");
        start_request += boundary;
        start_request += F("\r\ncontent-disposition: form-data; name=\"chat_id\"\r\n\r\n");
        start_request += chat_id;
        start_request += F("\r\n" "--");
        start_request += boundary;
        start_request += F("\r\ncontent-disposition: form-data; name=\"");
        start_request += binaryPropertyName;
        start_request += F("\"; filename=\"");
        start_request += fileName;
        start_request += F("\"\r\n" "Content-Type: ");
        start_request += contentType;
        start_request += F("\r\n" "\r\n");

        end_request += F("\r\n" "--");
        end_request += boundary;
        end_request += F("--" "\r\n");

        client->print(F("POST /"));
        client->print(buildCommand(command));
        client->println(F(" HTTP/1.1"));
        // Host header
        client->println(F("Host: " TELEGRAM_HOST)); // bugfix - https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/issues/186
        client->println(F("User-Agent: arduino/1.0"));
        client->println(F("Accept: */*"));

        int contentLength = fileSize + start_request.length() + end_request.length();
        #ifdef TELEGRAM_DEBUG
            Serial.println("Content-Length: " + String(contentLength));
        #endif
        client->print(F("Content-Length: "));
        client->println(String(contentLength));
        client->print(F("Content-Type: multipart/form-data; boundary="));
        client->println(boundary);
        client->println(F(""));
        client->print(start_request);

        #ifdef TELEGRAM_DEBUG
         Serial.print("Start request: " + start_request);
        #endif

        if (getNextByteCallback == nullptr) {
            while (moreDataAvailableCallback()) {
                client->write((const uint8_t *)getNextBufferCallback(), getNextBufferLenCallback());
                #ifdef TELEGRAM_DEBUG
                 Serial.println(F("Sending photo from buffer"));
                #endif
                }
        } else {
            #ifdef TELEGRAM_DEBUG
                Serial.println(F("Sending photo by binary"));
            #endif
            byte buffer[512];
            int count = 0;
            while (moreDataAvailableCallback()) {
                buffer[count] = getNextByteCallback();
                count++;
                if (count == 512) {
                    // yield();
                    #ifdef TELEGRAM_DEBUG
                        Serial.println(F("Sending binary photo full buffer"));
                    #endif
                    client->write((const uint8_t *)buffer, 512);
                    count = 0;
                }
            }
           
            if (count > 0) {
                #ifdef TELEGRAM_DEBUG
                    Serial.println(F("Sending binary photo remaining buffer"));
                #endif
                client->write((const uint8_t *)buffer, count);
            }
        }

        client->print(end_request);
        #ifdef TELEGRAM_DEBUG
            Serial.print("End request: " + end_request);
        #endif
        readHTTPAnswer(body, headers);
      }

      closeClient();
      return body;
    }
    Вообщем в процессе ее выполнения есп думает секунд 10 , видимо ждет ответа от апи и вроде говорит что все отправлено и великолепно ,но ничего бот не присылает . Я думаю что проблема в том что апи просто не понимает что я ему отправляю . либо я как то не правильно формирую запрос . HELP!!! уже всю голову сломал. Прилагаю библиотеку проверьте , даже пример не работает.
     

    Вложения:

  2. Un_ka

    Un_ka Гуру

    Что в ответе от API? Надо сравнивать ваш запрос с примерами для rest api.
     
  3. Readerfeeder

    Readerfeeder Нуб

    Вся загвоздка в том ,что ничего не приходит в ответ . в этой библиотеке предусмотрен вывод ответа от апи , при включеном дебаге.
    видимо какой-то косяк с multipart data form , наверное разделитель не правильно читается ,ладно буду ковыряться дальше .
     
  4. Un_ka

    Un_ka Гуру

    Надо попробовать вместо печати в клиент посылать в serial и смотреть, что не там.