サイボウズOffice10 から curl + SOAPでスケジュールの取得

#はじめに
サイボウズ Office10 連携APIで個人スケジュールを取り出すメモです。
ただ、執筆時点では [ドキュメントの配布終了](https://developer.cybozu.io/hc/ja/articles/360015228332--%E3%82%B5%E3%82%A4%E3%83%9C%E3%82%A6%E3%82%BA-Office-%E9%80%A3%E6%90%BAAPI%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E9%85%8D%E5%B8%83%E7%B5%82%E4%BA%86%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B-2018-09-19-
) されてるので[Garoon（ガルーン）のSOAP APIドキュメント](https://developer.cybozu.io/hc/ja/articles/202228424)を上手に参考にするのがいいです。（過去にAPIドキュメントを取得しされていたら大切に保管ください。）

SOAPでのXML問い合わせと結果XMLの受け取りをHTTPで行う処理なのでコア部分がわかるようにcurlコマンドで表します。

#ユーザID取得とスケジュール取得 curl
問い合わせ先はインストール先によって異なるのですが、私の場合はこちらです。

```
https://サイボウズサーバ/cgi-bin/cbag/ag.cgi?page=PApiBase
https://サイボウズサーバ/cgi-bin/cbag/ag.cgi?page=PApiSchedule
```

PApiBaseはユーザの基本情報を取得するAPIで、PApiScheduleはスケジュールを取得するAPIです。取得したい情報に応じてエンドポイントが変わります。
ユーザの基本情報を取得するのはスケジュール取得にユーザ名ではなく6821といった内部のユーザIDを指定する必要があるためです。ユーザIDを知っていたら不要です。

###①ユーザID取得
SOAPはXMLでの情報のやり取りなので、XMLファイルを準備します。認証情報を含める必要があるので、ログイン名とパスワードをつけます。ここではyamada。取得したいユーザもyamadaさんにしています。

```base.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <Action soap:mustUnderstand="1" xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">BaseGetUsersByLoginName</Action>
    <Timestamp soap:mustUnderstande="1" xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility">
      <Created>2020-08-12T14:45:00Z</Created>
      <Expires>2021-08-12T14:45:00Z</Expires>
    </Timestamp>
    <Security xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" soap:mustUnderstand="1" xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
      <UsernameToken>
        <Username>yamada（APIキックするログインID）</Username>
        <Password>password（APIキックするパスワード）</Password>
      </UsernameToken>
    </Security>
  </soap:Header>
  <soap:Body>
    <BaseGetUsersByLoginName xmlns="http://wsdl.cybozu.co.jp/base/2008">
      <parameters xmlns="">
        <login_name>yamada(取得したいログイン名)</login_name>
      </parameters>
    </BaseGetUsersByLoginName>
  </soap:Body>
</soap:Envelope>
```

XMLファイルをヘッダー付きでサーバにポストします。

```shell
curl -H "Content-Type: application/soap+xml; charset=utf-8;" -d "@base.xml" -X POST "https://サイボウズサーバ/cgi-bin/cbag/ag.cgi?page=PApiBase" > response.xml
```

XMLで返事が返ってきます。

```response.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
 xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:base="http://wsdl.cybozu.co.jp/base/2008"
>
 <soap:Header>
 <vendor>Cybozu</vendor>
 <product>Office</product>
 <version>10.8.0</version>
 <apiversion>1.3.0</apiversion>
 </soap:Header>
 <soap:Body>
 <base:BaseGetUsersByLoginNameResponse>
 <returns>
<user
 key="6831"
 version="1572287113"
 order="1"
 login_name="yamada"
 name="山田　一郎"
 status="0"
 reading="やまだ　いちろう"
 url="http://"
 email=""
 primary_organization="1234"
>
<organization
 id="1234"
 xmlns="http://schemas.cybozu.co.jp/base/2008"
/>
</user>
 </returns>
 </base:BaseGetUsersByLoginNameResponse>
 </soap:Body>
</soap:Envelope>
```

key="6831" がユーザIDになります。

###②ユーザのスケジュールを取得
先程取得したユーザID 6831 を user タグに詰めて問い合わせしています。

```schedule.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <Action soap:mustUnderstand="1" xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">ScheduleGetEventsByTarget</Action>
    <Timestamp soap:mustUnderstande="1" xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility">
      <Created>2020-08-12T14:45:00Z</Created>
      <Expires>2021-08-12T14:45:00Z</Expires>
    </Timestamp>
    <Security xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" soap:mustUnderstand="1" xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
      <UsernameToken>
        <Username>yamada（APIキックするログインID）</Username>
        <Password>password（APIキックするパスワード）</Password>
      </UsernameToken>
    </Security>
  </soap:Header>
  <soap:Body>
    <ScheduleGetEventsByTarget xmlns="http://wsdl.cybozu.co.jp/base/2008">
      <parameters xmlns="" start="2020-09-01T07:00:00" end="2020-09-01T20:00:00"> 
        <user id="6831"></user>
      </parameters>
    </ScheduleGetEventsByTarget>
  </soap:Body>
</soap:Envelope>
```

```shell
curl -H "Content-Type: application/soap+xml; charset=utf-8;" -d "@schedule.xml" -X POST "https://サイボウズサーバ/cgi-bin/cbag/ag.cgi?page=PApiSchedule" > response.xml
```

```response.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
 xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:schedule="http://wsdl.cybozu.co.jp/schedule/2008"
>
 <soap:Header>
 <vendor>Cybozu</vendor>
 <product>Office</product>
 <version>10.8.0</version>
 <apiversion>1.3.0</apiversion>
 </soap:Header>
 <soap:Body>
 <schedule:ScheduleGetEventsByTargetResponse>
 <returns>
<schedule_event
 id="1394260"
 event_type="normal"
 public_type="public"
 plan=""
 detail="定例会議"
 description=""
 version="1598826939"
 timezone="JST"
 allday="false"
 start_only="false"
>
<members xmlns="http://schemas.cybozu.co.jp/schedule/2008">
 <member>
 <user
 id="6831"
 name="山田　一郎"
 order="1"
 />
 </member>
</members>
<when xmlns="http://schemas.cybozu.co.jp/schedule/2008">
 <datetime
 start="2020-09-01T04:00:00Z"
 end="2020-09-01T04:15:00Z"
 />
</when>
 </schedule_event>
 </returns>
 </schedule:ScheduleGetEventsByTargetResponse>
 </soap:Body>
</soap:Envelope>
```

以上です。SOAPのXML書式を組み立てるのが大変ですが、書いてしまえば簡単ですね。

#ハマったポイント
ガルーンのドキュメントをみて書式を組み立てたのですが、

```xml
 <code>19106</code>
 <diagnosis>不正なパラメータです。</diagnosis>
 <cause>"user_id, group_id, facility_id"パラメータの値が不正です。</cause>
 <counter_measure></counter_measure>
 </soap:Detail>
```
とエラーになり、

```xml
<parameters start="2020-09-01T07:00:00" end="2020-09-01T20:00:00"> 
  <user id="6831"></user>
</parameters>

↓↓↓↓↓↓↓↓↓

<parameters xmlns="" start="2020-09-01T07:00:00" end="2020-09-01T20:00:00"> 
  <user id="6831"></user>
</parameters>
```
と **xmlns=""** も空で指定すると取得できるようになりました。XMLは厳格ですね。

#まとめ
API（RESTでJSONが多いですね）でHTTP接続ができるプロダクトが当たり前な昨今ですが、古くからSOAPでAPI公開しているサイボウズさんはすごいなと思いました。
問い合わせの要領は上の通りなので、あとは好みのプログラミング言語でプログラムを組み立てていったらよいかと思います。