老早就想搞一个微信机器人了,但之前的可爱猫只能在Windows上运行,还要下载指定版本微信,怪麻烦的,想着有没有类似Mirai之类的可以挂在Linux上的机器人。这几天发现了Wechaty满足我的需要。
这次有了免费的Web版的了,不需要token就可以(购买的话200RMB/月,买不起买不起),我用的Python-wechaty,先用docker启动wechaty服务登录微信,在用python连接wechaty进行消息处理。
以下教程摘自官方文档。

  1. 启动Web协议服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    docker pull wechaty/wechaty:latest

    export WECHATY_LOG="verbose"
    export WECHATY_PUPPET="wechaty-puppet-wechat"
    export WECHATY_PUPPET_SERVER_PORT="8080"
    export WECHATY_TOKEN="python-wechaty-{uuid}"

    docker run -ti \
    --name wechaty_puppet_service_token_gateway \
    --rm \
    -e WECHATY_LOG \
    -e WECHATY_PUPPET \
    -e WECHATY_PUPPET_SERVER_PORT \
    -e WECHATY_TOKEN \
    -p "$WECHATY_PUPPET_SERVER_PORT:$WECHATY_PUPPET_SERVER_PORT" \
    wechaty/wechaty:latest

    其中WECHATY_PUPPET类似平台比如IPAD、PC等,这里选择Web端。WECHATY_TOKEN为自己设定,类似消息密钥,可由import uuid;print(uuid.uuid4());生成

  2. 连接服务

    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
    import os
    os.environ['WECHATY_PUPPET_SERVICE_TOKEN']="python-wechaty-{uuid}"
    os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT']="ip:8084"

    import asyncio
    from typing import List, Optional, Union

    from wechaty_puppet import FileBox # type: ignore

    from wechaty import Wechaty, Contact
    from wechaty.user import Message, Room


    class MyBot(Wechaty):

    async def on_message(self, msg: Message):
    """
    listen for message event
    """
    from_contact: Optional[Contact] = msg.talker()
    text = msg.text()
    room: Optional[Room] = msg.room()
    if text == 'ding':
    conversation: Union[
    Room, Contact] = from_contact if room is None else room
    await conversation.ready()
    await conversation.say('dong')
    file_box = FileBox.from_url(
    'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/'
    'u=1116676390,2305043183&fm=26&gp=0.jpg',
    name='ding-dong.jpg')
    await conversation.say(file_box)

    asyncio.run(MyBot().start())

    给机器人发送ding,会回复dong加一张图片。

之后再探索出别的我再写,先这样