記事投稿時に自動投稿するLINEBot作ってみた(一斉送信編:その2)

プログラミング

こんにちは、ぴのです。

前回に引き続き、LINEBotを作っていきたいと思います。前回はTweetBotと同様に定時になったら自動投稿するものを作りましたが、今回はタイトルにもあるように記事投稿時にLINEに「サムネイル」「タイトル」「本文の一部」「リンク」を送信するプログラムを書いていきます。

前回の記事をまだご覧になっていない方はぜひそちらもご覧ください。

LINEBotを作る

Code Snippetsの準備

これまで同様、「Code Snippets」のプラグインを利用して分割管理していきます。

【2020/6/6追記】「Code Snippets」内に記述するとスクリプトが正しいタイミングで実行されないことを確認しました。function.phpに直接書いたほうがよさそうです。

プログラムの作成

都合よく記事投稿時に実行する関数が準備されていたので、それを利用して実装を行っていきました。また、前回は単なるテキストを投稿しましたが、LINE側で準備されているテンプレートを利用して、ボタン型の投稿をできるようにしました。

また、投稿実行部分は前回の時点ではほぼ参考サイトのコピペだったのですが、リファレンスなどを参考に余計な部分をそぎ落してすっきりさせました。

add_action('transition_post_status', function($new_status, $old_status, $post){ //記事投稿時に実行
    if ('publish' == $new_status && 'publish' != $old_status && 'post' == $post->post_type) { //記事が公開状態になったなら
		
		/*投稿準備*/
        $channelToken = ''; //アクセストークン
        $headers = [
            'Authorization: Bearer ' . $channelToken,
            'Content-Type: application/json; charset=utf-8',
        ];
		
		/*投稿内容*/
        $template = [
            'type'    => 'buttons',
			'thumbnailImageUrl' => get_the_post_thumbnail_url($post, 'medium') ?: 'https://okinotori.net/wp-content/uploads/2020/04/wordpress_icatch.png',
            '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 = [
            'messages' => [
                [
                    'type'     => 'template',
                    'altText'  => '記事が投稿されました',
                    'template' => $template,
                ],
            ],
        ];
		
		/*投稿実行*/
        $line = json_encode($line); //JSONにエンコード
        $ch = curl_init('https://api.line.me/v2/bot/message/broadcast'); //データ転送初期化
        $options = [
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_POSTFIELDS => $line,
        ];
        curl_setopt_array($ch, $options); //オプションの指定
        curl_exec($ch); //転送の実行
		curl_close($ch); //転送終了
    }
}, 10, 3 );

【2020/6/6追記】アイキャッチ画像が存在しないときにも動作するようにデフォルト画像を設定しました。適宜変更してお使いください。

テスト記事を投稿する

「タイトル」「本文」「アイキャッチ画像」を設定したテスト記事を投稿します。

ただし、add_action関数を追加した後から、投稿時に「公開に失敗しました。 返答が正しい JSON レスポンスではありません。」という警告が出るようになりました(記事の公開自体は可能)。関数内に何も書かなくても出たため、スクリプトの処理順に問題があるのかもしれません。(修正済み)

動作を確認

公開とともにLINEに投稿されてる!!!!!やったね!!!!

「ぴのの社」LINE公式アカウント

LINEBotの動作を体験したい人もそうでない人も友達登録だ!

友だち追加

終わりに

や、やっとまともに動作した…ネット上の情報が古かったり間違っていたりしてかなり試行錯誤してやっと完成しました!これで友達登録者が増えてくれると嬉しいな。

改善点としては、

  • 【修正済み】アイキャッチ無しの投稿をしたときの例外処理の追加
  • 【修正済み】(下書きでない)新規作成した記事だと投稿されない
  • 【修正済み】編集時に出る警告の解決
  • 【修正不可】LINE投稿時に高さ制限で本文がちょっとしか表示されない

などがあげられますかね。ぼちぼち改良していきたいと思います。

みんなも(公式アカウントと)友達になろう!

参考

コメント

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