.
게시글 주소: https://orbi.kr/00076616610
파이썬에서 rust로 수정
use reqwest::{header, Client, Response};
use reqwest::cookie::Jar;
use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
use tokio::time::{sleep, Duration};
use std::error::Error;
use dashmap::DashMap;
use std::io::{self, Write};
use futures::stream::{FuturesUnordered, StreamExt};
use tokio::sync::{Barrier, Semaphore};
use serde_json::Value;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let jar = Arc::new(Jar::default());
let mut headers = header::HeaderMap::new();
headers.insert("accept", header::HeaderValue::from_static("application/json, text/plain, */*"));
headers.insert("accept-language", header::HeaderValue::from_static("ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"));
headers.insert("cache-control", header::HeaderValue::from_static("no-cache"));
headers.insert("x-requested-with", header::HeaderValue::from_static("XMLHttpRequest"));
headers.insert("connection", header::HeaderValue::from_static("keep-alive"));
let fire_client = Arc::new(Client::builder()
.user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
.default_headers(headers)
.cookie_provider(Arc::clone(&jar))
.tcp_nodelay(true)
.http1_only()
.pool_max_idle_per_host(100)
.build()?);
println!("Attempting Login");
let login_params = [
("url", "https://orbi.kr/amusement/lottery"),
("username", "아이디"),
("password", "비번"),
];
let login_res: Response = fire_client.post("https://login.orbi.kr/login")
.header("content-type", "application/x-www-form-urlencoded; charset=UTF-8")
.form(&login_params)
.send()
.await?;
if !login_res.status().is_success() {
println!("Login Failed: {}", login_res.status());
return Ok(());
}
println!("Login Success. Protocol: {:?}", login_res.version());
let url = "https://orbi.kr/amusement/lottery/buy_ticket";
loop {
println!("\n[ACTION] Pre-building 30-round burst fire payloads...");
let success_count = Arc::new(AtomicUsize::new(0));
let prizes: Arc<DashMap<i64, usize>> = Arc::new(DashMap::new());
let barrier = Arc::new(Barrier::new(31));
let fire_semaphore = Arc::new(Semaphore::new(30));
let mut requests = Vec::with_capacity(30);
for _ in 0..30 {
requests.push(fire_client.post(url).build()?);
}
let mut worker_handles = Vec::with_capacity(30);
println!("[ACTION] Spawning 30 tasks to the runtime...");
for req in requests {
let client_ref = Arc::clone(&fire_client);
let b_ref = Arc::clone(&barrier);
let s_ref = Arc::clone(&fire_semaphore);
let handle = tokio::spawn(async move {
let _permit = s_ref.acquire().await.unwrap();
b_ref.wait().await;
client_ref.execute(req).await
});
worker_handles.push(handle);
}
print!("[ACTION] Synchronizing with spawned tasks...");
io::stdout().flush().unwrap();
barrier.wait().await;
println!(" FIRE!");
let mut responses = Vec::with_capacity(30);
for handle in worker_handles {
if let Ok(Ok(res)) = handle.await {
responses.push(res);
}
}
println!("\n[ACTION] Analyzing impact data from the void...");
let mut analysis_tasks = FuturesUnordered::new();
for response in responses {
let s_count = Arc::clone(&success_count);
let p_map = Arc::clone(&prizes);
analysis_tasks.push(async move {
if response.status().is_success() {
if let Ok(bytes) = response.bytes().await {
let json: Option<Value> = serde_json::from_slice(&bytes).ok();
if let Some(j) = json {
if j["success"].as_bool().unwrap_or(false) {
s_count.fetch_add(1, Ordering::Relaxed);
}
if let Some(p_type) = j["data"]["prize_type"].as_i64() {
if p_type > 0 {
p_map.entry(p_type).and_modify(|e| *e += 1).or_insert(1);
}
}
}
}
}
});
}
while let Some(_) = analysis_tasks.next().await {}
println!("[REPORT] {}/30 Success (Spawned Barrier Strike)", success_count.load(Ordering::Relaxed));
for entry in prizes.iter() {
let k: i64 = *entry.key();
let v: usize = *entry.value();
println!(" >> Prize Type {}: {} ea", k, v);
}
for i in (1..=70).rev() {
print!("\rNext attempt in {}s... ", i);
io::stdout().flush().unwrap();
sleep(Duration::from_secs(1)).await;
}
println!();
}
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
갑자기머리아픈데 4 0
20대에 뇌출혈이나 뇌졸중올수도 있음?
-
서성한 지금 짠거임? 7 0
그래야만함
-
근사 6 0
근사 때릴 때 차수 정확도를 어떻게 판별해야 되나요
-
핳 6 2
아파서 안나가니까 이렇게 심심하구낭
-
진짜 몇 급은 낮은 대학이지만 다른 곳들 보다는 그냥 가까운데 편하게 다니려는데...
-
잘 만든 아포칼립스물 있나요? 4 0
웹소설이나 웹툰 중에 핵전쟁 좀비 등등 종류나 아포칼립스ing 포스트아포칼립스 안 따짐
-
순간 흠칫했다 4 0
-
28명 이월이면 지금 추합권은 안심해도 될까요? 아니면 더 봐야 할까요?
-
출근하면 하루종일 심심하네 6 0
9 to 18 선배도 없고 동기도 없고 후임도 없어서 말할 사람도 없고 동떨어진...
-
아 집 ㅈㄴ 나가고싶음 ㄹㅇ 독립마렵
-
산책 끝 4 0
어머니랑 2시간 산책 후 씻고 오르비 왔다
-
할사람 5 3
집콕할건데 모배할사람 잇나요 지금
-
만약에 과외받는데 5 0
연대 신학과인데 수능 미적 원점수 92 VS 연대 전전인데 수능 미적 원점수 80...
-
오르비 안녕 3 1
합격증 들고 돌아올게요(돌아오자마자 탈릅할건 안비밀)
-
특정 점수대에서 서성한 높공이랑 연고 낮공이랑 고민하시는 분들 있을텐데 4 5
그 고민에 대한 최상의 해결책은 연고 높공을 향해 쏘는거임 원서질 열심히 공부하고...
-
한양대 융전 vs 성대 전전 3 1
집이 한양대는 30분거리고 성대는 수원이라 2시간 거리인데 성대를 가는게 크게...
-
새냄비 태워먹음 4 0
정신머리 쌰갈
-
근데 이상형 잘 모르겠음 3 0
아무리 이상형 고민을 해도 덕통사고마냥 치이면 아무 의미가 없는데
-
고2 10월 모고 514면 3 0
고2 10월 모고 514면 국어 영어 누구 들어야 되냐 영어는 맨날 4였고 국어는...
-
오늘 뭐 누구 아이돌 생일인가 3 0
성수에 외국인 여자들이 뭔 아이돌 사진 주렁주렁 달고 다니는데 누구지 흠
이거 해킹프로그램이래요
저 이거 보자마자 계좌에서 100덕 빠져나갓어요 ㅠㅠ