1use futures::executor::ThreadPool;
3use isahc::prelude::*;
4use scraper::{element_ref::ElementRef, Html, Selector};
5use std::io::{Read, Write};
6use std::net::SocketAddrV4;
7use futures::future::join_all;
8use std::str::FromStr;
9use std::sync::{Arc, RwLock};
10use std::time::Duration;
11
12pub async fn get_proxy() -> Vec<SocketAddrV4> {
13 let mut tasks = Vec::new();
14 let proxies = Arc::new(RwLock::new(Vec::new()));
15
16 for i in 1..=5 {
17 let cloned = proxies.clone();
18 let task = async move {
19 let client = HttpClient::builder()
20 .default_header("Accept", r#"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"#)
21 .default_header("Accept-Encoding", "gzip, deflate")
22 .default_header("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7")
23 .default_header("Cache-Control", "max-age=0")
24 .default_header("Connection", "keep-alive")
25 .default_header("Host", "free-proxy.cz")
26 .default_header("Cookie", "fp=f768e957238716fa2cc7232dfd308175")
27 .default_header("Upgrade-Insecure-Requests", "1")
28 .default_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36")
29 .build().unwrap();
30
31 let mut response = client
32 .get_async("http://free-proxy.cz/ru/proxylist/country/all/socks5/ping/all")
33 .await.unwrap();
34 let mut body = response.body_mut();
35 let mut data = Vec::new();
36 body.read_to_end(&mut data).unwrap();
37 let text = String::from_utf8(data).unwrap();
38
39 let selector = Selector::parse("table#proxy_list tbody tr").unwrap();
40 let scraper = Html::parse_document(&text);
41 let mut parsed_proxys: Vec<SocketAddrV4> = Vec::new();
42 for element in scraper.select(&selector) {
43 let inner_html = element.inner_html();
44 let proxy_data = Html::parse_fragment(&inner_html);
45
46 let decoded_ip = {
47 let encoded_ip_selector = Selector::parse("script").unwrap();
48 let encoded_ip_script = proxy_data
49 .select(&encoded_ip_selector)
50 .collect::<Vec<ElementRef>>()[0]
51 .inner_html();
52
53 let encoded_ip = encoded_ip_script
54 .replace("document.write(Base64.decode(\"", "")
55 .replace("\"))", "");
56 String::from_utf8(base64::decode(&encoded_ip).unwrap()).unwrap()
57 };
58
59 let port = {
60 let port_selector = Selector::parse("span.fport").unwrap();
61 let port = proxy_data
62 .select(&port_selector)
63 .collect::<Vec<ElementRef>>();
64
65 match port.get(0) {
66 Some(port) => port.inner_html(),
67 None => "0".to_owned(),
68 }
69 };
70
71 if port != "0" {
72 cloned.write().unwrap().push(format!("{}:{}", decoded_ip, port).parse().unwrap());
73 }
74 }
75 };
76
77 tasks.push(task);
78 }
79
80 join_all(tasks).await;
81
82 Arc::try_unwrap(proxies).unwrap().into_inner().unwrap()
85}
86
87pub async fn check_proxies(proxies: &Vec<SocketAddrV4>, time: Duration) -> Vec<SocketAddrV4> {
88 let working_proxys = Arc::new(RwLock::new(Vec::new()));
89 let mut futures = Vec::new();
90 for proxy in proxies {
91 let formated = format!("socks5://{}", proxy);
92 let proxy = proxy.clone();
93 let worked_cloned = working_proxys.clone();
94
95 let future = async move {
96 let client = HttpClient::builder()
97 .proxy(Some(formated.parse().unwrap()))
98 .timeout(time)
99 .build()
100 .unwrap();
101 let response = client.get_async("https://api.ipify.org?format=json").await;
102 match response {
103 Ok(_) => worked_cloned.write().unwrap().push(proxy),
104 Err(e) => {}
105 }
106 };
107
108 futures.push(future);
109 }
110
111 join_all(futures).await;
112 Arc::try_unwrap(working_proxys)
113 .unwrap()
114 .into_inner()
115 .unwrap()
116}