読者です 読者をやめる 読者になる 読者になる

プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】アクセス拒否されないhttp通信のコードサンプル

http通信したら403エラー(Forbidden)が返ってきたのでどうにかしてみました。

using System;
using System.Net.Http;
class Program
{
    static void Main(string[] args)
    {
        var uri = "http://i1.pixiv.net/img-original/img/2016/02/15/12/02/47/55302376_p0.png";
        DownloadImgAsync(uri);

        Console.ReadLine();
    }
    static async void DownloadImgAsync(string imgUri)
    {
        var client = new HttpClient();
        //リンク元のURLをリファラに設定
        client.DefaultRequestHeaders.Add("Referer",
            "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=55302376");
        HttpResponseMessage res = await client.GetAsync(
            imgUri,
            HttpCompletionOption.ResponseContentRead);
    }
}

解説

http通信する際には要求ヘッダというものを送信しています。
サイト側は要求ヘッダの内容で判定している場合があります。
例えばPixivではリファラ(大体リンク元URL)を同時に送信しないと403エラーが返ってきてアクセスできません。
f:id:shirakamisauto:20160216114332p:plain

リファラを送信するには以下のようにHttpClientクラスのDefaultRequestHeadersを経由してAddメソッドリファラを登録します。

client.DefaultRequestHeaders.Add("Referer", uri);

第1引数にヘッダ名*1、第2引数にヘッダの中身を渡します。
こうするとアクセスが成功しました。
f:id:shirakamisauto:20160216114348p:plain

他のサイトでは別の要求ヘッダを判定に使っているかもしれません。
ブラウザが通信しているのと同じようにするにはブラウザの開発ツールで通信内容を見るといいでしょう。
FirefoxでF12*2を押すと開発ツールが出てきます。
ネットワークタブをクリックして出てきたやつをクリックすると右側に窓が出ます。
f:id:shirakamisauto:20160216114340p:plain
上記窓では送信した要求ヘッダが見られます。

要求ヘッダはほかにもいろいろあるようなので、詳しいことはhttpプロトコルとか要求ヘッダとかでググってください。

*1:多分HttpRequestHeadersクラスの各プロパティ名に対応

*2:IEはF12、chromeはCtrl+Shift+I