記事へのリンクを自動返信するLINEBotを作ってみた(自動返信編:その2)

プログラミング

こんにちは、LINEBot歴3週間のぴのです。

今回はだいぶ前に作った「何を言っても『こんにちは』と返信するLINEBot」を改造して、最新記事やランダム記事へのリンクを返信できるようにしていきます。前回の記事をまだご覧になっていない方はぜひ先にご覧ください。

リンクを自動返信するLINEBot

最新記事取得関数の移動

TweetBotを作ったときに作成した最新記事取得関数を、少し手を加えた上で「Code Snippets」内に移動しました。これで何度も使いまわすことができます。

function get_last_article() { 
	$args = array(
		'posts_per_page' => 1, 
		'orderby' => 'date',
		'order' => 'DESC',
		'post_type' => 'post',
	);
	$my_posts = get_posts($args);
	wp_reset_postdata();
	return $my_posts[0];
}

ランダム記事取得関数の分割

WPのウィジェットを作ったときに作成したランダム記事取得関数を、「Code Snippets」内の別ファイルに分割しました。

function get_random_article() { 
	$args = array( 
		'posts_per_page' =>1, 
		'orderby'          => 'rand',
		'post_type'        => 'post',
	);
	$my_posts = get_posts( $args );
	wp_reset_postdata();
	return $my_posts[0];
}

返信記事取得関数の作成

ユーザー側から受信したテキスト内容によって、LINEBotが返信する内容を決定する関数を作成します。この関数は使いまわさないのでline-bot.php内に記述しました。

今回は「ランダム」または「らんだむ」の文字列が含まれているテキストメッセージを受信した場合はランダム記事を、そうでない場合は最新記事を取得して返すようにしています。

/*返信記事取得関数*/
function replyPost($input){
    $random = ['ランダム', 'らんだむ'];
    foreach($random as $value){
        if(strpos($input, $value) !== false){
            return get_random_article(); //ランダム記事取得
        }
    }
    return get_last_article(); //最新記事取得
}

line-bot.phpの作成

自動返信の本体部分を作成しました。wp-load.phpを読み込むことで、WordPress内のほとんどの関数(最新記事・ランダム記事取得関数含む)が使用可能になります。

一斉送信編のときと同じように、LINE側で用意されているテンプレートを使用して返信できるように改良しました。また、「自動返信編:その1」の時点ではほぼ参考サイトのコピペだったのですが、リファレンスなどを参考に無駄な部分をそぎ落としてスッキリさせました。

<?php
require_once ('./wp-load.php');

/*返信準備*/
$channelToken = ''; //アクセストークン
$headers = [
    'Authorization: Bearer ' . $channelToken,
    'Content-Type: application/json; charset=UTF-8',
];

/*情報取得*/
$json_string = file_get_contents('php://input'); //JSON取得
$json_object = json_decode($json_string); //JSONデコード
$replyToken = $json_object->{"events"}[0]->{"replyToken"}; //リプライトークン
$messageText = $json_object->{"events"}[0]->{"message"}->{"text"}; //受信テキスト

/*返信内容*/
$post = replyPost($messageText);
$template = [
    'type'    => 'buttons',
    'thumbnailImageUrl' => get_the_post_thumbnail_url($post, 'medium'),
    'title'   => mb_substr($post->post_title, 0, 40),
    'text'    => mb_substr(strip_tags($post->post_content), 0, 60, 'UTF-8'),
    'actions' => [
        [
            'type' => 'uri',
            'uri' => esc_url(get_permalink($post->ID)),
            'label' => 'ウェブサイトへ',
        ],
    ],
];
$line = [
    "replyToken" => $replyToken,
    'messages' => [
        [
            'type'     => 'template',
            'altText'  => '記事を取得',
            'template' => $template,
        ],
    ],
];

/*返信処理*/
$line = json_encode($line); //JSONエンコード
$ch = curl_init("https://api.line.me/v2/bot/message/reply"); //転送準備
$options = [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $line,
];
curl_setopt_array($ch, $options); //オプション指定
curl_exec($ch); //転送実行
curl_close($ch); //転送終了
?>

大したことではないのですが、PHPは関数や変数がアンダースコア(json_stringとか)で連結するのが一般的みたいです。管理人はアンダースコアがあまり好きでないのでキャメルケース(replyPostとか)で書くことが多く、ごっちゃになってしまっています。今後はPHPはアンダースコアに統一して書こうかな…

動作を確認

自動返信できた!!!!!やったぜ!!!!!

終わりに

とりあえず実装したかった機能は実装できたのでLINEBotはひと段落ってところです。しばらくは一斉送信編含めてバグや非効率なところをちょいちょい直していきたいと思います。

LINEBotも最初は何書いているのかさっぱりわからずほぼ参考サイトのコピペだったのですが、それなりに知識を付けてどういうことをやっているのかおおよそ理解できるようになってきました。オプションの部分は未だによくわかっていません。これからもぼちぼちやっていきたいと思います。

めざせ友達登録者数2桁!!!(登録してね)

コメント

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