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

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

ただいまの
回答率

90.51%

  • ChatWork

    32questions

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

  • Delphi

    20questions

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

DelphiでChatWorkApiを用いたpost

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 592

j13158mk

score 2

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

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm4 = class(TForm)
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var
  PostURL: string;
  PostStream: TStringList;
  ResStream: TStringStream;
  PostData: string;
  Encoding: TEncoding;
  BytesLength: Integer;

  poststring:TStringList;
  strm:TStringStream;
  st:string;

  test: TStringList;

begin
  PostURL    := 'https://api.chatwork.com/v2/rooms/XXXXXXXX/messages';
  PostStream := TStringList.Create;
  ResStream  := TStringStream.Create('');

  //自動でエンコードしないようにする
  IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions - [hoForceEncodeParams];

  //名前
  PostStream.Add('body=TEST');
  Screen.Cursor := crHourGlass;

  Encoding := TEncoding.GetEncoding(932);
  BytesLength := Encoding.GetByteCount(PostStream[0]);
  test := TStringList.Create;
  test.Add('X-ChatWorkToken:XXXXXXXXXXXX');

  Encoding.Free;
  try
    try
      IdHTTP1.Request.Method := 'POST';
      IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
      IdHTTP1.Request.ContentLength := BytesLength;
      IdHTTP1.Request.CustomHeaders.AddStdValues(test);
      IdHTTP1.Post(PostURL, PostStream, ResStream);
    except
      //エラー内容はIdHTTP1.ResponseTextで受取る
    end;
  finally
    ShowMessage(IdHTTP1.ResponseText);
    //サーバからのデータを表示
    ShowMessage(ResStream.DataString);

    Screen.Cursor := crDefault;
    FreeAndNil(PostStream);
    FreeAndNil(ResStream);
  end;

end;

end.

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

遅い回答ですが・・・。

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 11:41

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

    TIdSSLIOHandlerSocketOpenSSLを用いることで無事に動作させられました。
    情報を頂きましてありがとうございました!

    キャンセル

0

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

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

procedure TForm11.Button1Click(Sender: TObject);
var
  body : TStringList;
  msg : string;
  FIdIOHandler : TIdSSLIOHandlerSocketOpenSSL;
begin
  body := TStringList.Create;
  try
    body.Add('body=こんにちは!');

    FIdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    IdHTTP1.IOHandler := FIdIOHandler;
    IdHttp1.Request.CustomHeaders.Add('X-ChatWorkToken:XXXXXXX');
    msg := IdHttp1.Post('https://api.chatwork.com/v2/rooms/XXXXXXX/messages', body);
    // msgには以下のような message_id が格納されています
    // {"message_id":"10278XXXXXXXXXX123"}
    //MessageBox(msg);
  finally
    FreeAndNil(body);
  end;
end;

end.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • ChatWork

    32questions

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

  • Delphi

    20questions

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