使用wget或curl下载Xcode

40
我正在尝试仅使用wget或curl从苹果开发者网站下载Xcode。我认为我已经成功存储了下载.dmg文件所需的cookie,但并不完全确定。
当我运行此命令时:
wget \  
   --post-data="theAccountName=USERNAME&theAccountPW=PASSWORD" \  
   --cookies=on \  
   --keep-session-cookies \  
   --save-cookies=cookies.txt \        
   -O - \  
   https://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg > /dev/null

创建了一个名为cookies.txt的文件,其中包含类似于以下内容:

developer.apple.com FALSE / FALSE 0 XXXXXXXXXXXXXXXX  XXXXXXXXXXXX
developer.apple.com FALSE / FALSE 0 developer.sessionToken

我的不确定,但我认为应该比这更复杂(具体来说,在sessionToken后面应该是一个字母数字字符串)。

当我尝试使用以下curl命令来执行同样的操作时:

curl \  
   -d "theAccountName=USERNAME&theAccountPW=PASSWORD" \
   -c xcode-cookie \ 
   -A "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" \
   https://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg

我得到了一个名为xcode-cookie的文件,它包含与wget给出的cookies.txt文件相同的信息,但行是反向的。

然后我尝试下载.dmg文件。

使用wget:

wget \
   --cookies=on \
   --load-cookies=cookies.txt \
   --keep-session-cookies \
   http://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg

这给我生成了一个名为login?appIdKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&path=%2F%2Fios%2Fdownload.action?path=%2Fios%2Fios_sdk_4.1__final%2Fxcode_3.2.4_and_ios_sdk_4.1.dmg的文件,它只是一个包含开发者网站的登录表单的HTML页面。

使用curl:

curl \
   -b xcode-cookie \
   -c xcode-cookie \
   -O -v \
   -A "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" \
   https://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg

这基本上打印出与wget相同的东西(减去HTML)。

我想说这可能与sessionToken不在cookie中有关,但像我之前说的那样,我不确定。我甚至尝试了从浏览器导出cookies并按照我在下面链接的博客文章和其他几个搜索帮助时找到的指示进行操作。

除非自从10月10日以来Apple已经改变了某些事情,否则我一定做错了什么因为这个人似乎做对了什么

提前致谢!

8个回答

58

谢谢,petert!省去了我自己做的麻烦。 - Joe
是的,非常好用 - 现在可以轻松地使用cron在夜间设置下载了。 - petert

36

或许这是使用curl最简单的方法:

  • 打开 Google Chrome.app
  • 进入网站 developer.apple.com
  • CMD+SHIFT+J 或点击右上角的 菜单 图标 -> 工具 -> 开发者工具
  • 点击 网络 面板;
  • 现在点击apple.com上的 Xcode 下载链接;
  • 网络 面板中会看到一个或多个请求记录;
  • 右键单击最新的记录,然后点击 复制为cURL

现在,您已经得到了带有Cookie和其他HTTP请求字段的此下载链接的curl命令,只需将其粘贴到终端中并在末尾添加 -o xxx.dmg 即可。


9
在建议的-o xxx.dmg后面添加-L -C -,即可恢复之前的下载(即中途被服务器中断的下载)。 - mginius
更明确地说,在-H标志之前的命令开头应该是这样的:curl -C - -o Xcode_9.2.xip 'https://download.developer.apple.com/Developer_Tools/Xcode_9.2/Xcode_9.2.xip' - peterhil

14
这是一个使用curl而非wget的脚本,所以它可以在原始Mac上运行。你需要设置的只是xcode DMG文件的路径。该脚本将要求您输入用户名和密码,并为您确定ACTION和WOSID的值。
#!/bin/sh
# 将此行更改为xcode DMG文件的URI路径。 XCODE_PATH="/ios/ios_sdk_4.2__final/xcode_3.2.5_and_ios_sdk_4.2_final.dmg"
echo "输入您的Apple Dev Center用户名。" read -p "> " USERNAME echo "输入您的Apple Dev Center密码。" read -p "> " PASSWORD
curl \ -L -s -k \ --cookie-jar cookies \ -A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" \ https://developer.apple.com/devcenter/ios/login.action \ -o login.html
ACTION=$(sed -n 's/.*action="\(.*\)".*/\1/p' login.html) WOSID=$(sed -n 's/.*wosid" value="\(.*\)".*/\1/p' login.html) echo "action=${ACTION}" echo "wosid=${WOSID}"
curl \ -s -k --cookie-jar cookies --cookie cookies \ -A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" \ -e ";auto" "https://daw.apple.com${ACTION}?theAccountName=${USERNAME}&theAccountPW=${PASSWORD}&theAuxValue=&wosid=${WOSID}&1.Continue.x=0&1.Continue.y=0" \ > /dev/null
curl \ -L --cookie-jar cookies --cookie cookies \ -A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" \-O https://developer.apple.com/ios/download.action?path=${XCODE_PATH}
删除 login.html 删除 cookies

1
这个脚本不再起作用了。也许URL已经改变了? - thiagoveloso

9
我在多次尝试直接下载最新版本的Xcode到我的Mac开发机后,遇到了相同的问题。我也无法完全按照Daniel的方法来操作。

以下是我成功的做法:

  1. 使用Firefox登录iOS开发中心

  2. 使用Cookie Exporter 1.5将cookie保存到文本文件中,例如 "cookies.txt"

  3. 将cookies.txt通过FTP上传到我的暂存服务器,该服务器有一个很好的互联网带宽

  4. 使用暂存服务器上的wget下载文件(大约需要5分钟)

  5. 使用FTP将DMG文件传回我的开发机器(大约需要2小时)

