きっかけ
興味対象の似通った知人たち数人でLINEグループを運営している。日々有益(?)というかくだらない動画やウェブサイトが届いて大いに楽しませてもらっているのだが、我々以外の似たような趣味関心の人には全く届いていないのが非常に勿体なく思えてきた。
かといってシェアされた内容をウェブサイトやTwitterに転載していくのもバカバカしくてやってらんない、てことでグループチャットに投稿されたURLを自動でウェブサイトにも投稿されるようにしたら面白いかもな、とLINEグループチャットとWordpressの自動連携を作ってみました。
処理手順
- LINEグループチャットで発せられた情報をWebhookで受け取る
- URLだけ抜き出してページ内の情報を取得する
- WordpressのRest APIに投げる
LINEの開発をやったことがないと1は詰まりがちなポイントかもしれないが、あとは造作もない話で、2をテキストそのままにして3はTwitterに投げる等で置換してしまえばLINEの会話がそのままツイートされるアプリとかもできますね。
LINEはやっぱり使ってる人も多いので、ちょっとしたウェブアプリなんかをサクッと色んな人に試して貰うにはよい仕組みかなと思います。
実装
-
LINE developersとWebhook URLの設定
新規チャネルを作成してWebhook URLを設定。Webhook URLはhttpsで始まる必要があります。設定が終わったらQRコードをスキャンしてbotを友達に追加します。このbotに対して発話し、そのデータを使っていきます。グループチャットにこのbotを招待して追加することでチャット内の会話を受け取ることができます。
-
書いていく
Webhook URLさえ設定できてしまえばあとは楽しい時間ですね。もりもり書いていきましょう。LINEはページがないのでデバッグに関して私は全部ファイルに出力しています。
Webhookで受け取った会話を格納します。
$accessToken = 'LINE developerで発行したToken';
$jsonString = file_get_contents('php://input');
$jsonObj = json_decode($jsonString);
$message = $jsonObj->{"events"}[0]->{"message"};
$postback = $jsonObj->events[0]->postback->data;
$replyToken = $jsonObj->{"events"}[0]->{"replyToken"};
$userId=$jsonObj->{"events"}[0]->{"source"}->{"userId"};
error_log($jsonString,3,"./line.log");
受け取った会話を処理。今回はテキストの中からURLだけを抽出し、その後URLの内容を解析、タイトル、抜粋、画像等をWordpressに投稿する。
if ($message->{"text"} == 'こんにちは') {
//リプライのテスト
$messageData = [
'type' => 'text',
'text' => 'どもです'
];
}else{
//テキストの中からURLだけ抽出
$preg = '(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)';
$match=preg_match_all($preg, $message->{"text"}, $result);
$count=count($result[0]);
for($i=0;$i<$count;$i++){
//ページ情報の取得にOGPを利用
$graph = OpenGraph::fetch($result[0][$i]);
$title = $graph->title;
$site_name = $graph->site_name;
$description = $graph->description;
$image = $graph->image;
}
//Wordpressへの投稿
post_article('draft','slug', $title, $description, $category_ids=[],$tag_ids=[],$image);
}
Wordpressへ投稿する関数
function post_article($status,$slug,$title,$content,$category_ids,$tag_ids,$image){
//WP_REST_APIを使う準備
$WP_URL = 'http://example.com/wp-json/wp/v2/posts';
$WP_USERNAME = 'user';
$WP_PASSWORD = 'password';
//アイキャッチ画像をDLして格納、サムネイルIDを取得。著作権的には微妙なのでなくてもよい
if (!empty($image)) { $media_id=post_image($image); }
//記事投稿
$response = wp_remote_post($WP_URL, array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode($WP_USERNAME.':'.$WP_PASSWORD),
'Content-Type: application/json'
),
'body' => array(
"status"=> $status,
"slug"=> $slug,
"title"=> $title,
"content"=> $content,
"date"=> $date,
"categories"=> $category_ids,
"tags"=> $tag_ids,
"featured_media"=>$media_id
)
) );
}
アイキャッチ用画像取得関数。Wordpressの性質上、対象のページからFetchして自分のサーバにDLしてくることになります。
function post_image($image){
//Wordpress画像投稿用のEndpoint
$url = 'http://example.com/wp-json/wp/v2/media';
$file = $image;
$data = wp_remote_get($file);
$image_response = wp_remote_post( $url, array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode($WP_USERNAME.':'.$WP_PASSWORD),
'Content-Disposition' => 'attachment;filename=' . basename($file)
),
'body' => $data["body"]
));
$data = json_decode($image_response['body']);
$media_id=$data->id;
return $media_id;
}
はい、っと。
バカバカしい記事がいっぱいあるサイトが自動で膨らんでいきます。
まとめ
こんな感じでLINEへの投稿でWordpressのブログに自動投稿できるようになりました。Wordpressのダッシュボードからブログ書くのめんどい、思いついたときにLINEでさっと更新したい、とかそういうニーズにも対応できそうです。
コードは結構端折ってますが、実際にはOGPのところで文字化け回避とか、画像DLのとこでパラメータ削除等、いろいろ細かいことをやらないとWordpressには綺麗に投稿されません。