Ruby Net::HTTP 自作DL関数 初心者

このQ&Aのポイント
  • Ruby初心者がインターネットからファイルをダウンロードするためのNet::HTTPの自作ダウンロード関数を作成しました。
  • 現在の関数ではリフェラーやユーザーエージェントを設定することができません。
  • 変更方法がわからないため、助言を求めています。
回答を見る
  • ベストアンサー

Ruby Net::HTTP 自作DL関数 初心者

Ruby初心者です。 先日ダウンロード関数を作ったのですが、(下記) この関数に、既存の機能を外さず、リフェラーと、ユーザーエージェントを設定できるようにしたいのですが、 どこをどう変更したらよいかわかりません。 わかる方、ご指導ください。 初心者的コードですがどうかご勘弁ください。 =========== # インターネットからファイルをダウンロードする ※badNoFnameFlag => デフォルトのファイル名が指定されていない場合は、失敗とみなす def try_download(uri,num_trial = 3,badNoFnameFlag = false,minimum_content_length = 0) retHash = {} num_trial.times{ res = Net::HTTP.get_response(URI.parse(uri)) # , 'User-Agent' => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" & リフェラー を設定したい if res.class.name != "Net::HTTPOK" || res.code != "200" || res.message != "OK" next else fname = cd_file(res['content-disposition']) if badNoFnameFlag if !fname next end end if !defined? res['content-length'] next end if is_numeric(res['content-length']) res['content-length'] = numeric_or_zero(res['content-length']) else next end if Float(res['content-length']) <= minimum_content_length next end if !fname retHash['name'] = basename(uri) else retHash['name'] = fname end retHash['body'] = res.body break end } return retHash end ===========

  • Ruby
  • 回答数1
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

Net::HTTPクラスのインスタンスメソッドでheaderを送れます。 http://docs.ruby-lang.org/ja/2.0.0/class/Net=3a=3aHTTP.html 例えば、 get(path, header = nil, dest =nil)で headerを {'User-Agent' => 'xxxxx', 'Referer' => 'http://www.example.com/referer'} で可能なようです。

