private void loadProxyList(string file) { proxyLixt.Clear(); curentProxyIndex = 0; string path = file; try { if (File.Exists(path)) { using (StreamReader sr = new StreamReader(path)) { while (sr.Peek() >= 0) { string fullAddress = sr.ReadLine(); string[] proxyAddress = fullAddress.Split(':'); var proxy = new WebProxy(proxyAddress[0], Convert.ToInt32(proxyAddress[1])); ProxyListElement ProxyListElement = new ProxyListElement(); ProxyListElement.proxy = proxy; ProxyListElement.responseTime = 0; ProxyListElement.raiting = 5; ProxyListElement.address = fullAddress; proxyLixt.Add(ProxyListElement); } } } proxyListElementBindingSource.ResetBindings(true); useProxy = true; curentProxyIndex = 0; } catch (Exception ex) { loging(2, "Не удалось загрузить список прокси. " + ex.ToString()); } }
async Task reverseGeocoding(int addressIndex, int proxyIndex) { try { var stopWatch = Stopwatch.StartNew(); //var proxy = new WebProxy("88.247.153.104", 8080); ProxyListElement aProxyListElement = proxyLixt[proxyIndex]; var proxy = aProxyListElement.proxy; AddressListElement aAddressListElement = addressList[addressIndex]; aAddressListElement.isChecking = true; addressList[addressIndex] = aAddressListElement; addressListElementBindingSource.ResetItem(addressIndex); checkingAddresses++; if (aAddressListElement.latid != null & aAddressListElement.latid != "" & aAddressListElement.longit != null & aAddressListElement.longit != "") { // Now create a client handler which uses that proxy var httpClientHandler = new HttpClientHandler(); httpClientHandler.Proxy = proxy; httpClientHandler.UseProxy = useProxy; // Finally, create the HTTP client object var client = new HttpClient(handler: httpClientHandler, disposeHandler: true); client.BaseAddress = new Uri("https://nominatim.openstreetmap.org"); client.DefaultRequestHeaders.Add("User-Agent", "C# console program"); client.Timeout = TimeSpan.FromMilliseconds(3000); //nominatim.openstreetmap.org/reverse?lat=42.095995&lon=47.595025&accept-language=ru&zoom=18&[email protected]&addressdetails=1format=xml nominatim.openstreetmap.org/reverse?accept-language=ru&zoom=18&format=xml&lat=44.948674&lon=45.854249 //nominatim.openstreetmap.org/reverse?accept-language=ru&zoom=18&format=xml&lat=41.882855&lon=48.072434" var uri = "/reverse?accept-language=ru&zoom=18&format=xml"; string alat = aAddressListElement.latid.Contains("°")? convertGrad(aAddressListElement.latid) : aAddressListElement.latid; string alog = aAddressListElement.longit.Contains("°") ? convertGrad(aAddressListElement.longit) : aAddressListElement.longit; uri = uri + "&lat=" + alat; uri = uri + "&lon=" + alog; uri = uri.Replace(" ", ""); try { var response = await client.GetAsync(uri); if (response.IsSuccessStatusCode) { var responseString = await response.Content.ReadAsStringAsync(); XmlDocument doc = new XmlDocument(); try { doc.LoadXml(responseString); var hamlet = checkXmlNode(doc.DocumentElement.SelectSingleNode("/reversegeocode/addressparts/hamlet")); var city = checkXmlNode(doc.DocumentElement.SelectSingleNode("/reversegeocode/addressparts/city")); var county = checkXmlNode(doc.DocumentElement.SelectSingleNode("/reversegeocode/addressparts/county")); var road = checkXmlNode(doc.DocumentElement.SelectSingleNode("/reversegeocode/addressparts/road")); var house_number = checkXmlNode(doc.DocumentElement.SelectSingleNode("/reversegeocode/addressparts/house_number")); var fullAddress = checkXmlNode(doc.DocumentElement.SelectSingleNode("/reversegeocode/result")); if (hamlet != "") { aAddressListElement.city = hamlet; } else if (city != "") { aAddressListElement.city = city; } else { aAddressListElement.city = county; } if (useYandexCity & yandexCity != "") { aAddressListElement.city = yandexCity; } if (aAddressListElement.city != "") { if (validCity.ContainsKey(aAddressListElement.city)) { validCity[aAddressListElement.city] = validCity[aAddressListElement.city] + 1; } else { validCity.Add(aAddressListElement.city, 1); } } aAddressListElement.road = road; aAddressListElement.house_number = house_number; aAddressListElement.Checked = true; checkedAddresses++; Console.WriteLine(fullAddress); } catch (Exception ex) { Console.WriteLine(responseString + " " + ex.Message); } } else { if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) { aAddressListElement.Checked = true; checkedAddresses++; } loging(2, "Ошибка запроса, проверьте координаты в строке " + aAddressListElement.row); Console.WriteLine(response.StatusCode); } } catch (Exception ex) { if (useProxy) { aProxyListElement.raiting--; } Console.WriteLine(ex.Message); } long responseTime = stopWatch.ElapsedMilliseconds; aAddressListElement.isChecking = false; aProxyListElement.responseTime = responseTime; proxyLixt[proxyIndex] = aProxyListElement; proxyListElementBindingSource.ResetItem(proxyIndex); } else { aAddressListElement.Checked = true; checkedAddresses++; } aAddressListElement.isChecking = false; addressList[addressIndex] = aAddressListElement; addressListElementBindingSource.ResetItem(addressIndex); checkingAddresses--; await Task.Delay(10); } catch (Exception ex) { AddressListElement aAddressListElement = addressList[addressIndex]; aAddressListElement.isChecking = false; addressList[addressIndex] = aAddressListElement; addressListElementBindingSource.ResetItem(addressIndex); } }