API Telegram

Telegram

 

Telegram은 두 가지 종류의 API를 제공합니다. 하나는 봇과 HTTPs를 프로토콜로 사용하는 프로그램을 만들 수 있게 하는 Bot API입니다. Telegram API와 TDLib는 사용자 정의 Telegram 클라이언트를 빌드할 수 있게 하며 Bot API보다 훨씬 강력합니다.

 

sgcWebSockets는 tdjson 라이브러리를 통해 TDLib를 지원하므로, 자신만의 telegram 클라이언트를 빌드할 수 있습니다. TDLib는 모든 네트워크 구현 세부 사항, 암호화 및 로컬 데이터 저장소를 처리합니다. TDLib는 모든 Telegram 기능을 지원합니다.

 

TDLib (Telegram Database Library) Advantages

 

 

구성

Windows

 

TDLib에는 다른 서드파티 라이브러리가 필요합니다: OpenSSL 및 ZLib. 이 라이브러리들은 tdjson 라이브러리와 함께 배포해야 합니다.

 

* Windows 버전에는 VCRuntime이 필요하며, Microsoft에서 다운로드할 수 있습니다: https://www.microsoft.com/en-us/download/details.aspx?id=52685. 설치 후에도 문제가 지속되면 다음 dll을 애플리케이션이 있는 동일한 폴더에 복사해 보십시오: VCRUNTIME140.dll 및 VCRUNTIME140_1.dll.

 

다음 라이브러리를 애플리케이션이 위치한 동일한 디렉터리에 복사하십시오:

 

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

 

libtdjson.dylib 라이브러리를 장치에 배포하면 SetTDJsonPath를 사용하여 라이브러리 위치를 설정할 수 있습니다. 예:

 

"Contents\MacOS\"에 배포하는 경우, TPath.GetDirectoryName(ParamStr(0)) 폴더에 경로를 설정해야 합니다.

 

OSXARM64

 

libtdjson.dylib 라이브러리를 장치에 배포하면 SetTDJsonPath를 사용하여 라이브러리 위치를 설정할 수 있습니다. 예:

 

"Contents\MacOS\"에 배포하는 경우, TPath.GetDirectoryName(ParamStr(0)) 폴더에 경로를 설정해야 합니다.

 

Linux64

 

libtdjson.so 라이브러리를 디바이스에 배포하고 SetTDJsonPath 메서드를 호출하여 라이브러리 경로를 설정하십시오.

 

Android

 

libtdjsonandroid.so 라이브러리를 장치에 배포하십시오. 예: Android64 라이브러리를 배포하는 경우 Project/Deployment의 RemotePath를 "library\lib\arm64-v8a\"로 설정하십시오. Android32인 경우 RemotePath를 "library\lib\armeabi-v7a\"로 설정하십시오

 

iOS64

 

libtdjson.a 라이브러리를 다음 디렉터리에 복사하십시오:

 

 

Telegram 애플리케이션 만들기

API id를 얻고 Telegram API를 사용하여 자체 애플리케이션을 개발하려면 다음을 수행해야 합니다:

 

 

이 값들은 Telegram 구성 요소의 Telegram.API 속성에 설정해야 합니다. 인증하려면 사용자 또는 봇으로 인증할 수 있으며, Telegram에 로그인하기 위해 설정할 수 있는 2개의 속성이 있습니다:

 

 

다음 매개변수를 구성할 수 있습니다:

 

 

선택적으로 SetTDJsonPath 메서드를 사용하여 tdjson 라이브러리가 위치한 경로를 구성할 수 있습니다. 새 telegram 세션을 시작하기 전에 경로를 전달하기만 하면 됩니다.

 

Telegram 구성 요소를 구성한 후, Active 속성을 true로 설정하면 프로그램이 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.ApplicationVersion := '1.0';
oTelegram.DeviceModel := 'Desktop';
oTelegram.LanguageCode := 'en';
oTelegram.SystemVersion := 'Windows';
oTelegram.Active := true;

 

권한 부여

인증 코드(SMS가 아닌 Telegram 애플리케이션에서 전달됨)를 가져오거나 비밀번호를 제공하기 위해 라이브러리에서 호출할 수 있는 두 가지 이벤트가 있습니다.

 

OnAuthenticationCode

 

이 이벤트는 Telegram이 Telegram 애플리케이션에 Authorization Code를 보내고 사용자가 이 코드를 복사하여 이 이벤트의 Code 인수에 설정해야 할 때 호출됩니다.

 


