this post was submitted on 23 Jun 2024
32 points (92.1% liked)

Haupteingang

483 readers
1 users here now

Die Standard-Community von feddit.org

In dieser Community geht es ausschließlich um alles rund um die Instanz!

Regeln:

founded 4 months ago
MODERATORS
 

An dieser Stelle reposte ich auch auf der neuen deutschen Main-Instanz zwei einfache Wege, um seinen User (Settings und abonnierte/geblockte Communities) von einer Lemmy Instanz auf eine andere umzuziehen, beispielsweise von feddit.de auf feddit.org, von meinem ursprünglichen Post unter feddit.de/c/main ( https://alexandrite.app/feddit.de/post/11325409)

Update: Ich habe für die erhöhte Userfreundlichkeit noch eine Web Applikation erstellt, welche den Prozess so einfach wie möglich gestalten soll. Zu finden hier:

https://stablenarwhal.github.io/Lemmy-Userdata-Migration/

Features:

  • Export user data from any Lemmy instance (>=v0.19)
  • Download user data as a text file
  • Modify user data in the browser, e.g. to add or remove followed instances
  • Transfer user data to the target account on the target instance

Update 2: @elvith@feddit.org hat auch eine Web Applikation mit ähnlicher Funktionalität entwickelt. Zu finden hier:

https://elvith-de.github.io/lemmy-migration/

Features:

  • Login and export settings from any Lemmy instance (e.g. feddit.de)
  • Optionally: Find local communities on the target instance that match followed communities
  • Optionally: Backup your settings to a file (can be imported on any Lemmy instance in your profile)
  • Login and import settings to any Lemmy instance (e.g. feddit.org)

Weg 1, falls man noch einen Browser mit aktiver Session auf feddit.de hat:

Lemmy bietet seit Version 0.19 eine Funktion an, um die user data zu ex- und importieren. Das geht normalerweise über einen Button in den Settings des Webinterfaces, das geht aktuell bei feddit.de nicht.

Aber der zugrundeliegende API-Aufruf funktioniert noch, solange man noch mit einem Browser auf feddit.de eingeloggt ist:

  1. Man gehe auf https://feddit.de/api/v3/user/export_settings und speichert die zurückgegebene Datei als irgendwas.json
  2. Man nehme einen (neuen) Account auf einer stabilen Instanz der Wahl, gehe auf /settings und lade irgendwas.json über den Import-Button hoch.
  3. Voilà, man genieße die neue Instanz.

Das funktioniert mit jeder Instanz >=0.19, man muss lediglich das "feddit.de" in der URL ersetzen. Und wenn das Webinterface funktioniert, geht das auch über den Export- Button in den Settings.


Weg 2:

Für die Leute, die keine offene Browser Session haben, hier ein kleines, aber funktionales Bash Script, welches im Ausführungsverzeichnis eine myFedditUserData.json erstellt, welche bei anderen Instanzen importiert werden kann.

Anforderungen:

  • Linux/Mac OS X /Windows mit WSL
  • jq installiert (Unter Ubuntu/Debian/Mint z.B. per sudo apt install -y jq

Anleitung:

  • Folgendes Script unter einem beliebigen Namen mit .sh Endung abspeichern, z.B. getMyFedditUserData.sh
  • Script in beliebigen Textprogramm öffnen, Username/Mail und Passwort ausfüllen (optional Instanz ändern)
  • Terminal im Ordner des Scripts öffnen und chmod +x getMyFedditUserData.sh ausführen (Namen eventuell anpassen)
  • ./getMyFedditUserData.sh im Terminal eingeben
  • Nun liegt im Ordner neben dem Script eine frische myFedditUserData.json

Anmerkung: Das Script ist recht simpel, es wird ein JWT Bearer Token angefragt und als Header bei dem GET Aufruf von https://feddit.de/api/v3/user/export_settings mitgegeben. Wer kein Linux/Mac OS X zur Verfügung hat, kann den Ablauf mit anderen Mitteln nachstellen.

Das Script:

#!/bin/bash

# Basic login script for Lemmy API

# CHANGE THESE VALUES
my_instance="https://feddit.de"			# e.g. https://feddit.nl
my_username=""			# e.g. freamon
my_password=""			# e.g. hunter2

########################################################

# Lemmy API version
API="api/v3"

########################################################

# Turn off history substitution (avoid errors with ! usage)
set +H

########################################################

# Login
login() {
	end_point="user/login"
	json_data="{\"username_or_email\":\"$my_username\",\"password\":\"$my_password\"}"

	url="$my_instance/$API/$end_point"

	curl -H "Content-Type: application/json" -d "$json_data" "$url"
}

# Get userdata as JSON
getUserData() {
	end_point="user/export_settings"

	url="$my_instance/$API/$end_point"

	curl -H "Authorization: Bearer ${JWT}" "$url"
}

JWT=$(login | jq -r '.jwt')

printf 'JWT Token: %s\n' "$JWT"

getUserData | jq > myFedditUserData.json

@elvith@feddit.org hat mein Script auch in PowerShell nachgebaut, welches unter Windows ohne WSL auskommt: https://gist.github.com/elvith-de/89107061661e001df659d7a7d413092b

# CHANGE THESE VALUES
$my_instance="https://feddit.de" # e.g. https://feddit.nl
$target_file = "C:\Temp\export.json"

########################################################
#Ask user for username and password
$credentials = Get-Credential -Message "Logindata for $my_instance" -Title "Login"

$my_username= $credentials.UserName
$my_password= $credentials.GetNetworkCredential().Password

# Lemmy API version
$API="api/v3"

# Login
function Get-AuthToken() {
    $end_point="user/login"
    $json_data= @{
        "username_or_email" = $my_username;
        "password" = $my_password
    } | ConvertTo-Json

    $url="$my_instance/$API/$end_point"

    (Invoke-RestMethod -Headers @{"Content-Type" = "application/json"} -Body $json_data -Method Post -Uri $url).JWT
}

# Get userdata as JSON
function Get-UserData() {
    $end_point="user/export_settings"

    $url="$my_instance/$API/$end_point"

    Invoke-RestMethod -Headers @{"Authorization"="Bearer $($JWT)"} -Method Get -Uri $url
}

$JWT= Get-AuthToken

Write-Host "Got JWT Token: $JWT"

Write-Host "Exporting data to $target_file"
Get-UserData | ConvertTo-Json | Out-File -FilePath $target_file
you are viewing a single comment's thread
view the rest of the comments
[–] elvith@feddit.org 4 points 4 months ago* (last edited 4 months ago) (1 children)

@emotet@slrpnk.net kannst du meinen Link auch noch aufnehmen als Alternative?

https://elvith-de.github.io/lemmy-migration/

Dort ist auch noch das Feature in Arbeit umgezogene Communities zu erkennen und bei Bedarf mit zu abonnieren

[–] Emotet 4 points 4 months ago* (last edited 4 months ago) (1 children)

Ist aufgenommen! Das ist ein sehr sinnvolles Feature, btw. Willst du das über einzelne /api/v3/community/follow Aufrufe umsetzen oder direkt im exportierten JSON? Führst du ne DB über bekannte Community IDs bzw names oder rufst du die ebenfalls dynamisch über /api/v3/community ab? Bei potenziell sehr vielen API-Anfragen können ja leider diverse Problemchen entstehen.

[–] elvith@feddit.org 3 points 4 months ago* (last edited 4 months ago) (1 children)

Laut den Github issues scheint das Rate-Limit für POST und GET getrennt zu sein. Zumindest konnte man das früher getrennt einstellen. Zum aktuellen Stand weiß ich es leider nicht.

Ich hätte sie tatsächlich erst mal von der Zielinstanz abgerufen. Das sollte m.w. auch anonym ohne Login gehen - direkt mit Filter auf "nur lokale". Nervig ist nur, dass die Repsonse paged ist und ich daher 1-n Requests schicken muss. Ich hoffe aktuell, dass das gut geht. Alternativ würde ich evtl wirklich nur dafür nen Proxy aufsetzen (der ja dann keine Zugangsdaten o.ä. bekommt) bzw. schauen, ob ich das irgendwie anders cache kann (bspw. per cron täglich als statisches JSON mit globalen Communities auf Platte legen und ein Commit ins Repo, sodass es über GH Pages statisch mit in der Anwendung enthalten ist in aktueller Form)

Edit: Zweite Frage vergessen - ich hätte es in den Export gepackt und das Gesamtpaket auch als Download angeboten. Der manuelle Import ist ja im Zweifel ein leichter Workaround.

[–] Emotet 3 points 4 months ago (1 children)

Das sollte m.w. auch anonym ohne Login gehen - direkt mit Filter auf “nur lokale”. Nervig ist nur, dass die Repsonse paged ist und ich daher 1-n Requests schicken muss. Ich hoffe aktuell, dass das gut geht.

Theoretisch zumindest sollte sowas ja recht gut funktionieren (Pseudocode):

var communityList = 0;
for (let i = 0; true; i++) {
   var jsonResponse = getRequest('https://feddit.de/api/v3/community/list?type_=Local&limit=50&page=i')
  if (jsonResponse = {'"communities":[]') {
    break;
  } else {
    communityList.add(extractCommunities(jsonResponse))
  }
[–] elvith@feddit.org 3 points 4 months ago

Ja, was mich daran nervt ist, dass ich hier ja nur

{
    "communities": [ <Array> ]
}

bekomme. Ich kenne andere APIs die mir da dann halt wenigstens mitteilen, wieviel Treffer oder Pages es gibt, also bspw.

{
    "communities": [ <Array> ],
    "page": 2,
    "pagecount": 5,
    "results": 232,
}

Sowas spart am Ende dann halt auch unnötige Request. (Wobei ich immerhin erkennen kann, wenn die Zahl der Communities < limit ist, dass ich am Ende bin)