Skip to content

使用免费Web协议

使用免费Web协议

一、介绍

底层的对接实现是基于TypeScript语言,故无法直接在python-wechaty中使用该服务。可是Wechaty社区能够直接将其转化成对应的服务让多语言调用,从而实现:底层复用的特性。

整体步骤分为两步:

  • 使用Docker启动web协议服务
  • 使用python-wechaty连接服务

二、启动Web协议服务

docker pull wechaty/wechaty:0.65

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

# save login session
if [ ! -f "${WECHATY_TOKEN}.memory-card.json" ]; then
touch "${WECHATY_TOKEN}.memory-card.json"
fi

docker run -ti \
--name wechaty_puppet_service_token_gateway \
--rm \
-v "`pwd`/${WECHATY_TOKEN}.memory-card.json":"/wechaty/${WECHATY_TOKEN}.memory-card.json" \
-e WECHATY_LOG \
-e WECHATY_PUPPET \
-e WECHATY_PUPPET_SERVER_PORT \
-e WECHATY_PUPPET_SERVICE_NO_TLS_INSECURE_SERVER \
-e WECHATY_TOKEN \
-p "$WECHATY_PUPPET_SERVER_PORT:$WECHATY_PUPPET_SERVER_PORT" \
wechaty/wechaty:0.65

注意:

  • WECHATY_TOKEN 必须使用生成的UUID来替换,不然直接使用该token来启动的服务很容易被他人盗窃。

小伙伴们可在python解释器中运行以下代码来获得随机TOKEN:

# 例如:b2ff8fc5-c5a2-4384-b317-3695807e483f
import uuid;print(uuid.uuid4());

三、连接服务

当使用docker来启动web服务时,可分为在本地环境测试以及在远端环境中测试,在连接方式上有一些不一样。

3.1 本地WEB服务

当在计算机本地启动web服务后,可直接使用python-wechaty连接本地的服务,不通过token来获取对应的服务连接地址。示例代码如下:

export WECHATY_PUPPET_SERVICE_ENDPOINT=127.0.0.1:8080

或者

import os
os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT'] = '127.0.0.1:8080'

当你的服务和python-wechaty机器人代码都部署在服务器中时,此时也属于本地服务,可使用此方法来配置。

3.2 远端服务

当把服务部署在远端服务器中时,要保证该计算机能够被外网访问到,且对应端口开放。例如在上述示例脚本中,比如保证服务器的8080端口开放,而你的服务器IP为:10.12.123.23,此时可直接设置服务连接地址:

export WECHATY_PUPPET_SERVICE_ENDPOINT=10.12.123.23:8080

或者

import os
os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT'] = '10.12.123.23:8080'

四、编写代码

talk is cheep, show you the code

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

欢迎各位品尝以上代码 🥳