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

使用微信公众号实现,发送到腾讯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 项目管理器 运行的该项目
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# -*- 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()

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

https://cdn.ftls.xyz/images/2022/02/微信图片_20220210210446.jpg
微信公众号样子
https://cdn.ftls.xyz/images/2022/02/ob_test1.png
发送的信息保存到 Obsidian
https://cdn.ftls.xyz/images/2022/02/ob_test3.png.png
图片会保存两个文件 一个在附件里 一个是 md
https://cdn.ftls.xyz/images/2022/02/ob_test2.png
配合 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 配置指南