[Obcsapi v1] 微信使用 Remotely Save S3 兼容 发送到 Obsidian
系列 -
目录
注意
本文最后更新于 2024-04-21,文中内容可能已过时。
使用微信公众号实现,发送到腾讯COS。Obsidian 获取到消息。
最新版见 Obsidian 从本地到云端 obcsapi v3.0
!!! 注意 新项目已发布 Obsidian 从本地到云端 obcsapi v3.0
下面文章属于 2.0 版本,新项目是 3.0 版本。请读者根据自身实际情况酌情选择
基础要求
- 带公网ip的服务器并装有python3环境
- 微信公众号的测试号
- 腾讯云 COS
准备数据
- 微信公众号测试号APP_ID
- 微信公众号测试号APP_SECRET
- 腾讯云 secret_id
- 腾讯云 secret_key
- 腾讯云 COS 相关信息 包括 region,Bucket 名
服务端搭建
- 服务器安装依赖模块 pip3 install werobot 和 pip3 install cos-python-sdk-v5
- 将准备的数据填写至程序 # 相关信息 中 ,如果想要改服务器端口可以在 robot.config[“PORT”] = “8008” 更改
- 开放 Linux 服务器8008端口 ; 开放 腾讯云安全组 8008 端口
- 运行程序并挂后台 ,我使用的是 宝塔面板 python 项目管理器 运行的该项目
# -*- coding=utf-8
# werobot cos-python-sdk-v5
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import werobot
import time
import requests
# 相关信息
token = "token" # 自定义
APP_ID = "wxxxxxxxxxxxxxxxxx" # 微信公众号测试号APP_ID
APP_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 微信公众号测试号APP_SECRET
secret_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 腾讯云 secret_id
secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxx" # 腾讯云 secret_key
region = "ap-nanjing" # 腾讯云 COS
cos_token = None # 腾讯云 COS token
scheme = "https" # 腾讯云 COS 访问模式
bucket = "test-0123456789" # 腾讯云 Bucket
# werobot 配置
robot = werobot.WeRoBot(token=token)
robot.config["APP_ID"] = APP_ID
robot.config["APP_SECRET"] = APP_SECRET
# cos 配置
config = CosConfig(
Region=region,
SecretId=secret_id,
SecretKey=secret_key,
Token=cos_token,
Scheme=scheme,
)
client = CosS3Client(config)
# rob_client = robot.client
# rob_client.create_menu({
# "button":[{
# "type": "click",
# "name": "用户信息",
# "key": "info"
# }]
# })
# 菜单点击 输入信息 这个菜单影响快速输入信息 不方便
# @robot.key_click("info")
# def music(message):
# return '你点击了“用户信息”按钮'
# 关注回复
@robot.subscribe
def subscribe(message):
return "这是恐咖兵糖的测试公众号"
# 文字消息回复 put_object append_object
@robot.text
def text_reply(message):
yaml_str = message.content
yaml = (
"---\ncontent: " + yaml_str.replace("\n", "<br>") + "\n---\n"
) # 将内容存入 yaml 字段 方便 dataview 使用 替换换行防止出错
btyes = bytes(yaml + message.content, encoding="utf8")
name = time.strftime("%Y%m%d%H%M%S", time.localtime())
response = client.put_object(
Bucket=bucket,
Body=btyes,
Key="微信收藏/" + name + ".md",
)
return response["ETag"]
# 图片消息
@robot.image
def image_reply(message):
# btyes = bytes("![]("+message.img+")", encoding = "utf8") # 直接使用腾讯链接显示图片
file = requests.get(message.img)
name = time.strftime("%Y%m%d%H%M%S", time.localtime())
response1 = client.put_object(
Bucket=bucket,
Body=file.content,
Key="微信收藏/附件/" + name + ".jpg",
)
conent = "![[附件/" + name + ".jpg]]"
yaml = "---\ncontent: " + conent + "\n---\n"
btyes = bytes(yaml + conent, encoding="utf8")
response2 = client.put_object(
Bucket=bucket,
Body=btyes,
Key="微信收藏/" + name + ".md",
)
return response1["ETag"] + response2["ETag"]
@robot.error_page
def make_error_page(url):
return "404"
@robot.handler
def error_message(message):
return "不支持的消息类型"
robot.config["HOST"] = "0.0.0.0"
robot.config["PORT"] = "8008"
robot.run()
基本使用
扫码测试号二维码,然后可以看到用户列表中多了一个人。然后就可以发送消息了。
问题和缺点
- 公众号毕竟有公众属性,并不是为个人服务准备的。或许可以使用鉴别用户 id 的方法防止不相干的人关注和发送消息,但是最好的解决方法是使用用户系统。
- 上面这个程序有时候会报错,甚至有崩溃过。毕竟只是顺手写的。
- 发送图片时,后台能获取到一个图片链接。但是图片会被压缩。
- 接收图片以![](https://abc.com/123.jpg)形式保存至 yaml 中时是能被 dataview 显示出来的。但是上面程序选择了保存图片至本地附件文件夹并且使用的是 ![[]]的形式。
- 关于 dataview 不会显示 md 中图片这个问题,我尝试了很久,也没解决这个问题。dataview 没有找到显示正文的函数,yaml 显示还有一点问题。如果有人解决了希望 发邮件 告诉我一声,或者通过 哔哩哔哩 联系我,我会在本文中记录。
相关资料
使用的框架文档
公众号搭建可以在 哔哩哔哩网站 搜索 werobot 学习
COS 和 Obsidian 插件 Remotely Save 使用说明: Obsidian 同步 Remotely Save S3 配置指南
欢迎赞赏~
赞赏