macOS/Linux script to download all statuses
| Author | Topic | 
|---|---|
| 
            kevg
             
  | 
        
             
                Posted 2024-05-12 15:06:39
                
                
                
                 
            Should also work on Windows through Cygwin. 1. Make sure you have the jq utility installed. 2. Create status_cafe.sh: 
#!/bin/sh
# usage: status_cafe.sh USER
TIMEOUT_SECONDS=5
VERBOSE=0
ONLYFIRST=0
OPTIND=1
while getopts "ov" opt; do
  case "$opt" in
    o)
      ONLYFIRST=1
      ;;
    v)
      VERBOSE=1
      ;;
  esac
done
shift $(expr $OPTIND - 1 )
TARGETUSER=$1
if [ "${TARGETUSER}" = "" ]; then
  echo "Status Cafe user name is a required argument"
  exit 1
fi
if ! command -v jq &> /dev/null; then
  echo "The jq command must be installed"
  exit 1
fi
createNote() {
  cat << EOF
      {
        "@type": "Create",
        "object": {
          "@type": "Note",
          "content": "${1}"
        },
        "published": "${2}"
      }
EOF
}
processPage() {
  TARGETURL="${1}"
  ANY_ELEMENTS_PRINTED=${2}
  MAINPAGE="$(curl --no-progress-meter --max-time ${TIMEOUT_SECONDS} "${TARGETURL}")"
  RC=$?
  if [ ${RC} -ne 0 ]; then
    echo "Failed to query Status Cafe user page. Check the user name and your internet connection."
    exit 1
  fi
  
  SUBSET="$(echo "${MAINPAGE}" | \
              grep -e status-username -e status-content | \
              sed 's/.*status-content">//g' | \
              sed 's/<\/p>$//g' | \
              sed 's/.*<\/a> \+\([^ ]\+\) \+\(.*\)<\/div>/\1\n\2/g')"
  if [ "${VERBOSE}" -eq "1" ]; then
    echo "processPage ${TARGETURL}"
    echo "=============="
    echo "${MAINPAGE}"
    echo "=============="
    echo "${MAINPAGE}" | hexdump -C
    echo "=============="
    echo "${SUBSET}"
    echo "=============="
  fi
  echo "${SUBSET}" | \
    while read EMOJI; do
      read TIME_AGO
      read STATUS
    
      DATE_ISO8601="$(TZ=UTC date -d "${TIME_AGO}" +%Y-%m-%dT%H:%m:%S%Z)"
      ESCAPED_STATUS="$(echo -n "${STATUS}" | jq -Rsa . | sed 's/^"//g' | sed 's/"$//g')"
      # JSON doesn't allow a slash on the last array element
      if [ ${ANY_ELEMENTS_PRINTED} -eq 1 ]; then
        printf ",\n"
      else
        ANY_ELEMENTS_PRINTED=1
      fi
      NOTE="$(createNote "${ESCAPED_STATUS} ${EMOJI}" "${DATE_ISO8601}")"
      echo -n "$NOTE"
    done
    printf "\n"
  if [ "${ONLYFIRST}" -eq "0" ]; then
    # Check if there's a next page
    NEXTPAGE="$(echo "${MAINPAGE}" | grep "Older statuses" | sed 's/.*page=//g' | sed 's/".*//g')"
    if [ "${NEXTPAGE}" != "" ]; then
      processPage "https://status.cafe/users/${TARGETUSER}?page=${NEXTPAGE}" 1
    fi
  fi
}
cat << EOF
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "@type": "Person",
  "@id": "${TARGETUSER}",
  "name": "${TARGETUSER}",
  "outbox": {
    "@type": "OrderedCollection",
    "orderedItems": [
EOF
processPage "https://status.cafe/users/${TARGETUSER}" 0
cat << EOF
    ]
  }
}
EOF
3. Make it executable: chmod a+x status_cafe.sh 4. Execute it and re-redirect output to a JSON file, replacing USER twice with your user name: ./status_cafe.sh USER > USER.json The format is JSON-LD and I simulated what an ActivityPub feed might be like though I'm not sure what the latest pseudo-standard is. Nothing imports this yet. But at least it's a way to save statuses in a pseudo-standardized format. Last edited on 2025-04-22 20:53:29  | 
    
| 
            beesilisk
             | 
        
             
                Posted 2024-08-01 04:35:37
                
                
                
                 
            ty <3  | 
    

