ワードプレス、ContactForm7の内容を、LineWorksに

この記事は約20分で読めます。

現場では、「LineWorks」が使われている場合があります。
わざわざメールをチェックしなくても、「LineWorks」に通知されると便利です。
今回は、ContactForm7 + phpプログラムでやってみたいと思います。

「LineWorks」とは

「LINE WORKS」は、情報や予定を共有しあって活動する、組織・チームのためのコミュニケーションツール。(下記のページから引用)
https://line.worksmobile.com/jp/blog/product/line-works/

LINEのアカウントは必要ありません。
LINEのアカウントとは、区別されます。

実際に現場で使っている組織も多いのでしょう。

LineWorks Developers 基本設定


↑右上の「ログイン」を選びます。

↑LineWorksと、ワードプレスをつなぐには、「Developers」に、「LineWorks」の管理者でログインをします。

↑「Developer Console」を選びます。


↑規約を読み、チェックをして、「利用する」を押して進みます。


↑このような画面が出てきます。
「API ID」を発行します。


↑上記のように「英数字」が表示されて、「API ID」が発行されました。

送信準備-LineWorks Developer Consoleなどでの設定

送信する前に、「ラインワークス」の「Developer Console」や管理者画面で、設定を行います。

Server API Consumer Keyの発行


↑「Server API Consumer Key」を作成します。「発行」を押します。


↑「追加」「照会」のみを選びます


↑7日間、で、自動更新とします。


↑上記のような感じになりました。

botの追加

LineWorks のDeveloper Console上で、「bot」のサービスを追加します。


↑「登録」を押します。


↑「bot登録」の画面になります。
プロフィール画像は、linework上に表示されますので、わかりやすい画像にすると混乱が少ないです。
今回、ワードプレスのロゴを入れてみました。

「bot名」も、lineworks上に表示されますので、わかりやすい名称がいいかと思います。
「説明」は、ご自身の説明を入れます。
「複数人のトークルーム招待可」にチェックを入れます。
「主担当」は、ログインしている管理者を、設定するといいかと思います。


↑登録を行うと上記のような画面が出てきます。


↑登録された「bot」は、まだ「準備中」となっています。

linework上から、botの追加

lineworksの管理者でログインを行います。(Developer Consoleではないです)


↑管理者のlineworks上の「管理画面」を選びます。


↑「サービス」の「bot」を選びます。


↑右上の「bot追加」を選びます。


↑先ほど、登録した、botが表示されているはずです。

チェックをして、「bot追加」を押します。


↑「botが追加されました。」とメッセージが出てくると思います。


↑「developer tool」のほうでは、「サービス中」に変更されたかと思います。


↑公開されていなく、公開をして利用したいので、先ほどの「bot名」をクリックします。


↑修正を押します。


↑画面下の「公開設定」をONにして、「保存」を押します。


↑「鍵」のマークが無くなりました。


↑管理者への通知で、「botが追加された」と表示されました。

トークルームへの招待

特定の人が、ワードプレスのメッセージを受け取る場合より、トークルームで複数の人がメッセージを見る方が現実的でしょう。

トークルームへ、botの招待を行います。


↑トークルームを選んで、右上の「・・・」を選び、「招待」を押します。


↑「bot」タグを選びます。
先ほど、登録した、botを選びます。


↑トークルームに1名分加わりました(ワードプレスのアイコンが加わりました)。

Guzzle Http インストール

lineworksとの通信で、Guzzle Httpを使ってみます。
前までは、curlとかを使っていましたが・・・

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

↑で、「composer-setup.php」をゲット

$ php composer-setup.php 
All settings correct for using Composer
Downloading...

Composer (version 2.0.8) successfully installed to: /home/white_set/web/line2/composer.phar

↑composer.pharをゲットします。

