Sending a message to a Telegram bot
-
wrote on 30 Aug 2022, 06:56 last edited by jenya7
First I check my bot is alive and kicking
https://api.telegram.org/bot_my_api_key/sendMessage?chat_id=my_chat_id&text="This is a test"
And my bot gets the message.
Now I use QtTelegramBot library
bot = new Telegram::Bot("my_api_key"); bot->sendMessage("my_chat_id", "This is a test");
And I get in Debug window - [99] TLS initialization failed
What could be wrong?
-
First I check my bot is alive and kicking
https://api.telegram.org/bot_my_api_key/sendMessage?chat_id=my_chat_id&text="This is a test"
And my bot gets the message.
Now I use QtTelegramBot library
bot = new Telegram::Bot("my_api_key"); bot->sendMessage("my_chat_id", "This is a test");
And I get in Debug window - [99] TLS initialization failed
What could be wrong?
@jenya7 Probably OpenSSL libs are missing. See https://forum.qt.io/topic/95700/qsslsocket-tls-initialization-failed
-
@jenya7 Probably OpenSSL libs are missing. See https://forum.qt.io/topic/95700/qsslsocket-tls-initialization-failed
wrote on 30 Aug 2022, 07:15 last edited by@jsulm
I see. I have sslserver.c, sslserver.h in the library.
When break at bot->sendMessage and go deep down I get toQByteArray Networking::request(QString endpoint, ParameterList params, Networking::Method method) { if (endpoint.isEmpty()) { qWarning("Cannot do request without endpoint"); return QByteArray(); } if (m_token.isEmpty()) { qWarning("Cannot do request without a Telegram Bot Token"); return QByteArray(); } QNetworkRequest req; QUrl url = buildUrl(endpoint); req.setUrl(url); #ifdef DEBUG qDebug("HTTP request: %s", qUtf8Printable(req.url().toString())); #endif QEventLoop loop; QNetworkReply *reply; if (method == GET) { url.setQuery(parameterListToString(params)); req.setUrl(url); reply = m_nam->get(req); } else if (method == POST) { req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); reply = m_nam->post(req, parameterListToString(params)); } else if (method == UPLOAD) { QByteArray boundary = generateMultipartBoundary(params); req.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary); QByteArray requestData = generateMultipartFormData(params, boundary); req.setHeader(QNetworkRequest::ContentLengthHeader, requestData.length()); reply = m_nam->post(req, requestData); } else { qCritical("No valid method!"); reply = nullptr; } if (reply == nullptr) { qWarning("Reply is NULL"); delete reply; return QByteArray(); } QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); if (reply->error() != QNetworkReply::NoError) { qCritical("%s", qPrintable(QString("[%1] %2").arg(reply->error()).arg(reply->errorString()))); delete reply; return QByteArray(); } QByteArray ret = reply->readAll(); delete reply; return ret; } QUrl Networking::buildUrl(QString endpoint) { QUrl url = QUrl(); url.setScheme("https"); url.setHost(API_HOST); url.setPath("/bot" + m_token + endpoint); return url; }
And get the error at
if (reply->error() != QNetworkReply::NoError) { qCritical("%s", qPrintable(QString("[%1] %2").arg(reply->error()).arg(reply->errorString()))); delete reply; return QByteArray(); }
But the function builds an URL and sends with POST method - the same way I do it manually.
-
@jsulm
I see. I have sslserver.c, sslserver.h in the library.
When break at bot->sendMessage and go deep down I get toQByteArray Networking::request(QString endpoint, ParameterList params, Networking::Method method) { if (endpoint.isEmpty()) { qWarning("Cannot do request without endpoint"); return QByteArray(); } if (m_token.isEmpty()) { qWarning("Cannot do request without a Telegram Bot Token"); return QByteArray(); } QNetworkRequest req; QUrl url = buildUrl(endpoint); req.setUrl(url); #ifdef DEBUG qDebug("HTTP request: %s", qUtf8Printable(req.url().toString())); #endif QEventLoop loop; QNetworkReply *reply; if (method == GET) { url.setQuery(parameterListToString(params)); req.setUrl(url); reply = m_nam->get(req); } else if (method == POST) { req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); reply = m_nam->post(req, parameterListToString(params)); } else if (method == UPLOAD) { QByteArray boundary = generateMultipartBoundary(params); req.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary); QByteArray requestData = generateMultipartFormData(params, boundary); req.setHeader(QNetworkRequest::ContentLengthHeader, requestData.length()); reply = m_nam->post(req, requestData); } else { qCritical("No valid method!"); reply = nullptr; } if (reply == nullptr) { qWarning("Reply is NULL"); delete reply; return QByteArray(); } QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); if (reply->error() != QNetworkReply::NoError) { qCritical("%s", qPrintable(QString("[%1] %2").arg(reply->error()).arg(reply->errorString()))); delete reply; return QByteArray(); } QByteArray ret = reply->readAll(); delete reply; return ret; } QUrl Networking::buildUrl(QString endpoint) { QUrl url = QUrl(); url.setScheme("https"); url.setHost(API_HOST); url.setPath("/bot" + m_token + endpoint); return url; }
And get the error at
if (reply->error() != QNetworkReply::NoError) { qCritical("%s", qPrintable(QString("[%1] %2").arg(reply->error()).arg(reply->errorString()))); delete reply; return QByteArray(); }
But the function builds an URL and sends with POST method - the same way I do it manually.
@jenya7 said in Sending a message to a Telegram bot:
I have sslserver.c, sslserver.h in the library
You still need the OpenSSL libs...
-
@jenya7 said in Sending a message to a Telegram bot:
I have sslserver.c, sslserver.h in the library
You still need the OpenSSL libs...
wrote on 30 Aug 2022, 07:28 last edited by@jsulm said in Sending a message to a Telegram bot:
@jenya7 said in Sending a message to a Telegram bot:
I have sslserver.c, sslserver.h in the library
You still need the OpenSSL libs...
Where can I find it?
I was suggested to addLIBS += "C:/Qt/Tools/OpenSSL/Win_x64/lib/libssl.lib"
But there is no OpenSSL folder in my Qt/Tools.
-
@jsulm said in Sending a message to a Telegram bot:
@jenya7 said in Sending a message to a Telegram bot:
I have sslserver.c, sslserver.h in the library
You still need the OpenSSL libs...
Where can I find it?
I was suggested to addLIBS += "C:/Qt/Tools/OpenSSL/Win_x64/lib/libssl.lib"
But there is no OpenSSL folder in my Qt/Tools.
@jenya7 Start the Qt Maintenance Tool and select OpenSSL there, install...
-
wrote on 30 Aug 2022, 08:19 last edited by
@jsulm said in Sending a message to a Telegram bot:
@jenya7 Start the Qt Maintenance Tool and select OpenSSL there, install...
When I get to Setup - Qt stage I get
There is an important update available, please run the udater first
How do I run the updater?
-
@jsulm said in Sending a message to a Telegram bot:
@jenya7 Start the Qt Maintenance Tool and select OpenSSL there, install...
When I get to Setup - Qt stage I get
There is an important update available, please run the udater first
How do I run the updater?
@jenya7 said in Sending a message to a Telegram bot:
How do I run the updater?
What about clicking on "Update components" and then "Next"?
-
@jenya7 said in Sending a message to a Telegram bot:
How do I run the updater?
What about clicking on "Update components" and then "Next"?
wrote on 30 Aug 2022, 08:40 last edited by jenya7@jsulm said in Sending a message to a Telegram bot:
@jenya7 said in Sending a message to a Telegram bot:
How do I run the updater?
What about clicking on "Update components" and then "Next"?
Thank you. Now it's OK, OpenSSL installed, added LIBS += C:/Qt/Tools/OpenSSL/Win_x64/lib/libssl.lib
But still the same problem - [99] TLS initialization failedwell...in a Linux project I don't have this problem. probably openssl installed and handled properly in Linux.
But when I run the code
TelegramBot bot("my_api_key"); bot.sendMessage("my_chat_id", "This is a test");
I get in Debug window
QUrl("https://api.telegram.org/botmy_api_key/sendMessage?chat_id=my_chat_id&text=This is a test")
And nothing happens - my bot did not get the message.well...I've managed to send and get a message on Linux. actually it's good enough, my project should run on Linux.
-
Hi,
I would guess that your application cannot find the dlls at run time. You need to add the path to these to the PATH environment variable. Do that in the Run part of the Project panel.
-
Hi,
I would guess that your application cannot find the dlls at run time. You need to add the path to these to the PATH environment variable. Do that in the Run part of the Project panel.
wrote on 31 Aug 2022, 05:34 last edited by@SGaist said in Sending a message to a Telegram bot:
Hi,
I would guess that your application cannot find the dlls at run time. You need to add the path to these to the PATH environment variable. Do that in the Run part of the Project panel.
still the same problem - [99] TLS initialization failed
-
@SGaist said in Sending a message to a Telegram bot:
Hi,
I would guess that your application cannot find the dlls at run time. You need to add the path to these to the PATH environment variable. Do that in the Run part of the Project panel.
I did so
still the same problem - [99] TLS initialization failed
@jenya7 You need to add the path to the FOLDER containing the libs without the file name!
-
wrote on 31 Aug 2022, 05:54 last edited by
@jsulm said in Sending a message to a Telegram bot:
@jenya7 You need to add the path to the FOLDER containing the libs without the file name!
OK. Did so. Removed the name. Still the same problem.
-
@jsulm said in Sending a message to a Telegram bot:
@jenya7 You need to add the path to the FOLDER containing the libs without the file name!
OK. Did so. Removed the name. Still the same problem.
@jenya7 Does that folder also contain the dll file?
-
wrote on 31 Aug 2022, 07:06 last edited by
@jsulm said in Sending a message to a Telegram bot:
@jenya7 Does that folder also contain the dll file?
I ran a search in Qt folder on any ssl related files and found only
ssleay32.dll in C:\Qt\Tools\mingw730_64\opt\bin and C:\Qt\Tools\QtCreator\bin
Should I include the paths too? -
wrote on 31 Aug 2022, 11:52 last edited by
I have a problem.
This way it works - if I initialize explicitly with a stringtelebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
But if I do it with variable
telebot::telebot(QObject *parent) : QObject(parent) { if (!sys_params.bot_api_key.isNull() && !sys_params.bot_api_key.isEmpty()) { TelegramBot bot(sys_params.bot_api_key); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); } }
I get the error
The inferior stopped because it received a signal from the operating system.
Signal name : SIGSEGV
Signal meaning : Segmentation faultI see the constructor works before sys_params initialization although I set first line after window activation
int main(int argc, char *argv[]) { QFuture<uint32_t> discovered; QApplication a(argc, argv); MainWindow w; w.show(); //here is sys_params initialization SetupRun(); //some other code return a.exec(); }
What should I do?
-
I have a problem.
This way it works - if I initialize explicitly with a stringtelebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
But if I do it with variable
telebot::telebot(QObject *parent) : QObject(parent) { if (!sys_params.bot_api_key.isNull() && !sys_params.bot_api_key.isEmpty()) { TelegramBot bot(sys_params.bot_api_key); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); } }
I get the error
The inferior stopped because it received a signal from the operating system.
Signal name : SIGSEGV
Signal meaning : Segmentation faultI see the constructor works before sys_params initialization although I set first line after window activation
int main(int argc, char *argv[]) { QFuture<uint32_t> discovered; QApplication a(argc, argv); MainWindow w; w.show(); //here is sys_params initialization SetupRun(); //some other code return a.exec(); }
What should I do?
wrote on 31 Aug 2022, 12:02 last edited by@jenya7 said in Sending a message to a Telegram bot:
Signal name : SIGSEGV
What should I do?
You are supposed to run your code in a debugger. It will stop on the seg fault, go to the stack trace window to see information about where this is occurring from your code/the code you call.
Since we have no idea what your
sys_params.bot_api_key
is or what is in it, and since you say introducing it causes a seg fault, that would be my first suspect.....telebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
Your
TelegramBot bot
is a local variable, it will go out of scope and be destroyed at the end of this constructor. Same applies in your second code attempt. What do you think you are achieving with this code, because it is not right. -
@jenya7 said in Sending a message to a Telegram bot:
Signal name : SIGSEGV
What should I do?
You are supposed to run your code in a debugger. It will stop on the seg fault, go to the stack trace window to see information about where this is occurring from your code/the code you call.
Since we have no idea what your
sys_params.bot_api_key
is or what is in it, and since you say introducing it causes a seg fault, that would be my first suspect.....telebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
Your
TelegramBot bot
is a local variable, it will go out of scope and be destroyed at the end of this constructor. Same applies in your second code attempt. What do you think you are achieving with this code, because it is not right.wrote on 31 Aug 2022, 12:14 last edited by jenya7@JonB said in Sending a message to a Telegram bot:
@jenya7 said in Sending a message to a Telegram bot:
Signal name : SIGSEGV
What should I do?
You are supposed to run your code in a debugger. It will stop on the seg fault, go to the stack trace window to see information about where this is occurring from your code/the code you call.
Since we have no idea what your
sys_params.bot_api_key
is or what is in it, and since you say introducing it causes a seg fault, that would be my first suspect.....telebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
Your
TelegramBot bot
is a local variable, it will go out of scope and be destroyed at the end of this constructor. Same applies in your second code attempt. What do you think you are achieving with this code, because it is not right.Yes I stop with a breakpoint at
if (!sys_params.bot_api_key.isNull() && !sys_params.bot_api_key.isEmpty())
the next step - refering to sys_params.bot_api_key generates the error.It's a field of a structure
typedef struct { //some fields QString bot_api_key; }SYS_PARAMS; SYS_PARAMS sys_params;
How can I do it global? It's not like I can instantiate it
TelegramBot bot; telebot::telebot(QObject *parent) : QObject(parent) { bot = new TelegramBot ("my_api_key"); //is not allowed }
-
@JonB said in Sending a message to a Telegram bot:
@jenya7 said in Sending a message to a Telegram bot:
Signal name : SIGSEGV
What should I do?
You are supposed to run your code in a debugger. It will stop on the seg fault, go to the stack trace window to see information about where this is occurring from your code/the code you call.
Since we have no idea what your
sys_params.bot_api_key
is or what is in it, and since you say introducing it causes a seg fault, that would be my first suspect.....telebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
Your
TelegramBot bot
is a local variable, it will go out of scope and be destroyed at the end of this constructor. Same applies in your second code attempt. What do you think you are achieving with this code, because it is not right.Yes I stop with a breakpoint at
if (!sys_params.bot_api_key.isNull() && !sys_params.bot_api_key.isEmpty())
the next step - refering to sys_params.bot_api_key generates the error.It's a field of a structure
typedef struct { //some fields QString bot_api_key; }SYS_PARAMS; SYS_PARAMS sys_params;
How can I do it global? It's not like I can instantiate it
TelegramBot bot; telebot::telebot(QObject *parent) : QObject(parent) { bot = new TelegramBot ("my_api_key"); //is not allowed }
@jenya7 said in Sending a message to a Telegram bot:
the next step - refering to sys_params.bot_api_key generates the error
As @JonB asked: how does the stack trace look like after crash?
"How can I do it global?" - why should it be global? Simply make bot a class member...
-
@JonB said in Sending a message to a Telegram bot:
@jenya7 said in Sending a message to a Telegram bot:
Signal name : SIGSEGV
What should I do?
You are supposed to run your code in a debugger. It will stop on the seg fault, go to the stack trace window to see information about where this is occurring from your code/the code you call.
Since we have no idea what your
sys_params.bot_api_key
is or what is in it, and since you say introducing it causes a seg fault, that would be my first suspect.....telebot::telebot(QObject *parent) : QObject(parent) { TelegramBot bot("my_api_key"); QObject::connect(&bot, &TelegramBot::newMessage, this, &telebot::NewMessage); }
Your
TelegramBot bot
is a local variable, it will go out of scope and be destroyed at the end of this constructor. Same applies in your second code attempt. What do you think you are achieving with this code, because it is not right.Yes I stop with a breakpoint at
if (!sys_params.bot_api_key.isNull() && !sys_params.bot_api_key.isEmpty())
the next step - refering to sys_params.bot_api_key generates the error.It's a field of a structure
typedef struct { //some fields QString bot_api_key; }SYS_PARAMS; SYS_PARAMS sys_params;
How can I do it global? It's not like I can instantiate it
TelegramBot bot; telebot::telebot(QObject *parent) : QObject(parent) { bot = new TelegramBot ("my_api_key"); //is not allowed }
wrote on 31 Aug 2022, 12:29 last edited by JonB
1/41