procedure OnAuthenticationCode(Sender: TObject; var Code: string);
begin
  Code := InputBox('Telegram Code', 'Introduce code', '');
end;

 

Android에서는 inputbox가 스레드를 잠그지 않으므로, 사용자가 Code 매개변수에 입력한 값을 반환하는 대신 SetAuthenticationCode 메서드를 사용하여 코드 값을 설정하십시오.

 


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

 

이 이벤트는 Telegram이 사용자가 비밀번호를 설정하도록 요구할 때 호출됩니다.

 

 

권한 부여 상태

권한 부여가 시작되면 OnAuthorizationStatus 이벤트로 권한 부여 상태를 확인할 수 있으며, 이 이벤트는 권한 부여 상태가 변경될 때마다 호출됩니다. Status의 일부 값은 다음과 같습니다:

 

 

연결 상태

연결이 시작되면 OnConnectionStatus 이벤트로 연결 상태를 확인할 수 있습니다. 이 이벤트는 연결 상태가 변경될 때마다 호출됩니다. Status의 일부 값은 다음과 같습니다:

 

 

주요 메서드

TsgcTDLib_Telegram API 구성 요소는 여러 Telegram 메서드를 지원합니다. 아래에서 가장 많이 사용되는 것을 확인하십시오.

 

메서드 매개변수 Description
SendTextMessage

aChatId: 메시지가 전송될 Chat의 Id aText: Message의 텍스트.

InlineKeyboard: 선택적 버튼(봇만 해당).

Chat에 텍스트 메시지를 보냅니다.
SendRichTextMessage

aChatId: 메시지가 전송될 Chat의 Id입니다 aText: 메시지 텍스트입니다.

InlineKeyboard: 선택적 버튼(봇만 해당).

채팅에 Rich Text 메시지를 보냅니다. Markdown 구문:
  • Bold: **bold**
  • Italic: __italic__
  • Strike: --strike--
  • Underline: ~~underline~~
  • Code: ##code##
SendDocumentMessage aChatId: 메시지를 보낼 Chat의 Id입니다 aFilePath: 문서의 전체 파일 경로입니다 aInlineKeyboard: 선택적 Buttons(봇만 해당). Chat에 문서를 보냅니다.
SendPhotoMessage

aChatId: 메시지가 전송될 채팅의 Id aFilePath: 사진의 전체 파일 경로

Width: 사진의 너비.

Height: 사진의 너비.

InlineKeyboard: 선택적 버튼(봇만 해당).

Chat에 Photo를 보냅니다.
SendVideoMessage

aChatId: 메시지를 보낼 Chat의 Id aFilePath: 비디오의 전체 파일 경로 aWidth: 비디오 너비.

Height: 비디오의 너비입니다.

aDuration: 비디오 길이(초).

aInlineKeyboard: 선택적 버튼(봇 전용).

Chat에 비디오를 보냅니다.
SendInvoiceMessage

aChatId: 메시지가 전송될 Chat의 Id aInvoice: 메시지 텍스트.

aInlineKeyboard: 선택적 버튼(봇 전용).

Invoice를 보냅니다(Bot이고 Private Channel인 경우에만 사용 가능).
EditTextMessage

aChatId: 메시지가 전송될 Chat의 Id입니다.

aMessageId: 수정할 메시지의 Id

Text: 메시지 텍스트입니다.

InlineKeyboard: 선택적 버튼(봇만 해당).

ShowKeyboard: 선택적 버튼(봇 전용).

메시지의 텍스트(또는 game 메시지의 텍스트)를 편집합니다
AddChatMember aChatId: 메시지를 보낼 Chat의 Id입니다 aUserId: 사용자의 식별자입니다. aForwardLimit: 새 멤버에게 전달될 채팅의 이전 메시지 수입니다(최대 100). supergroup 및 채널의 경우 무시됩니다. 채팅에 새 멤버를 추가합니다. 멤버는 비공개 또는 비밀 채팅에 추가될 수 없습니다. 채팅 상태가 서버와 동기화될 때까지 멤버가 추가되지 않습니다.
AddChatMembers aChatId: 메시지가 전송될 Chat의 Id aUserIds: 채팅에 추가될 사용자의 식별자. 채팅에 여러 새 멤버를 추가합니다. 현재 이 옵션은 슈퍼그룹 및 채널에서만 사용할 수 있습니다. 이 옵션은 채팅에 참여하는 데 사용할 수 없습니다. 채널에 200명 이상의 멤버가 있으면 멤버를 추가할 수 없습니다. 채팅 상태가 서버와 동기화될 때까지 멤버가 추가되지 않습니다.
GetChatMember aChatId: Chat 식별자입니다. aUserId: User 식별자입니다. 채팅의 단일 멤버에 대한 정보를 반환합니다.
GetBasicGroupFullInfo aGroupId: Basic Group Identifier 식별자로 기본 그룹에 대한 전체 정보를 반환합니다.
GetSupergroupMembers

