天域至尊 发表于 2022-12-8 17:12

基于剪切板文本模式的文件传输工具(这有啥用?)

有的时候,我们通过某些远程工具,可以是远程主机与本机共享剪切板,但是这种剪切板只能传输文本,不能传输文件。
那么有没有依靠于文本的方式,进行文件传输呢?

因为文本模式往往有长度限制,所以思路是这样的:
1.将待传输文件切片,每一片整理为base64,存储到剪切板
2.目标机器读取剪切板数据,解析成二进制,写入文件
3.重复上述过程,将一个文件全部数据发送过去

我自己写了个,试了试,能用,在vm中,你要不断地把鼠标划入虚拟机,再划出来,以此同步双方剪切板。
聊胜于无吧,用于极端情况下的文件传输。

import pyperclip,time,json
from base64 import b64encode, b64decode
import argparse

parser = argparse.ArgumentParser(description='使用剪切板文本模式发送文件,发送端先启动,接收端再启动')
parser.add_argument("-s","--send",help="选择发送模式",action="store_true")
parser.add_argument("-g","--get",help="选择接收模式",action="store_true")
parser.add_argument("-f","--file",help="指定发送或接收的文件路径及名称",type=str)
parser.add_argument("--size",help="指定单次发送内容的字节数,默认为1024",type=int,default=1024)
args=parser.parse_args()

read_file=args.file
write_file=args.file
#True-发送False-接受
mode=args.send

size=args.size

now_data=""
now_id=0
now_id_list=[]
error_num=0

def check_data(now_id):
    """
    """
    global now_data
    while True:
      text = pyperclip.paste()
      if now_data==text:
            time.sleep(0.01)
            continue
      try:
            data=json.loads(text)
            if data["now_id"]==now_id and data["answer"]==True:
                now_data=text
                return True
      except Exception:
            return False

def send(read_file):
    """
    发送数据
    """
    global size,now_data,now_id
    f=open(read_file,mode="rb")
    finish=False
    while finish==False:
      time.sleep(0.01)
      file_data=f.read(size)
      now={
            "now_id":now_id,
            "finish":False,
            "answer":False,
            "data":b64encode(file_data).decode("utf8")
      }
      if len(file_data)==0:
            print("send data finish!")
            now["finish"]=True
            finish=True
      while True:
            data=json.dumps(now)
            now_data=data
            pyperclip.copy(now_data)
            if check_data(now_id):
                now_id=now_id+1
                break
            else:
                time.sleep(0.01)
      if len(file_data)==0:
            exit()

def get_data(write_file):
    """
    发送数据
    """
    global now_data,now_id
    f=open(write_file,mode="wb")
    finish=False
    while finish==False:
      text = pyperclip.paste()
      if now_data==text:
            time.sleep(0.01)
      else:
            now_data=text
            try:
                data=json.loads(text)
                now_id=data["now_id"]
                finish=data["finish"]
                file_data=b64decode(data["data"])
                if now_id not in now_id_list:
                  now_id_list.append(now_id)
                  f.write(file_data)
                now_data=json.dumps({
                  "now_id":now_id,
                  "finish":finish,
                  "answer":True
                })
                error_num=0
                pyperclip.copy(now_data)

            except Exception:
                now_data=""
                pyperclip.copy(now_data)
                error_num=error_num+1
                time.sleep(0.01)
                if error_num>100000:
                  exit()
    f.close()

if mode:
    send(read_file=read_file)
else:
    get_data(write_file=write_file)

使用方式:
>python send_file.py -h
usage: send_file.py [-h] [-s] [-g] [-f FILE] [--size SIZE]

使用剪切板文本模式发送文件,发送端先启动,接收端再启动

options:
-h, --help            show this help message and exit
-s, --send            选择发送模式
-g, --get             选择接收模式
-f FILE, --file FILE指定发送或接收的文件路径及名称
--size SIZE         指定单次发送内容的字节数,默认为1024

别忘了来回滑动鼠标,同步双方剪切板

笑死,我写的这都是啥工具

gzsklsskszngc 发表于 2022-12-8 21:12

前段时间我就设想过这个事情,群友都说我疯了,没想到还真有人做了,谢谢大佬!:lol

光之继承者 发表于 2022-12-8 21:11

确实很有用,我以前就遇到过只能传输文本不能传输文件的情况

无语的小紫英 发表于 2022-12-8 17:27

这大概就是多端在线协同吧

coder_LGB 发表于 2022-12-8 22:39

哈哈 我也写过类似的

wihn 发表于 2022-12-8 22:55

mac系统可以共享文件吗?如果可以的话,可以看看它是怎么做的

hk9186 发表于 2022-12-9 00:25

确实疯了,百度云和局域网隔空传物都不敢说话

cloud2010 发表于 2022-12-9 18:23

写的很好{:301_993:}
页: [1]
查看完整版本: 基于剪切板文本模式的文件传输工具(这有啥用?)