[Obcsapi v1] 微信使用 Remotely Save S3 兼容 发送到 Obsidian

注意
本文最后更新于 2024-04-21,文中内容可能已过时。

使用微信公众号实现,发送到腾讯COS。Obsidian 获取到消息。

最新版见 Obsidian 从本地到云端 obcsapi v3.0

!!! 注意 新项目已发布 Obsidian 从本地到云端 obcsapi v3.0
下面文章属于 2.0 版本,新项目是 3.0 版本。请读者根据自身实际情况酌情选择

  1. 带公网ip的服务器并装有python3环境
  2. 微信公众号的测试号
  3. 腾讯云 COS
  1. 微信公众号测试号APP_ID
  2. 微信公众号测试号APP_SECRET
  3. 腾讯云 secret_id
  4. 腾讯云 secret_key
  5. 腾讯云 COS 相关信息 包括 region,Bucket 名
  1. 服务器安装依赖模块 pip3 install werobot 和 pip3 install cos-python-sdk-v5
  2. 将准备的数据填写至程序 # 相关信息 中 ,如果想要改服务器端口可以在 robot.config[“PORT”] = “8008” 更改
  3. 开放 Linux 服务器8008端口 ; 开放 腾讯云安全组 8008 端口
  4. 运行程序并挂后台 ,我使用的是 宝塔面板 python 项目管理器 运行的该项目

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()

扫码测试号二维码,然后可以看到用户列表中多了一个人。然后就可以发送消息了。

微信公众号样子
发送的信息保存到 Obsidian
图片会保存两个文件 一个在附件里 一个是 md
配合 dataview 能够显示所有信息
  1. 公众号毕竟有公众属性,并不是为个人服务准备的。或许可以使用鉴别用户 id 的方法防止不相干的人关注和发送消息,但是最好的解决方法是使用用户系统。
  2. 上面这个程序有时候会报错,甚至有崩溃过。毕竟只是顺手写的。
  3. 发送图片时,后台能获取到一个图片链接。但是图片会被压缩。
  4. 接收图片以![](https://abc.com/123.jpg)形式保存至 yaml 中时是能被 dataview 显示出来的。但是上面程序选择了保存图片至本地附件文件夹并且使用的是 ![[]]的形式。
  5. 关于 dataview 不会显示 md 中图片这个问题,我尝试了很久,也没解决这个问题。dataview 没有找到显示正文的函数,yaml 显示还有一点问题。如果有人解决了希望 发邮件 告诉我一声,或者通过 哔哩哔哩 联系我,我会在本文中记录。

使用的框架文档

werobot说明文档

cos上传文档

公众号搭建可以在 哔哩哔哩网站 搜索 werobot 学习

COS 和 Obsidian 插件 Remotely Save 使用说明: Obsidian 同步 Remotely Save S3 配置指南