#gemini #client #fun #experimental #actor #cli #aims

bin+lib trotter

Trotter 🎠 是一个旨在使编写 Gemini 客户端变得有趣和简单的实验性crate。

12 个版本 (3 个稳定版)

1.0.2 2024年7月4日
1.0.1 2024年3月31日
0.6.0 2023年11月21日
0.5.2 2023年11月18日
0.1.0 2023年11月11日

#929网络编程

每月49次 下载
3 个 crate 中使用 (2 个直接使用)

GPL-3.0-only

37KB
809

🎠 Trotter

Trotter 是一个有趣和实验性的 Gemini 客户端 crate。

安装 trot 命令行工具:cargo install --features cli trotter

对于简单的请求,使用 trottrot_in

#[tokio::main]
async fn main() {
    trotter::trot("geminiprotocol.net") // gemini:// prefix and root slash can be elided
        .await
        .unwrap();

    trotter::trot_in("localhost/input", "notice me!")
        .await
        .unwrap();
}

😊 请求

🎭 演员

演员存储与多个请求相关的信息。

use trotter::{Actor, UserAgent};

#[tokio::main]
async fn main() {
    let owo = Actor::default()
        .user_agent(UserAgent::Indexer)
        .cert_file("id/owo.crt")
        .key_file("id/owo.key");

    owo.get("localhost")
        .await
        .unwrap();
}

🤖 用户代理

你知道 Gemini 有一个针对标准的 robots.txt 版本吗? (robots.txt for Gemini)

Trotter 内置了机器人功能。一旦设置用户代理,如果您尝试访问不允许访问的页面,将会收到一个 RobotDenied 错误。

如果您使用 Trotter 进行依赖于他人内容的项目的开发,我强烈建议您进行此操作。

🌕 泰坦

Titan 是 Gemini 的姐妹协议,用于上传文件。

要使用 Titan,创建一个 Titan 结构体,并将其传递给 Actor::upload

use trotter::{Actor, Titan};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let g = Actor::default()
        .upload(
            "titan://127.0.0.1/",
            Titan {
                content:  "Example content :DDDDDDDDDDDDDDDDDDDD".into(),
                mimetype: "text/plain".into(),
                token:    None,
            },
        )
        .await?
        .gemtext()?;
    println!("{g}");

    Ok(())
}

📖 解析

use trotter::parse::Gemtext;

fn main() {
    let txt = "# 💎
## Is
### So
> effing
* dope
man
=> /path/to/somewhere i can take u there
``` alt text goes here
Here's a table
| The | Best |
|-----|------|
| 😘  | 😪   |
```";

    let gemtext = Gemtext::parse(txt);

    println!("{gemtext:#?}");
}

提示

证书

安装了 openssl 后,您可以使用以下 shell 函数生成和检查 x509 证书。

certgen() { [ -f "${1:?usage: certgen [domain]}.key" ] || [ -f "$1.crt" ] || ( openssl req -new -subj "/CN=$1" -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -days 3650 -nodes -out "$1.crt" -keyout "$1.key" && printf '📜 Cert generated\n' ) ;}
certinfo(){ openssl x509 -noout -text < "${1:?usage: certinfo [file]}" ;}

待办事项

  • 将 --generate-cert 选项添加到 cli。
  • 修复损坏的 robots.txt :(
  • 豆腐存储目录
  • 字节读写超时

依赖关系

~6–15MB
~215K SLoC