[{"content":"1 背景 平时写博客用的Markdown，但是每次想要在微信公众号上发表文章比较麻烦，因为微信公众号不支持除了mp.weixin.qq.com以外的其它域名，因此无法在微信公众号中的引用阿里云OSS中的图床\n2 目标 把任意一张图片上传到微信公众号\n3 微信公众号限制 微信公众平台开发概述 微信限制\n3.1 Token限制 微信公众号获取Token的限制如下\n公众平台以access_token为接口调用凭据，来调用接口，所有接口的调用需要先获取access_token，access_token在2小时内有效，过期需要重新获取，但1天内获取次数有限，开发者需自行存储，详见获取接口调用凭据（access_token）文档\n3.2 素材限制，这里我们主要关系图片的限制 微信公众号临时素材限制如下\n1、临时素材media_id是可复用的。 2、媒体文件在微信后台保存时间为3天，即3天后media_id失效。 3、上传临时素材的格式、大小限制与公众平台官网一致。 图片（image）: 10M，支持PNG\\JPEG\\JPG\\GIF格式 语音（voice）：2M，播放长度不超过60s，支持AMR\\MP3格式 视频（video）：10MB，支持MP4格式 缩略图（thumb）：64KB，支持JPG格式 4、需使用https调用本接口。 接口调用请求说明 http请求方式：POST/FORM，使用https https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN\u0026type=TYPE 调用示例（使用curl命令，用FORM表单方式上传一个多媒体文件）： curl -F media=@test.jpg \u0026ldquo;","permalink":"https://wangmin362.github.io/posts/tools/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99/05.%E9%80%9A%E8%BF%87golang%E6%89%8B%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E5%88%B0%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7/","summary":"1 背景 平时写博客用的Markdown，但是每次想要在微信公众号上发表文章比较麻烦，因为微信公众号不支持除了mp.weixin.qq.com以外的其它域名，因此无法在微信公众号中的引用阿里云OSS中的图床\n2 目标 把任意一张图片上传到微信公众号\n3 微信公众号限制 微信公众平台开发概述 微信限制\n3.1 Token限制 微信公众号获取Token的限制如下\n公众平台以access_token为接口调用凭据，来调用接口，所有接口的调用需要先获取access_token，access_token在2小时内有效，过期需要重新获取，但1天内获取次数有限，开发者需自行存储，详见获取接口调用凭据（access_token）文档\n3.2 素材限制，这里我们主要关系图片的限制 微信公众号临时素材限制如下\n1、临时素材media_id是可复用的。 2、媒体文件在微信后台保存时间为3天，即3天后media_id失效。 3、上传临时素材的格式、大小限制与公众平台官网一致。 图片（image）: 10M，支持PNG\\JPEG\\JPG\\GIF格式 语音（voice）：2M，播放长度不超过60s，支持AMR\\MP3格式 视频（video）：10MB，支持MP4格式 缩略图（thumb）：64KB，支持JPG格式 4、需使用https调用本接口。 接口调用请求说明 http请求方式：POST/FORM，使用https https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN\u0026type=TYPE 调用示例（使用curl命令，用FORM表单方式上传一个多媒体文件）： curl -F media=@test.jpg \u0026ldquo;","title":"通过golang手动上传图片到微信公众号"},{"content":"1 背景 自己开发了一个应用程序，想要再windows上后台运行，并且能够设置为开机启动。\n2 目标 可以在Windows上配置任意一个可执行文件后台启动，并且设置为开机启动。\n3 应用程序测试代码 测试代码非常简单，就是再运行之后，每隔三秒钟在可执行文件的同级目录的app-logs文件夹中创建文件。如果程序正常运行，那么我们就可以看到新创建的文件。\n编译命令：go build -o app.exe main.go\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;os\u0026#34; \u0026#34;time\u0026#34; ) func main() { dir := \u0026#34;app-logs\u0026#34; if err := os.MkdirAll(dir, os.ModePerm); err != nil { fmt.Printf(\u0026#34;%s\\n\u0026#34;, err) os.Exit(1) } for { file := fmt.Sprintf(\u0026#34;.\\\\%s\\\\app测试_%s.txt\u0026#34;, dir, time.Now().Format(\u0026#34;2006.01.02_15_04_05\u0026#34;)) _, err := os.Create(file) if err != nil { os.Exit(1) } time.Sleep(3 * time.Second) } } 4 解决方案 4.1 方案一 使用sc命令注册服务（不推荐） 4.1.1 相关命令 ⚠注意：这些命令的执行需要以管理员的方式打开CMD\n注册服务：sc create ceshi binpath= D:\\Project\\ceshi\\app.exe type= own start= auto displayname= ceshi，注意等号后面的空格\n删除服务：sc delete ceshi\n启动服务：sc start ceshi\n查看服务：sc query ceshi\n4.1.2 测试过程 测试日志如下\nC:\\Windows\\system32\u0026gt; C:\\Windows\\system32\u0026gt; C:\\Windows\\system32\u0026gt;sc create ceshi binpath= D:\\Project\\ceshi\\app.exe type= own start= auto displayname= ceshi [SC] CreateService 成功 C:\\Windows\\system32\u0026gt;sc query ceshi SERVICE_NAME: ceshi TYPE : 10 WIN32_OWN_PROCESS STATE : 1 STOPPED WIN32_EXIT_CODE : 1077 (0x435) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 C:\\Windows\\system32\u0026gt;sc start ceshi [SC] StartService 失败 1053: 服务没有及时响应启动或控制请求。 C:\\Windows\\system32\u0026gt; C:\\Windows\\system32\u0026gt;sc query ceshi SERVICE_NAME: ceshi TYPE : 10 WIN32_OWN_PROCESS STATE : 1 STOPPED WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x7d0 C:\\Windows\\system32\u0026gt; 4.1.3 弊端 这种方式注册的服务需要符合一定的规范，否则服务即使能够成功，启动服务时也极有可能报错\n4.2 方案二 使用WinSW包装应用程序为服务 4.2.1 步骤 第一步：下载WinSW软件：github下载链接\n第二步：把WinSW复制到需要启动应用的目录位置，然后重命名，譬如我这里重命名为app-server.exe。重命名的目的是为了后面书写命令更加方便\n第三步：在目录中新建和第二步同名的yml配置文件，譬如我这里就是app-server.xml\n当然也可以使用XML语法配置文件，WinSW都支持。YAML配置参考链接，XML配置参考链接\n# 服务ID名称（唯一） id: App-Server # 服务显示名称 name: App-Server # 服务的描述信息 description: 测试APP应用程序 # 环境变量设置 env: - name: \u0026#34;HOME\u0026#34; value: \u0026#34;%BASE%\u0026#34; # 要执行的可执行文件 executable: \u0026#34;%BASE%/app.exe\u0026#34; # 可执行文件传递的参数 # server: \u0026#39;%BASE%\\data\u0026#39; log: mode: roll-by-size logpath: \u0026#34;%BASE/log%\u0026#34; sizeThreshold: 10240 keepFiles: 8 ⚠注意：这里XML配置文件的名字必须和WinSW文件名相同，因为WinSW启动之后会去寻找同名的配置文件\n当前环境如下：\nPS D:\\Project\\ceshi\u0026gt; ls 目录: D:\\Project\\ceshi Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2024-03-19 21:59 18243033 app-server.exe -a---- 2024-03-19 22:42 859 app-server.xml -a---- 2024-03-19 21:13 4233216 app.exe 第四步：注册服务。以管理员身份启动CMD，进入到上述目录，执行install命令，譬如我这里为：app-server install\nD:\\Project\\ceshi\u0026gt;app-server install 2024-03-19 22:58:45,521 INFO - Installing service \u0026#39;App-Server (App-Server)\u0026#39;... 2024-03-19 22:58:45,547 INFO - Service \u0026#39;App-Server (App-Server)\u0026#39; was installed successfully. D:\\Project\\ceshi\u0026gt; 第五步：按下win + r，然后输入services.msc，打开服务页面，查看列表中是否存在前面注册的服务\n第六步：启动服务。以管理员身份启动CMD，进入到上述目录，执行start命令，譬如我这里为：app-server start\nD:\\Project\\ceshi\u0026gt;app-server start 2024-03-19 23:05:24,026 INFO - Starting service \u0026#39;App-Server (App-Server)\u0026#39;... 2024-03-19 23:05:24,341 INFO - Service \u0026#39;App-Server (App-Server)\u0026#39; started successfully. D:\\Project\\ceshi\u0026gt; 第七步：校验服务是否真正启动，是否异常退出。只要发现文件在不同的创建，就说明当前配置没有问题。\nPS D:\\Project\\ceshi\u0026gt; tree /f 卷 软件 的文件夹 PATH 列表 卷序列号为 D32A-2561 D:. │ app-server.exe │ app-server.xml │ app.exe │ ├─app-logs │ app测试_2024.03.20_07_31_30.txt │ app测试_2024.03.20_07_31_33.txt │ app测试_2024.03.20_07_31_36.txt │ app测试_2024.03.20_07_31_39.txt │ app测试_2024.03.20_07_31_42.txt │ app测试_2024.03.20_07_31_45.txt │ └─logs app-server.err.log app-server.out.log app-server.wrapper.log 第八步：查看服务状态。以管理员身份启动CMD，进入到上述目录，执行status命令，譬如我这里为：app-server status\nD:\\Project\\ceshi\u0026gt;app-server status Started D:\\Project\\ceshi\u0026gt; 4.2.2 WinSW命令说明 install：注册服务\nuninstall：卸载服务\nstart：启动服务，启动服务之前，该服务必须已经安装\nstop：停止服务\nstopwait：停止服务，直到服务退出，此命令才返回\nrestart：重启服务\nstatus：查看服务状态\n","permalink":"https://wangmin362.github.io/posts/tools/windows/01.windows%E8%87%AA%E5%AE%9A%E4%B9%89%E5%90%8E%E5%8F%B0%E8%BF%9B%E7%A8%8B%E5%B9%B6%E8%AE%BE%E7%BD%AE%E4%B8%BA%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8/","summary":"1 背景 自己开发了一个应用程序，想要再windows上后台运行，并且能够设置为开机启动。\n2 目标 可以在Windows上配置任意一个可执行文件后台启动，并且设置为开机启动。\n3 应用程序测试代码 测试代码非常简单，就是再运行之后，每隔三秒钟在可执行文件的同级目录的app-logs文件夹中创建文件。如果程序正常运行，那么我们就可以看到新创建的文件。\n编译命令：go build -o app.exe main.go\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;os\u0026#34; \u0026#34;time\u0026#34; ) func main() { dir := \u0026#34;app-logs\u0026#34; if err := os.MkdirAll(dir, os.ModePerm); err != nil { fmt.Printf(\u0026#34;%s\\n\u0026#34;, err) os.Exit(1) } for { file := fmt.Sprintf(\u0026#34;.\\\\%s\\\\app测试_%s.txt\u0026#34;, dir, time.Now().Format(\u0026#34;2006.01.02_15_04_05\u0026#34;)) _, err := os.Create(file) if err != nil { os.Exit(1) } time.Sleep(3 * time.Second) } } 4 解决方案 4.1 方案一 使用sc命令注册服务（不推荐） 4.1.1 相关命令 ⚠注意：这些命令的执行需要以管理员的方式打开CMD","title":"Windows自定义后台进程并设置为开机启动"}]