如何使用类似 wget 的工具从 public.me.com 复制其他人的文件夹?

如何使用类似 wget 的工具从 public.me.com 复制其他人的文件夹?

如何从中复制文件夹http://public.me.com/(与以下相关的服务磁盘, 或者移动我)使用 Unix 工具(例如获取,命令行非交互式工具)?

问题是 Web 界面实际上是一个复杂的基于 Javascript 的东西,而不是简单地公开文件。 (甚至w3m无法浏览,例如https://public.me.com/rudchenko.)

我的目标是不时以非交互方式更新本地副本,并将下载文件的命令放入脚本中,以便其他人可以运行该脚本并下载文件。

A获取-喜欢 (同步-喜欢,git拉-like)工具适合我,或者通过 FUSE 安装网络文件系统然后使用标准 Unix 命令复制目录的组合也可以。

我读过苹果提供的维基百科文章(我在上面提到过)WebDAV 访问这些服务,我也读过尸体, A获取- 就像 WebDAV 客户端,但我不知道应该使用哪个地址来访问文件夹http://public.me.com/只读(匿名)。

也许 Gilles 的评论(即 WebDAV 目前未被使用)是正确的,但在幕后似乎仍存在一些 WebDAV 的东西:传递给浏览器用于下载带有目录的档案的 URL(按下 Web 界面顶部的“下载选定的文件”按钮后)如下所示:

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

-- 请注意,它提到了“WebDAV”。 (如果您好奇,我尝试重新使用此 URL 作为参数获取,但失败了:

$ 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.
$ 

(我使用的是 GNU/Linux 系统。)

答案1

该服务器显然正在运行部分或损坏的 WebDAV 实现。请注意,您需要连接到类似以下的 URLhttps://public.me.com/ix/rudchenko,不是普通的URLhttps://public.me.com/rudchenko。我尝试了几个客户端:

  • 使用普通的 HTTP 下载器(例如 wget 或 curl),我可以下载知道其名称的文件(例如wget https://public.me.com/ix/rudchenko/directory/filename),但无法获取目录列表。
  • 熔断器DAV,这本来是我的第一选择,无法应对一些丢失的命令。它显然设法列出根目录(在输出中可见fusedav -D),但最终运行一些返回“PROPFIND failed: 404 Not Found”的请求并锁定。
  • 缺少列表命令。
  • 尸体效果很好,但缺少递归检索命令。您可以使用它来获取列表,然后如上所述检索单个文件。

    它并不完美,在这种情况下特别存在一个问题:尸体mget 无法处理带有通配符的 args,这些通配符扩展为带有空格的文件名

  • 达夫文件系统2效果很好。我可以挂载该共享并从中复制文件。唯一的缺点是这不是 FUSE 文件系统,您需要 root 才能挂载它或/etc/fstab.
  • 基于FUSE的数据文件系统-1.4.2-替代0.M51.1在这种情况下工作得很好,不需要root(仅需要权限/dev/fuse)。

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

(当然,在本示例中,使用简单的cp替代方案rsync效果很好;rsync选择它只是为了在更新副本时对差异进行额外诊断。)

(除了 wdfs 之外,我在 Debian squeeze 系统上尝试了这些命令。您的情况可能会有所不同。)

答案2

还有一些特殊的脚本和一个工具(wget-warc)来下载内容https://public.me.com/用户的文件夹——https://github.com/ArchiveTeam/mobileme-grab/blob/master/dld-me-com.sh(并查看包含的存储库)。 (通过发现http://archiveteam.org/index.php?title=MobileMe#How_to_help_archiving.)

在内部,该脚本似乎组成 WebDAV 请求并使用响应,例如:

# 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 

是的,他们也使用“https://public.me.com/ix/${用户名}/”,注意“/九/" URL 中的中缀!不是普通 URL --吉尔斯在他的回答中发现了同样的事情

相关内容