我不想调用整个Firefox
// Chrome
...Opera
来找出带有 的单词的含义Google translate
,因此我决定编写一个shell script
用于wget
获取下载文件的内容translate.google.hu
并从下载的文件中获取翻译的代码。但我在第一步就卡住了。
例如,如果我想找出单词的翻译(从 eng 到 hun)'爱好者'我会尝试
$ wget https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast
但wget
不会下载我输入的页面
进入我的浏览器地址栏。相反,我得到了以下内容:
solid@skynet:~> wget https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast
[1] 2143
solid@skynet:~> --2016-05-02 08:23:24-- https://translate.google.hu/?hl=hu
Resolving translate.google.hu (translate.google.hu)... 216.58.209.163, 2a00:1450:400d:806::2003
Connecting to translate.google.hu (translate.google.hu)|216.58.209.163|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2016-05-02 08:23:24 ERROR 403: Forbidden.
我在等待,等待,等待……最后我按下回车键:
[1]+ Exit 8 wget https://translate.google.hu/?hl=hu
有人可以解决我的问题吗?
(我使用的是 OpenSuse Linux 13.2)
更新根据 [Alexander Batischev] 我已经尝试过
$ wget 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
它解决了后台运行的问题,并传递给wget正确的地址(而不是创建局部变量'tab')^.^'
但我收到同样的错误,直到Forbidden
:
$ wget 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
--2016-05-03 14:57:48-- https://translate.google.hu/?hl=hu&tab=wT
Resolving translate.google.hu (translate.google.hu)... 216.58.209.163, 2a00:1450:400d:806::2003
Connecting to translate.google.hu
(translate.google.hu)|216.58.209.163|:443... connected. HTTP request
sent, awaiting response... 403 Forbidden
2016-05-03 14:57:48 ERROR 403: Forbidden.
答案1
当您运行此命令时:
wget https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast
真正发生的是:
- 您运行
wget
的 URL 为“https://translate.google.hu/?hl=hu”; - & 符号表示
wget
将在后台运行; tab
定义了一个名为 的变量并获取一个值wT#en/hu/Enthusiast
。
这一切的原因是 shell 为特殊的东西保留了一些字符,包括 & 符号。要防止 shell 解释 & 符号,请使用引号:
wget 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
解决后,您仍然会收到“禁止”响应。
这是想要绕过接口的客户和不想绕过接口的提供商之间的一场竞赛。谷歌从广告中获得收入,并且它知道您的脚本不会显示任何内容。因此,他们正在采取措施禁止除通过浏览器之外的任何访问。
唯一能准确告诉你为什么你被“禁止”的人是谷歌工程师。也就是说,更简单的技术是众所周知的。
最简单的方法之一是通过“用户代理字符串”进行阻止。这是一个标识客户端(您的浏览器或 wget)的品牌和版本的字符串。它看起来像这样:
Wget/1.16.3 (linux-gnu)
客户端在每次请求时都会发送此字符串。服务器可以使用它来调整结果的外观,或拒绝访问,就像您的情况一样。
wget
接受--user-agent
标志,您可以在其中指定要发送的用户代理字符串。要模仿您自己的浏览器,您可以在同一个 Google 中输入“我的用户代理是什么”并从那里复制字符串:)然后,只需将其传递给wget
如下所示:
wget --user-agent='Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0' \
'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
答案2
问题的一方面是您应该使用引号以避免像 & 这样的 shell 命令出现问题。但这并不是唯一的问题。如果您使用 wget 等机器人或程序,许多网站会拒绝为您提供服务。所以你必须更改用户代理。
去:
该网站向您显示您的浏览器的用户名。然后运行:
wget -U "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405" 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast' -O Enthusiast.html
更明智的选择是使用 Google Chrome。打开Chrome,按F12,转到https://translate.google.com/。然后右键单击第一个请求,即translate.google.com,然后选择“复制为cURL”。然后,您可以使用该命令来请求该页面(几乎),就像您使用的是 Google Chrome 一样。您可以在 cURL 中使用“-o”将其保存为文件,也可以将命令转换为 wget 中可用的命令。
Chrome 的此功能记录如下:
http://www.lornajane.net/posts/2013/chrome-feature-copy-as-curl
请注意,有时当您收到“禁止”消息时,您必须等待一段时间,或者使用浏览器访问该网站并回答验证码等问题,才能继续向该网站发送请求。
最后,在以特定方式使用它之前,您应该检查“服务条款”。我不知道你做的是否正确,所以请你自己检查一下。
答案3
这个解决方案将选定的文本发送到 Google 翻译,获取结果wget
并通过创建可以使用快捷方式运行的脚本来显示结果。 (由于某些错误,基于 Zenity 的脚本似乎无法工作,我没有提到这一点。)
如果尚未安装,请安装一些工具:
sudo apt-get install libnotify-bin wget xsel xclip
用于翻译选择并在弹出桌面通知中给出结果的脚本:
gedit notitrans
和:
#!/usr/bin/env bash
notify-send --icon=info "$(xsel -o)" "$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=$(xsel -o | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"
使其可执行
chmod +x ~/notitrans
移动它如下:
sudo mv ~/notitrans /usr/local/bin/
脚本在桌面通知中显示翻译并自动将翻译复制到剪贴板:
#!/usr/bin/env bash
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=$(echo $text | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"
echo "$translate" | xclip -selection clipboard
notify-send --icon=info "$text" "$translate"
使其可执行。
以上内容将翻译成英文。要en
根据以下内容更改替换为其他内容两字母代码。