LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

前提

ちょっとした作業で基本認証されているサイトからファイルを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で上手くいかなかった理由はさておきとりあえずできたので満足しておく。
手作業の処理を自動化させようと思ったらもう少しいろいろと必要な気もするけど、そっちについてもいったん完了としておく。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0