채팅 워크 API를 사용하여 텍스트 파일 게시

12201 단어 ChatworkC#api
안녕하세요 tsuttie입니다(*'▽')
이번에는 채팅 작업의 API를 사용하여 텍스트 파일을 보내고 싶습니다.

1. 이유



업무에서 채팅 워크를 사용하고 있는 것도 있어, 채팅 워크에 자동 투고등을 설정하는 것이 가끔 있습니다만, 감시 내용등의 로그 파일을 텍스트로서 송신하면 아래와 같이 쭉~~ 나란히 매우보기 어려워집니다.


그래서 파일 전송용 API를 사용하여 ↓처럼 하고 싶었습니다.


이 경우 필요에 따라 미리보기에서도 확인할 수 있습니다 (゜゜)


2. 채팅 워크 API 정보



채팅 워크 API에 대해서는 아래 링크처를 참조합니다.
채팅 워크 API 공식 문서

채팅 워크 API의 파일 전송에 대해서입니다만, 다음과 같이 설정되어 있습니다.


여기서 주목해야 할 포인트는 파일 전송 API 요청입니다.Content-Type: multipart/form-data로 설정되어 있다는 곳이라고 생각합니다.
거기만 주의하면 후에는 거기까지 어렵지 않고 사용할 수 있었습니다.

,,, 라는 것으로 샘플 코드를 써 보았습니다.

3. 실제로 써 보자



이번에는 콘솔 애플리케이션으로 채팅 워크 API를 사용하는 범용 앱을 만들었습니다.
그 중에서 chatWorkFileNotice라는 메소드를 작성하고 있습니다.
콘솔 앱으로서는 커멘드 라인 인수로서, 파일 패스를 취득, 송신 후의 파일명을 옵션으로서 지정할 수 있도록(듯이) 했습니다. 그건 그렇고, roomID와 API 토큰은 구성에서 가져옵니다.

notice.cs
        public static void chatWorkFileNotice(string apikey, string roomID, string filePath, string filename = "テキスト.txt")
        {
            try
            {
                //文字コードを指定する
                var enc = Encoding.GetEncoding("UTF-8");
                string url = string.Format("https://api.chatwork.com/v2/rooms/{0}/files", roomID);
                string boundary = System.Environment.TickCount.ToString();
                var req = WebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "multipart/form-data; boundary=" + boundary;
                System.IO.StreamReader cReader = (
                    new System.IO.StreamReader(filePath, System.Text.Encoding.Default)
                );
                string stResult = string.Empty;
                while (cReader.Peek() >= 0)
                {
                    // ファイルを 1 行ずつ読み込む
                    string stBuffer = cReader.ReadLine();
                    // 読み込んだものを追加で格納する
                    stResult += stBuffer + System.Environment.NewLine;
                }
                cReader.Close();

                var postData = "";
                postData = "--------------------------" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"file\"; filename=" + filename + "\"\r\n" +
                    "Content-Type: text/plain\r\n\r\n" +
                    stResult + "\r\n" +
                    "--------------------------" + boundary + "--";

                var postDataBytes = System.Text.Encoding.UTF8.GetBytes(postData);
                req.ContentLength = postDataBytes.Length;
                req.Headers.Add(string.Format("X-ChatWorkToken: {0}", apikey));

                // データをPOST送信するためのStreamを取得
                var reqStream = req.GetRequestStream();
                // 送信するデータを書き込む
                reqStream.Write(postDataBytes, 0, postDataBytes.Length);
                reqStream.Close();

                // サーバーからの応答を受信する
                var res = req.GetResponse();
                // 応答データを受信するためのStreamを取得
                var resStream = res.GetResponseStream();
                // 受信して表示
                var sr = new StreamReader(resStream, enc);
                // 結果受信
                var responseMessage = sr.ReadToEnd();

                Console.Write(responseMessage);
                sr.Close();
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("下記エラーにより送信失敗");
                Console.WriteLine(ex.Message);
            }
        }

오류를 잡는 방법은 어색하고 실례합니다. m(__)m
그래서 전송에 성공. 개발로 Windows 서버를 사용하고 있으므로, 그 환경에서는 자유롭게 로그를 보낼 수 있게 되었습니다(^O^)

4. 빠진 포인트


Content-Type: multipart/form-data 를 사용한 적이 없어 취급에 곤란했다.
하기 등을 참고로 MIME Type의 일종, 복수 종류의 데이터를 한 번에 취급할 수 있다고 공부했습니다.
참고 : enctype='multipart/form-data'는 무엇입니까?

5. 정리



이번에는 채팅 워크 API를 사용하여 텍스트 파일 전송 범용 도구를 만들어 보았습니다.
이제 서버 모니터링 결과를 일일이 서버로 보지 않아도됩니다 (p_-)

뭔가 지적 등 있으면 댓글 주시면 감사하겠습니다.
잘 부탁드립니다. ('◇')ゞ

좋은 웹페이지 즐겨찾기