96 lines
2.7 KiB
Bash
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 |