#!/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_JWT}" ]] || [[ "${ACCESS_JWT}" == "null" ]]; then echo "Token ist leer, erstelle Session." create_session break fi break 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