Edited at

Windowsでwgetする色々な方法

More than 1 year has passed since last update.

windowsでwgetみたいな事をしたいと思ったときどんな方法があるか調べてみた。

※ https(自己証明書/IPアドレス)でもエラーとならずにダウンロードする方法についても。

(安全とわかっているサイトに対して)


ツール


bitsadmin

Windowsに標準で入っているらしい。Windows8で確認

bitsadmin.exe /TRANSFER <ジョブ名> <リモートURL> <ダウンロード先>

参考URL

http://qiita.com/zembutsu/items/f05d7c5835017fb4c796


wget for windows

そのまま、wget for windowsというソフトがある。

windows95〜2008まで対応。試していないのでwindows8で使えるかは不明。

インストーラーもあるが、exeとdllを配置するだけでも使える。詳細は参考サイト。

wget http://IpAddress/resource -O out.html

参考URL

http://www.atmarkit.co.jp/ait/articles/1307/17/news061.html

http://assimane.blog.so-net.ne.jp/2013-01-21


chocolateyから

chocolateyにwgetが無いかと探したらあった。

(Linuxでいうyum/apt-getみたいなパッケージ管理ツール)

尚、前述のGNU Wget for windowsと同じものみたいです。

最新版は提供されていないようなので、Wget for windowsを使った方が良いかも。

chocolateyのインストール

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

wgetのインストール

choco install Wget

実行

wget http://IpAddress/resource -O out.html

https(自己証明書/IPアドレスでも)の場合は、-no-check-certificateオプションを付ける


wget https://IpAddress/resource -O out.html -no-check
-certificate

参考

http://chocolatey.org/packages/Wget

chocolateyの入れ方はこっち

http://millkeyweb.com/win-chocolatey/


aria2

exe置くだけで使える。分割ダウンロードやBitTorrentと色々な使い方が出来る。

--check-certificate=false をつけるとSSL証明書の検証は行わない

aria2 https://IpAddress/resource/out.html --check-certificate=false

参考

http://aria2.sourceforge.net/index-ja.html

http://aria2.sourceforge.net/manual/en/html/aria2c.html


PowerShell

Windowsに入っていて色々出来ると行ったら、やっぱりPowerShell。.Net Frameworkを呼び出したり、標準でwgetコマンドも用意されている。


WebClient.Downloadfile

WebClient.DownloadFileメソッド(System.Net)を呼び出す方法

C#/VB.NETで作る場合もこのメソッドを使用する事になるかと。


wget.ps1

(new-object System.Net.WebClient).Downloadfile("http://IpAddress/resource", "out.html")



Invoke-WebRequest

PowerShell3.0からInvoke-WebRequestが使える。

エイリアス名がwgetなので、windowsでwgetコマンドは使えると行ってもいい感じ。


wget.ps1

Invoke-WebRequest -Uri "http://IpAddress/resource" -OutFile "out.html"

<# Invoke-WebRequestのエイリアスがwgetなのでこれでも可 #>
wget http://IpAddress/resource -OutFile out.html


参考URL

http://tech.guitarrapc.com/entry/2013/07/09/220710

httpsページで自己証明書の場合は弾かれてしまうので、下記のようにすると警告が出なくなる。


wget_ssl.ps1

add-type @"

using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$result = Invoke-WebRequest -Uri "https://IpAddress/resource" -OutFile "out.html"


参考URL

http://suzan2go.hatenablog.com/entry/2014/10/18/192246

http://stackoverflow.com/questions/11696944/powershell-v3-invoke-webrequest-https-error


Go

goでなんか用意されているんじゃないかと思って調べてみた。goはインストール不要で使えて、exeが作れるので自作の場合はこれが良さげ。


wget-go

v0.5で完全版じゃないみたい。動くかどうか試してないです。

https://github.com/laher/wget-go


書いてみる

参考サイトの記述にコマンドライン引数を指定できるようにした感じ

さらに、https通信はSSL証明書の検証を無視するようにしているので、IPや自己証明書の場合でもOK

詳細は、参考サイトで。


wget.go

package main

import (
"fmt"
"io"
"net/http"
"crypto/tls"
"os"
"flag"
"path"
)

func main(){

var filename string
flag.StringVar(&filename,"o","","output-document")
flag.Parse()
url := flag.Args()[0]
if len(filename) == 0 {
_ ,filename = path.Split(url)
}

transport := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}

client := &http.Client{
Transport: transport,
}

res, err := client.Get(url)
if err != nil {
panic(err)
}
defer res.Body.Close()

file, err := os.Create(filename)
if err != nil {
panic(err)
}
defer file.Close()

n, err := io.Copy(file, res.Body)
if err != nil {
panic(err)
}

fmt.Println(n, "bytes downloaded.")

}


go run wget.go -o abc.jpg http://example.xx/abc.jpg

go run wget.go http://example.xx/abc.jpg

参考

http://kitak.hatenablog.jp/entry/2014/10/19/175133

https://github.com/thbar/golang-playground/blob/master/download-files.go

http://qiita.com/jpshadowapps/items/463b2623209479adcd88

http://tkuchiki.hatenablog.com/entry/2014/07/24/100126


PHP

PHPもインストール不要でコマンドラインで呼び出せるので、これも良さげ。


file_get_contentsを使う

https通信の場合は、php.iniの extension=php_openssl.dll が有効になっているか確認。extension_dirも指定されているか確認。allow_url_fopen = On とURLをファイルとして開くことが許可されているかも確認。


