チャットワークにはAPIが用意されており、それを使用することでプログラムからメッセージを投稿することができます。チャットワークAPIをC#で使う方法を考えます。
まずメッセージを送る方法から。SendMessage(string message)メソッドを使えばメッセージを送ることができます。
投稿先は、ルームIDで指定します。URL で #!ridXXXXXXXXX となっている XXXの数字部分がルームIDです。それからAPIを使うためにはAPIトークンが必要です。
ここで取得したAPIトークンをフィールド変数Keyに保存しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public partial class Form1 : Form { string Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; string RoomID = "XXXXXXXXX"; string SendMessage(string message) { if(message == "") return "引数が不正"; string url = String.Format("https://api.chatwork.com/v2/rooms/{0}/messages", RoomID); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.Headers.Set("X-ChatWorkToken", Key); string content = "body=" + Uri.EscapeDataString(message); var bytes = Encoding.ASCII.GetBytes(content); req.ContentLength = bytes.Length; new MemoryStream(bytes).CopyTo(req.GetRequestStream()); // 応答データを受信する WebResponse resp = req.GetResponse(); using(StreamReader sr = new StreamReader(resp.GetResponseStream())) { return sr.ReadToEnd(); } } } |
次にファイルも同時に送る方法を考えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public partial class Form1 : Form { public string SendFile(string filePath, string filename) { try { string url = string.Format("https://api.chatwork.com/v2/rooms/{0}/files", RoomID); string boundary = Environment.TickCount.ToString(); var req = WebRequest.Create(url); req.Method = "POST"; req.ContentType = "multipart/form-data; boundary=" + boundary; FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); // ファイルをバイナリで読み取る BinaryReader br = new BinaryReader(fs); byte[] readData = br.ReadBytes((Int32)fs.Length); fs.Close(); // 送信するデータ var postData1 = "--------------------------" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"file\"; filename=" + filename + "\"\r\n" + "Content-Type: image/jpeg\r\n\r\n"; var postData2 = "\r\n--------------------------" + boundary + "--\r\n"; byte[] bytes1 = Encoding.UTF8.GetBytes(postData1); byte[] bytes2 = Encoding.UTF8.GetBytes(postData2); List<byte> vs = bytes1.ToList(); vs.AddRange(readData); vs.AddRange(bytes2); byte[] bytes = vs.ToArray(); req.ContentLength = bytes.Length; req.Headers.Set("X-ChatWorkToken", Key); // データを送信するためのStreamを生成 Stream reqStream = req.GetRequestStream(); reqStream.Write(bytes, 0, bytes.Length); reqStream.Close(); // 応答データを受信する WebResponse res = req.GetResponse(); Stream resStream = res.GetResponseStream(); StreamReader sr = new StreamReader(resStream); string responseMessage = sr.ReadToEnd(); sr.Close(); return responseMessage; } catch(Exception ex) { return ex.Message; } } } |
以下のようにすればファイルと同時にメッセージも送ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
public partial class Form1 : Form { public string SendFileMessage(string filePath, string filename, string message) { if(message == "") return "引数が不正"; try { string url = string.Format("https://api.chatwork.com/v2/rooms/{0}/files", RoomID); string boundary = Environment.TickCount.ToString(); var req = WebRequest.Create(url); req.Method = "POST"; req.ContentType = "multipart/form-data; boundary=" + boundary; FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); // ファイルをバイナリで読み取る BinaryReader br = new BinaryReader(fs); byte[] readData = br.ReadBytes((Int32)fs.Length); fs.Close(); // 送信するデータ var postData1 = "--------------------------" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"file\"; filename=" + filename + "\"\r\n" + "Content-Type: image/jpeg\r\n\r\n"; var postData2 = "\r\n--------------------------" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"message\"\r\n\r\n" + message + "\r\n" + "--------------------------" + boundary + "--"; byte[] bytes1 = Encoding.UTF8.GetBytes(postData1); byte[] bytes2 = Encoding.UTF8.GetBytes(postData2); List<byte> vs = bytes1.ToList(); vs.AddRange(readData); vs.AddRange(bytes2); byte[] bytes = vs.ToArray(); req.ContentLength = bytes.Length; req.Headers.Set("X-ChatWorkToken", Key); // データを送信するためのStreamを生成 Stream reqStream = req.GetRequestStream(); reqStream.Write(bytes, 0, bytes.Length); reqStream.Close(); WebResponse res = req.GetResponse(); // 応答データを受信する Stream resStream = res.GetResponseStream(); StreamReader sr = new StreamReader(resStream); string responseMessage = sr.ReadToEnd(); sr.Close(); return responseMessage; } catch(Exception ex) { return ex.Message; } } } |
では実際に使ってみましょう。
テキストボックスのように見えるのは
で作成したTextBoxクラスを継承して作成されたクラスです。
チェックボックスの状態をみて、送信するのはテキストメッセージだけなのか、ファイルだけなのか、両方なのかを調べています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { if(CheckBoxFile.Checked) { string filePath = filePathTextBox1.Text; if(File.Exists(filePath)) { FileInfo info = new FileInfo(filePath); string name = info.Name; if(CheckBoxOnlyFile.Checked) SendFile(filePath, name); else SendFileMessage(filePath, name, richTextBox1.Text); } else { MessageBox.Show("ファイルパスを正しく指定してください!", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { SendMessage(richTextBox1.Text); } } } |
こんにちは。
わかりやすい記事ありがとうございます。参考にして、無事グループチャットにメッセージ投稿ができました。
以下2点質問させてください。
・グループチャットでなく、ダイレクトチャットにメッセージを送ることは可能ですか?
・紹介されている方法で、メンション(TO)を付けることは可能ですか?
お手すきの時に回答いただけたら嬉しいです。
よろしくお願いします。
>グループチャットでなく、ダイレクトチャットにメッセージを送ることは可能ですか?
可能です。
>紹介されている方法で、メンション(TO)を付けることは可能ですか?
RichTextBoxに
[To:XXXXX]相手の名前
送りたいメッセージ
でメンション(TO)を付けることができます。XXXXXの部分は最初の1回だけ手動でToの部分をクリックして調べたほうが早いと思います。