rein's world

블로그 새 글 Bluesky로 보내기

WordPress로 블로그를 운영하던 시절에는, WP에 포함되어있는 Jetpack 기능으로 새 글을 자동으로 twitter로 보내게 했었다.1 Hugo 기반으로도 슬슬 글을 몇 개 쓰고나니 더 간단하게 공유할 수 없을까 싶어서 방법을 찾아봤다.

mattn/bsky

CLI에서 글만 올릴 수 있으면 되겠다 싶어서 찾아보니 bsky가 이미 잘 만들어져있더라. 그런데 -q 로 블로그 글을 임베드할 수 있나 싶어서 보는데 안되더라. 오늘 코로나에서 좀 회복되어가는 김에 코드를 들여다보니, URL이 들어있으면 자동으로 embeded card를 만들어주고, URL은 그대로 놔두더라. (관련 코드)

bsky CLI로 올린 결과

표시된 부분처럼 URL이 그대로 남아있다.

URL 부분 알아서 제거하게 수정

어쩌겠는가 기능이 없으면 만들어야지. 다음과 같은 규칙으로 고치게 했다.

URL이 한 개 밖에 사용되지 않은 경우에 한해서,

  • Card로 임베딩되게 한다. (코드에 이미 구현되어있음)
  • URL을 지운다.
  • URL 부분을 “웹 주소"라고 인식시켜준걸 지운다. (URL을 이미 지웠으니까)

이런 구현을 추가하고 bksy CLI 도구를 다시 빌드.

블로그 k번째 글 공유하는 스크립트 추가

Jetpack 같은 웹 서비스를 쓸 순 없으니까 최근 글 중 하나를 공유하는 짧은 스크립트를 하나 추가했다.

  • Hugo의 RSS 피드는 /index.xml 로 제공된다.
  • RSS 피드의 “제목"과 “글 주소 (URL)“을 얻는다.
  • 이걸 bsky CLI를 통해서 Bluesky 새 글로 쓴다.

아래 스크립트를 만들었고 최근 글 중에 Bluesky로 보내지 못한 세 개를 보냈다.

#!/usr/local/bin/bash -e

if [[ "$#" == "0" ]]; then
  INDEX=1
else
  INDEX=$1
fi

if (( $INDEX < 1 )); then
  echo "an index must be greater or equal to 1"
  exit 1
fi

POSTS=$(curl --silent -X GET 'https://rein.kr/index.xml')

TITLE=$(echo "$POSTS" | xq -x "./rss/channel/item[${INDEX}]/title")
LINK=$(echo "$POSTS" | xq -x "./rss/channel/item[${INDEX}]/link")

bsky post "블로그 새 글: ${TITLE} ${LINK}"

가끔쓰다보니 항상 새롭지만, XPath의 index는 0이 아니라 1부터 시작하기 때문에 1이 가장 최근 글이다. 그 이전 글은 2, 3, … 이런 식으로 표현한다.

이제 아래처럼 글을 올려준다. 수정한 bsky로 올린 결과


  1. 지금은 twitter API 사용을 Elon Musk가 막아서 더 이상 쓸 수 없는 기능이다↩︎