wget.php


<?php
$filename=$argv[1];
$url = $argv[2];
$data = file_get_contents($url);
file_put_contents($filename,$data);
?>

php wget.php abc.jpg http://example.xx/abc.jpg


cURL (Client URL Library) を使う

自己証明書・IPアドレスのhttps通信の場合はcurlを使う。php.iniの extension=php_curl.dll を有効になっているか確認。

CURLOPT_SSL_VERIFYPEER、CURLOPT_SSL_VERIFYHOSTをfalseに指定するとサーバ証明書の警告を回避する。


wget.php

<?php

$filename=$argv[1];
$url=$argv[2];

//新しい cURL リソースを作成
$ch = curl_init();
//ファイルを書き出しのみでオープン
$fp = fopen($filename, 'w');
//取得するURLを指定
curl_setopt($ch, CURLOPT_URL, $url);
//下記の2つにfalseを設定するとcURLはサーバー証明書の検証行わない
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
   //転送内容が書き込まれるファイルポインタを指定
curl_setopt($ch, CURLOPT_FILE, $fp);
//指定したcURLセッションを実行
curl_exec($ch);
//cURLリソースを閉じ、システムリソースを解放
curl_close($ch);
  //ファイルをクローズ
fclose($fp);
?>


php wget.php abc.jpg https://example.xx/abc.jpg

参考サイト

http://helog.jp/php/xampp/2202/

http://kontany.net/blog/?p=57

http://mio-koduki.blogspot.jp/2012/08/php-curlsslhttpsca.html

http://qiita.com/Hiraku/items/9fb7a0df060e0424921d

http://blog.code4u.org/archives/407

http://php.net/manual/ja/function.curl-setopt.php


Node.js

httpの場合とhttpsの場合と別れる。


httpの場合


wget.js

// argv[0]はnode(固定値)、 argv[1]は実行されたjsの絶対パス、2以降はコマンドライン引数の内容

var filename=process.argv[2];
var url=process.argv[3];
//http通信
var http = require('http');
var fs = require('fs');

var file = fs.createWriteStream(filename);
var request = http.get(url, function(response) {
response.pipe(file);
});


node wge.js abc.jpg http://example.xx/abc.jpg


httpsの場合

process.env.NODE_TLS_REJECT_UNAUTHORIZED =0;

を入れると認証エラーでも通る。


wget_https.js


// argv[0]はnode(固定値)、 argv[1]は実行されたjsの絶対パス、2以降はコマンドライン引数の内容
var filename=process.argv[];
var url=process.argv[3];

//認証エラーを無視
process.env.NODE_TLS_REJECT_UNAUTHORIZED =0;

//https通信
var https = require('https');
var fs = require('fs');

var file = fs.createWriteStream(filename);
var request = https.get(url, function(response) {
response.pipe(file);
});


node wget_https.js abc.jpg https://example.xx/abc.jpg

参考サイト

http://stackoverflow.com/questions/10888610/ignore-invalid-self-signed-ssl-certificate-in-node-js-with-https-request

http://www.yoheim.net/blog.php?q=20130905


Python3


requests

Python3でhttpクライアントは色々あるがrequestsを使用。

:: requestsのインストール

pip install requests


wget.py


import sys
import requests
import shutil

param = sys.argv

# verify=Falseで自己証明書でもスキップする
r = requests.get(param[2], stream=True, verify=False)
if r.status_code == 200:
with open(param[1], 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)


python wget.py abc.jpg https://example.xx/abc.jpg

参考サイト

http://momijiame.tumblr.com/post/45560105945/python-http-requests

http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests

http://stackoverflow.com/questions/15445981/how-do-i-disable-the-security-certificate-check-in-python-requests

http://www.python-izm.com/contents/basis/command_line_arguments.shtml

http://d.hatena.ne.jp/s-n-k/20080513/1210692988


Ruby

RubyInstaller を使ってインストール。


net/https


wget.rb


require "net/https"
require "uri"

uri = URI.parse(ARGV[1])
http = Net::HTTP.new(uri.host,uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # SSLの検証を無効

request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)

# filename = File.basename(uri.request_uri)
filename=ARGV[0]
open(filename, 'wb') do |file|
file.puts response.body
end


ruby wget.rb abc.jpg https://example.xx/abc.jpg

参考URL

http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

http://d.hatena.ne.jp/gan2/20080531/1212227507

http://hideack.hatenablog.com/entry/20111023/1319357035


Perl

ActivePerl を使ってインストール。

下記を予めインストール


cpan install LWP::Simple


wget.pl


use LWP::Simple;

$url_save = $ARGV[1];
$file_save = $ARGV[0];
getstore($url_save,$file_save);


Perl wget.pl abc.jpg http://example.xx/abc.jpg

https通信する場合は、openssl(Windowsは、ssleay32.dll と libeay32.dll のファイルだけが必要)が必要。あと Net::SSLaey が必要らしい。詳細は参考URLで。

参考URL

http://memememomo.hatenablog.com/entry/20100826/1282792781

http://www.igreks.jp/dev/2010/02/cryptssleaylwphttps.html

http://blog.livedoor.jp/xaicron/archives/53514791.html

http://www.magicvox.net/archive/2011/11212131/

http://getpopfile.org/docs/jp:howtos:allplatformsrequireperl