Como copiar as pastas do else de public.me.com com uma ferramenta do tipo wget?

5

Como posso copiar uma pasta do link (um serviço relacionado a iDisk , ou MobileMe ) para o meu sistema de arquivos local com uma ferramenta Unix (como wget , uma ferramenta não interativa de linha de comando )?

O problema é que a interface web é, na verdade, uma coisa complexa baseada em Javascript, em vez de simplesmente expor os arquivos. (Mesmo w3m não pode navegar, por exemplo, link .)

Meu objetivo é atualizar a cópia local de tempos em tempos, não interativamente, e colocar o comando para fazer o download dos arquivos para um script, para que outras pessoas possam executar o script e baixar os arquivos.

Uma ferramenta wget -like ( rsync , git pull ) combina comigo ou em uma combinação de montagem de uma rede sistema de arquivos via FUSE e, em seguida, usando comandos Unix padrão para copiar os diretórios fará.

Li nos artigos da Wikipedia (aos quais me refiro acima) que a Apple fornece acesso WebDAV para esses serviços, e também li sobre o cadaver , um wget como o cliente WebDAV, mas não consigo descobrir qual endereço devo usar para acessar o pastas no link somente leitura (anonimamente).

Talvez o comentário de Gilles (que o WebDAV não é usado atualmente) seja verdade, mas ainda parece haver algumas coisas do WebDAV por trás da cena: a URL passou para o navegador para baixar um arquivo com um diretório (depois de pressionar o botão " baixar os arquivos selecionados "botão no topo da interface web) é assim:

https://public.me.com/ix/rudchenko/SEM%20Sep21%201%20TO%20PRINT.zip?webdav-method=ZIPGET&token=1g3s18hn-363p-13fryl0a20-17ial2zeu00&disposition=download

- note que menciona "WebDAV". (Se você está curioso, tentei reutilizar este URL como um argumento para wget , mas ele falhou:

$ LC_ALL=C wget 'https://public.me.com/ix/rudchenko/SEM%20Sep21%201%20TO%20PRINT.zip?webdav-method=ZIPGET&token=1g3s18hn-363p-13fryl0a20-17ial2zeu00&disposition=download'
--2011-11-21 01:21:48--  https://public.me.com/ix/rudchenko/SEM%20Sep21%201%20TO%20PRINT.zip?webdav-method=ZIPGET&token=1g3s18hn-363p-13fryl0a20-17ial2zeu00&disposition=download
Resolving public.me.com... 23.32.106.105
Connecting to public.me.com|23.32.106.105|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2011-11-21 01:21:48 ERROR 404: Not Found.
$ 

(estou usando um sistema GNU / Linux).

    
por imz -- Ivan Zakharyaschev 20.11.2011 / 13:13

2 respostas

4

Esse servidor está claramente executando uma implementação parcial ou interrompida do WebDAV. Observe que você precisa se conectar a um URL como link , não ao URL normal link . Eu tentei vários clientes:

  • Com um downloader normal de HTTP, como wget ou curl, posso fazer o download de um arquivo sabendo seu nome (por exemplo, wget https://public.me.com/ix/rudchenko/directory/filename ), mas não consegui obter uma listagem de diretório.
  • FuseDAV , que teria sido minha primeira escolha, é incapaz de lidar com alguns comandos ausentes. Ele aparentemente consegue listar o diretório raiz (visível na saída de fusedav -D ) mas, eventualmente, executa alguma solicitação que retorna “PROPFIND failed: 404 Not Found” e bloqueia.
  • Nd não possui um comando de lista.
  • Cadaver funciona bem, mas falta um comando de recuperação recursiva. Você poderia usá-lo para obter listagens e, em seguida, recuperar arquivos individuais como acima.

    Não é perfeito, e há um problema específico neste caso: mget cadáver = 26649 "> falha ao tratar argumentos com curingas que se expandem para nomes de arquivos com espaços .

  • Davfs2 funciona muito bem. Eu poderia montar esse compartilhamento e copiar arquivos dele. A única desvantagem é que este não é um sistema de arquivos FUSE, você precisa de root para montá-lo ou uma entrada em /etc/fstab .
  • Os wdfs baseados no FUSE -1.4.2- alt0.M51.1 funcionou muito bem neste caso, não exigindo raiz (somente permissões para /dev/fuse ).

    mkdir viewRemote
    wdfs https://public.me.com/ix/rudchenko/ viewRemote
    rsync -a viewRemote/SEM*TO\ PRINT* ./
    fusermount -u viewRemote
    rmdir viewRemote
    

(É claro que um simples cp em vez de rsync funcionaria bem neste exemplo; rsync foi escolhido apenas para diagnósticos extras sobre a diferença quando atualizamos a cópia.)

(Além do wdfs, eu tentei esses comandos em um sistema de squeeze do Debian. Sua milhagem pode variar.)

    
por 20.11.2011 / 23:59
1

Há também alguns scripts especiais e uma ferramenta ( wget-warc ) para baixar o conteúdo das pastas do link - link (e veja o repositório contendo). (Encontrado através do link .)

Internamente, o script parece compor solicitações do WebDAV e usar as respostas, por exemplo:

# step 1: download the list of files

if [[ "$domain" =~ "public.me.com" ]]
then

  # public.me.com has real WebDAV

  # PROPFIND with Depth: infinity lists all files
  echo -n "   - Discovering urls (XML)..."
  curl "https://public.me.com/ix/${username}/" \
       --silent \
       --request PROPFIND \
       --header "Content-Type: text/xml; charset=\"utf-8\"" \
       --header "Depth: infinity" \
       --data '<?xml version="1.0" encoding="utf-8"?><DAV:propfind xmlns:DAV="DAV:"><DAV:allprop/></DAV:propfind>' \
       --user-agent "${USER_AGENT}" \
     > "$userdir/webdav-feed.xml"
  result=$?
  if [ $result -ne 0 ]
  then
    echo " ERROR ($result)."
    exit 1
  fi
  echo " done."

  # grep for href, strip <D:href> and prepend https://public.me.com
  grep -o -E "<D:href>[^<]+" "$userdir/webdav-feed.xml" | cut -c 9- | awk '/[^\/]$/ { print "https://public.me.com" $1 }' > "$userdir/urls.txt"
  count=$( cat "$userdir/urls.txt" | wc -l )

elif 

Sim, eles também usam o link $ {username} / ", observe o" / ix / "infix na URL! Não é a URL normal - a mesma coisa que Gilles descobriu em sua resposta .

    
por 29.11.2011 / 00:20