web-dev-qa-db-ja.com

WebClient403禁止

これはIEで手動でダウンロードできます。

http://scholar.google.com/scholar.ris?q=info:j8ymU9rzMsEJ:scholar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=

ただし、フォローコードを使用する

WebClient client = new WebClient();
client.DownloadFile(address, filename);

例外を表示:403禁止

どうしましたか?どうやってやるの?

その他

http://scholar.google.com/scholar.ris?q=info:sskrpr5jlLwJ:scholar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=1

16
Begtostudy

IEで403を取得しました。リソースを取得するには、ログインする必要があると思います。ブラウザに認証情報がキャッシュされている可能性がありますが、アプリはログインするように設計されていません。または、ブラウザでGoogleにログインしていますか?ログアウトして、まだアクセスできるかどうかを確認してください。

0
philiphobgen

ダウンロードする前に、簡単な行を追加するだけです。

string url = ... 
string fileName = ...

WebClient wb = new WebClient();
wb.Headers.Add("User-Agent: Other");   //that is the simple line!
wb.DownloadFile(url, fileName);

それでおしまい。

70
Borg8

403は、TLSの問題が原因である可能性もあります。確認するには、WebException.Responseオブジェクトのテキストを確認する必要があります。

_     catch (WebException ex)
     {
        if (ex.Response != null)
        {
           var response = ex.Response;
           var dataStream = response.GetResponseStream();
           var reader = new StreamReader(dataStream);
           var details = reader.ReadToEnd();
        }
     }
_

TLSの場合は、これをコードに追加してTLS1.2を強制してみてください。

.net4の場合:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

.net4.5以降の場合:

_ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;_

5
Developer Wonk

SharePointサイトのURLから画像をダウンロードしようとすると、この問題が発生しました。私の場合、ヘッダーでuser-agentをOtherまたは空白に設定するだけでは不十分でした。代わりに、user-agentを次のように設定する必要がありました。

client.Headers.Add("user-agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");

その解決策は この答え から来ました。

3
tomRedox

DownloadFileメソッドを呼び出す前に、適切なhttpヘッダーを設定する必要があります。

WebClient webClient = new WebClient();
webClient.Headers.Add("???", "???");
webClient.Headers.Add("???", "???");
webClient.Headers.Add("???", "???");
webClient.DownloadFile(address, filename);

これらの疑問符の代わりに正しい値を入力するのは難しいかもしれません。 Fiddlerまたはその他のプログラムまたはWebブラウザー拡張機能をダウンロードして、WebブラウザーによってGoogleに送信されているhttpヘッダーを明らかにし、基本的に同じ要求をプログラムに複製する必要があります。

1
lubos hasko

これは私に起こったことです:

すべてのブラウザから快適にダウンロードされている(パブリック).xlsファイルを(DownloadFileメソッドを介して)ダウンロードしようとしました。

すべての答えに挑戦して苦労した後(しかし運がなかった)、私はついにスタックを開いて、何か奇妙なことに気づきました(スクリーンショットを参照)。

ファイルはブラウザのhttp経由でダウンロードされていましたが、DownloadFileメソッド経由で403エラーが発生していました。

最後に、URLを http:// something から https:// something に変更したところ、正常に機能しました。

お役に立てれば!

Screenshot

1
Jiten

これを解決するための鍵は、コードを介して1回、ブラウザーで2回目のリクエストを実行し、両方のリクエストをFiddlerでログに記録し、ヘッダーが一致することを確認することでした。

結局、次のヘッダーを追加する必要がありました。

  • 受け入れる
  • Accept-Encoding
  • 受け入れる-言語
  • ユーザーエージェント
  • アップグレード-安全でない-リクエスト

これが将来の人々に役立つことを願っています。

0
JMK

いくつかの特定のWebサイトからファイルをダウンロードしようとすると、同様の問題が発生し、一部のファイルでは403エラーが返されますが、他のファイルでは返されません。

User-Agentヘッダー、Acceptヘッダー、https urlやその他のさまざまな設定を試しましたが、それでも成功しません。

両方のURLはブラウザに読み込まれ、それらにアクセスするためにWebサイトでの認証を必要としません(これらはパブリックアクセスです)が、一方はダウンロードし、もう一方は403を返します。

原因とその解決方法に関する支援。

static void Main(string[] args)
    {
        WebClient webClient = new WebClient();
        webClient.Headers.Add("Accept: text/html, application/xhtml+xml, application/pdf, */*");
        webClient.Headers.Add("User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
        webClient.Headers.Add("Accept-Encoding: gzip, deflate, br");
        webClient.Headers.Add("Accept-Language: en-US,en;q=0.9");
        webClient.Headers.Add("Cache-Control: no-cache");
        webClient.Headers.Add("Upgrade-Insecure-Requests: 1");
        try
        {

            webClient.DownloadFile(new Uri("https://www.vigil.aero/wp-content/uploads/PSB-10-2013-06-14-.pdf"), "test1.pdf");             
            Console.WriteLine("Complete");
        }
        catch (Exception ex)
        {
            Console.WriteLine("{0}", ex.Message);
        }
        try
        {


            webClient.DownloadFile(new Uri("https://www.vigil.aero/wp-content/uploads/PSB-9-2013-06-14.pdf"), "test2.pdf");
            Console.WriteLine("Complete");
        }
        catch (Exception ex)
        {
            Console.WriteLine("{0}", ex.Message);
        }
        Console.ReadLine();
    }                                   
0
user3502865