开源一款剪贴板跨设备共享工具

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: `shigen`,编程博主,擅长多种语言,近期自制了一个名为`copyhub`的工具,用于局域网内跨设备同步剪贴板。设计灵感源于对现有共享工具的安全顾虑,采用`Flask`和`Redis`实现,前端直接HTML+JS,简化架构。用户通过取件码交换内容,不涉及复杂功能。代码已开源并在个人腾讯云服务器上部署。更多详情见shigen的GitHub和哔哩哔哩频道。一起探索,每天进步!

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
个人IP:shigen

昨天遇到了一个很棘手的问题:我的手机剪贴板需要同步到另外的两台设备上。遗憾的是手机上并没有安装相同的通讯软件。用网上免费的剪贴板共享工具吧,方便是方便,但是觉得还是不安全,关键是不能实现特定的需求。我很享受DIY的过程,于是思索一下,我觉得我可以自己做出来,还能做到局域网下的剪贴板跨设备共享,毕竟我也曾有过成功的案例:开源一个局域网文件共享工具。于是说干就干。

起名字

项目总得有个名字吧。哎,想了好久,还是觉得没有合适的,最后问了GPT,选用了cpoyhub这个名字。

确认需求

我的需求就是很简单,像极了【蜂巢】的设计,我随用随取。输入剪贴板内容,拿到取件码;输入取件码,获得剪贴板内容。再简单不过了!所以,我也不用考虑那么多复杂的东西,什么认证、安全、高并发……小脑袋要爆炸!

确认架构

这是一个小工具,用不着我动不动Spring Boot那一套,而且Spring boot本身就很重!还是拿起了拿手的Flask框架,外加一个Redis,搞定!

前端的话,别搞Vue项目了,直接原生的来一套!关键是时间就那么一丢丢,能用魔法尽量用魔法。需要注意的是:前端的js文件,能用CDN就用CDN,给服务器节省一点流量。

代码设计

算起来逻辑还是很简单的,shigen直接开干了!

项目的整体结构

项目的整体结构如图所示:

项目结构

算得上是一个简简单单的小demo了。

后端代码

这里只展示核心的代码:

from datetime import datetime
from app import app, redis_client
from flask import jsonify, render_template, request

REDIS_KEY_PREFIX = 'clip:'
REDIS_KEY_EXPIRE_SES = 3600 * 10


def format_current_time(format='%m%d%H%M%S'):
    """
    默认格式化当前时间为 'MMDDhhmmss'
    :return: 格式化后的时间字符串
    """
    current_time = datetime.now()
    formatted_time = current_time.strftime(format)
    return formatted_time


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/new', methods=['POST'])
def clipboard():
    data = request.form['data']
    # 将数据存储到 Redis 中
    tms = format_current_time()
    key = REDIS_KEY_PREFIX + tms
    redis_client.set(key, data, REDIS_KEY_EXPIRE_SES)
    return jsonify({
   
   'data': tms, 'success': True})


@app.route('/get', methods=['GET'])
def get():
    tms = request.args.get('code')
    key = REDIS_KEY_PREFIX + tms
    value = redis_client.get(key)
    if not value:
        return jsonify({
   
   'data': None, 'success': False})
    else:
        return jsonify({
   
   'data': value, 'success': True})

前端代码

    <script>
        $(document).ready(function() {
   
   
            // 保存剪贴板内容
            $('#save-btn').click(function() {
   
   
                var data = $('#new-data').val();
                $.post('/new', {
   
   data: data}, function(response) {
   
   
                    console.log(response);
                    showSuccessMessage('Your clipboard saved successfully');
                    $('#new-data').val(response.data);
                    $('#save-btn').attr('disabled', true);
                });
            });

            // 提取剪贴板内容
            $('#extract-code').change(function() {
   
   
                var code = $(this).val();
                $.get('/get', {
   
   code: code}, function(response) {
   
   
                    $('#extracted-data').val(response.data);
                });
            });

            // 复制剪贴板内容
            $('#copy-btn').click(function() {
   
   
                var textarea = document.getElementById('extracted-data');
                textarea.select();
                document.execCommand('copy');
                showSuccessMessage('Copied to clipboard!');
            });

            // 显示复制成功提示消息
            function showSuccessMessage(text) {
   
   
                var message = $('#alert-message');
                message.text(text).fadeIn(300).delay(1500).fadeOut(400);
            }
        });
    </script>

完整的代码,可参考shigen的GitHub

服务部署

最后就是服务的部署了,shigen部署在了自己的腾讯云服务器上。一切很是顺利,基本山没有遇到大的问题:

nohup python3 run.py > app.log 2>&1 &

