实现Windows和iPhone互发文本

zerobiubiu 2022年06月13日 394次浏览

通过Windows以通知形式发送到iPhone文本,iPhone发送到Windows自动复制来实现类似共享剪贴板

事由

由于不可抗力,iPhone始终无法和Windows实现共享剪贴板,导致了传输文本成了一件麻烦事,只好自己去实现一个还算方便的形式。

实现方式

Windows发送到iPhone

iPhone下载Bark即可实现自由自定义通知。

只需要根据要求发送get请求就可以实现推送到通知到iPhone。

在Chrome浏览器可以直接去商店找到bark插件,配置好路径就能点击就发送到手机。

Bark - Chrome 网上应用店 (google.com)

或者通过Quicker动作发送复制内容。

发送到iPhone - 动作信息 - Quicker (getquicker.net)

我也尝试实现了图形化,采用易语言写了图形界面,但是由于编码有问题,就放弃了。转向用C++实现了一个程序,添加Path环境变量,即可实现Shell命令,或者配合上Power Toys的Power Toys Run即可实现编辑内容后发布。

不过在Power Toys Run有BUG,附带中文就不能正确引导,更多的是放在Shell环境下可以使用。

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

int main(int argc, char *argv[])
{
    string content = argv[1];
    content.erase(0, 1);
    string url = "替换成自己的URL" + content;
    string curl = "curl "+ url;
    system(curl.c_str());

    return 0;
}

依赖:

  • Curl

为了实现简单的get请求,而不是再去写复杂的GET实现,直接调用Shell环境,用Curl发送GET请求,导致必须依赖Curl,以及运行时必然会闪过Shell页面。

技术不达标,未能实现复制自动发送。

由于iOS14.5之后不能自动复制通知,也比较遗憾在iPhone端也不能自动复制。

iPhone发送到Windows

用node实现一个简单的http服务器,配合Apple 快捷指令,发送PUT请求,即可将内容发送到Windows并实现自动复制。

快捷指令

记得将快捷指令内的URL改成自己服务器的。

发送剪贴板文本

扫描二维码内容发送

服务器

添加依赖

npm install http iconv-lite child_process silly-datetime

服务器代码:

#!node

const { exec } = require('child_process')
const sd = require('silly-datetime')
const iconv = require('iconv-lite')
const http = require("http")
const fs = require('fs')

var runMath = 1

const server = http.createServer()
const time = sd.format(new Date(), 'YYYY-MM-DD HH:mm')
const logTime = sd.format(new Date(), 'YYYY-MM-DD HH.mm')
const log = `服务器启动时间:${time}\n`

console.log(log)

var fileNmame = logTime+".log"
var filePath = __dirname + "/log/"+fileNmame
fs.mkdir(__dirname + "/log",function(err){})
fs.writeFileSync(filePath, log, { flag: 'a+' })

server.on("request", (req, res) => {
    const chunk = []
    req.on("data", (data) => {
        chunk.push(data)
    })
    req.on("end", () => {

        const time = sd.format(new Date(), 'YYYY-MM-DD HH:mm')
        const header=time+" 第" + runMath + "次请求\n----------------------------------------------------------------------------\n"
        console.log(header)
        fs.writeFileSync(filePath, header, { flag: 'a+' })
        runMath++
        const data = Buffer.concat(chunk)
        console.log(data.toString())
        fs.writeFileSync(filePath, data.toString(), { flag: 'a+' })
        const footer="\n----------------------------------------------------------------------------\n"
        console.log(footer)
        fs.writeFileSync(filePath, footer, { flag: 'a+' })

        exec('clip').stdin.end(iconv.encode(data.toString(), 'gbk'))
    })

    res.end('收到了')
})
server.listen(18011, () => {
    console.log("server is http://127.0.0.1:18011")
    fs.writeFileSync(filePath, "server is http://127.0.0.1:18011\n", { flag: 'a+' })
})

启动服务器,会在同目录下创建log文件夹,内生成了每次运行的日志文件。

实现开机启动

创建一个用来运行服务器的bat脚本

node 服务器文件位置

在创建一个vbs脚本

Set shell = Wscript.createobject("wscript.shell")

a = shell.run ("脚本位置.bat",0)

然后给vbs创建快捷方式,放在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup目录下实现开机运行。

如果想停止运行在任务管理器找到node结束掉就行了。