mitsuo300
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • PHPの自作関数がよくわかりません

    同じ処理をするときに関数を作ればソースが短くなるのだろうと思うのですがいまいち分かりません。 phpでユーザー登録の確認画面を作っていまして、名前やメールアドレス等によって、POSTの部分と変数が違うだけでほぼ一緒ですので、関数化できないかと考えています。 自作関数事態がよくわかっていません。アドバイスお願い致します if(isset($_POST['fname'])){ $fname=$_POST['fname']; } else{ $fname=""; }

    • ベストアンサー
    • PHP
  • カーソル位置に文字を挿入

    カーソル位置に文字を挿入しようとしているのですが、どうもうまく行きません。 コードは以下なのですが、FireFox 等ではうまくいきますが、IE ではうまくいきません。どこが間違っているのでしょうか。よろしくお願いいたします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head>  <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">  <title></title> <script type="text/javascript"> //@cc_on (function(){  document./*@if(1) attachEvent('on'+ @else@*/ addEventListener( /*@end@*/ 'click', function( evt ) {   var t = evt./*@if(1) srcElement @else@*/ target /*@end@*/;      if ( t.tagName == 'BUTTON' && /(^| )ContributionForm( |$)/.test( t.form.className ) ) {    var content = t.form.elements['content'];        /*@if(1)     var r = document.selection.createRange();     var c = r.duplicate();     c.moveToElementText(content);     c.setEndPoint('EndToEnd', r);     var pos = c.text.length;    @else@*/     var pos = content.selectionStart;    /*@end@*/    var moji_1 = content.value.substring( 0, pos );    var moji_2 = content.value.substring( pos, content.value.length );    content.value = moji_1 + t.value + moji_2;       }     }, false ); })(); </script> </head> <body>  <form action="#" class="ContributionForm" id="form" name="form">   <div>     <button type="button" value="test">ボタン</button>    <textarea name="content"></textarea>   </div>  </form> </body> </html>

  • 数値⇒漢数字変換 java

    こんにちは。java初心者の学生です。 実行時引数で得た数値を漢数字に変換するコードを書いているのですがif構文の&&のところで実行時エラーが出てしまいます。 原因としては1200001234と入力した時に”args[0].length()-12が存在しない”などがあげられると思いますが、下に載せたコード以外で兆、億、万桁が0の場合の対処方がわかりません。 御享受いただけると助かります。よろしくお願いします! public class Question14 { /** * 実行時引数で得た数字の漢数字変換 * @param args 数字 */ public static void main(String[] args) { StringBuffer num = new StringBuffer(args[0]); if(num.length()>20){ System.out.println("0~99999999999999999999の数値で入力してください。"); } else{ StringBuffer sb = new StringBuffer(); if(num.equals("0")){ System.out.println("零"); } else{ for(int keta = num.length()-1; keta>=0; keta--){ if(keta==args[0].length()-5 && !((num.substring(args[0].length()-8,args[0].length()-4).equals("0000")))){ sb.insert(0,'万'); } else if(keta==args[0].length()-9 && !((num.substring(args[0].length()-12,args[0].length()-8).equals("0000")))){ sb.insert(0,'億'); } else if(keta==args[0].length()-13 && !((num.substring(args[0].length()-16,args[0].length()-12).equals("0000")))){ sb.insert(0,'兆'); } else if(keta==args[0].length()-17){ sb.insert(0,'京'); } switch(num.charAt(keta)){ case'1': sb.insert(0,"一"); break; case'2': sb.insert(0,"二"); break; case'3': sb.insert(0,"三"); break; case'4': sb.insert(0,"四"); break; case'5': sb.insert(0,"五"); break; case'6': sb.insert(0,"六"); break; case'7': sb.insert(0,"七"); break; case'8': sb.insert(0,"八"); break; case'9': sb.insert(0,"九"); break; case'0': continue; default: System.out.println("数値を入力してください"); break; } if(keta==num.length()-2||keta==num.length()-6||keta==num.length()-10||keta==num.length()-14||keta==num.length()-18){ sb.insert(1,"十"); } else if(keta==num.length()-3||keta==num.length()-7||keta==num.length()-11||keta==num.length()-15||keta==num.length()-19){ sb.insert(1,"百"); } else if(keta==num.length()-4||keta==num.length()-8||keta==num.length()-12||keta==num.length()-16||keta==num.length()-20){ sb.insert(1,"千"); } } } System.out.println(sb); } } }

  • Ruby 自作メソッドのブロック付きメソッドについ

    いつも、ご教授ありがとうございます。 Ruby でメソッドを自作してそのメソッドにブロックを持たせる場合 ブロック内で返り値を返すためにはどうしたらいいのでしょうか? たとえば以下のような自作メソッドがあるとすると def blocktest(str) if (block_given?) yield str else print "メソッドにブロックが与えられていない"; end end begin #自作したメソッドにブロックを与えた場合 res = blocktest("ブロック付きメソッドのテスト") {|value| print value; print "<br/>" print "メソッドに与えられた引数をprintしています" return "ブロックで返り値" } print res; print "<hr />" #ブロックを与えない場合 blocktest("ブロック付きメソッドのテスト"); rescue => ex print ex.message end 上記のようにブロック内で返り値 を指定して変数resのその返り値を返したい場合 どうしたらいいのでしょうか? 一応、ブロック内でreturnで値を与えてはいますが、例外が発生します。 よろしくお願いしまう。

    • ベストアンサー
    • Ruby
  • 指定時間ごとに画像とリンク先を変えるには?

    バナーが指定時間ごとに変わるページを 作りたいと思っているのですが 下記のソースではどうもうまくいきません。 <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis"> <TITLE>指定時間毎に画像とリンク先を変えるには?</TITLE> </HEAD> <BODY BGCOLOR="#ffffff" onLoad="banner()"> <SCRIPT language="JavaScript"> <!-- num=1; function banner(){ if(num==1){ document.photo.src="img/no_0.gif", document.photo.href= "http://www.test.co.jp/0"; num=2; }else if(num==2){ document.photo.src="img/no_1.gif", document.photo.href= "http://www.test.co.jp/1"; num=3; }else if(num==3){ document.photo.src="img/no_2.gif", document.photo.href= "http://www.test.co.jp/2"; num=4; }else if(num==4){ document.photo.src="img/no_3.gif", document.photo.href= "http://www.test.co.jp/3"; num=5; }else if(num==5){ document.photo.src="img/no_4.gif", document.photo.href= "http://www.test.co.jp/4"; num=6; }else if(num==6){ document.photo.src="img/no_5.gif", document.photo.href= "http://www.test.co.jp/5"; num=1; } setTimeout("banner()",5000); } //--> </SCRIPT> <a href="http://www.test.co.jp/ng" NAME="photo"><IMG SRC="img/1.jpg" NAME="photo" ALIGN="BOTTOM" WIDTH="60" HEIGHT="110" BORDER="0"></a> </BODY> </HTML> 画像は変わるのですがリンク先が変わらないようで…。 どなたかご指示をいただけないでしょうか?

  • PHPのWebアプリ作成

    乱数で得た値を当てるというアプリを作っています。 <html> <head> <meta http-equiv="Content-type" content="text/html; charset=ISO-2022-JP"> <title>数あてゲーム</title> </head> <body> <h1>数あてゲーム</h1> <form action="numinput.php" method="POST"> <ul> <li>このゲームは、0から10までの間からランダムにひとつ選ばれた数が隠されています。 <li>当てるチャンスは3回あり、入力欄に数を入力してsubmit ボタンを押すと判定されます。 <ul> <input type="submit" value="スタート"/> <input type="hidden" name="ranum" value="rand(0, 10)"/> <input type="hidden" name="charenge" value="1"/> </form> </body> </html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=EUC-JP"> <title>入力</title> </head> <?php $ranum = $_POST['ranum']; $charenge= $_POST['charenge']; ?> <body> <h1>入力</h1> <?php <form action="judge.php" method="POST"> <input type="text" name="num"/> <input type="submit" value="submit"> ?> </form> </body> </html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=EUC-JP"> <title>判定</title> </head> <?php $ranum = $_POST['ranum']; $charenge = $_POST['charenge']; $num = $_POST['num']; ?> <body> <h1>判定</h1> <?php if(!is_numeric($num)) { print("数値以外が入力されました.<br/>"); print("<a href=\"numinput.php\">入力ページ</a>からやり直 してください"); }else if($num == $ranum){ print("あたりです。"); }else if($num != $ranum && 3 > $charenge){ print("はずれです。 <br/>"); print("<a href=\"numinput.php\">入力ページ</a>からやり直 してください"); $charenge = $charenge + 1; }else{ print("はずれです。 <br/>"); print("正解は $ranum です"); } ?> </body> </html> この3つを組み合わせて作っていますが、 スタートを押してnuminput.phpに行こうとすると Parse error: syntax error, unexpected '<' in ~/numinput.php on line 13と出て先に進めません。どなたか解決方法を教えていただけませんか? また、乱数の受渡しがちゃんとできているのでしょうか?

    • ベストアンサー
    • PHP
  • If分の記述???

    1~31までの数字のうち、重複しない5つの数字をランダムに選び出し、ページ表示させるプログラムを作っているのですが、どういう訳か、最初のIf分の箇所が構文エラーでひっかかるんです。 一体、記述がどう間違っているんでしょうか? PerlCGIはまだまだ初心者なので、どなたかHelpMe!(T_T) #! c:/perl/bin/perl #----------------------------------------数字生成 for ($i = 0; $i < 5; ++$i) { #重複確認フラグリセット $j = 0 while ($j = 1) { #数字を選ぶ $NUM = int(rand 31) + 1; #重複チェック #1個目確認処理なし if ($i == 0) { ++$j; } #2個目確認処理 elsif ($i == 1) { if ($Res[0] != $NUM) { ++$j; } } #3個目確認処理 elsif ($i == 2) { if ($Res[0] != $NUM and $Res[1] != $NUM) { ++$j; } } #4個目確認処理 elsif ($i == 3) { if ($Res[0] != $NUM and $Res[1] != $NUM and $Res[2] != $NUM) { ++$j; } } #5個目確認処理 elsif ($i == 4) { if ($Res[0] != $NUM and $Res[1] != $NUM and $Res[2] != $NUM and $Res[3] != $NUM) { ++$j; } } } #値代入 $Res[$i] = "$NUM"; } #---------------------------------------ページ出力 print qq(Content-type: text/html; charset=Shift_JIS\n\n); print qq(<HTML>\n); print qq(<Head><Title>Test</Title></Head>\n); print qq(<Body><Center><P>数字は...<BR><Big>\n); for ($i = 0; $i < 5; ++ $i) { print qq($Res[$i]<BR>\n); } print qq(</Big>です。</P><Center></Body></HTML>\n);

    • ベストアンサー
    • CGI
  • aspxにてVBAのようなEXECUTEメソッドは?

    aspxにてVBAのようなEXECUTEメソッドは? お世話になります。 aspxにてVBAのようなEXECUTEやVBScriptのようなEVALを扱いたいのです。 vb内にて If num = 1 Then Inq1.Src = "gazou/Inq-11.gif" Else Inq1.Src = "gazou/Inq-10.gif" End If If num = 2 Then Inq2.Src = "gazou/Inq-21.gif" Else Inq2.Src = "gazou/Inq-20.gif" End If If num = 3 Then Inq3.Src = "gazou/Inq-31.gif" Else Inq3.Src = "gazou/Inq-30.gif" End If If num = 4 Then Inq4.Src = "gazou/Inq-41.gif" Else Inq4.Src = "gazou/Inq-40.gif" End If If num = 5 Then Inq5.Src = "gazou/Inq-51.gif" Else Inq5.Src = "gazou/Inq-50.gif" End If という上記内容を Dim Inq(5) As String For i As Integer = 1 To 5 If i = num Then Eval("Inq" & i & ".src = gazou/Inq-" & i & "1.gif" --------* Else Eval("Inq" & i & ".src= gazou/Inq-" & i & "0.gif" --------* End If Next のようにするには-------*をどのような文にすればよいでしょうか? よろしくお願いします。

  • ラジオボタンで選択変更

    ラジオボタンで選択した背景色に変更する方法はわかったのですが。。。 「★ラジオボタン」で、 「ページの移動」(別のページ)するには、どうしたらいいのでしょうか???(↓この方法でなくてもいいです。。。) <HTML> <HEAD> <TITLE></TITLE> </HEAD> <SCRIPT language="JavaScript"> <!-- function changeColor(num){ if(num==0){ document.bgColor="#ffffff"; }else if(num==1){ document.bgColor="#ffcccc"; }else if(num==2){ document.bgColor="#ccffcc"; }else if(num==3){ document.bgColor="#ccccff"; } } // --> </SCRIPT> <BODY> <CENTER> <FORM> <INPUT type="radio" name="bgradio" checked onClick="changeColor(0)">white <INPUT type="radio" name="bgradio" onClick="changeColor(1)">red <INPUT type="radio" name="bgradio" onClick="changeColor(2)">green <INPUT type="radio" name="bgradio" onClick="changeColor(3)">blue </FORM> </CENTER> </BODY> </HTML>

  • POJ 2718

    #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; int numbers[10]; int length; int n; int permutation(int num[10]){ int i; int oneco=0; for(i=0;i<length;i++){ if(num[i]){oneco++;} } int length2 = length-oneco; if((oneco==length)||(oneco==0)){return 1000000000;} if(abs(length2-oneco)>=2){return 1000000000;} vector<int> one; vector<int> two; for(int i=0;i<length;i++){ if(num[i]){one.push_back(numbers[i]);} else{two.push_back(numbers[i]);} } int len1 = one.size(); int len2 = two.size(); //cout << len1 << len2 << endl; // int num1[10];int num2[10]; vector<int> num1; vector<int> num2; //cout << one[1] << one[2] << endl; int count1=0;int count2 = 0; sort(one.begin(),one.end()); sort(two.begin(),two.end()); do{ int num=0; for(int i=1;i<len1;i++){ int onei = one[i]; for(int i2=0;i2<i;i2++){ onei = onei*10; } num = num + onei; }//cout << num << endl; if(one[0]==0){num = num;} else {num = num + one[0];} num1.push_back(num); //cout << num << endl; count1++; }while(next_permutation(one.begin(),one.end())); do{ int num = 0; for(int i=1;i<len2;i++){ int twoi = two[i]; for(int i2 =0;i2<i;i2++){ twoi = twoi*10; } num = num + twoi; // cout << num << endl; }//cout << "here" << num << endl; if(two[0]==0){num = num;} else {//cout << num ; num = num + two[0]; //cout << " " << num << endl; } num2.push_back(num); //cout << "here" << num << endl; count2++; }while(next_permutation(two.begin(),two.end())); int ans = 1000000000; //cout << len2; int dummy1 = 1; for(int x=1;x<len1;x++){ dummy1 = dummy1*10; }//cout << dummy1; int dummy2 = 1; for(int x=1;x<len2;x++){//cout << dummy2<< endl; dummy2 = (dummy2)*10; //cout << dummy2<< endl; }//cout << dummy2; for(int i=0;i<count1;i++){//cout << num1[i] << dummy1 << endl; if((num1[i]%dummy1)==num1[i]){if(num1[i]!=0){continue;}} for(int i2=0;i2<count2;i2++){ if((num2[i2]%dummy2)==num2[i2]){if(num1[i]!=0){continue;}} ans = min(ans,abs(num1[i]-num2[i2])); } } return ans; } //int permutation(int i[10]){return 1;} int dfs(int i,int num[10]){ if(i==length) return permutation(num); num[i]=0; int ans1 = dfs(i+1,num); num[i]=1; int ans2 = dfs(i+1,num); return min(ans1,ans2); } int main(){ cin >> n; getchar(); for(int i=0;i<n;i++){ /*for(length=0;length<10;length++){ cin >> numbers[length]; char c = getchar(); if(c=='\n'){break;} }*/ string str; while(1){ char c = getchar(); if(c=='\n'){break;} str += c;} length = 0; for(int i2=0;i2<str.length();i2=i2+2){ numbers[length] = (int)str[i2]-'0'; length++; } // cout << length; int dummy[10] = {0,0,0,0,0,0,0,0,0,0}; cout << dfs(1,dummy) << endl; } } 上記のどこが間違っているか教えてください。POJの2718です。書いてあるテストは通りました。