Skip to content

Repository files navigation

DAKit — DeviantArt 客户端 SDK

DAKit

语言 / Language: 中文 · English

GitHub stars GitHub license pub.dev pub.dev pub.dev

DAKit 是面向 Dart 与 Flutter 的模块化 DeviantArt 客户端 SDK,为 Android、macOS 与 Windows 应用提供认证、官方 API、领域模型、诊断和后台传输能力。它既可以支撑完整的第三方客户端,也可以只作为其中一个功能模块使用。

本项目由社区独立维护,与 DeviantArt 没有隶属或背书关系。“DeviantArt”仅用于说明 SDK 所连接的服务。

参考实现 / Reference app:完整的第三方客户端 DAViewer 就是基于 DAKit 构建的 —— 因 DeviantArt 官方放弃其 App 而诞生,是查看 DAKit 实际用法的最佳范例。

目录

能做什么

  • 使用系统浏览器完成 Authorization Code + PKCE 登录;
  • 安全保存 OAuth 会话,并在进程重启后恢复回调;
  • 读取当前账户、用户资料与关系、作品详情与正文、首页/搜索、每日精选和关注动态;
  • 浏览标签、标签补全、主题导航、画廊与收藏夹目录及目录内容;
  • 读取「更多类似作品」预览,个别失效或异常的推荐不会影响其余结果;
  • 读取/发布作品评论,收藏/取消收藏作品,关注/取消关注用户;
  • 读取通知、反馈和 mentions,展开或删除消息堆栈;
  • 从专用接口解析原文件,不把缩略图冒充原图;
  • 在 Flutter 端排队、恢复、暂停、取消后台传输,并以失败保留记录的方式安全删除文件;
  • 分别配置 API 与媒体代理,并定位 DNS、TCP、TLS、HTTP、OAuth、解析和存储故障;
  • 通过稳定领域接口替换网络层、登录层、存储层或传输层。

目前尚未实现作品提交/编辑、Notes 私信和本地数据库。网站私有接口或页面抓取也不属于稳定 API。

开始前准备

运行任何登录、下载或诊断流程前,先确认下面几件事:

  • 你需要一个 DeviantArt 开发者应用。客户端类程序(示例客户端、CLI、Android/macOS/Windows 应用)必须选 Public;只有把凭据安全保存在服务端时才选 Confidential
  • Public 应用只需要 client_id,不要使用或保存 client_secret;DAKit 的客户端登录流程不接收 secret。
  • 回调地址必须精确写入应用的 OAuth2 Redirect URI Whitelist:
    • Flutter 示例客户端 / 桌面:dakit://oauth/callback
    • 命令行客户端:http://127.0.0.1:8765/callback
  • 登录需要 client_id;下载可直接传作品网页链接、fav.me 短链或裸 UUID—— dakit url 会把网页链接里的数字编号自动解析为 UUID。

包结构

用途 Flutter 依赖
dakit_core 模型、错误、仓库接口、分页、诊断、传输契约
dakit_api OAuth PKCE、网络配置、连通性检查、官方 API 实现
dakit_flutter 系统浏览器、深链、安全存储、后台传输
dakit_cli 纯 Dart 命令行登录、下载与诊断客户端
example_client Android/macOS/Windows 集成与故障诊断客户端 应用

依赖方向固定为 dakit_flutter → dakit_api → dakit_core。业务应用只依赖所需层;使用完整 Flutter 集成时依赖 dakit_flutter 即可。

安装

包已发布到 pub.dev。完整 Flutter 集成只需依赖 dakit_flutter,它会自动解析 dakit_apidakit_core

dependencies:
  dakit_flutter: ^0.1.12

如果只需要纯 Dart 能力,也可以按需声明:

dependencies:
  dakit_core: ^0.1.15
  dakit_api: ^0.1.30

随后阅读开始使用。直接在移动端或桌面端运行内置登录流程时,需要注册 Public OAuth 应用,并配置精确回调地址 dakit://oauth/callback

命令行客户端

不需要安装 Dart 或 Flutter。直接从 DAKit CLI Releases 下载与系统和 CPU 对应的压缩包:Linux x64/ARM64、Windows x64、macOS Intel/Apple Silicon。macOS 二进制明确标记为未签名测试版,没有 Apple Developer ID 签名或公证,Gatekeeper 可能拦截首次运行。每个 Release 同时提供 SHA256SUMS

dakit --help
dakit status --proxy 127.0.0.1:7892
dakit login --client-id 你的_PUBLIC_CLIENT_ID
dakit whoami
dakit url https://www.deviantart.com/loish/art/underwater-913624585 --dest downloads
dakit url https://fav.me/df3y58p --dest downloads
dakit url https://www.deviantart.com/loish/gallery --limit 50 --archive done.txt
dakit artist 用户名 --limit 24 --delay 0
dakit gallery 用户名 [gallery_id]
dakit fav 用户名 [folder_id]
dakit search "digital art" --limit 24
dakit logout

