A.4 (Optional): Integrieren in Telegram-Bot#

Als eine Erweiterung des Tasks: Sie können ihren Chatbot auch in einen Messenger einbinden. Als Beispiel wählen wir Telegram, da dessen API relativ offen ist. Hier kann einfach ein Bot erstellt werden und verbunden werden. Wir nutzen hierfür eine hauptsächlich header-basierte API.

Ziel von Teilaufgabe A.4#

Einbindung einer bestehenden API in C++, um so einen eigenen Bot zu generieren. Dabei wird ein Listener Konzept realisiert.

Grundlegende Struktur#

Anweisungen für optionale Aufgabe

  • Machen sie sich mit der API und den Beispielen darin einmal vertraut.

  • Erzeugen sie einen Telegram-Bot und erhalten dessen Token zur Authentifizierung (Anleitungen siehe bei Telegram oder hier).

  • Jetzt können sie einfach das echo-Beispiel aus dem github Repository nachvollziehen.

  • Bauen sie nun ihren Chatbot ein, der Antworten oder Fortsetzungen von angefangenen Sätzen generiert.

#include <iostream>

#include <libtelegram/libtelegram.h>

#include "chat_bot.h"

int main(int argc, const char* argv[])
{
  // Telegram Message API
  std::string const token("123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11");         // in practice you would probably read this from config file or database
  telegram::sender sender(token);                                               // create a sender with our token for outgoing messages
  telegram::listener::poll listener(sender);                                    // create a polling listener which will process incoming requests, polling using the sender
  listener.set_callback_message([&](telegram::types::message const &message){   // we set a callback for receiving messages in native format, using a lambda for convenience
    std::string const message_from(message.from ? message.from->first_name : "Unknown sender"); // some fields, such as message.from, are optional
    std::string const reply(message_from + " hat dir folgendes geschrieben \"" + *message.text + "\" to chat id " + std::to_string(message.chat.id)); // each element is a native type - the chat id is an integer
    sender.send_message(message.chat.id, reply);                                // send our reply from within the callback
  });
  listener.run();  
  return 0;
}
CXX	:= c++
CXXFLAGS := -Wall -Werror -std=c++20

# Contain path for any includes (headers)
# Depending on your platform: Include a path to boost, on linux should be 
# /usr/local/include, on mac could be /opt/homebrew/include
INCLUDES := -I./include -I/opt/homebrew/include

# Contains libraries we need to (-L is directory search path, -l is lib)
LDFLAGS = -L/usr/local/lib -L/opt/homebrew/lib
LDLIBS = -lcurl -lssl -lcrypto

SRCDIR := ./src

TELEGRAM_OBS = main_telegram.o

telegram: $(TELEGRAM_OBS)
	$(CXX) $^ -o $@ $(LDFLAGS) $(LDLIBS)
    
%.o: $(SRCDIR)/%.cpp
	$(CXX) $(INCLUDES) $(CXXFLAGS) -c $^ -o $@

Referenzen#