https://github.com/apify/impit
impit | rust library for browser impersonation
https://github.com/apify/impit
Last synced: about 1 month ago
JSON representation
impit | rust library for browser impersonation
- Host: GitHub
- URL: https://github.com/apify/impit
- Owner: apify
- License: apache-2.0
- Created: 2025-01-10T14:09:09.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2026-04-22T09:04:50.000Z (about 2 months ago)
- Last Synced: 2026-04-22T11:13:31.777Z (about 2 months ago)
- Language: Rust
- Homepage: https://apify.github.io/impit/js
- Size: 20.5 MB
- Stars: 450
- Watchers: 8
- Forks: 35
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# impit | browser impersonation made simple
impit is a `rust` library that allows you to impersonate a browser and make requests to websites. It is built on top of `reqwest`, `rustls` and `tokio` and supports HTTP/1.1, HTTP/2, and HTTP/3.
The library provides a simple API for making requests to websites, and it also allows you to customize the request headers, use proxies, custom timeouts and more.
```rust
use impit::cookie::Jar;
use impit::{impit::Impit, fingerprint::database as fingerprints};
#[tokio::main]
async fn main() {
let impit = Impit::::builder()
.with_fingerprint(fingerprints::firefox_144::fingerprint())
.with_http3()
.build()
.unwrap();
let response = impit
.get(String::from("https://example.com"), None, None)
.await;
match response {
Ok(response) => {
println!("{}", response.text().await.unwrap());
}
Err(e) => {
println!("{:#?}", e);
}
}
}
```
### Other projects
If you'd prefer to use `impit` from a Node.js application, check out the [`impit-node`](https://github.com/apify/impit/tree/master/impit-node) folder, or download the package from npm:
```bash
npm install impit
```
The interface is the same as the native [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch).
```typescript
import { Impit } from 'impit';
// Set up the Impit instance
const impit = new Impit({
browser: "chrome", // or "firefox"
proxyUrl: "http://localhost:8080",
ignoreTlsErrors: true,
});
// Use the `fetch` method as you would with the built-in `fetch` function
const response = await impit.fetch("https://example.com");
console.log(response.status);
console.log(response.headers);
console.log(await response.text());
// console.log(await response.json());
// ...
```
### Usage from Rust
Technically speaking, the `impit` project is a somewhat thin wrapper around `reqwest` that provides a more ergonomic API for making requests to websites.
The real strength of `impit` is that it uses patched versions of `rustls` and other libraries that allow it to make browser-like requests.
Note that if you want to use this library in your rust project, you have to add the following dependencies to your `Cargo.toml` file:
```toml
[dependencies]
impit = { git="https://github.com/apify/impit.git", branch="master" }
[patch.crates-io]
rustls = { git="https://github.com/apify/rustls.git" }
h2 = { git="https://github.com/apify/h2.git" }
```
Without the patched dependencies, the project won't build.
Note that you also have to build your project with `rustflags = "--cfg reqwest_unstable"`, otherwise, the build will also fail.
This is because `impit` uses unstable features of `reqwest` (namely `http3` support), which are not available in the stable version of the library.