url 接受任意 DeviantArt 链接并自动识别目标:作品/日志页、fav.me 短链、 用户画廊、画廊/收藏夹、标签页和搜索链接都会路由到对应的下载逻辑(网页链接里的 数字编号会自动解析为 UUID)。批量下载还支持 --archive 文件(已下载 ID 跳过)、 --filename 模板{id} {title} {username} {published} {filename} {ext}) 和 --write-info-json(每个作品旁写一份元数据 .json)。

登录前在 DeviantArt 注册 Public OAuth 应用,把 http://127.0.0.1:8765/callback 精确加入白名单。login 会打开系统浏览器并在 本机接收回调,不会要求 DeviantArt 密码进入 CLI。远程或无界面环境可另外加入 dakit://oauth/callback,再使用 --manual --no-open

凭据保存到 ~/.config/dakit/(Windows 为 %APPDATA%/dakit/),刷新令牌会自动 续期;logout 会撤销远端令牌,logout --local 只删除本地凭据。下载采用流式 临时文件,默认保留同名文件,需要替换时显式传入 --overwrite

代理可通过 --proxy HOST:PORT--proxy http://HOST:PORThttp_proxyhttps_proxy 或 HTTP 形式的 all_proxy 配置。--verbose / -v 会把脱敏诊断 输出到 stderr。CLI 只支持 HTTP 代理,不把 SOCKS5 静默当作 HTTP 使用。

下载与登录走官方 OAuth API(唯一的网页抓取是解析数字编号为 UUID:先读首页 CSRF 令牌,再调用公开的 _puppy/dadeviation/init),因此不提供 cookies.txtSOCKS5 代理、预览画质切换或“防封”策略。官方接口支持原文件下载,CLI 不会用 preview 冒充 original。

最小示例

final diagnostics = MyDiagnosticSink();
final network = NetworkProfile.environment();
final oauth = DAKitOAuthClient(
  config: OAuthConfig(
    clientId: clientId,
    redirectUri: Uri.parse('dakit://oauth/callback'),
  ),
  networkProfile: network,
  diagnostics: diagnostics,
);

final restored = await oauth.resumePending();
final tokens = restored ?? await oauth.authorize();

final transport = OfficialApiClient(
  session: oauth.session,
  networkProfile: network,
  diagnostics: diagnostics,
);
final account = await OfficialAccountRepository(transport).currentUser();

authorize() 应由用户操作触发。应用启动时应尽早创建客户端并调用 resumePending(),以接收冷启动深链。

文档

文档总览见 docs/README.md(英文:docs/en/README.md)。

用户指南(把 DAKit 嵌入自己的应用):

  • 开始使用:注册应用、运行示例、嵌入客户端;
  • 认证:PKCE、平台回调、安全与排错;
  • 网络:代理模型、国内网络、分阶段诊断;
  • 媒体:原文件、正文、后台任务与验收边界。

开发与维护(贡献者与维护者):

  • 架构:边界、扩展点、兼容策略;
  • 开发:工具链、测试、三平台构建、CI、发布;
  • 发布:包版本更新与 pub.dev 发布流程;
  • 真实服务测试:需用户授权的完整媒体矩阵;
  • 当前状态:已验证结果和后续工作。

开发

项目固定使用 Flutter 3.47.1 / Dart 3.13.1。运行完整质量门:

./tool/verify.sh

普通 CI 不包含 OAuth 凭据。当前单元测试、Android APK、macOS 应用和 Windows/MSIX 构建均已在 GitHub Actions 验证;真实账户媒体矩阵仍需有效的 Public OAuth 应用和测试素材。

设计底线

  • 不在客户端保存 client_secret,不绕过人机验证;
  • 不使用嵌入式 WebView 代替系统浏览器登录;
  • 不关闭 TLS 校验,不在日志中输出令牌、授权码、Cookie 或 PKCE verifier;
  • 不把上游 DTO、插件类型或具体状态管理框架暴露为公共领域 API;
  • 不承诺自动适配任意网页改版,兼容性由集中式适配器与契约测试维护。

许可证

MIT

参考与致谢

DAKit 建立在以下开源项目之上:

接口映射与排错时参考的开源项目:

  • gallery-dl —— 记录了 DeviantArt 数据提取方式的下载器项目
  • deviantart.ts —— DeviantArt API 的 TypeScript 封装,用于核对接口参数

基于 DAKit 构建的完整客户端:DAViewer

社区 / Community

如果 DAKit 帮到了你,点个 ⭐ Star 能让更多需要它的人看到。

About

面向 Dart / Flutter 的模块化 DeviantArt 客户端 SDK —— OAuth 认证、官方 API、领域模型、诊断与后台传输。Modular DeviantArt client SDK for Dart & Flutter — OAuth, official API, domain models, diagnostics, and background transfers.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages