A standalone Rust-based solver for FriendlyCaptcha puzzles that exposes a standard HTTP API. It performs proof-of-work calculations using SIMD (blake2b_simd), fast-fails difficult puzzles, and spoofs execution telemetry to simulate normal browser solving speeds.
Note: This is currently a proof of concept. The solver may struggle with multiple concurrent threads/tasks at this stage.
- High-Speed Execution: Uses SIMD and
rayonfor massive multithreading speedups. - WASM Time Simulation: Calculates expected execution time of the in-browser WASM solver (~18 MH/s) and holds the solution until that time passes to spoof telemetry accurately.
- Difficulty Threshold Fast-Fail: Evaluates puzzle difficulty and immediately rejects it if the threshold is abnormally hard (threshold < 1000).
- Asynchronous Task Queue: Tasks are processed entirely in the background.
- Rust toolchain (cargo)
Run the program via Cargo:
cd frc_solver
cargo build --release
cargo run --releaseThe server binds to 127.0.0.1:8989 by default.
Submits a new puzzle to be solved. If the puzzle is too difficult, it will return an immediate error, otherwise it responds with a task ID.
Endpoint: POST http://127.0.0.1:8989/createTask
Request Body (JSON):
{
"puzzle": "SIGNATURE.BASE64_PAYLOAD",
"activate_payload": { ... }, // Optional: If you want the solver to fetch the puzzle itself
"proxy": "http://user:pass@ip:port" // Optional: Used to route the activate_payload request
}Response (JSON):
{
"errorId": 0,
"taskId": "hex_string_task_id"
}(If puzzle rejected due to length/difficulty: {"errorId": 1, "status": "too_long"})
Polls the solver for the result of a specific task. To maintain telemetry consistency, the server will intentionally hold the solution in the Processing state until the simulated WASM duration holds pass.
Endpoint: POST http://127.0.0.1:8989/getTaskResult
Request Body (JSON):
{
"task_id": "hex_string_task_id"
}Response (JSON - Expected):
{
"errorId": 0,
"status": "ready",
"solution": {
"frc_solution": "signature.b64_puzzle.b64_sol.b64_diag"
}
}Responses for pending / errored tasks:
- Processing:
{"errorId": 0, "status": "processing"} - Errored:
{"errorId": 1, "status": "error", "errorDescription": "Error message"}