aSuperGroupId: supergroup 또는 채널의 식별자입니다.

aSupergroupMembersFilter: 반환할 사용자 유형입니다. 기본값은 null aOffset: 건너뛸 사용자 수입니다.

aLimit: 반환할 최대 사용자 수입니다. 최대 200까지 가능합니다.

supergroup 또는 channel의 멤버 또는 차단된 사용자에 대한 정보를 반환합니다.
JoinChatByInviteLink aLink: 가져올 초대 링크입니다. 가능한 경우 초대 링크를 사용하여 현재 사용자를 채팅에 추가합니다. 채팅 상태가 서버와 동기화될 때까지 새 멤버는 추가되지 않습니다.
CreateNewSecretChat aUserId: 사용자의 식별자입니다. 새 비밀 채팅을 생성합니다.
CreateNewBasicGroupChat aUserIds: 채팅에 추가할 사용자의 식별자입니다. aTitle: 새 기본 그룹의 제목입니다 새 기본 그룹을 생성합니다
CreateNewSupergroupChat

aTitle: 새 SuperGroup의 제목

aIsChannel: True인 경우 채널 채팅이 생성되어야 합니다. aDescription: 채팅 설명.

새 슈퍼그룹 또는 채널을 생성합니다.
CreatePrivateChat

aUserId: 사용자의 식별자.

aForce: true이면 네트워크 요청 없이 채팅이 생성됩니다. 이 경우 유형, 제목 및 사진을 제외한 채팅에 대한 모든 정보가 부정확할 수 있습니다

지정된 사용자에 해당하는 기존 채팅을 반환합니다
GetChats aOffsetOrder: 채팅을 반환할 채팅 순서 aOffsetChatId: 채팅을 반환할 채팅 식별자 aLimit: 반환할 최대 채팅 수입니다. 정렬된 채팅 목록을 반환합니다. 채팅은 (order, chat_id) 쌍을 기준으로 내림차순으로 정렬됩니다(봇으로 로그인한 경우 사용할 수 없음).
GetChat aChatId: Chat 식별자 식별자로 chat에 대한 정보를 반환합니다
GetChatHistory

aChatId: 채팅 식별자

aFromMessageId: 기록을 가져오기 시작할 메시지의 식별자입니다. 마지막 메시지부터 결과를 얻으려면 0을 사용하십시오.

aOffset: from_message_id에서 정확히 결과를 얻으려면 0을 지정하거나, 추가로 일부 새 메시지를 얻으려면 최대 99까지의 음수 offset을 지정하십시오.

aLimit:반환할 최대 메시지 수입니다

채팅의 메시지를 반환합니다. 메시지는 역시간순으로 반환됩니다
GetUser aUserId: 사용자 식별자 식별자로 사용자에 대한 정보를 반환합니다.
AddProxyHTTP

aServer: 프록시의 서버 이름입니다.

aPort: 프록시 포트 번호입니다.

aUserName: 로그인용 사용자 이름이며, 비어 있을 수 있습니다.

aPassword: 로그인 비밀번호입니다. 비어 있을 수 있습니다.

aHTTPOnly: 프록시가 HTTP 요청만 지원하고 HTTP CONNECT 메서드를 통한 투명한 TCP 연결을 지원하지 않는 경우 true를 전달하십시오.

네트워크 요청에 대한 HTTP 프록시 서버를 추가합니다. 인증 전에 호출할 수 있습니다.
AddProxyMTProto

aServer: 프록시의 서버 이름입니다.

aPort: 프록시 포트 번호. aSecret: 16진수 인코딩으로 된 프록시의 시크릿.

네트워크 요청을 위한 MTProto 프록시 서버를 추가합니다. 권한 부여 전에 호출할 수 있습니다.
AddProxySocks5

