V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lslqtz
V2EX  ›  分享创造

开源一个基于网页的共享剪切板 ( PHP )

  •  
  •   lslqtz · 2023-11-13 11:55:16 +08:00 · 1741 次点击
    这是一个创建于 407 天前的主题,其中的信息可能已经有所发展或是发生改变。

    个人使用了两年左右, 最近心血来潮进行了一波优化, 顺便进行开源. 说是共享剪切板, 实际上更像是一个共享文本框, 因为没有设备的剪切板访问权限.

    https://github.com/lslqtz/UniversalClipboard

    这一剪切板具有如下特性:

    1. 基于网页, 采用轮询机制, PHP 单文件部署;
    2. 在键入完毕后的半秒内被同步到各设备;
    3. 网页会产生二维码便于共享 (推荐由移动设备访问桌面设备产生的二维码);
    4. 支持简单的深色模式 (二维码在深色模式下会变暗);
    5. 支持简单的多账号认证和匿名. 匿名模式下使用一个不需要登录的"特殊账号". 以账号为门槛, 在 Session 模式下剪切板关联 Session ID (即根据不同的 Session ID 可支持单账号多剪切板, 但此时剪切板可跨账号访问), 在 JSON 模式下剪切板关联账号 (即意味着在匿名模式下完全共享剪切板).
    6. 可设置的过期时间;
    7. 通过修改 VersionKey, 可以废弃所有用户的之前剪切板;

    注: 这一剪切板的设计目的是个人及小规模使用. 该工具的密码存储及传输使用未加盐 SHA1, 不建议使用重要密码. SessionName 如为 null, 则以 JSON 模式存储用户数据, 否则其字符串决定其字面意思. 过期及废弃剪切板并不意味着丢弃, 由于没有计划任务的实现, Session 模式下 PHP 本身会触发基于概率的回收, JSON 模式下只有在访问用户数据时才会检查是否过期.

    这是一个目前可用的测试服务, 使用 Session 模式, 账号为 user1, 密码为空. 测试链接

    第 1 条附言  ·  2023-11-13 14:43:57 +08:00
    关于本程序的接口:
    POST /clipboard.php 或 POST /clipboard.php?{SessionName}={SessionID}
    Content-Type: application/json

    首次访问/初始化
    {"version": -1, "version_hash": null, "clipboard": null}

    再次访问须使用已获得的 version 及 version_hash, 并传递客户端当前剪切板内容, 如无变化 clipboard 将为 null, 有变化即获得下一版本, 应当储存它.
    第 2 条附言  ·  2023-11-13 14:48:28 +08:00
    另: 接口若只返回 version 且为 -2, 即意味着未登录, 不应继续请求.
    客户端登录可直接构造 Cookie: {AuthCookieName}={Username}:{Password (SHA1)}
    第 3 条附言  ·  2023-11-13 17:16:33 +08:00
    测试服务目前无法达成: 2. 在键入完毕后的半秒内被同步到各设备; ,这是因为默认间隔 Interval 配置为 1000ms (1s), 修改间隔会加快速度, 但是也会导致大量 HTTP(S) 请求的压力.
    第 4 条附言  ·  2023-11-13 17:40:44 +08:00

    为上一条附言补充一条视频:

    Preview

    11 条回复    2023-12-18 10:03:40 +08:00
    Puteulanus
        1
    Puteulanus  
       2023-11-13 12:05:56 +08:00
    我之前也想做这个,基于网页或者 PWA 的剪贴板共享工具
    但是浏览器的剪贴板 API 卡得太死了,要权限都可以接受,焦点还必须一直在网页上,自动同步基本上就不要想了
    lslqtz
        2
    lslqtz  
    OP
       2023-11-13 12:08:54 +08:00
    @Puteulanus
    说到剪切板 API, 这个程序目前还没有使用, 也许有优化空间? 我一般是使用 Command (Control)+C/V 快捷键来取出.
    不过如果使用的话, 在两个设备都已有剪切板内容时确定先后顺序可能是一个难题.
    Puteulanus
        3
    Puteulanus  
       2023-11-13 12:20:40 +08:00
    @lslqtz 可以做一个一键复制的按钮,或者把变动历史做成一个列表(剪贴板历史),每个 item 单击或者双击直接复制,感觉体验会好一些,纯鼠标就能操作。

    两个设备的先后确实是个问题,特别是浏览器 API 禁止了非焦点情况下的剪贴板访问,没办法像剪贴板同步的客户端程序一样在变动的当下及时反应,当一个设备重新回网页的时候是不可能知道它是想读还是想写的。

    我的想法是网页上再做个读剪贴板的按钮,都手动操作,让它俩自己决定哪边读哪边写,自动同步这事在网页上真做不出来。。
    lemonTreeTop
        4
    lemonTreeTop  
       2023-11-13 14:29:38 +08:00
    可以看看我的项目柠檬 Push ,把电脑剪切板转为 http 服务,提供获取和写入的 api

    柠檬 Push ,同一 WiFi 环境下手机高效推送文本到电脑剪切板的工具,移动端支持 Android 、iOS ,电脑端支持 Windows 、Mac 、Linux 平台

    https://github.com/ishare20/lemonPush
    brader
        5
    brader  
       2023-11-13 14:33:52 +08:00
    我是自己做了一个 https://9iqu.cn/clip/
    justfindu
        6
    justfindu  
       2023-11-13 14:47:43 +08:00
    我一直在用 Edge 提供的 Drop
    dasenlin
        7
    dasenlin  
       2023-11-13 20:04:30 +08:00
    每秒一次的轮询是否可以使用主动推送到客户端来代替,当前剪切板内容变化时才改变状态然后推送到各客户端,我想这样会增加难度,比如不得不增加 Websocket 之类的功能,这样就影响了轻便的初衷了。
    lslqtz
        8
    lslqtz  
    OP
       2023-11-13 20:14:04 +08:00
    @dasenlin 可以, 除了 CDN 和虚拟主机等兼容性外应该还好.
    lslqtz
        9
    lslqtz  
    OP
       2023-11-13 20:17:05 +08:00
    目前没有计划, 高频轮询足够个人需求了.
    Eanson
        10
    Eanson  
       2023-12-17 14:27:51 +08:00
    @brader 开源吗 我正好需要这个
    brader
        11
    brader  
       2023-12-18 10:03:40 +08:00
    @Eanson 之前有放了一份到 gitee ,你要可以自己上去拿
    https://gitee.com/shunbiao/clip
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:43 · PVG 04:43 · LAX 12:43 · JFK 15:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.