proxify/
lib.rs

1// use tokio::prelude::*;
2use 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    // println!("{}", text);
83
84    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}