C#에서 SlackAPI를 사용하여 지정된 기간 내에 게시된 메시지 가져오기

16264 단어 slack-apiC#

소개



이 기사는 C#에서 SlackAPI를 이용하여 지정된 기간 내에 게시된 메시지를 검색하는 방법을 요약하는 것을 목표로 합니다.
덧붙여 이전에 아래와 같은 SlackAPI에 관한 기사를 투고하고 있으므로, 이 기사를 먼저 읽어 주시는 것을 추천합니다.
  • SlackAPI를 사용하기위한 준비
    htps : // m / t_t / ms / 10bd5d9 굳이 897f0b8b6
  • 이미지와 함께 메시지를 얻는 방법
    htps : // 이 m / t_t t / ms / 14b688 48 a fbcd52505

  • 사용하는 API 및 API 인수



    메시지를 얻으려면 여기 API를 사용하십시오.
    게시 시간을 지정하려면 다음 oldest, latest 인수를 설정하여 API를 호출해야합니다.



    oldest는 검색할 메시지의 게시 시간의 최소값, latest는 검색할 메시지의 게시 시간의 최대값을 나타냅니다. 즉, oldest와 latest를 모두 설정하면 oldest와 latest 사이의 메시지를 얻을 수 있습니다.

    oldest, latest를 지정하는 방법



    여기 공식 문서에 나와 있듯이 Slack은 UNIX 시간 형식으로 시간을 처리합니다. UNIX 시간은 UNIX계의 컴퓨터 시스템으로 표준적으로 사용되고 있는 시각 표현입니다. 자세한 내용은 여기을 참조하십시오.
    따라서 예를 들어 2020년 7월 1일에 게시된 메시지를 가져오는 경우 oldest, latest에 각각 다음과 같은 값을 넣어 API를 호출합니다.
  • oldest
    2020년 7월 1일 0:00을 표현하는 UNIX 시간
  • latest
    2020년 7월 2일 0:00을 나타내는 UNIX 시간

  • C#에서 UNIX 시간을 만드는 방법



    C#에서 UNIX 시간을 만들려면 DateTimeOffset 구조체에서 변환하는 것이 쉽다고 생각합니다.
    절차는 다음과 같습니다.
  • DateTime 구조체에서 UNIX 시간으로 변환하려는 날짜 및 시간 정보 만들기
  • 1로 만든 DateTime 형식의 값을 사용하여 DateTimeOffset 구조체 만들기 (참조 여기)
  • 2의 DateTimeOffset 형식 값을 여기 메서드로 UNIX 시간으로 변환

  • 시간을 지정하여 메시지를 검색하는 서비스



    이전 내용을 활용하여 게시 시간을 지정하여 메시지를 검색하는 서비스를 만듭니다. 여기 기사에서 만든 메시지를 검색하는 GetMessages 메서드를 확장하여 구현합니다.
    /// <summary>
    /// Slackメッセージの取得に必要な機能を提供するサービス
    /// </summary>
    public class SlackMessageGetService
    {
        #region 定数
    
        /// <summary>
        /// アクセストークン用のクエリパラメータ名
        /// </summary>
        private const string c_AccessTokenQueryParameterName = "token";
    
        /// <summary>
        /// チャンネルID用のクエリパラメータ名
        /// </summary>
        private const string c_ChannelIdQueryParameterName = "channel";
    
        /// <summary>
        /// 取得メッセージ数用のクエリパラメータ名
        /// </summary>
        private const string c_MessageCountQueryParameterName = "limit";
    
        /// <summary>
        /// 投稿時間の最小値用のクエリパラメータ名
        /// </summary>
        private const string c_OldestQueryParameterName = "oldest";
    
        /// <summary>
        /// 投稿時間の最大値用のクエリパラメータ名
        /// </summary>
        private const string c_LatestQueryParameterName = "latest";
    
        ・・・
    
        #endregion
    
        #region フィールド
    
        /// <summary>
        /// SlackにPOST,GETするために使用するHttpClient
        ///
        /// ユーザーの利用方法を想定したとき、接続先のホストは[チーム名].slack.comしかありえないため、
        /// HttpClientは単一インスタンスのみとする
        /// </summary>
        // ReSharper disable once InconsistentNaming
        private static readonly HttpClient m_HttpClient = new HttpClient();
    
        #endregion
    
        #region 公開サービス
    
        /// <summary>
        /// メッセージを取得する
        /// </summary>
        /// <param name="accessToken">アクセストークン</param>
        /// <param name="channelId">チャンネルID</param>
        /// <param name="messageCount">取得するメッセージ数</param>
        /// <param name="oldest">投稿時間の最小値</param>
        /// <param name="latest">投稿時間の最大値</param>
        /// <returns>取得メッセージ一覧</returns>
        public async Task<IEnumerable<Message>> GetMessages(string accessToken, string channelId, int messageCount, DateTime oldest, DateTime latest)
        {
            var messages = new List<Message>();
    
            // latestとoldestをUNIX時間に変換
            var oldestDateTimeOffset = new DateTimeOffset(oldest);
            var oldestUnixTime = oldestDateTimeOffset.ToUnixTimeSeconds();
            var latestDateTimeOffset = new DateTimeOffset(latest);
            var latestUnixTime = latestDateTimeOffset.ToUnixTimeSeconds();
    
            // クエリパラメータを作成するためにディクショナリを作成
            // ディクショナリのKeyがクエリパラメータ名、ディクショナリのValueがクエリパラメータの値
            var parameters = new Dictionary<string, string>()
            {
                { c_AccessTokenQueryParameterName, accessToken},
                { c_ChannelIdQueryParameterName, channelId},
                { c_MessageCountQueryParameterName, messageCount.ToString()},
                { c_OldestQueryParameterName, oldestUnixTime.ToString()},
                { c_LatestQueryParameterName, latestUnixTime.ToString()}
            };
    
            try
            {
                // クエリパラメータを作成し、文字列で読み出す
                var parametersString = await new FormUrlEncodedContent(parameters).ReadAsStringAsync();
                // 読みだしたクエリパラメータを使ってリクエストURLを作成する。
                var requestBaseUrl = "https://slack.com/api/conversations.history";
                var requestUrl = $"{requestBaseUrl}?{parametersString}";
                var response = await m_HttpClient.GetAsync(requestUrl).ConfigureAwait(false);
                // レスポンスのコンテンツをstringで読み出す
                var responseBodyString = await response.Content.ReadAsStringAsync();
                // 読みだしたJsonを、オブジェクトにデシリアライズする
                var responceObject = JsonConvert.DeserializeObject<GetSlackMessagesResponce>(responseBodyString);
    
                // 戻り値用のメッセージ一覧を作成
                foreach (var messageResponce in responceObject.messages)
                {
                    // 本文を設定
                    var message = new Message()
                    {
                        Text = messageResponce.text
                    };
    
                    // 添付ファイルを設定
                    foreach (var file in messageResponce.files)
                    {
                        var addFile = new File()
                        {
                            FileURL = file.url_private,
                            Id = file.id,
                        };
                        message.Files.Add(addFile);
                    }
    
                    messages.Add(message);
                }
    
                return messages;
            }
            catch
            {
                return messages;
            }
        }
    
        ・・・
    
        #endregion
    }
    

    메소드에 새로 추가한 로직인 인수 oldest와 latest를 UNIX 시간으로 변환하는 부분을 세세하게 설명합니다.
    인수 oldest와 latest는 DateTime 형식이므로 해당 값을 사용하여 DateTimeOffset 구조체의 값을 만듭니다. 생성자에 DataTime 형식의 값을 전달하는 것만으로 만들 수 있습니다. 그런 다음 ToUnixTimeSeconds 메서드를 사용하여 UNIX 시간으로 변환합니다.
    그런 다음 원래 API 인수로 전달했던 channelId 등과 마찬가지로 사전에 정보를 채 웁니다. 사전의 Key 값이 API 인수 이름(oldest 또는 latest)이고 Value 값이 실제 값입니다. 사전을 API 인수로 만드는 방법에 대한 자세한 내용은 이전 기사을 참조하십시오.

    이러한 로직 추가를 통해 oldest, latest를 지정하여 API를 호출할 수 있습니다.

    요약



    이 기사에서는 C#에서 SlackAPI를 사용하여 지정된 기간 내에 게시 된 메시지를 검색하는 방법을 요약했습니다.
    가장 전하고 싶었던 것은, 이하 2점입니다.
  • SlackAPI에서 시간은 UNIX 시간으로 표현됩니다
  • C#에서 UNIX 시간을 만들려면 DateTimeOffset 구조체를 사용하기 쉽습니다
  • 좋은 웹페이지 즐겨찾기