Telegram APIを使用したメッセージのアンロード。 どこから始めるか

インターネットでは、電報ボットの作成に関する多くの説明と例を見つけることができます。 ただし、 Telegram Bot Apiの機能は限られています。 キーワードでTelegramからメッセージをダウンロードする問題を解決するには、Telegram APIを使用する必要があります。 基礎はTLSharpライブラリーです。 Telegramの登録ユーザーのみがさらなる作業が可能であることをすぐに明らかにする価値があります。

APIを使用した作業の開始は、アプリケーションの登録です。

  1. Telegramの Webサイトにアクセスして、電話番号を入力します。 確認コードを入力します。

    画像
  2. 開発者のページにアクセスします。 登録を完了するには、将来の申請を特徴付けるフィールドに入力する必要があります。

    画像
  3. api_idとapi_hashを取得します。

ライブラリを操作する


パッケージマネージャーコンソールからVisual Studioプロジェクトに追加します。

Install-Package TLSharp 

開始するには、上記で取得したapi_idおよびapi_hashパラメーターを使用してクライアントを作成し、接続を確立します。

 TelegramClient client = new TelegramClient(apiId, apiHash); await client.ConnectAsync(); 

アカウントを認証するには、次の手順を実行します。

 var hash = await client.SendCodeRequestAsync(" "); var code = " "; var user = await client.MakeAuthAsync(" ", hash, code); 

この手順を完了すると、TLSharpはすべてのユーザーセッション情報を保存するsession.datファイルを作成します。 その後、 ドキュメントに記載されているリクエストを実行できます

前提条件であるチャネルからメッセージをアンロードします。最初にチャネルにサブスクライブする必要があります。 ユーザーが持っているすべてのダイアログを取得します。

 var dialogs = (TLDialogs)await client.GetUserDialogsAsync(); 

記録された変数にはすべてのダイアログが保存されるようになりましたが、チャンネルのみを選択するために、便利な構造により、以下を使用してチャンネルとチャットのダイアログを選択できます。

 dialogs.Chats 

次の要素がチャットであ​​るかチャンネルであるかを個別に確認しながら、すべてのチャットとチャンネルを調べます。

 foreach (var element in dialogs.Chats){ if (element is TLChat){ TLChat chat = element as TLChat; 

TLSharpライブラリは、 公式APIのすべての機能を実装しています 。 機能はリクエストを介して実装されます。たとえば、次の形式のリクエストを介してチャネルに関する追加情報を取得できます。

 TeleSharp.TL.Messages.TLChatFull channelInfo = await client.SendRequestAsync<TeleSharp.TL.Messages.TLChatFull> (new TLRequestGetFullChat(){ChatId = chat.Id}); 

SendRequestAsync <TeleSharp.TL.Messages.TLChatFull>メソッドは戻り値の型で呼び出され、ライブラリで提案されているクエリはすべてパラメーターとして使用する必要があります。 以下は、チャネルに関する完全な情報を受け取るコードです。この場合、チャネルを取得するには、ChannelIdとAccessHashの2つのパラメーターが必要です。

 if (element is TLChannel){ var offset = 0; TLChannel channel = element as TLChannel; var chan = await client.SendRequestAsync<TeleSharp.TL.Messages.TLChatFull>(new TLRequestGetFullChannel() { Channel = new TLInputChannel() { ChannelId = channel.Id, AccessHash = (long)channel.AccessHash} }); TLInputPeerChannel inputPeer = new TLInputPeerChannel() { ChannelId = channel.Id, AccessHash = (long)channel.AccessHash }; 

メッセージのアップロード


メッセージのアンロードは100個のメッセージの一部で発生し、AddOffsetパラメーターはメッセージの次の部分のアンロードを構成します。

 while (true){ TLChannelMessages res = await client.SendRequestAsync<TLChannelMessages> (new TLRequestGetHistory(){ Peer = inputPeer, Limit = 400, AddOffset = offset, OffsetId = 0 }); var msgs = res.Messages; 

メッセージには、TLMessageとTLMessageServiceの2つのタイプがあります。 1つ目は通常のテキストメッセージで、おそらく何らかの種類のメディアファイルが含まれています。 ほとんどの場合、2番目のタイプのメッセージは、Telegram Serviceからの呼び出しまたはメッセージです。

 if (res.Count > offset){ offset += msgs.Count; foreach (var msg in msgs) { if (msg is TLMessage) { TLMessage sms = msg as TLMessage; st.Add(sms.Message); } if (msg is TLMessageService) continue; } } else break; } } 

投稿で検索


チャネル内のメッセージの予備検索を追加します。 これを行うには、同じクエリを使用します。その構造は上記に示されています。

 TLInputPeerChannel inputPeer = new TLInputPeerChannel() { ChannelId = channel.Id, AccessHash = (long)channel.AccessHash}; TLChannelMessages search = await client.SendRequestAsync<TLChannelMessages> (new TeleSharp.TL.Messages.TLRequestSearch(){ Peer = inputPeer, MaxDate = maxdate, MinDate = mindate, Q = searchWord, Filter = new TLInputMessagesFilterEmpty(), Limit = 100, Offset = offset }); 

リクエストを作成するには、 パラメータを入力してから、受信したメッセージを同じ方法で処理するだけです。

以上で、この記事がお役に立てば幸いです。

Source: https://habr.com/ru/post/J351350/


All Articles