# CLI tool<no value>

A CLI tool exists to compute mCaptcha challenges. It can be installed
from multiple sources:

## Install

### crates.io

The CLI tool is available on, [crates.io](https://crates.io), the Rust
language's package registry. Rust language toolchain is required to
install from crates.io, please see [rustup.rs](https://rustup.rs) for
Instructions to install it.

```bash
cargo install mcaptcha-cli
```

### Pre-compiled binaries

Nightly builds and stable releases are regularly published to
[dl.mcaptcha.org](https://dl.mcaptcha.org/mcaptcha/cli) for a variety of
CPU architectures and operating systems.

1. Download binary, checksum and GPG signature files

```bash
wget https://dl.mcaptcha.org/mcaptcha/cli/{VERSION}/{FILENAME}.tar.gz
wget https://dl.mcaptcha.org/mcaptcha/cli/{VERSION}/{FILENAME}.tar.gz.asc
wget https://dl.mcaptcha.org/mcaptcha/cli/{VERSION}/{FILENAME}.tar.gz.sha256
```

2. Verify checksum

```bash
sha256sum -c {FILENAME}.tar.gz.sha256
```

3. Download mCaptcha's GPG release keys and verify GPG signature

```bash
gpg --keyserver keyserver.ubuntu.com --recv 73DAC973A9ADBB9ADCB5CDC4595A08135BA9FF73
gpg --verify {FILENAME}.tar.gz.asc
```

4. Install Binary

```bash
tar -xvzf {FILENAME}.tar.gz && sudo cp {FILENAME}/mcaptcha-cli /usr/local/bin
```

### Build from source

1. Install Rust tool chain
   Please see [here](https://rustup.rs) for instructions.
2. Download source code

```bash
git clone https://git.batsense.net/mCaptcha/cli
```

3. Compile and install

```bash
cargo build --release && sudp cp ./target/release/mcaptcha-cli
/usr/local/bin
```

## Pass mCaptcha challenge

The CLI tool requires details about the challenge to work on it. The
tool can be used in three different modes compute challenge:

1. Protected Page: Compute mCaptcha challenge for the CAPTCHA at a
   protected page
2. Widget URL: Compute PoW for captcha at widget URL
3. (Developer mode) Offline: Computes PoW over given CAPTCHA parameters

### From protected page URL

The most convenient mode: copy the URL of the webpage which has the
mCaptcha widget (example: showcase.mcaptcha.org) and run the CLI tool
with it to get an authorization code:
Compute challenge using the URL

```bash
03:39 atm@lab cli ±|feat-parse-webpage ✗|→ mcaptcha-cli protected-page https://showcase.mcaptcha.org/
Authorization token: eRAZJiMrW58uDYA1s64Tmwq1u30HutuF
```

### Widget URL

If you have the widget URL (will be in format https://mcaptcha.example.org/widget?sitekey=randomstring), it can be used to solve challenge as well:

```bash
Compute PoW by fetching parameters from  CAPTCHA URL

Usage: mcaptcha-cli online --url <URL>

Options:
  -u, --url <URL>  URL of the CAPTCHA. Example:  https://example.org/widget?sitekey=foo
  -h, --help       Print help
```

Example usage:

```bash
13:32 atm@lab cli ±|online ✗|→ mcaptcha-cli online -u https://demo.mcaptcha.org/widget?sitekey=pHy0AktWyOKuxZDzFfoaewncWecCHo23
Authorization token: 3xleN26OctBuVu3X4t6CYyUjErhaxQvz
```

### [Developer mode] Offline

Useful while debugging mCaptcha configurations, works on raw challenge
parameters.

Help menu:

```bash
Compute PoW with offline parameters

Usage: mcaptcha-cli offline --salt <SALT> --phrase <PHRASE> --difficulty-factor <DIFFICULTY_FACTOR>

Options:
  -s, --salt <SALT>                            Salt with which PoW should be computed
  -p, --phrase <PHRASE>                        Phrase over which PoW should be computed
  -d, --difficulty-factor <DIFFICULTY_FACTOR>  Difficulty Factor
  -h, --help                                   Print help
```

Example usage:

```bash
13:28 atm@lab cli ±|online|→ mcaptcha-cli offline -s $(rand 32) -p $(rand 32) -d 50000
difficulty: 50000
nonce: 90507
original phrase: f351f333d44b2c6b5bf7f033b065bbb8fb5e9dd153bd402e43ed04425f5a3859
result: 340276562956196291522979356090220150471
```

Where rand is [this](https://github.com/realaravinth/dotfiles/blob/6fc6c87cc912e17488a35c0d3327ecf393221270/scripts/rand#L20) script.
