Telegram oferuje dwa rodzaje API: Bot API umożliwia tworzenie programów korzystających z botów i protokołu HTTPs, natomiast Telegram API i TDLib pozwalają budować niestandardowych klientów Telegram i oferują znacznie więcej możliwości niż Bot API.
sgcWebSockets obsługuje TDLib za pośrednictwem biblioteki tdjson, co oznacza, że można zbudować własnego klienta Telegram. TDLib zajmuje się wszystkimi szczegółami implementacji sieciowej, szyfrowaniem i lokalnym przechowywaniem danych. TDLib obsługuje wszystkie funkcje Telegram.
Zalety TDLib (Telegram Database Library)
Wieloplatformowy: może być używany w systemach Windows, Android, iOS, MacOS, Linux...
Łatwość użycia: do komunikacji między aplikacją a Telegram używane są wiadomości JSON.
Wysoka wydajność: W Telegram Bot API każda instancja TDLib obsługuje ponad 24 000 botów.
Consistent: TDLib gwarantuje, że wszystkie aktualizacje zostaną dostarczone we właściwej kolejności.
Niezawodność: TDLib pozostaje stabilny przy wolnych i zawodnych połączeniach internetowych.
Secure: Wszystkie lokalne dane są szyfrowane przy użyciu klucza szyfrowania podanego przez użytkownika.
W pełni asynchroniczny: Żądania do TDLib nie blokują się nawzajem. Odpowiedzi są wysyłane, gdy są dostępne.
Windows
TDLib wymaga innych bibliotek firm trzecich: OpenSSL i ZLib. Biblioteki te muszą być wdrożone razem z biblioteką tdjson.
* Wersje Windows wymagają VCRuntime, który można pobrać od firmy Microsoft: https://www.microsoft.com/en-us/download/details.aspx?id=52685. Jeśli problem nadal występuje po instalacji, należy skopiować następujące biblioteki DLL do folderu, w którym znajduje się aplikacja: VCRUNTIME140.dll i VCRUNTIME140_1.dll.
Skopiuj następujące biblioteki do tego samego katalogu, w którym znajduje się aplikacja:
| Windows 32 | Windows 64 |
| tdjson.dll | tdjson.dll |
| libcrypto-1_1.dll | libcrypto-1_1-x64.dll |
| libssl-1_1.dll | libssl-1_1-x64.dll |
| zlib1.dll | zlib1.dll |
OSX64
Wdróż bibliotekę libtdjson.dylib na urządzeniu i możesz ustawić lokalizację biblioteki za pomocą SetTDJsonPath, na przykład:
Jeśli wdrożenie następuje do katalogu „Contents\MacOS\", należy ustawić ścieżkę w folderze TPath.GetDirectoryName(ParamStr(0)).
OSXARM64
Wdróż bibliotekę libtdjson.dylib na urządzeniu i możesz ustawić lokalizację biblioteki za pomocą SetTDJsonPath, na przykład:
Jeśli wdrożenie następuje do katalogu „Contents\MacOS\", należy ustawić ścieżkę w folderze TPath.GetDirectoryName(ParamStr(0)).
Linux64
Wdróż bibliotekę libtdjson.so na urządzeniu i ustaw ścieżkę biblioteki, wywołując metodę SetTDJsonPath.
Android
Należy wdrożyć bibliotekę libtdjsonandroid.so na urządzeniu. Przykład: jeśli wdrażana jest biblioteka Android64, należy ustawić RemotePath w Project/Deployment na "library\lib\arm64-v8a\". Dla wersji Android32 należy ustawić RemotePath na "library\lib\armeabi-v7a\".
iOS64
Skopiuj bibliotekę libtdjson.a do następujących katalogów:
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\debug
C:\Program Files (x86)\Embarcadero\Studio\<IDE Version>\lib\iosDevice64\release
Aby uzyskać identyfikator API i opracować własną aplikację korzystającą z Telegram API, należy wykonać następujące czynności:
Zarejestruj się w Telegram za pomocą dowolnej aplikacji.
Zaloguj się do rdzenia Telegram: https://my.telegram.org.
Przejdź do narzędzi deweloperskich API i wypełnij formularz.
Zostaną uzyskane podstawowe adresy, a także parametry api_id i api_hash wymagane do autoryzacji użytkownika.
Na chwilę obecną każdy numer może mieć podłączony tylko jeden api_id.
Wartości te należy ustawić we właściwości Telegram.API komponentu Telegram. W celu uwierzytelnienia można zalogować się jako użytkownik lub jako bot; dostępne są 2 właściwości, które można ustawić, aby zalogować się do Telegrama:
PhoneNumber: w przypadku logowania jako użytkownik należy podać numer telefonu (z kodem kierunkowym kraju), na przykład: +34699123456
BotToken: jeśli logujesz się jako bot, ustaw tutaj swój token (zgodnie z informacją od Telegrama).
DatabaseDirectory: umożliwia określenie lokalizacji bazy danych tdlib. Pozostaw puste, aby użyć domyślnej konfiguracji.
Można skonfigurować następujące parametry:
ApplicationVersion: wersja aplikacji, przykład: 1.0
DeviceModel: model urządzenia, przykład: desktop
LanguageCode: kod języka użytkownika, przykład: en.
SystemVersion: wersja systemu operacyjnego, przykład: windows.
Opcjonalnie można skonfigurować ścieżkę, w której znajduje się biblioteka tdjson, używając metody SetTDJsonPath. Wystarczy przekazać ścieżkę przed rozpoczęciem nowej sesji Telegram.
Po skonfigurowaniu komponentu Telegram można ustawić właściwość Active na true, a program podejmie próbę połączenia z Telegram.
Przykładowy kod
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.ApplicationVersion := '1.0';
oTelegram.DeviceModel := 'Desktop';
oTelegram.LanguageCode := 'en';
oTelegram.SystemVersion := 'Windows';
oTelegram.Active := true;
Istnieją dwa zdarzenia, które mogą być wywoływane przez bibliotekę w celu uzyskania kodu uwierzytelniającego (dostarczanego w aplikacji Telegram, nie SMS-em) lub podania hasła.
OnAuthenticationCode
To zdarzenie jest wywoływane, gdy Telegram wyśle kod autoryzacyjny do aplikacji Telegram i użytkownik musi skopiować ten kod i wprowadzić go w argumencie Code tego zdarzenia.
procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
Code := InputBox('Telegram Code', 'Introduce code', '');
end;
W systemie Android pole wprowadzania tekstu nie blokuje wątku, dlatego zamiast zwracać wartość wprowadzoną przez użytkownika w parametrze Code, należy użyć metody SetAuthenticationCode do ustawienia wartości kodu.
procedure OnAuthenticationCode(Sender: TObject; var Code:string);
begin
InputBox('Telegram', 'Introduce Telegram Code', '',
procedure(const AResult: TModalResult; const AValue: string)
begin
sgcTelegram.SetAuthenticationCode(AValue);
end
);
end;
OnAuthenticationPassword
To zdarzenie jest wywoływane, gdy Telegram wymaga od użytkownika ustawienia hasła.
Po rozpoczęciu autoryzacji można sprawdzać jej status w zdarzeniu OnAuthorizationStatus, wywoływanym za każdym razem, gdy nastąpi zmiana statusu autoryzacji. Niektóre wartości parametru Status to:
Po rozpoczęciu połączenia można sprawdzić jego status za pomocą zdarzenia OnConnectionStatus, które jest wywoływane za każdym razem, gdy zmienia się stan połączenia. Przykładowe wartości Status:
Komponent API TsgcTDLib_Telegram obsługuje kilka metod Telegrama; poniżej przedstawiono najczęściej używane.
| Metoda | Parametry | Opis |
| SendTextMessage |
aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość aText: Treść wiadomości. InlineKeyboard: Opcjonalne przyciski (wyłącznie boty). |
Wysyła wiadomość tekstową do czatu. |
| SendRichTextMessage |
aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość aText: Treść wiadomości. InlineKeyboard: Opcjonalne przyciski (wyłącznie boty). |
Wysyła sformatowaną wiadomość tekstową do czatu. Składnia Markdown:
|
| SendDocumentMessage | aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość aFilePath: pełna ścieżka pliku dokumentu aInlineKeyboard: Opcjonalne przyciski (tylko boty). | Wysyła dokument do czatu. |
| SendPhotoMessage |
aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość aFilePath: pełna ścieżka pliku zdjęcia Width: szerokość zdjęcia. Height: szerokość zdjęcia. InlineKeyboard: Opcjonalne przyciski (wyłącznie boty). |
Wysyła zdjęcie do czatu. |
| SendVideoMessage |
aChatId: identyfikator czatu, do którego zostanie wysłana wiadomość aFilePath: pełna ścieżka pliku wideo aWidth: szerokość wideo. Wysokość: szerokość wideo. aDuration: czas trwania wideo w sekundach. aInlineKeyboard: Opcjonalne przyciski (tylko dla botów). |
Wysyła wideo do czatu. |
| SendInvoiceMessage |
aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość aInvoice: Treść wiadomości. aInlineKeyboard: Opcjonalne przyciski (tylko dla botów). |
Wysyła fakturę (dostępne tylko gdy jest botem i w kanałach prywatnych). |
| EditTextMessage |
aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość aMessageId: Identyfikator wiadomości do zmodyfikowania Text: Treść wiadomości. InlineKeyboard: Opcjonalne przyciski (wyłącznie boty). ShowKeyboard: Opcjonalne przyciski (tylko boty). |
Edytuje tekst wiadomości (lub tekst wiadomości gry) |
| AddChatMember | aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość. aUserId: Identyfikator użytkownika. aForwardLimit: Liczba wcześniejszych wiadomości z czatu do przekazania nowemu członkowi; maksymalnie 100. Ignorowane w przypadku supergroup i kanałów. | Dodaje nowego członka do czatu. Nie można dodawać członków do prywatnych lub tajnych czatów. Członkowie nie zostaną dodani, dopóki stan czatu nie zostanie zsynchronizowany z serwerem. |
| AddChatMembers | aChatId: Identyfikator czatu, do którego zostanie wysłana wiadomość. aUserIds: Identyfikatory użytkowników, którzy mają zostać dodani do czatu. | Dodaje wielu nowych członków do czatu. Opcja ta jest obecnie dostępna tylko dla supergrup i kanałów. Nie można jej używać do dołączania do czatu. Nie można dodawać członków do kanału, jeśli liczy on więcej niż 200 członków. Członkowie nie będą dodani do momentu zsynchronizowania stanu czatu z serwerem. |
| GetChatMember | aChatId: Identyfikator czatu. aUserId: Identyfikator użytkownika. | Zwraca informacje o pojedynczym członku czatu. |
| GetBasicGroupFullInfo | aGroupId: Identyfikator grupy podstawowej | Zwraca pełne informacje o grupie podstawowej na podstawie jej identyfikatora. |
| GetSupergroupMembers |
aSuperGroupId: Identyfikator supergrupy lub kanału. aSupergroupMembersFilter: Typ użytkowników do zwrócenia. Domyślnie null. aOffset: Liczba użytkowników do pominięcia. aLimit: Maksymalna liczba zwracanych użytkowników; do 200. |
Zwraca informacje o członkach lub zbanowanych użytkownikach supergrupy lub kanału. |
| JoinChatByInviteLink | aLink: Link zaproszenia do zaimportowania; | Używa łącza z zaproszeniem, aby dodać bieżącego użytkownika do czatu, jeśli jest to możliwe. Nowy członek nie zostanie dodany do chwili zsynchronizowania stanu czatu z serwerem. |
| CreateNewSecretChat | aUserId: Identyfikator użytkownika. | Tworzy nowy tajny czat. |
| CreateNewBasicGroupChat | aUserIds: Identyfikatory użytkowników, którzy mają zostać dodani do czatu. aTitle: Tytuł nowej podstawowej grupy | Tworzy nową grupę podstawową |
| CreateNewSupergroupChat |
aTitle: Tytuł nowej SuperGrupy aIsChannel: True, jeśli ma zostać utworzony czat kanałowy. aDescription: Opis czatu. |
Tworzy nową supergrупę lub kanał. |
| CreatePrivateChat |
aUserId: Identyfikator użytkownika. aForce: Jeśli true, czat zostanie utworzony bez żądania sieciowego. W takim przypadku wszystkie informacje o czacie z wyjątkiem jego typu, tytułu i zdjęcia mogą być nieprawidłowe. |
Zwraca istniejący czat odpowiadający danemu użytkownikowi |
| GetChats | aOffsetOrder: Kolejność czatów, od której należy zwracać czaty aOffsetChatId: Identyfikator czatu, od którego należy zwracać czaty aLimit: Maksymalna liczba czatów do zwrócenia. | Zwraca uporządkowaną listę czatów. Czaty są posortowane według pary (order, chat_id) w kolejności malejącej (nie można użyć, jeśli zalogowany jako Bot) |
| GetChat | aChatId: Identyfikator czatu | Zwraca informacje o czacie na podstawie jego identyfikatora |
| GetChatHistory |
aChatId: Identyfikator czatu aFromMessageId: Identyfikator wiadomości, od której należy pobrać historię; użyj 0, aby pobrać wyniki od ostatniej wiadomości. aOffset: Podaj 0, aby uzyskać wyniki dokładnie od from_message_id, lub ujemne przesunięcie do 99, aby dodatkowo pobrać nowsze wiadomości. aLimit:Maksymalna liczba wiadomości do zwrócenia |
Zwraca wiadomości w czacie. Wiadomości są zwracane w odwrotnym porządku chronologicznym |
| GetUser | aUserId: Identyfikator użytkownika | Zwraca informacje o użytkowniku na podstawie jego identyfikatora. |
| AddProxyHTTP |
aServer: Nazwa serwera proxy. aPort: Numer portu proxy. aUserName: nazwa użytkownika do logowania; może być pusta. aPassword: Hasło do logowania; może być puste. aHTTPOnly: Przekaż true, jeśli proxy obsługuje tylko żądania HTTP i nie obsługuje przezroczystych połączeń TCP przez metodę HTTP CONNECT. |
Dodaje serwer proxy HTTP dla żądań sieciowych. Można wywołać przed autoryzacją. |
| AddProxyMTProto |
aServer: Nazwa serwera proxy. aPort: Numer portu proxy. aSecret: Sekret proxy w kodowaniu szesnastkowym. |
Dodaje serwer proxy MTProto dla żądań sieciowych. Może być wywołane przed autoryzacją. |
| AddProxySocks5 |
aServer: Nazwa serwera proxy. aPort: Numer portu proxy. aUserName: nazwa użytkownika do logowania; może być pusta. aPassword: Hasło do logowania; może być puste. |
Dodaje serwer proxy Socks5 dla żądań sieciowych. Może być wywołane przed autoryzacją. |
| EnableProxy | aId: Identyfikator proxy | Włącza serwer proxy. Jednocześnie może być włączony tylko jeden serwer proxy. Może być wywoływane przed autoryzacją. |
| DisableProxy | Wyłącza aktualnie włączone proxy. Można wywołać przed autoryzacją. | |
| RemoveProxy | aId: Identyfikator proxy | Usuwa serwer proxy. Może być wywołana przed autoryzacją. |
| GetProxies | Zwraca listę aktualnie skonfigurowanych serwerów proxy. Można wywołać przed autoryzacją. | |
| getChatSponsoredMessage | aChatId: Identyfikator czatu | Zwraca sponsorowaną wiadomość do wyświetlenia na czacie; tylko dla czatów kanałowych. Zwraca błąd 404, jeśli na czacie nie ma sponsorowanej wiadomości. |
| ViewMessage |
aSponsorChatId: Identyfikator czatu sponsora aMessageId: identyfikator wiadomości |
Informuje TDLib, że użytkownik aktualnie przegląda wiadomości. Wiele przydatnych operacji zależy od tego, czy wiadomości są w danej chwili wyświetlane |
| Wylogowanie | Wylogowuje z Telegrama. | |
| TDLibSend | aRequest: Żądanie JSON. | Wyślij dowolne żądanie w protokole JSON. |
Przykład wysyłania wiadomości tekstowej
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.Active := true;
...
oTelegram.SendTextMessage('1234', 'My First Message from sgcWebSockets');
Przykład: wysyłanie odpowiedzi „metoda nie zaimplementowana"
Dowolną wiadomość JSON można wysłać za pomocą metody TDLibSend, na przykład w celu dołączenia do czatu Telegram.
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.Active := true;
...
oTelegram.TDLibSend('{"@type": "joinChat", "chat_id": "1234"}');
OnBeforeReadEvent
Zdarzenie jest wywoływane, gdy komponent API Telegram odbierze wiadomość JSON, która nie została jeszcze przetworzona. Należy ustawić właściwość Handled na True, jeśli zdarzenie jest przetwarzane ręcznie lub nie ma być obsługiwane przez komponent. Zdarzenia można również używać do rejestrowania wszystkich wiadomości.
OnMessageText
Zdarzenie wywoływane po odebraniu nowej wiadomości tekstowej; należy odczytać parametr MessageText, aby uzyskać dostęp do właściwości tekstu wiadomości.
OnMessageDocument
Zdarzenie jest wywoływane po odebraniu nowej wiadomości dokumentu. Dostęp do właściwości dokumentu można uzyskać przez MessageDocument.
OnMessagePhoto
Zdarzenie jest wywoływane po odebraniu nowej wiadomości ze zdjęciem. Dostęp do właściwości zdjęcia uzyskuje się za pośrednictwem obiektu MessagePhoto.
OnVideoPhoto
To zdarzenie jest wywoływane po odebraniu nowej wiadomości wideo. Dostęp do MessageVideo umożliwia odczyt właściwości wideo.
OnMessageSponsored
To zdarzenie jest wywoływane po odebraniu nowej sponsorowanej wiadomości (po wywołaniu metody getChatSponsoredMessage)
OnNewChat
To zdarzenie jest wywoływane po odebraniu nowego czatu.
OnNewCallbackQuery
To zdarzenie jest wywoływane po odebraniu nowego przychodzącego zapytania zwrotnego; tylko dla botów.
OnEvent
Zdarzenie to jest wywoływane, gdy komponent API odbierze nowe zdarzenie. Może być używane do przetwarzania zdarzeń niezaimplementowanych przez komponent API.
OnException
To zdarzenie jest wywoływane, gdy podczas przetwarzania danych Telegram API wystąpi wyjątek.
MyId: zwraca identyfikator bieżącego użytkownika.
Zapoznaj się z poniższym przykładem kodu, który pokazuje, jak połączyć się z Telegram API, poprosić użytkownika o wprowadzenie kodu (jeśli jest to wymagane przez Telegram API), wysłać wiadomość po nawiązaniu połączenia oraz rejestrować odbierane wiadomości tekstowe.
oTelegram := TsgcTDLib_Telegram.Create(nil);
oTelegram.Telegram.API.ApiHash := 'your api hash';
oTelegram.Telegram.API.ApiId := 'your api id';
oTelegram.PhoneNumber := 'your phone number';
oTelegram.ApplicationVersion := '1.0';
oTelegram.DeviceModel := 'Desktop';
oTelegram.LanguageCode := 'en';
oTelegram.SystemVersion := 'Windows';
oTelegram.Active := true;
procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
Code := InputBox('Telegram Code', 'Introduce code', '');
end;
procedure OnMessageText(Sender: TObject; MessageText: TsgcTelegramMessageText);
begin
Log('Message Received: ' + MessageText.Text);
end;
procedure OnConnectionStatus(Sender: TObject; const Status: string);
begin
if Status = 'connectionStateReady' then
oTelegram.SendTextMessage('1234', 'Hello Telegram!');
end;