#cookies #user #wry #window #cross-platform #pop-up

bin+lib get-cookies

从弹出窗口获取Cookies

11个版本

0.2.0 2024年4月27日
0.1.9 2024年4月27日
0.1.2 2024年3月29日

5 in #wry

MIT 许可证

35KB
425

get-cookies-rs

Crates.io

英文 | 简体中文 get-cookies-rs 是一个Rust库,旨在通过使用 Wry 库来简化跨平台兼容性,方便从任何网站检索Cookies。这使得它非常适合需要跨Windows、macOS和Linux保持一致工具的开发者,而不依赖特定的浏览器,这可能会增大您的程序大小。

功能

  • 跨平台支持:由于 Wryget-cookies-rs 在各种操作系统上运行顺畅,使其成为跨平台应用的绝佳选择。
  • 异步API:该库支持异步操作,利用Rust的现代异步/等待语法进行高效、非阻塞I/O。
  • 灵活的Cookies检索:允许用户根据可定制的条件检索Cookies,为网络爬取和自动化测试提供强大的解决方案。

安装

要在您的项目中使用 get-cookies-rs,请将其添加到您的 Cargo.toml 依赖项中

[dependencies]
get-cookies = "0.1.0"

先决条件

Linux需要额外安装gtklib浏览器,请参阅 wry 文档 进行安装。Windows和macOS不需要额外的依赖。

用法

use std::{str::FromStr, sync::Arc};

use get_cookies::read_cookie_until;
use regex::Regex;
use reqwest::header::{ACCEPT, COOKIE, ORIGIN, REFERER, USER_AGENT};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let cookie_store = Arc::new(reqwest::cookie::Jar::default());
    let client = reqwest::Client::builder()
        .cookie_provider(cookie_store.clone())
        .build()?;
    let repo_url = "https://github.com/lonelam/get-cookies-rs";
    let cookie_str = read_cookie_until("https://github.com", |cookie_str: &String| {
        cookie_str.contains("logged_in=yes")
    })
    .await?;

    let cookies = cookie_str.split(';');
    for c_str in cookies {
        cookie_store.add_cookie_str(c_str, &reqwest::Url::from_str("https://github.com")?);
    }
    let repository_page = client.get(repo_url).send().await?;
    let html_content = repository_page.text().await?;
    let auth_re = Regex::new(
        r#"<form class="unstarred js-social-form" data-turbo="(.*)" action="(.*)/star" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="(.*)" autocomplete="off" />"#,
    )?;
    let auth_token = auth_re
        .captures(&html_content)
        .map_or(String::new(), |r| r[3].to_string());

    let star_resp = client
        .post(format!("{}/star", repo_url))
        .header(REFERER, repo_url)
        .header(COOKIE, cookie_str)
        .header(ORIGIN, "https://github.com")
        .header(ACCEPT, "application/json")
        .multipart(
            reqwest::multipart::Form::new()
                .text("authenticity_token", auth_token)
                .text("context", "repository"),
        )
        .send()
        .await?;
    println!("{}", star_resp.text().await?);
    Ok(())
}


贡献

我们欢迎对 get-cookies-rs 的贡献,使其更加出色!如果您有兴趣做出贡献,请将仓库分叉,提交您的更改,并提交一个拉取请求。对于重大更改,请首先打开一个问题来讨论您想要进行的更改。

许可证

get-cookies-rs 根据 MIT 许可证分发,该许可证允许免费使用、修改、分发和私人使用软件,只要保留版权和许可证声明。

依赖项

~8–64MB
~1M SLoC