微信使用 Remotely Save S3 兼容 发送到 Obsidian

系列 - Obsidian 使用指南
警告
本文最后更新于 2022-02-11,文中内容可能已过时。

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

最新版见 微信到 Obsidian 2.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 配置指南