Metadata-Version: 2.4
Name: ChatComment
Version: 0.1.0
Summary: Embeddable comments with a Python server, SQLite storage and a small JavaScript widget.
Author: ChatArch
License-Expression: MIT
Project-URL: Repository, https://github.com/ChatArch/ChatComment
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: click<9,>=8
Requires-Dist: chatstyle<0.3.0,>=0.2.0
Requires-Dist: chatenv<0.3.0,>=0.2.11
Provides-Extra: dev
Requires-Dist: build; extra == "dev"
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: twine; extra == "dev"
Dynamic: license-file

# ChatComment

Python 服务、SQLite 数据和一个无依赖的 JavaScript 留言组件。支持多站点、逐页隔离、匿名开关、昵称/邮箱/网址必填设置、审核与软删除。邮箱只在管理界面出现。默认私有站点由可信网关保护；可显式注册公开站点。

```sh
python -m pip install .
chatcomment --version
chatcomment --tree
chatcomment site register personal-blog --origin https://blog.example.com --page /post/one --public
chatcomment serve --token-file ~/.chatarch/chatcomment/admin-token
```

`--token-file` 必须指向仅部署者可读的现有文件（建议随机 32 字节以上）；命令不生成或打印密钥。默认数据库 `~/.chatarch/chatcomment/comments.sqlite3`，监听 `127.0.0.1:10196`。公网接入必须使用 HTTPS 反向代理；私有站点的 API 要由网关验证登录后附加 Bearer token，不能把该 token 交给浏览器。管理入口也必须经这种登录网关，或使用支持 Bearer token 的管理客户端。

```html
<div id="comments"></div>
<script src="https://comments.example.com/widget.js" defer
  data-chatcomment data-target="#comments"
  data-api="https://comments.example.com" data-site="personal-blog"
  data-page="/post/one"></script>
```

组件自动读取设置并只显示允许的字段；必填校验由服务器执行。默认不记住访客信息、不加载第三方头像、不渲染留言 HTML。公开模式的匿名留言不代表拥有可信实名；关闭匿名时要求可信网关提供已验证的作者身份。

API、网关接入、备份与恢复见 [docs/api.md](docs/api.md)、[docs/deployment.md](docs/deployment.md)。本包不自动开放防火墙或注册 DNS，也不包含云服务凭据。

独立留言板为 `/board?site=personal-blog&page=%2Fpost%2Fone`，与嵌入表单读写同一留言流。设置按钮只在服务器返回 `can_manage=true` 时显示。网关为普通成员设置 `X-ChatComment-Role: reader`，仅经服务端验证的 owner 使用 `admin`；管理接口另行验证权限。公开浏览器不能靠昵称或伪造角色 header 获得权限，因为缺少服务器 Bearer token。
