初めてのWebexのAPI ー サンプルコードを使うとき最低限何が必要か？ 

この記事はシスコの有志による Webex Advent Calendar 2021 の 25 日目として投稿しています。
Webex Advent Calendar 2021: https://qiita.com/advent-calendar/2021/webex

#はじめに

コテコテののネットワークエンジニアです。APIはビギナーなんですが、時流に乗ってWebex APIを初めてに叩いてみました。
他の方のようなテクはないので、「初めてやるとこんなところにつまづくんだなー」という記録のためにAdvent Calendarに参加します。:grin:
＃アドベントカレンダー最終日にこんな記事でいいのか・・・:flushed:

#やりたいこと

使い古しかもしれないですが、コテネットエンジニアらしく、EEM(Embedded Event Manager)からWebexにメッセージを飛ばすというのをやってみます。

やりたいことはこれです。

ルータで何か事件が発生(インターフェイスダウンとか、config変更とか) --> Webexにメッセージを送信！

以下の手順で進めます。

1. サンプルコードを[DevNet](https://developer.cisco.com/)から探す
2. [Webexの開発者用サイト](https://developer.webex.com/)から必要な情報を取得する
3. ルータにEEM設定して、コード(python)をルータに置く
4. エラーが出るのでデバッグする！

#環境

EEM用に以下のルータと、インターネット接続環境を用意

C1111X-8P (IOS-XE version 17.03.04a)

#免責事項

スクリプトの実行は自己責任でお願いします。本スクリプトを実行することにより生じるいかなる問題に関しましても、筆者は一切責任を負いません。

#さあ、やってみよう
## 1. サンプルコードをDevNetから探す

https://developer.cisco.com/ にアクセスします。Code Exchangeから使えそうなコードを探します。
![Screen Shot 2021-12-21 at 15.43.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/eded7217-d096-2376-f865-30ea21d052b5.jpeg)

Code Exchangeでは"eem"をキーワードにして検索してみました。
![Screen Shot 2021-12-21 at 15.56.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/28cb8e6e-8f1e-a484-e94b-f63361b6a989.jpeg)

今回はこれを使ってみることにします！
![Screen Shot 2021-12-21 at 15.56.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/07d2daee-0268-89a9-3d52-8ab26e9a7cff.jpeg)

コードはGithubで管理されているようです。View on GitHubをクリックします。
![Screen Shot 2021-12-21 at 15.57.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/4f3db463-7414-9d70-99c9-0976018ed68a.jpeg)

クリックした先のページには、ファイルのリンクとREAMD.mdが表示されています。READMEを読んでみます。
ざっとみて

- 条件等の説明
- Config方法 (EEMとguestshell)
- 使い方

が書いてあるようです。今回は細かいカスタマイズはせず、単純に使ってみるだけなので詳細はすっ飛ばし、pythonファイル(configDiff.pyとmytokens.py)をローカルPCにコピーしましょう。
![Screen Shot 2021-12-21 at 15.57.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/875369a3-ae0c-94b3-a0f4-246a50c5e905.jpeg)

mytokens.pyを開いてみると、"access token"と"room id"が必要そうです。

```mytokens.py
access_token = "your.webex.token"
teams_room = "your.teams.room.id"
http_proxy  = "http://proxy.your.server.com:port"
webex_webhook_url = "https://your.webhook.url"
slack_webhook_url = "https://your.webhook.url"
microsoft_webhook_url = "https://your.webhook.url"
```
これらはwebexでroomに投稿する際に必要なものです。
誰が投稿するのか＝Access Tokenで識別
どのスペースに投稿するのか＝Room IDで識別
します。
Access TokenとRoom IDは[Webexの開発者用サイト](https://developer.webex.com/)からゲットします。

## 2. Webexの開発者用サイトから必要な情報を取得する
https://developer.webex.com にアクセスします。Log in後、Documentationをクリックしましょう。(アカウントがない場合はSign upからアカウントを作成します)
![Screen Shot 2021-12-25 at 21.56.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/27739f64-70ae-69f5-927e-581903f22a2e.jpeg)


まず投稿用のスペースを作成し、そのRoom IDを取得します。
左ペインの"Webex APIs"から"Messaging">"Reference">"Rooms"を探します。
![Screen Shot 2021-12-25 at 22.32.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/2ab6300f-2e5c-d329-51ba-07eb122b55da.jpeg)

"Create a Room"からWebex内にメッセージ投稿用のスペースを作成しましょう。
右ペインに現れた項目のうち、titleが必須項目です。ここにスペース名を記入します。なお、下の"isAnnouncementOnly"のチェックは外しておきましょう。
![Screen Shot 2021-12-25 at 22.44.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/246bc03e-5c9b-3295-5a0c-7407109eabcc.jpeg)

Runをクリックすると結果が表示されます。200/OKが出ていれば成功です。
![Screen Shot 2021-12-25 at 22.47.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/43c75c09-11cd-5821-008e-3eea435dab05.jpeg)

↑この一番上の行の"id"が"Room ID"です。コピーして控えておきましょう。

次に"Access Token"です。自分の名前で投稿する場合には、右ペイン一番上にある"Authorization"に表示されている(隠れている？)ものがAccess Tokenです。
![Screen Shot 2021-12-25 at 22.49.35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/29b354aa-834e-96f7-b278-d4b63c2a7048.jpeg)

これを使うこともできるのですが、自分のAccess Tokenが漏れてしまった場合、そのTokenを使ってあなたになりすまして（権限の範囲内で）何でもできてしまうため、コードに埋め込むのはセキュリティ上おすすめしません。
ということで、投稿用のbotを作成します。

ブラウザ画面上部右にある自分のアイコンをクリックし、"My Webex Apps"をクリックします。

![Screen Shot 2021-12-25 at 22.54.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/ea768d12-3a9e-4cbd-34ee-33c4441c001d.jpeg)

"Create a New App"をクリックします。Create a New App画面がでるので、Create a Botをクリックします。
![Screen Shot 2021-12-25 at 22.56.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/293c1c84-867c-11ea-d827-05681653bbb1.jpeg)

必要な項目を入力して、"Add Bot"ボタンをクリックします。

![Screen Shot 2021-12-25 at 23.00.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344909/a4011761-df2b-a9ac-e9fd-8a4e186ba2dd.jpeg)

正常に作成できました。このbotのAccess Tokenは、"Copy Token"をクリックします。コピーして控えておきましょう。

さて、ゲットできたAccess TokenとRoom IDをmytokens.pyに記入します。
"your.webex.token"と"your.teams.room.id"を、先ほどゲットしたAccess TokenとRoom IDに置き換えます。

さて、pythonファイルの修正で注意すべきことがあります。
- ファイル内のインデント(字下げ)がTABになっていると、ルータがエラーを吐くことがあります。TABはスペースに置き換えた方が無難です。
- テキストエディタで修正する場合、半角/全角や文字コードに注意しましょう。エディタが気を利かせて勝手に書き換える場合があります。コードの修正はVisual Studio Codeなどのコードエディタを使うことをお勧めします。
- 今回のサンプルはpython version 3でしたが、古いサンプルだとpython 2を使っている場合があります。ルータのOSが新しい場合はpython 3なので、python 2 --> python 3の書き換えが必要です。

## 3. ルータにEEM設定して、コード(python)をルータに置く
DevNet(というかGitHub)に戻りましょう。READMEを読むと、ルータに設定すべき設定がすべて書かれています。
EEMのconfigとIOxのconfigをルータに設定します。

さて、pythonファイルはどこに置いたらいいのでしょうか？
ルータの設定後、guestshellを起動してみましょう。

```
C1111X-8P-1#guestshell
[guestshell@guestshell ~]$ cd /
[guestshell@guestshell /]$ ls
bin        cisco  etc    lib    lost+found  opt   run      srv  usr
boot       data   flash  lib64  media       proc  sbin     sys  var
bootflash  dev    home   local  mnt         root  selinux  tmp
[guestshell@guestshell /]$ cd flash
[guestshell@guestshell flash]$ ls
guest-share
[guestshell@guestshell flash]$ 
```
guestshellからは、ルータのflashにマウントされているのですが、guestshellから見えるのは、flashの中のguest-shareディレクトリのみのようです。
pythonファイルはguest-shareディレクトリにコピーするようにしてください。

EEMのconfigに記載するpythonファイルのパスも上記に合わせて修正するのも忘れずに。


## 4. エラーが出るのでデバッグする！

さあ、動かしてみましょう！
READMEにやり方は書いてありますよ。
そして一発で動けば幸運です。エラーが出た場合は、変数をprint()で表示させながら、どこまで正常に動作しているのか確認しながら進めます。
前述の3つ(TABはスペースに書き換える、文字コードに注意、python3に修正)が適切になっているか、確認しましょう。

#さいごに

今回は初歩の初歩の話でした。developer.webex.comだけでなく、DevNetも活用することで、サンプルコードを使ったお手軽API体験ができます。
多少pythonの知識は必要となるサンプルですが、一から作るより随分ハードルは下がります。2つのディベロッパーサイトをフル活用にチャレンジしてみてください。私も来年頑張ります！
メリークリスマス＆パッピーニューイヤー＆ハッピーWebex！！！