質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Delphi

DelphiはPascalを拡張してオブジェクト指向を導入したWindows, OS X,iOS,Androidのネイティブアプリケーションを開発するための言語です。旧称はObject Pascal。開発用IDE「Delphi」にあわせ現在の名前に改称されました。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

解決済

2回答

1097閲覧

DelphiでChatWorkApiを用いたpost

eneko0513

総合スコア349

Delphi

DelphiはPascalを拡張してオブジェクト指向を導入したWindows, OS X,iOS,Androidのネイティブアプリケーションを開発するための言語です。旧称はObject Pascal。開発用IDE「Delphi」にあわせ現在の名前に改称されました。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

0クリップ

投稿2018/02/25 13:41

Delphiを用いて、ChatWorkへのメッセージ投稿をしようと考えています。
コンポーネントとしてIndyのIdHTTPを使用しようと思っています。

Delphi

1 2unit Unit1; 3 4interface 5 6uses 7 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 8 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, 9 IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; 10 11type 12 TForm4 = class(TForm) 13 IdHTTP1: TIdHTTP; 14 Button1: TButton; 15 procedure Button1Click(Sender: TObject); 16 private 17 { Private 宣言 } 18 public 19 { Public 宣言 } 20 end; 21 22var 23 Form4: TForm4; 24 25implementation 26 27{$R *.dfm} 28 29procedure TForm4.Button1Click(Sender: TObject); 30var 31 PostURL: string; 32 PostStream: TStringList; 33 ResStream: TStringStream; 34 PostData: string; 35 Encoding: TEncoding; 36 BytesLength: Integer; 37 38 poststring:TStringList; 39 strm:TStringStream; 40 st:string; 41 42 test: TStringList; 43 44begin 45 PostURL := 'https://api.chatwork.com/v2/rooms/XXXXXXXX/messages'; 46 PostStream := TStringList.Create; 47 ResStream := TStringStream.Create(''); 48 49 //自動でエンコードしないようにする 50 IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions - [hoForceEncodeParams]; 51 52 //名前 53 PostStream.Add('body=TEST'); 54 Screen.Cursor := crHourGlass; 55 56 Encoding := TEncoding.GetEncoding(932); 57 BytesLength := Encoding.GetByteCount(PostStream[0]); 58 test := TStringList.Create; 59 test.Add('X-ChatWorkToken:XXXXXXXXXXXX'); 60 61 Encoding.Free; 62 try 63 try 64 IdHTTP1.Request.Method := 'POST'; 65 IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded'; 66 IdHTTP1.Request.ContentLength := BytesLength; 67 IdHTTP1.Request.CustomHeaders.AddStdValues(test); 68 IdHTTP1.Post(PostURL, PostStream, ResStream); 69 except 70 //エラー内容はIdHTTP1.ResponseTextで受取る 71 end; 72 finally 73 ShowMessage(IdHTTP1.ResponseText); 74 //サーバからのデータを表示 75 ShowMessage(ResStream.DataString); 76 77 Screen.Cursor := crDefault; 78 FreeAndNil(PostStream); 79 FreeAndNil(ResStream); 80 end; 81 82end; 83 84end.

VCLフォーム上にTButtonとIdHTTPを配置してクリックイベントが行われたら特定のルームにTESTというメッセージを通知しようと思っていますが401エラーが発生します。

パラメータが足りていない、またはポストのやり方が違うなどを考えていますがその場合どのように直せば良いのかで悩んでいます。DelphiでのChatWork通知のやり方が無かったので手探りの状態です。

ご助言のほどよろしくお願いします。
※ChatworkAPIは発行済みで、Delphiとは異なる言語でのPOSTは確認しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

遅い回答ですが・・・。

401エラーという事ですが、APIトークンに間違いはないのですよね。

Delphiのバージョンは分からないので、手元にある Delphi 10.2(VCL)でのサンプルです。
細かい事は抜きにしてメッセージの投稿は出来ました。
APIドキュメントにはContentTypeの記載がなかったので不要なのかな?

pascal

1procedure TForm1.btnPostHello(Sender: TObject); 2var 3 body : TStringList; 4 msg : string; 5begin 6 body := TStringList.Create; 7 try 8 body.Add('body=こんにちは!'); 9 IdHttp.Request.CustomHeaders.Add('X-ChatWorkToken:<your_api_token>'); 10 msg := IdHttp.Post('https://api.chatwork.com/v2/rooms/<room_id>/messages', body); 11 // msgには以下のような message_id が格納されています 12 // {"message_id":"10278XXXXXXXXXX123"} 13 Memo1.Lines.Add(msg); 14 finally 15 FreeAndNil(body); 16 end; 17end;

解決できると良いですが。

投稿2018/03/20 08:30

gfk

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eneko0513

2018/03/27 02:41

gfkさん こんにちは、情報を頂きありがとうございました。 頂いたサンプルを元に無事にPOSTすることが出来ました。 ただ、私の環境がXE4のため一部改変は必要そうでした。 TIdSSLIOHandlerSocketOpenSSLを用いることで無事に動作させられました。 情報を頂きましてありがとうございました!
guest

0

ありがとうございました。頂いた情報を元に無事にPOSTすることが出来ました。
DelphiXE4という古いバージョンのため、TIdSSLIOHandlerSocketOpenSSLを使用する
必要がありましたが対応できました。

情報を頂きありがとうございました。

Delphi

1procedure TForm11.Button1Click(Sender: TObject); 2var 3 body : TStringList; 4 msg : string; 5 FIdIOHandler : TIdSSLIOHandlerSocketOpenSSL; 6begin 7 body := TStringList.Create; 8 try 9 body.Add('body=こんにちは!'); 10 11 FIdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 12 IdHTTP1.IOHandler := FIdIOHandler; 13 IdHttp1.Request.CustomHeaders.Add('X-ChatWorkToken:XXXXXXX'); 14 msg := IdHttp1.Post('https://api.chatwork.com/v2/rooms/XXXXXXX/messages', body); 15 // msgには以下のような message_id が格納されています 16 // {"message_id":"10278XXXXXXXXXX123"} 17 //MessageBox(msg); 18 finally 19 FreeAndNil(body); 20 end; 21end; 22 23end.

投稿2018/03/27 02:39

eneko0513

総合スコア349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問