SexyLady 发表于 2022-9-30 13:17

微信机器人终端

本帖最后由 SexyLady 于 2022-9-30 23:28 编辑

bot console 是本人最近研发的一款项目,目前存放在github中
bot console未来的设想就是做成telegram一样强大的机器人群体集控终端
在自定义机器人和脚本这块可以说是自由度非常高,当然对编程技术也有一定要求,有兴趣的可以一起开发和讨论,也感谢收听的观众支持{:1_893:}
script下的脚本代码主要就是集成了指令,例如 /help /天气-北京 等,指令也在代码中详细的介绍
wx下的则是自定义的群机器人,目前有debug版本和后台版,可以自定义监控的群组
打包好的下载地址:zip下载

from requests import request


class Spider:
    # address:https://github.com/CJ-from-LosSantos/bot-console/releases/tag/%E5%8F%91%E5%B8%83
    token = "EOk6j38PELxUwJy8"

    def __init__(self):
      self.headers = {'Content-Type': "application/x-www-form-urlencoded"}

    @staticmethod
    def other(key):
      url = f'https://cn.bing.com/search?q="{key}"&FORM=BESBTB'
      return f'😢没有该指令,已自动根据你的指令搜索到如下内容,请点击查看\n{url}'

    @staticmethod
    def what_to_eat_today(*args):
      """
      今天吃什么
      :docs: https://www.apispace.com/eolink/api/eat222/apiDocument
      """
      url = "https://eolink.o.apispace.com/eat222/api/v1/forward/chishenme"
      payload = {"size": "3"}
      headers = {
            "X-APISpace-Token": "zbxmug9fyd25pvq7b37urfl2yqm46f0g",
            "Authorization-Type": "apikey"
      }

      result = request('GET', url, params=payload, headers=headers).json()
      if result['code'] == 200:
            return f'亲~,今日推荐的食谱,三选一吧🥙:\n【{result["data"]}】'

      return 'api 错误或者失效了'

    def help_(self, *args):
      return f'🚩 命令格式:/命令名称\n🚩 注意:命令带有下划线请忽略填写\n🚩 命令列表:{list(self.By.keys())}'

    def query_virus_cities(self, province, city=None, county=None):
      """
      疫情风险地区查询
      :docs: https://alapi.cn/api/view/106
      """
      url = "https://v2.alapi.cn/api/springTravel/risk"
      payload = {
            'token': self.token,
            'province': province,
            'city': city,
            "country": county
      }

      result = request('POST', url, params=payload, headers=self.headers).json()
      if result['code'] == 200:

            if 10 > len(result['config']['high_list']) > 0:
                high_list = result['config']['high_list']
                msg = ''.join(f"{row['area_name']} - ⛔ 高风险社区:{len(row['communitys'])}个\n" for row in high_list)
            elif city is None:
                msg = f"{province} ⛔ 存在高风险地区:{result['config']['high_count']}个\n"
            else:
                msg = f"{city} ⛔ 存在高风险地区:{result['config']['high_count']}个\n"
            msg = f"{msg}⚠ 存在中风险地区:{result['config']['middle_count']}个\n最新发布时间:{result['config']['end_update_time']}"

            return msg

      return 'api 错误或者失效了'

    def get_healthy_travel(self, from_, to):
      """
      出行防疫政策指南
      :docs: https://alapi.cn/api/view/87
      """
      return '该接口已取消'
      # table = City()
      # from_id = table.get_city_id(from_)
      # to_id = table.get_city_id(to)
      #
      # url = "https://v2.alapi.cn/api/springTravel/query"
      # payload = {
      #   'token': self.token,
      #   'from': from_id,
      #   'to': to_id
      # }
      #
      # result = request('POST', url, params=payload, headers=self.headers).json()
      # if result['code'] == 200:
      #   out_desc = result['config']['from_info']['out_desc']
      #   out_code_name = result['config']['from_info']['health_code_name']
      #   in_desc = result['config']['to_info']['low_in_desc']
      #   in_code_name = result['config']['to_info']['health_code_name']
      #
      #   return f"🌏 {from_}出站:\n📕 健康码:{out_code_name}\n🚆 {out_desc}\n🌏 {to}进站:\n📕 健康码:{in_code_name}\n🚆 {in_desc}\n"

    def get_weather(self, city=None):
      """
      国内天气查询
      :docs: https://alapi.cn/api/view/65
      """
      url = 'https://v2.alapi.cn/api/tianqi'
      payload = {
            'token': self.token,
            'city': city
      }

      result = request('POST', url, params=payload, headers=self.headers).json()
      if result['code'] == 200:
            hour_list = result['config']['hour']
            msg = ''.join(f"⏰ {row['time'].split()[-1]} - {row['wea']} - {row['temp']}°\n" for row in hour_list)
            msg = f'今日早晨-明日早晨\n{msg}'

            return msg

      return 'api 错误或者失效了'

    def query_logistics(self, number):
      """
      快递查询
      :docs: https://alapi.cn/api/view/63
      """
      url = 'https://v2.alapi.cn/api/kd'
      payload = {
            'token': self.token,
            'number': number,
            'order': 'asc'
      }

      result = request('POST', url, params=payload, headers=self.headers).json()
      if result['code'] == 200:
            new_state = result['config']['info'][-1]
            return f"⏰ 最新更新时间:{new_state['time']}\n📦 {new_state['content']}"

      return 'api 错误或者失效了'

    def get_news_to_day(self):
      """
      每日60秒早报
      :docs: https://alapi.cn/api/view/93
      """
      url = 'https://v2.alapi.cn/api/zaobao'
      payload = {
            'token': self.token,
            'format': 'json'
      }

      result = request('POST', url, params=payload, headers=self.headers).json()
      if result['code'] == 200:
            image_url = result['config']['image']
            c = request('GET', image_url).content
            filename = r'D:\GI\network-tools\images\zaobao.png'

            with open(filename, 'wb') as f:
                f.write(c)

            return filename

      return 'api 错误或者失效了'

    def oneiromancy(self, key):
      """
      周公解梦
      :docs: https://www.apispace.com/eolink/api/zgjm/guidence/
      """
      url = "https://eolink.o.apispace.com/zgjm/common/dream/searchDreamDetail"
      payload = {"keyword": key}
      headers = {
            "X-APISpace-Token": "zbxmug9fyd25pvq7b37urfl2yqm46f0g",
            "Authorization-Type": "apikey",
            "Content-Type": "application/x-www-form-urlencoded"
      }
      result = request('POST', url, data=payload, headers=headers).json()
      if result['statusCode'] == '000000':
            contents = result["result"]
            msg = ''.join(f'关键字:{key}\n内容:{c["content"]}' for c in contents)

            return msg

      return 'api 错误或者失效了'


