· 6 years ago · Oct 04, 2019, 12:42 PM
1using System;
2using System.ComponentModel;
3using System.IO;
4using System.Net;
5using System.Net.Http;
6using System.Text.RegularExpressions;
7using Microsoft.Win32;
8using Newtonsoft.Json.Linq;
9
10namespace wykaz_podatnikow
11{
12 internal class Program
13 {
14 public static void Main(string[] args)
15 {
16 /*
17 * true - wysylamy na bramke testowa, nie sprawdzamy
18 * poprawnosci certyfikatu TLS (ktory na bramce testowej
19 * jest nieprawidlowy)
20 * false - sprawdzamy certyfikaty TLS, zadania sa wysylane na
21 * bramka produkcyjna
22 */
23 const bool isTest = false;
24 const double minimalDotnetVersion = 4.7;
25
26 string url = string.Empty;
27 JArray exceptions = new JArray();
28 JObject config = new JObject();
29 JObject output = new JObject(exceptions, config);
30
31 config.Add("IsTest", isTest.ToString());
32 config.Add("MinimalDotnetVersionRequired",
33 minimalDotnetVersion.ToString());
34
35 try
36 {
37 float dotnetVersion = GetDotnetVersion();
38
39 config.Add("DotNetVersion", dotnetVersion.ToString());
40 config.Add("IsDotnetVersionSufficient",
41 (dotnetVersion > minimalDotnetVersion).ToString());
42 }
43 catch (Exception e)
44 {
45 if (e is AggregateException aggregateException)
46 {
47 var flattened = aggregateException.Flatten();
48 foreach (Exception innerException in flattened
49 .InnerExceptions)
50 {
51 exceptions.Add(innerException.Message);
52 }
53 }
54 else
55 {
56 exceptions.Add(e.Message);
57 }
58 }
59
60
61 if (isTest)
62 {
63 /* Jesli jest test, ufamy wszystkim cerfytikatom TLS.
64 Certyfikat na bramce testowej jest lewy. */
65
66 ServicePointManager.ServerCertificateValidationCallback +=
67 (sender, certificate, chain, sslPolicyErrors) => true;
68
69 url = "https://wl-test.mf.gov.pl:9091/" +
70 "wykaz-podatnikow/api";
71 }
72 else
73#pragma warning disable 162
74 {
75 url = "https://wl-api.mf.gov.pl/api";
76 }
77#pragma warning restore 162
78
79
80 string outputFileName = string.Empty;
81
82 try
83 {
84 outputFileName = args[args.Length - 1].EndsWith(".json")
85 ? args[args.Length - 1]
86 : "output.json";
87
88 switch (args[0])
89 {
90 case "search/bank-account":
91 url += $"/search/bank-account/{args[1]}?date={args[2]}";
92 break;
93 case "search/bank-accounts":
94 url +=
95 $"/search/bank-accounts/{args[1]}?date={args[2]}";
96 break;
97 case "check/nip":
98 url +=
99 $"/check/nip/{args[1]}/bank-account/" +
100 $"{args[2]}?date={args[3]}";
101 break;
102 case "check/regon":
103 url +=
104 $"/check/regon/{args[1]}/bank-account/" +
105 $"{args[2]}?date={args[3]}";
106 break;
107 case "search/nip":
108 url += $"/search/nip/{args[1]}?date={args[2]}";
109 break;
110 case "search/nips":
111 url += $"/search/nips/{args[1]}?date={args[2]}";
112 break;
113 case "search/regon":
114 url += $"/search/regon/{args[1]}?date={args[2]}";
115 break;
116 case "search/regons":
117 url += $"/search/regons/{args[1]}?date={args[2]}";
118 break;
119 default:
120 throw new Exception("Niepoprawna metoda API.");
121 }
122
123 var response = Get(url);
124 output.Add("ServerResponse", response);
125 }
126 catch (Exception e)
127 {
128 if (e is AggregateException aggregateException)
129 {
130 var flattened = aggregateException.Flatten();
131 foreach (Exception innerException in flattened
132 .InnerExceptions)
133 {
134 exceptions.Add(innerException.Message);
135 }
136 }
137 else
138 {
139 exceptions.Add(e.Message);
140 }
141 }
142
143 finally
144 {
145 File.WriteAllText(outputFileName, output.ToString());
146 }
147 }
148
149 private static float GetDotnetVersion()
150 {
151 using (RegistryKey key =
152 Registry.LocalMachine.OpenSubKey(
153 @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"))
154 {
155 string fullVersion = key.GetValue("Version").ToString();
156 float minorVersion = float.Parse(Regex.Match(fullVersion,
157 @"(\d+\.\d+)(?=\.)?").Captures[0].Value);
158 return minorVersion;
159 }
160 }
161
162 private static string Get(string url)
163 {
164 HttpClient client = new HttpClient();
165
166 /*
167 Bramka sprawdza, czy zadanie jest wyslane z przegladarki
168 czy przez program na podstawie jednego z tych naglowkow
169 (prawdopodobnie User-Agent?). Jesli nie wyslemy tych naglowkow,
170 szybko zostaniemy zablokowani za "wyczerpanie limitu zadan dla tego
171 adresu IP."
172 */
173 client.DefaultRequestHeaders.Add("User-Agent",
174 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36");
175 client.DefaultRequestHeaders.Add("Accept",
176 "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
177 client.DefaultRequestHeaders.Add("Accept-Encoding",
178 "gzip, deflate, br");
179 client.DefaultRequestHeaders.Add("Accept-Language",
180 "en-US,en;q=0.9");
181
182 HttpResponseMessage response = client.GetAsync(url).Result;
183 return response.Content.ReadAsStringAsync().Result;
184 }
185 }
186}