Files
Bluesky-DM-to-Telegram/bluesky-telegram.sh
2025-07-28 15:56:45 +02:00

96 lines
2.7 KiB
Bash

#!/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