diff --git a/bluesky-telegram.sh b/bluesky-telegram.sh new file mode 100644 index 0000000..0fcae38 --- /dev/null +++ b/bluesky-telegram.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +PDSHOST="" +BLUESKY_HANDLE="" +BLUESKY_PASSWORD="" +CONVO_ID="" +CHAT_ID="" +TOKEN="" + +WORKING_DIR="$(pwd)" +TOKEN_FILE="$WORKING_DIR/token.json" +ACCESS_JWT=$(cat "${TOKEN_FILE}" | jq -r .ACCESS_JWT) +REFRESH_JWT=$(cat "${TOKEN_FILE}" | jq -r .REFRESH_JWT) +MESSAGE_FILE="$WORKING_DIR/bluesky.json" +LAST_ID="$WORKING_DIR/last_id.txt" + +# Create a new session +create_session() { + curl -sX POST "${PDSHOST}/xrpc/com.atproto.server.createSession" \ + -H "Content-Type: application/json" \ + -d '{"identifier": "'"${BLUESKY_HANDLE}"'", "password": "'"${BLUESKY_PASSWORD}"'"}' \ + | jq '{ACCESS_JWT: .accessJwt, REFRESH_JWT: .refreshJwt}' \ + > "${TOKEN_FILE}" +} + +# Retrieve conversation ID +get_messages() { + curl -s "https://api.bsky.chat/xrpc/chat.bsky.convo.listConvos?limit=50" \ + -H "Authorization: Bearer ${ACCESS_JWT}" | jq -r '.convos[0].id' +} + +# Refresh session (token) +refresh_session() { + curl -sX POST "${PDSHOST}/xrpc/com.atproto.server.refreshSession" \ + -H "Authorization: Bearer ${REFRESH_JWT}" | jq '{ACCESS_JWT: .accessJwt, REFRESH_JWT: .refreshJwt}' \ + > "${TOKEN_FILE}" +} + +# Retrieve session status +get_session() { + curl -sX GET "${PDSHOST}/xrpc/com.atproto.server.getSession" \ + -H "Authorization: Bearer ${ACCESS_JWT}" | jq -r .active +} + +# Retrieve last message (message ID, URI, Handle) +get_message() { + curl -sX GET https://api.bsky.chat/xrpc/chat.bsky.convo.getConvo?convoId="${CONVO_ID}" \ + -H "Authorization: Bearer ${ACCESS_JWT}" \ + | jq '{message_id: .convo.lastMessage.id, uri: .convo.lastMessage.embed.record.uri, handle: .convo.lastMessage.embed.record.author.handle}' \ + > "${MESSAGE_FILE}" +} + +##### + +# Retrieve token if missing +while true; do + if [[ -z "${ACCESS_TOKEN}" ]]; then + echo "Token ist leer, erstelle Session." + create_session + break + fi +done + +# Start function if provided as argument +if [[ -n $1 ]]; then + $1 + exit 0 +fi + +# Check session status +session_active=$(get_session) +if [[ "${session_active}" = "true" ]]; then + echo "Session ist aktiv." +else + refresh_session +fi + +# Retrieve message +get_message + +# Create URL +id=$(cat "${MESSAGE_FILE}" | jq -r .message_id) +uri=$(cat "${MESSAGE_FILE}" | jq -r '(.uri | split("/")[-1])') +handle=$(cat "${MESSAGE_FILE}" | jq -r .handle) + +# Check if message has already been sent +if [[ $(cat "${LAST_ID}") != "${id}" ]]; then + + # Send URL to Telegram bot + url="https://bsky.app/profile/${handle}/post/${uri}" + + # If send sucessfully save message ID + if curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" -d chat_id="${CHAT_ID}" -d text="$url"; then + echo "${id}" > "${LAST_ID}" + fi +fi \ No newline at end of file