【wordpress】プラグインなしで Bluesky に自動投稿する

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、「今週はブログ何書こっかな…🤔」なんて考えてたら、あるニュースが飛び込んできました。

それが・・・・・・

Bluesky が招待なしでも登録できるようになった

というものです。

📝 参考ページ: 「X対抗SNS」Bluesky(ブルースカイ)、招待制廃止で誰でも登録可能に Xとの違いとは

Blueskyはまだ馴染みがないかもしれませんがX(旧ツイッター)の代替になるんじゃないかとも言われるSNSのことで、創業者のジャック・ドーシーが発案したものなんだそうです。(実際、見た目も何から何までツイッターとそっくりです😄)

そして、少し調べてみると、すでにAPIまで用意されているとのことだったので、「じゃあ、せっかくだから」ということで「wordpressに記事が投稿されたら、自動でBlueskyに投稿される」ようにしてみることにしました。

そこで❗

今回はBlueskyの(API)の話題をお届けしたいと思います。

ぜひ何かの参考になりましたら嬉しいです。😄✨

「招待制のときからアカウントあったのに、
ひとつも投稿してなかった…
すっかり忘れてた😂」

📝 九保すこひの Bluesky アカウントはこちら

開発環境: wordpress 6.4

必要になるもの

2024.2.8現在Bluesky APIは特に登録せずに以下の情報があれば普通に使えるようです。

  • ユーザー名(例: sukohi.bsky.social
  • ログインパスワード

そのため、これらの情報を用意しておいてください。

※ 多分人気が出てきたらAPIも登録制とかになるんじゃないでしょうか。あと、パスワードもAPIキーとかに変わりそうな気がします🤔

では、楽しんでやっていきましょう❗(今回はすぐできます👍)

子テーマをつくる

wordpressをカスタマイズする場合の定番ですが、「子テーマ」というものをつくって「すでにあるテーマの一部分だけを上書きできるように」します。

なお、子テーマの作り方は以下のページを参考にしてください。

📝 参考ページ: 子テーマをつくる

ちなみに、今回作ったのは以下の「Twenty Twenty-Four for Bluesky」です。

wp-content/themes/twentytwentyfour-bluesky/style.css

/*
Theme Name:   Twenty Twenty-Four for Bluesky
Theme URI:    https://wordpress.org/themes/twentytwentyfour/
Description:  Twenty Twenty-Four with Summary
Author:       Sukohi Kuhoh
Author URI:   http://example.com
Template:     twentytwentyfour
Version:      1.0.0
License:      GNU General Public License v2 or later
License URI:  http://www.gnu.org/licenses/gpl-2.0.html
Tags: one-column, custom-colors, custom-menu, custom-logo, editor-style, featured-images, full-site-editing, block-patterns, rtl-language-support, sticky-post, threaded-comments, translation-ready, wide-blocks, block-styles, style-variations, accessibility-ready, blog, portfolio, news
*/

Bluesky APIでへ投稿するようにする

では、今回のメインになるカスタマイズ部分です。

wp-content/themes/twentytwentyfour-bluesky/functions.php

<?php

// 定数
define('BLUESKY_LOGIN_USER_NAME', '(あなたのユーザー名)'); // Bluesky にログインするユーザー名
define('BLUESKY_LOGIN_PASSWORD', '(あなたのパスワード)'); // Bluesky にログインするパスワード

add_action('transition_post_status', function($new_status, $old_status, $post)
{
    if($new_status === 'publish' &&
        in_array($old_status, ['draft', 'future'], true) &&
        $post->post_type === 'post') { // 初回投稿の時だけ

        // ログインする
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://bsky.social/xrpc/com.atproto.server.createSession');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
            'identifier' => BLUESKY_LOGIN_USER_NAME,
            'password' => BLUESKY_LOGIN_PASSWORD,
        ]));
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

        $response = curl_exec($ch);
        $login_response = json_decode($response, true);
        curl_close($ch);

        $has_error = isset($login_response['error']);

        if (! $has_error) { // ログイン成功

            // ポストする
            $text = $post->post_title ."\nという記事を公開しました!\nぜひご覧ください。";
            $postData = json_encode([
                'repo' => $login_response['did'],
                'collection' => 'app.bsky.feed.post',
                'record' => [
                    '$type' => 'app.bsky.feed.post',
                    'createdAt' => date('c'),
                    'langs' => ['ja'],
                    'text' => $text,
                    'embed' => [
                        '$type' => 'app.bsky.embed.external',
                        'external' => [
                            'uri' => get_permalink($post->ID),
                            'title' => $post->post_title,
                            'description' => $post->post_excerpt,
                        ]
                    ]
                ]
            ]);
            $jwt = $login_response['accessJwt'];

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'https://bsky.social/xrpc/com.atproto.repo.createRecord');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/json',
                'Authorization: Bearer '. $jwt,
            ]);
            curl_exec($ch);
            curl_close($ch);

        }

    }
}, 10, 3);

【追記:2024.2.18】予約投稿を使った場合、2回実行される可能性があるのでコードを修正しました。

この中にある最初の2行へあなたの「ユーザー名」と「パスワード」をセットしてください。

なんとこれで作業は終了です。
お疲れ様でした 😄✨(今回ホントにすぐでした)

テストしてみる

では、実際にテストしてみましょう❗

wordpressにログインして以下のような投稿をしてみます。

すると記事の保存ができるので、急いでBluesky へ行ってみましょう❗

どうなるでしょうか・・・・・・

はい❗
うまく投稿できています。

成功です😄👍

企業様へのご提案

まだまだBlueskyが幅広くみんなに使われるかどうかは未知数ですが、BlueskyXと同じく無料でも運用でき、さらにリポスト(いわゆるリツイート)も実装されているので、拡散性が高いといっていいでしょう。

もしBlueskyへの自動配信などご希望でしたらお気軽にお問い合わせからご相談ください。

お待ちしております。m(_ _)m

開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで、今回はホントにシンプルな記事になってしまいました。😂(たまにはこういう薄味な記事もいいかもですね。動画もショートが人気らしいですし)

なお、残念ながらBlueskyには「ハッシュタグ」が使えないようですね。
ただ、イーロン・マスクがハッシュタグを廃止するなんて話題もあったので、正直あんまりいらないという判断なんでしょうか🤔

また、残念ながら(Bluesky本体による)PHPのパッケージは提供されていないので、curlを使って実装しましたが、もしパッケージがあれば簡単にポストができるようになるかもしれませんね。(ただ、時流を考えるとPHPでは提供されなさそうな気がしています😅)

兎にも角にも、Blueskyは招待無しで使えるようになっているので、ぜひ皆さんも登録してみてはいかがでしょうか。

ではでは〜❗

「そういえば、メタ社がつくった
Theadsってどうなったんでしょうか
まだ登録してないけど…」

このエントリーをはてなブックマークに追加       follow us in feedly