0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

Basic認証の先にあるファイルをDLしたい。

前提

ちょっとした作業で基本認証されているサイトからファイルをDLする必要があったのだが
手作業で何回もやるのがあまりにもめんどくさかったのでツールを試してみた。

後続処理との関連からとりあえずPythonで試してみることにする。
2系か3系かは気にしない。

Pythonでやってみた

以下を参考にそのまま流用
https://qiita.com/fetaro/items/d095244d53be6192ef43

が、
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)>
というようなエラー

これについては以下を参考に対応
https://shinespark.hatenablog.com/entry/2015/12/06/100000

で、
urllib2.URLError: <urlopen error [Errno 10060] 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続 できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。>
というエラー

なんか時間がかかりそうだったので、一回C#で試してみることにする。

C#でやってみた。

using System;
using System.IO;
using System.Net.Http;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static HttpRequestMessage CreateRequest(string url)
        {
            var id = "user_id";
            var pass = "user_pass";

            // リクエストの生成
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri(url)
            };

            // Basic認証ヘッダを付与する
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", id, pass))));
            return request;
        }

        static void Main(string[] args)
        {
            // 情報一覧取得
            var url = "https://GET_LIST_URL";
            var request = CreateRequest(url);

            // リクエストの送信
            using (var httpClient = new HttpClient())
            {
                var response = httpClient.SendAsync(request);
                var res = response.Result.Content.ReadAsStringAsync().Result;
                Console.WriteLine(res);
            }

            //TODO 一覧情報のJSONをパースしてtarget_idを引っ張り出す処理を入れる
            //仮で入れておく
            var target_id = 20180803100000;

            // 取得したデータに合わせてAPIでファイルをDLする
            var file_url = "https://GET_INFO_URL?target_id=" + target_id;
            DownloadFileAsync(file_url, @"C:\temp\"+target_id + ".zip");
        }

        static async void DownloadFileAsync(string url, string outputPath)
        {
            var request = CreateRequest(url);
            var client = new HttpClient();

            HttpResponseMessage res;
            // リクエストの送信
            using (var httpClient = new HttpClient())
            {
                var response = httpClient.SendAsync(request);
                res = response.Result;
            }

            // ファイルのDL
            using (var fileStream = File.Create(outputPath))
            using (var httpStream = await res.Content.ReadAsStreamAsync())
            {
                httpStream.CopyTo(fileStream);
                fileStream.Flush();
            }

        }
    }
}

これで取得はできた。
意外にあっさり。

今回のまとめ

Pythonで上手くいかなかった理由はさておきとりあえずできたので満足しておく。
手作業の処理を自動化させようと思ったらもう少しいろいろと必要な気もするけど、そっちについてもいったん完了としておく。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?