pub async fn login_with_qrcode(
    uin: i64,
    show_qrcode: impl FnMut(Bytes) -> Result<(), Box<dyn Error + Send + Sync>>,
    data_folder: impl AsRef<Path>
) -> Result<(Arc<Client>, AliveHandle), LoginError>
Expand description

使用二维码登录。

二维码图片会通过 show_qrcode 回调函数传递给调用者。 调用者需要自行实现二维码图片的显示。

Examples

Rust

下面是一个使用 imagerqrrqrcode 库在控制台打印二维码的例子。

use anyhow::{bail, Result};
use libawr::{login, Protocol};

/// 将二维码图片转换为文本。
fn qrcode_text(qrcode: &[u8]) -> Result<String> {
    let qrcode = image::load_from_memory(qrcode)?.to_luma8();
    let mut qrcode = rqrr::PreparedImage::prepare(qrcode);
    let grids = qrcode.detect_grids();
    if grids.len() != 1 {
       bail!("无法识别二维码");
    }
    let (_, content) = grids[0].decode()?;
    let qrcode = qrcode::QrCode::new(content)?;
    let qrcode = qrcode.render::<qrcode::render::unicode::Dense1x2>().build();
    Ok(qrcode)
}

let (client, alive) = login!(
    12345678,
    show_qrcode = |img| {
        println!("{}", qrcode_text(&img)?);
        Ok(())
    }
).await?;

alive.auto_reconnect().await?;

Python

下面是一个使用 Pillow 显示二维码图片的例子。

from io import BytesIO
from PIL import Image

client, alive = await awr.login(
    12345678,
    show_qrcode = lambda img: Image.open(BytesIO(img)).show(),
)

Python

async def login_with_qrcode(
    uin: int,
    show_qrcode: Callable[[bytes], None],
    data_folder: str = "./bots",
) -> Tuple[Client, AliveHandle]: ...