class BySpiderCommand(Spider):
    By = None

    def __init__(self):
      super().__init__()
      self.By = {
            'help': self.help_,
            'other': self.other,
            '疫情查询': self.query_virus_cities,
            '出行防疫': self.get_healthy_travel,
            '天气': self.get_weather,
            '快递': self.query_logistics,
            '早报': self.get_news_to_day,
            '吃东西': self.what_to_eat_today,
            '解梦': self.oneiromancy,
      }

# 使用方法

## 支持的微信版本下载 (https://github.com/tom-snow/wechat-windows-versions/releases/download/v3.6.0.18/WeChatSetup-3.6.0.18.exe)

## 初始化

1. 下载代码后解压

2. 在有`bot.exe`的目录下进入终端,执行`bot init test_robot`

3. 正常情况下初始化命令执行成功会生成了一些机器人启动的文件

## 启动

1. 在有`bot.exe`的目录下进入终端,执行`bot start test_robot`

2. 如果您没有登录pc端微信,他将会弹出登录窗口,扫描即可,随后机器人将管控您的微信
   
   1. 如果您已在pc端登陆,极有可能也会弹出扫码窗口,忽略即可

3. 验证机器人是否成功,在包含被机器人管控的群组中输入`/help`发送,将会收到机器人回复
   
   1. 如果未收到回复,请尝试退出微信以启动机器人后弹出的扫码界面扫码进入

## 结束

1. 在有`bot.exe`的目录下进入终端,执行`bot close`

## 其他自定义

- 可以自定义脚本命令,参考script/spider.py文件格式,同时记得同步修改配置文件(yaml)

- 可以机器人脚本,暂无参考

SexyLady 发表于 2022-9-30 17:12

SexyLady 发表于 2022-9-30 16:37
可以到git中,哪里有交流学习群

https://gitcode.net/m0_47048494/bot-console可以看这里

SexyLady 发表于 2022-9-30 17:11

dickyuan 发表于 2022-9-30 16:52
最近想弄机器人,先MARK一下 回家弄弄, 就是不知道用这个机器人会不会封号。那只能用小号测试了
不知道...

自己搞一搞可以的,可以尝试下,我未来对这个项目的规划就是不是在云端,当然,前提是它能够和telegram的机器人一样强大

zhysf 发表于 2022-9-30 14:53

不错,拿走啦,测试完回来再感谢

bobo2017365 发表于 2022-9-30 15:06

先Mark以下,后期再来尝试

潋天堂 发表于 2022-9-30 16:08

可以自动转发微信群消息、图片吗?

sexbomb 发表于 2022-9-30 16:17

感觉不怎么会用,是不是必须用支持的微信版本?才能激活这个机器人?

wan456 发表于 2022-9-30 16:19

ALAPI 的API接口做了个小程序

mengqiu 发表于 2022-9-30 16:30

SexyLady 发表于 2022-9-30 16:33

sexbomb 发表于 2022-9-30 16:17
感觉不怎么会用,是不是必须用?才能激活这个机器人?

是的,链接地址是官方的,这您放心,你自己也可以去微信官网找历史版本对应的下载

SexyLady 发表于 2022-9-30 16:35

潋天堂 发表于 2022-9-30 16:08
可以自动转发微信群消息、图片吗?

可以的,具体可以自定义wx下的脚本,script和wx目下的都可以自定义,自由度很高,未来可能我会初始一个模板供用户选择,让bot console变得更好

xpsp1 发表于 2022-9-30 16:35

看了几遍也没看懂哈...
页: [1] 2 3 4 5 6 7 8
查看完整版本: 微信机器人终端