$ php ./composer.phar require guzzlehttp/guzzle
Using version ^7.2 for guzzlehttp/guzzle
./composer.json has been created
Running composer update guzzlehttp/guzzle
Loading composer repositories with package information
Updating dependencies
Lock file operations: 6 installs, 0 updates, 0 removals
  - Locking guzzlehttp/guzzle (7.2.0)
  - Locking guzzlehttp/promises (1.4.0)
  - Locking guzzlehttp/psr7 (1.7.0)
  - Locking psr/http-client (1.0.1)
  - Locking psr/http-message (1.0.1)
  - Locking ralouphie/getallheaders (3.0.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 6 installs, 0 updates, 0 removals
  - Installing psr/http-message (1.0.1): Extracting archive
  - Installing psr/http-client (1.0.1): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing guzzlehttp/psr7 (1.7.0): Extracting archive
  - Installing guzzlehttp/promises (1.4.0): Extracting archive
  - Installing guzzlehttp/guzzle (7.2.0): Extracting archive
2 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

↑「composer.phar」を実行します。
「vendor」というフォルダができます。

require_once '/xxxx/vendor/autoload.php';
use GuzzleHttp\Client;

↑PHPプログラム上では、上記のように利用します。

Server List(固定IPタイプ)でのメッセージ送信

Server List(固定IPタイプ)で、lineworks側に通知してみます。

このタイプは、有効期限がありますので、ご留意ください。

事前準備-Developer consoleで、Tokenの取得

メッセージを送るタイプで、2つあります。「固定IPタイプ」と「ID登録タイプ」です。
まずは、前者の「固定IPタイプ」を設定します。


↑追加を押します。


↑小窓が出てくるので、「サーバー名」のところは、わかりやすい名称を入れます。
「keyの選択」は、先ほどの「Server API Consumer Key」が選択されているかと思います。
「IP」は、サーバーの固定IPを入れます。
そして「発行」を押します。

(52)

↑「token」のところに、長い英数字が入りました。

「同意して利用する」を押します。


↑このような画面になります。

Server List(固定IPタイプ)-サンプルプログラム

 

<?php

    require_once '/xxxxx/vendor/autoload.php';
    use GuzzleHttp\Client;


    $api_id = '(API ID)';

    send_mes();

    function send_mes(){

            global $api_id;

            $message = "(lineworksに通知したいメッセージ)";

            $botno = '(botno)';
            $consumerKey = '(consumerKey)';
            $accountid = '(個人のlineworksアカウント)'; # xxxx@xxxx 形式
            #$roomid = '(roomID)';
            $token_now = '(トークン)';
            $url = "https://apis.worksmobile.com/r/$api_id/message/v1/bot/$botno/message/push";
            $options = [
                'json' => [
                    "accountId" => $accountid,
                    #"roomId" => $roomid,
                    "content" => [
                        "type" => "text",
                        "text" => $message
                    ]
                ],
                'headers' => [
                    'Content-Type' => 'application/json;charset=UTF-8',
                    'consumerKey' => $consumerKey,
                    'Authorization' => "Bearer $token_now"
                ]
            ];
            $client = new Client();
            $response = $client->request("POST", $url, $options);
    }



?>

↑「()」には、「Develovper Console」などで、取得した英数字を入れてください。
そして、上記のPHPを実行すると、個人のトークルームにメッセージが送信されるはずです。

「トークルーム」へ通知する方法(ルームIDを知る方法)

「トークルーム」への通知は、「トークルームのID」を知らないといけません。
このIDは管理画面からは、確認することができません。

ここでは、「callbackのURL」から解析してみいたと思います。


↑developer consoleの「bot」から作成済みの「bot」で、「修正」を選びます。


↑プログラムを設置できそうなURLを入れます。「テキスト」を選択します。
ContactForm7設置サーバー以外でもいいです。

$jsoninput = file_get_contents('php://input');
$jsonobj = json_decode($jsoninput);
$roomid = $jsonobj->{"source"}->{"roomId"};

↑上記のようなphpプログラムをcallbackプログラムに設置します。対象のトークルームにメッセージが投稿されると、calbackのURLが自動的にアクセスされて、プログラム実行されます。そして、上記の「$roomid」の変数にroomID(数字)が書かれています。

function send_mes(){

        global $api_id;

        $message = "(lineworksに通知したいメッセージ)";

        $botno = '(botno)';
        $consumerKey = '(consumerKey)';
        #$accountid = '(個人のlineworksアカウント)'; # xxxx@xxxx 形式
        $roomid = '(roomID)';
        $token_now = '(トークン)';
        $url = "https://apis.worksmobile.com/r/$api_id/message/v1/bot/$botno/message/push";
        $options = [
            'json' => [
                #"accountId" => $accountid,
                "roomId" => $roomid,
                "content" => [
                    "type" => "text",
                    "text" => $message
                ]
            ],
            'headers' => [
                'Content-Type' => 'application/json;charset=UTF-8',
                'consumerKey' => $consumerKey,
                'Authorization' => "Bearer $token_now"
            ]
        ];
        $client = new Client();
        $response = $client->request("POST", $url, $options);
}

↑上記の「$roomid」のところに、callbackで得られた数字を入れて、「roomID =>」のところを有効にします。

これで、特定のトークルームに発言が届く事になります。

Server List(ID登録タイプ)でのメッセージ送信

こちらの方法では、決まった手順に従い、毎回、tokenを取得します。
手順が面倒かもしれません。

事前準備-Developer consoleで、ID・認証キーの取得

↑追加を押します。


↑「サーバー名」のところは、わかりやすい名称を入れます。
「keyの選択」部分は、同じ画面の「Server API Consumer Key」で設定したkeyを選びます。


↑上記のような画面になります。

ここで、「ID」のところを数字と、
「認証キー」のボタンを押して得られるテキストデータを、プログラムで利用します。
「認証キー」は重要で、きちんと保管をしておきましょう。

事前準備-JWTライブラリの設置

JWT(JSON Web Token RFC-7519) を利用するため、phpで、利用できるライブラリをダウンロードします。

firebase/php-jwt
PHP package for JWT. Contribute to firebase/php-jwt development by creating an account on GitHub.

にアクセスをします。


↑「Download ZIP」を選びます。

ダウンロードしたzipファイルの「src」の中身を稼働させるプログラムのフォルダにコピーします。

phpプログラム上から

require_once 'jwt/src/BeforeValidException.php';
require_once 'jwt/src/ExpiredException.php';
require_once 'jwt/src/SignatureInvalidException.php';
require_once 'jwt/src/JWT.php';

use \Firebase\JWT\JWT;

というように記述します。

Server List(ID登録タイプ)-サンプルプログラム

<?php
    require_once 'jwt/src/BeforeValidException.php';
    require_once 'jwt/src/ExpiredException.php';
    require_once 'jwt/src/SignatureInvalidException.php';
    require_once 'jwt/src/JWT.php';

    use \Firebase\JWT\JWT;

    require_once '/home/white_set/web/line/vendor/autoload.php';
    use GuzzleHttp\Client;

    $api_id = '(Developer Console、一番上の API ID)';

    $key = "-----BEGIN PRIVATE KEY-----
    (Server List(ID登録タイプ)から、ダウンロードした、認証キー。
     30行近くの改行コード付き英数字が入ります。)
    -----END PRIVATE KEY-----";

    function get_jwt(){

            global $key;

            $t_st = time();
            $t_end = time() + 1800; // 認証時間を30分とします。

            $payload = array(
                "iss" => "(Server List(ID登録タイプ)のID。英数字。1行。)",
                "iat" => time(),
                "exp" => time() + 1800
            );
            $jwt = JWT::encode($payload, $key,'RS256');

            return $jwt;

    }

    function getAccessToken($jwttoken){
        global $api_id;

        $url = "https://auth.worksmobile.com/b/".$api_id."/server/token";
        $options = [
        'form_params' => [
            "grant_type" => urlencode("urn:ietf:params:oauth:grant-type:jwt-bearer"),
            "assertion" => $jwttoken
        ],
        'headers' => [
            'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8'
        ]
        ];
        $client = new Client();
        $response = $client->request("POST", $url, $options);
        $status = (string) $response->getStatusCode();
        $body = $response->getBody();
        $json = json_decode($body, true);

        return $json["access_token"];
    }

    function send_mes($token_now){
        
        $message = "(送信したいメッセージ)";

        global $api_id;

        $botno = '(Bot No。数字)';
        $consumerKey = '(Server API Consumer Keyの「key」)';
        #$accountid = '(Line Works のアカウントID。xxx@xxx形式)';
        $roomid = '(RoomID)';
        $url = "https://apis.worksmobile.com/r/$api_id/message/v1/bot/$botno/message/push";
        $options = [
            'json' => [
                #""accountId" => $accountid,
                "roomId" => $roomid,
                "content" => [
                    "type" => "text",
                    "text" => $message
                ]
            ],
            'headers' => [
                'Content-Type' => 'application/json;charset=UTF-8',
                'consumerKey' => $consumerKey,
                'Authorization' => "Bearer $token_now"
            ]
        ];
        $client = new Client();
        $response = $client->request("POST", $url, $options);
    }


    $jwt = get_jwt();

    $token_now = getAccessToken($jwt);

    send_mes($token_now);


    exit;


?>

上記のプログラムで、phpプログラムから、メッセージを送信することができます。

ワードプレスのContactform7から送信

本題の「ワードプレス」の「Contact form7」からの送信です。

function get_form_mes(){
        $submission = WPCF7_Submission::get_instance();

        if($submission) {
                $fm7 = $submission->get_posted_data();
                $mes = "氏名\n" . $fm7['your-name'] . "\n\n";
                $mes .= "メールアドレス\n" . $fm7['your-email'] . "\n\n";
                $mes .= "題名\n" . $fm7['your-subject'] . "\n\n";
                $mes .= "メッセージ本文\n" . $fm7['your-message'] . "\n\n";
        }
        return $mes;
}

先ほどの、phpプログラムファイルに上記の関数を入れます。

function send_mes($token_now){
    
    $message = "(送信したいメッセージ)";

↑最初のプログラム、上記部分を

function send_mes($token_now){
    
    $message = get_form_mes();

↑と変更をします。

ワードプレスの「function.php」に

require get_template_directory() . '/line/line-wp.php';

add_action('wpcf7_mail_sent', 'send_mes', 10, 1);

↑と、追記します。

「line-wp.php」
が、一連のプログラムが格納されているファイルです。


↑これで、問い合わせがあれば、メッセージが、ラインワークスのトークルームに送信されます。

タイトルとURLをコピーしました