aServer: 프록시의 서버 이름입니다.

aPort: 프록시 포트 번호입니다.

aUserName: 로그인용 사용자 이름이며, 비어 있을 수 있습니다.

aPassword: 로그인용 비밀번호입니다. 비어 있을 수 있습니다.

네트워크 요청에 Socks5 프록시 서버를 추가합니다. 권한 부여 전에 호출할 수 있습니다.
EnableProxy aId: 프록시의 ID입니다. 프록시를 활성화합니다. 한 번에 하나의 프록시만 활성화할 수 있습니다. 권한 부여 전에 호출할 수 있습니다.
DisableProxy   현재 활성화된 프록시를 비활성화합니다. 권한 부여 전에 호출할 수 있습니다.
RemoveProxy aId: 프록시의 ID입니다. 프록시 서버를 제거합니다. 권한 부여 전에 호출할 수 있습니다.
GetProxies   현재 설정된 proxy 목록을 반환합니다. 권한 부여 전에 호출할 수 있습니다.
getChatSponsoredMessage aChatId: 채팅의 ID입니다. 채팅에 표시될 sponsored 메시지를 반환합니다. 채널 채팅 전용입니다. 채팅에 sponsored 메시지가 없으면 404 오류를 반환합니다.
ViewMessage

aSponsorChatId: 스폰서 Chat의 ID

aMessageId: 메시지의 ID

사용자가 메시지를 보고 있음을 TDLib에 알립니다. 많은 유용한 활동은 메시지가 현재 보고 있는지 여부에 따라 달라집니다
Logout   Telegram에서 로그아웃합니다.
TDLibSend aRequest: JSON Request. JSON 프로토콜로 모든 Request를 보냅니다.

 

 

Example How to send a Text Message


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');

구현되지 않은 메서드를 보내는 방법의 예

 

TDLibSend 메서드를 사용하여 모든 JSON 메시지를 보낼 수 있습니다(예: 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"}');

 

 

Events

OnBeforeReadEvent

이 이벤트는 Telegram API 구성 요소에 의해 JSON 메시지가 수신되었지만 아직 처리되지 않았을 때 호출됩니다. 이 이벤트를 수동으로 처리하거나 구성 요소가 이벤트를 처리하지 않게 하려면 Handled 속성을 True로 설정하십시오. 이 이벤트를 사용하여 모든 메시지를 로깅할 수도 있습니다.

 

OnMessageText

이 이벤트는 새 메시지 텍스트가 수신되었을 때 호출됩니다. 메시지 텍스트 속성에 액세스하려면 MessageText 매개변수를 읽으십시오.

 

 

OnMessageDocument

새 Document Message가 수신될 때 이 이벤트가 호출됩니다. Document 속성에 액세스하려면 MessageDocument에 액세스하십시오.

 

 

OnMessagePhoto

이 이벤트는 새 사진 메시지가 수신될 때 호출됩니다. 사진 속성에 접근하려면 MessagePhoto에 접근하십시오.

 

 

OnVideoPhoto

이 이벤트는 새 Video Message가 수신될 때 호출됩니다. Video 속성에 액세스하려면 MessageVideo에 액세스하십시오.

 

 

OnMessageSponsored

이 이벤트는 새 Sponsored Message가 수신되었을 때(getChatSponsoredMessage 메서드 호출 후) 호출됩니다

 

 

OnNewChat

이 이벤트는 새 채팅이 수신될 때 호출됩니다.

 

 

OnNewCallbackQuery

이 이벤트는 새 콜백 쿼리가 수신될 때 호출됩니다. 봇 전용입니다.

 

 

OnEvent

이 이벤트는 API 구성 요소가 새 이벤트를 받을 때 호출됩니다. API 구성 요소에서 구현하지 않은 일부 이벤트를 처리하는 데 사용할 수 있습니다.

 

 

OnException

이 이벤트는 Telegram API 데이터를 처리할 때 예외가 있는 경우 호출됩니다.

 

Properties

MyId: 현재 사용자의 User Identifier를 반환합니다.

 

전체 코드 샘플

Telegram API에 연결하는 방법, 사용자에게 Code를 입력하도록 요청하는 방법(Telegram API에서 요구하는 경우), 연결이 준비되면 메시지를 보내고 수신된 텍스트 메시지를 로깅하는 방법을 보여주는 다음 코드 샘플을 확인하십시오.


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;