服务部署

整个过程也放在了shigen的哔哩哔哩上,感兴趣的伙伴,欢迎体验。

与shigen一起,每天不一样!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
11月前
|
存储 前端开发 安全
跨页面通信的方式有哪些?
跨页面通信的方式有哪些?
183 0
|
Web App开发 前端开发 JavaScript
跨浏览器兼容性:确保您的网站在各个平台上无缝运行
在当今多样化的网络浏览器市场中,确保您的网站能够在不同浏览器上正常运行变得至关重要。跨浏览器兼容性是一项关键任务,涉及到确保您的网站在不同浏览器和设备上都提供一致的用户体验。本博客将深入探讨跨浏览器兼容性的重要性、挑战以及如何实施有效的兼容性策略。
207 0
|
4月前
|
JSON JavaScript 小程序
跨设备平台问题之静态编译解决了哪些问题
跨设备平台问题之静态编译解决了哪些问题
跨设备平台问题之静态编译解决了哪些问题
|
1月前
|
存储 移动开发 网络协议
【实战指南】从零构建嵌入式远程Shell,提升跨地域协作效率(2)
本文《从零构建嵌入式远程Shell》的第二部分,介绍了如何通过模块化设计和功能增强来优化远程Shell,包括支持阻塞命令、增加用户主动结束Shell进程的能力等,提升了跨地域协作效率。文中提供了详细的代码示例和验证步骤,适合开发者深入学习。
44 7
|
5月前
|
移动开发 监控 安全
【实战指南】从零构建嵌入式远程Shell,提升跨地域协作效率
构建嵌入式远程Shell的文章概述: - 目标:解决嵌入式软件测试中的远程调试难题,提供轻量级解决方案。 - 功能:包括远程交互、命令执行与反馈,强调多客户端并发连接和稳定性。 - 设计:基于Socket服务端架构,使用I/O多路复用和popen函数,确保命令执行与结果反馈。 - 需求:支持命令解析、执行和结果回传,考虑网络不稳定情况下的连接保持。 - 安全性:仅限内部调试,未详细讨论加密等安全措施。 - 实现:关注点在Socket服务端程序,包括监听、数据过滤和命令处理。 - 测试:通过 Telnet 和Windows网络助手验证连接和命令执行功能。
323 68
|
2月前
|
传感器 Java 关系型数据库
「深入揭秘」 Micronaut配置与环境管理的隐藏技巧:如何无缝切换部署场景?
【9月更文挑战第9天】Micronaut是一款轻量级、高性能的Java/Grails框架,支持灵活的配置管理和环境感知。通过`application.yml`或`application.properties`文件,开发者可以轻松定义不同环境下的配置,如开发环境使用H2内存数据库,生产环境则连接远程MySQL数据库。Micronaut还支持通过环境变量或命令行参数覆盖配置值,增强应用灵活性和安全性。利用`@Environment`等注解,开发者能实现基于环境条件的依赖注入,使应用能够根据不同部署场景做出相应调整。这套完善的配置管理机制简化了应用维护,提高了安全性和可扩展性。
51 7
|
5月前
|
消息中间件 物联网 数据处理
TDengine 数据接入功能支持 Wonderware 了,不需一行代码完成迁移工作
TDengine 3.2.3.0 引入了 Wonderware Historian (AVEVA Historian) 连接器,简化了数据迁移至 TDengine 的过程,增强时序数据管理与分析。此连接器解决了传统实时数据库扩展性问题,提供成本效益高、国产化的替代方案。TDengine 已支持多种数据源集成,如 OPC、Kafka、MQTT等,打造统一数据平台,助力企业数字化转型。作为高性能时序数据库,TDengine 提供云原生解决方案,减少系统复杂度,加速业务创新。
66 6
|
6月前
|
存储 移动开发 API
本地跨页面通讯
本地跨页面通讯包括Web Storage、Cookies、Broadcast Channel API、SharedWorker和postMessage API等方法。Web Storage和Cookies用于存储数据共享,Broadcast Channel API提供消息通道,SharedWorker支持多页面共享后台线程,postMessage用于不同窗口或页面间的消息传递。根据项目需求选择合适的技术,可实现高效通信。
|
6月前
|
存储 JavaScript 前端开发
跨标签页通信的8种方式(下)
跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中,每个标签页都是相互独立的,无法直接共享数据。然而,有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作,这就需要使用跨标签页通信来实现。
138 0
|
6月前
|
存储 缓存 JavaScript
跨标签页通信的8种方式(上)
跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中,每个标签页都是相互独立的,无法直接共享数据。然而,有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作,这就需要使用跨标签页通信来实现。
173 0