Vonage Messaging APIを使ってFacebook Messengerにテキストメッセージを送信してみる


# はじめに
[【Vonage】コミュニケーションAPIを使ってみよう、Vonageのことなら何でも共有しよう！ by Vonage Advent Calendar 2023]()の23日目です :santa:

この機会に初めてVonageAPIを使ってみました。その時の様子をお伝えします :v:

# 概要
 - [準備](#準備)
     - [アカウント登録(無料)](#アカウント登録無料)
     - [APIKey,APIシークレットの取得](#apikeyapiシークレットの取得)
     - [FB_RECIPIENT_IDの取得](#fb_recipient_idの取得)
 - [まずcurlで試してみる](#まずcurlで試してみる)
 - [PHPで実装していくー！](#phpで実装していくー)


## 準備
### アカウント登録(無料)

[テストクレジット€ 2いただきました :gift: ](https://qiita.com/advent-calendar/2023/vonage#:~:text=Video%20API%20%E4%BB%A5%E5%A4%96%E3%81%AEAPI%20%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%20(%E3%83%86%E3%82%B9%E3%83%88%E3%82%AF%E3%83%AC%E3%82%B8%E3%83%83%E3%83%88%E2%82%AC%202%E4%BB%98%E4%B8%8E))

https://ui.idp.vonage.com/ui/auth/registration?icid=tryitfree_api-developer-adp-hp_nexmodashbdfreetrialsignup_createfreeacctbtn

### APIKey,APIシークレットの取得
以下リンクよりダッシュボードにいくと一番上にあります :point_up:

https://dashboard.nexmo.com/


### FB_RECIPIENT_IDの取得
ダッシュボード > トラブルシューティングと詳細 > デベロッパーツール > Messageサンドボックス より、Facebook Messengerのsend invite emailを押下すると、
以下のメールが届きます :love_letter:

<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83896/67106517-5f0d-be68-5d15-1328165f0065.png">

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83896/4270b61a-d891-aab7-2c6b-1ea41807f891.jpeg">


## まずcurlで試してみる

※fromの`100614398987044`はVonage Sandbox V1のFB_RECIPIENT_IDです。
```
$ curl -X POST https://messages-sandbox.nexmo.com/v1/messages \
> -u '{API key}:{APIシークレット}' \
> -H 'Content-Type: application/json' \
> -H 'Accept: application/json' \
> -d '{
>     "from": "100614398987044",
>     "to": "{FB_RECIPIENT_ID}",
>     "message_type": "text",
>     "text": "This is a Facebook Messenger Message sent from the Messages API",
>     "channel": "messenger"
>   }'
{"message_uuid":"xxxxxxxx-xxxx-xxxx-xxxx-xxx"}
```

Vonage Sandbox V1からメッセージが来ましたー :tada::tada::tada:
<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83896/15e10129-f704-8ef4-0b4d-5970dafc7a57.jpeg">



### 参考
- https://developer.vonage.com/en/messages/code-snippets/messenger/send-text

## PHPで実装していくー！

PHP Client(vonage/client)が用意されているのでそれを使います。

Symfony Consoleを使って、コマンドでメッセージを送信できるように実装していきます。

```bash
$ symfony new vonage_exam --version="7.0.*"
$ composer req --dev maker
$ symfony console make:command
$ composer require vonage/client:^4.0
```

実装したコマンドがこちら!!!
```php
<?php

namespace App\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Vonage\Client as VonageClient;
use Vonage\Messages\Channel\Messenger\MessengerText;

#[AsCommand(
    name: 'app:send-messenger',
    description: 'Commands to send text messages in Facebook Messenger',
)]
class SendMessengerCommand extends Command
{
    public function __construct(
        #[Autowire(env: 'VANAGE_API_KEY')] private readonly string $vonageApiKey,
        #[Autowire(env: 'VANAGE_API_SECRET')]  private readonly string $vonageApiSecret,
    )
    {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this
            ->addArgument('to_fb_page_id', null, InputOption::VALUE_REQUIRED, 'to fb_page_id')
            ->addArgument('from_fb_recipient_id', null, InputOption::VALUE_REQUIRED, 'from fb_recipient_id')
            ->addOption('text', null, InputOption::VALUE_OPTIONAL, 'send message text')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        try {
            $client = new  VonageClient(
                new VonageClient\Credentials\Basic($this->vonageApiKey, $this->vonageApiSecret),
                ['base_api_url' => 'https://messages-sandbox.nexmo.com']
            );
            $client->messages->send(
                new MessengerText(
                    $to = $input->getArgument('to_fb_page_id'),
                    $from = $input->getArgument('from_fb_recipient_id'),
                    $text = $input->getOption('text') ?: 'hello world! from Vonage PHP SDK'
                )
            );
        } catch (\Exception $e) {
            $io->error('error. exception message: ' . $e->getMessage());

            return Command::FAILURE;
        }

        $io->success('Your facebook messenger has been sent.' . PHP_EOL
            . 'to: ' . $to . PHP_EOL
            . 'from: ' . $from . PHP_EOL
            . 'text: ' . $text);

        return Command::SUCCESS;
    }
}

```


コマンドを実行すると...
```bash
$ symfony console app:send-messenger {fb_recipient_id} 100614398987044 --text=できたー！

                                                                                                                        
 [OK] Your facebook messenger has been sent.                                                                            
      to: 6797460817029912                                                                                              
      from: 100614398987044                                                                                             
      text: できたー！                                                                                                  
                                                                                             
```
Messengerに送信できました :relaxed:
![IMG_8B5F8DB874BA-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83896/3b4245d7-ec27-2848-6fbb-629ce21f1e2e.jpeg)




参考：
- https://github.com/Vonage/vonage-php-sdk-core
- https://developer.vonage.com/en/messages/code-snippets/messenger/send-text?lang=php


# 最後に
PHPドキュメントもあったので、PHPerの私にはとっても助かりました。
しかし、なぜかサンプルコードのsend-text.phpには、メッセンジャーテキストを作る部分の実装のみで送信部分がなかったので少し苦戦しました :sweat_smile:

SymfonyのNotifier ComponentがVonageに対応していることを知ったので、こちらも使ってみたいなと思いました！ 
https://github.com/symfony/symfony/blob/7.0/src/Symfony/Component/Notifier/Bridge/Vonage/README.md