这是wget命令行:

wget --cookies=on --load-cookies=cookies.txt --keep-session-cookies --save-cookies=cookies.txt http://adcdownload.apple.com/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg

这里的诀窍是不要使用页面上的下载链接,而是开始下载,然后在下载列表中使用上下文菜单中的“复制下载链接”选项。

这似乎出于某种原因也没有起作用,但它仍然帮助了我! - Joe
已发送HTTP请求,等待响应... 403禁止访问 11:05:27 错误403:禁止访问。 - nishantcm
仅供注册,你的技巧仍然有效。我只是在wget后面添加了“--continue”,所以如果出现问题,你可以继续从失败点下载。 - Cassio Seffrin

3

并不是最优解,但适合我:

如果你知道下载的直接链接(例如你已经开始下载),那么你可以在开发者门户网站上登陆并在控制台中运行以下JS代码:

copy('wget -c http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_5_za4gu6/xcode_6_beta_5.dmg --header="Cookie:' + document.cookie + '"')

这将复制wget命令以及所有必要的cookies到剪贴板,以便wget正常工作。您可以随时重新启动此命令以继续操作。


2

1

我似乎已经找到了自己问题的答案。以下是使用curl下载Xcode的方法。

首先,运行以下命令:

curl \
-L -s -k \
--cookie-jar cookies \
-A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" \
https://developer.apple.com/devcenter/ios/login.action \
-o login.html

打开已创建的 login.html 文件,查找以下两个内容:

  • 登录表单的 action 属性。它应该在/周围第54行。
  • 名为 wosidinput 字段。它应该在/周围第129行。

复制 action 属性的值以及输入字段的 value 属性的值。您将需要这些值进行下一步操作。

下面是下一个 curl 命令:

curl \
-s -k --cookie-jar cookies --cookie cookies \
-A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" \
-e ";auto" "https://daw.apple.com{ACTION}?theAccountName={USERNAME}&theAccountPW={PASSWORD}&theAuxValue=&wosid={WOSID}&1.Continue.x=0&1.Continue.y=0" \
> /dev/null
  • {ACTION}替换为您保存的操作值
  • {USERNAME}{PASSWORD}替换为您的Apple Dev Center凭据
  • {WOSID}替换为您保存的wosid值
  • 运行命令

现在,您应该拥有允许您下载.dmg文件的cookie。如果您还没有注意到,cookie存储在名为cookies的文件中。

现在只需运行此最后一个curl命令,Xcode映像就应该开始下载:

curl \
-L --cookie-jar cookies --cookie cookies \
-A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" \
-O https://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.1__final/xcode_3.2.4_and_ios_sdk_4.1.dmg

我已经在两台不同的机器上尝试过,并且在两台机器上都可以正常工作。


我尝试了这个,按照其他指示操作后它在4kb处开始并停止... curl -L --cookie-jar cookies --cookie cookies -A "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5" -O http://adcdownload.apple.com/Developer_Tools/xcode_4.0.2_and_ios_sdk_4.3/xcode_4.0.2_and_ios_sdk_4.3.dmg - David van Dugteren

1
这是一个小的bash脚本,用于下载Xcode:
#!/bin/bash

export ID=YourAppleID
export PW=YourPW

[ -f cookies ] && rm cookies && touch cookies

2>Header \
wget \
-S \
-O R1 \
http://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.2__final/xcode_3.2.5_and_ios_sdk_4.2_final.dmg

tac Header | grep Location
LOCATION=$(grep Location Header | sed -E 's/^ *Location: ([^/]+:\/\/[^/]+)\/.*$/\1/')
[ -z "$LOCATION" ] && { echo "Bad day for LOCATION...";exit;} || echo "LOCATION=$LOCATION"
rm Header

ACTION=$(grep action R1 | sed 's/^.*action="//;s/".*$//')
[ -z "$ACTION" ] && { echo "Bad day for ACTION...";exit;} || echo "ACTION=$ACTION"

POST=$( grep input R1 | sed 's/<input/\
<input/g' | grep input | sed 's/^.*name="//' | sed 's/".*value="/=/;s/".*$//' | sed '/=/!s/$/=/' | sed '/theAccountName/s/$/'$ID'/;/theAccountPW/s/$/'$PW'/' | sed '/=$/d' | sed -n '1h;1!H;${x;s/[[:space:]]/\&/g;p;}' | sed  's/$/\&1.Continue.x=0\&1.Continue.y=0/')
[ -z "$POST" ] && { echo "Bad day for POST...";exit;} || echo "POST=$POST"

2>Header \
wget \
-S \
--save-cookies cookies \
--keep-session-cookies \
-O R2 \
--post-data="$POST" \
$LOCATION/$ACTION

URL=$( grep -i REFRESH R2 | sed 's/^.*URL=//;s/".*$//' )
[ -z "$URL" ] && { echo "Bad day for URL...";exit;} || echo "URL=$URL"

wget \
-S \
--load-cookies cookies \
$URL &

sleep 1; rm R1 R2 Header cookies

注释与Joe的解决方案相同 - 谢谢Joe ;o) 好主意是从Xcode下载网址开始进行流量分析。


1
替换uname和pwd并运行这个脚本会给我带来:./wgetapple.sh: line 14: tac: command not found LOCATION今天真背。 - David van Dugteren
好的,tac不是Mac OS X上安装的标准命令,我在发布脚本时忘记了这一点。只需在脚本开头的两个导出之后添加tac() { sed -ne '1h;1!{G;x;};${x;p;}';}即可修复此错误。如果您使用的是macport,您也可以安装gtac并将tac替换为gtac:o) - denis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接