智能手表短信读取实现具体教程(带有eSIM卡,无短信功能,可安装手表QQ的智能手表)Version2.0改进版

1 前言

像华为watch3这款智能手表,不带短信功能,一号双终端的设备,三大运营商都不支持短信服务,手机不在身边收取短信如验证码、快递信息等很不方便,因此开发出此方法,解决信息读取问题。

2 思路

  1. 手表端安装QQ软件(有教程,自己搜一下);
  2. 用flask写一个简单的网页用于接受短信;
  3. 利用花生壳实现内网穿透,使搭建的flask网页可以被公网访问;
  4. 利用手机APP smsfowarder (短信转发器)将手机短信实时转发(post请求)到网页上(自己搭建信息可控,速度快捷);
  5. 从网页端获取最新的短信(get请求);
  6. 利用nonebot和go-cqhttp搭建QQ机器人(使用另一个QQ号),实时监控网页短信变化,发送到手表端QQ号上,实现短信读取;
  7. 程序可以全天候挂着,短信收取延时在5秒内。

3 步骤

  • 手机端

    1. 安装smsfowarder (短信转发器),应用锁,后台允许允许,防止杀后台;
      image-20210805170451767

    2. smsfowarder设置,设置发送方,添加发送方,选择发送到Webhook
      image-20210808161053361
      这里的地址填花生壳内网穿透产生的地址,后面要加上”/msg“,具体看后面的内网穿透部分

    3. **注意:**验证码之类的短信有的手机有保护无法转发,解决方法以华为手机为例,右上角点击进入设置,取消选中验证码安全保护即可

      image-20210805183115675
      image-20210805183205109

  • flask页面搭建及信息获取
    思路:相同的地址,post请求用于发送信息,get请求用于获取信息

    # -*- coding: utf-8 -*-
    # @FileName: flask短信转发服务器.py
    # @Author  : XuLei
    # @Time    : 2021/8/7 12:48
    # @Software: PyCharm
    # @Version : 1.0
    
    
    import flask, json
    from flask import request
    import io
    
    server = flask.Flask(__name__)
    glob_msg_from = None
    glob_msg = None
    
    # 访问这个网址"http://你的ipv4地址:你最底下设置的端口号/msg"
    @server.route('/msg', methods=['get', 'post'])
    def msg():
        if request.method == "POST":
            msg_from = request.form.get("from")
            msg = request.form.get("content")
            # print(msg_from)
            global glob_msg_from
            global glob_msg
            glob_msg_from = msg_from
            glob_msg = msg
            if msg:
                resu = {'code': 200, 'message': '成功', "from": msg_from, "msg": msg}
                # json.dumps()将字典改为json,json.load()将字符串接送改为字典
                return json.dumps(resu, ensure_ascii=False)
            else:
                return json.dumps({'code': 400, 'message': '失败', "from": msg_from, "msg": msg}, ensure_ascii=False)
        if request.method == "GET":
            return json.dumps({"from": glob_msg_from, "msg": glob_msg}, ensure_ascii=False)
    
    if __name__ == '__main__' :
        # host='0.0.0.0'这样就是本地的IPV4地址了。可以ipconfig -all中查看,方便内网穿透,port555为端口
        server.run(debug=True, host='0.0.0.0', port=5555)
    
  • 花生壳内网穿透,实现公网访问
    下载花生壳注册登录,实名认证,免费的会有一个月1G流量,1M带宽,完全够用!
    image-20210808160448383

    具体设置如图

    image-20210808160729256
    开启之后就可以实现公网访问页面了!

    这里的访问地址+“/msg”就是你要填到手机短信转发器的地址!

  • 利用nonebot和go-cqhttp搭建QQ机器人实现消息转发(视频教程可看:https://www.bilibili.com/video/BV1JK4y1D7kX?p=1)

    使用的是nonebot2.0版本,用过1.0的要先卸载,主页:https://v2.nonebot.dev/

    1. 安装nonebot(我的python环境用annoconda建立的虚拟环境,在pycharm的Terminal中安装的,你们也可以直接在cmd中安装)
      输入以下命令(使用的豆瓣源比较快):

      pip install nb-cli -i https://pypi.douban.com/simple
      

      image-20210805185035352
      顺带安装安装 NoneBot CQHTTP 适配器,后面使用go-cqhttp时要用到,提前装上

      pip install nonebot-adapter-cqhttp -i https://pypi.douban.com/simple
      
    2. nonebot初步设置
      先创建一个空项目,如果是在虚拟环境中创建,就在虚拟环境下输入,不是就在想要创建的目录下shift+右键打开powershell输入以下命令

      nb create
      

      之后输入项目名称、插件放置位置(一般在src中)、是否加载内置插件选y,确认选y

      创建完之后项目文件夹下会有如下文件(修改.env和bot.py就行)
      image-20210805190106129

      .env中将ENVIRONMENT=dev修改为ENVIRONMENT=prod
      bot.py修改为如下代码:

      #!/usr/bin/env python3
      # -*- coding: utf-8 -*-
      
      import nonebot
      from nonebot.adapters.cqhttp import Bot as CQHTTPBot
      
      # Custom your logger
      # 
      # from nonebot.log import logger, default_format
      # logger.add("error.log",
      #            rotation="00:00",
      #            diagnose=False,
      #            level="ERROR",
      #            format=default_format)
      
      # You can pass some keyword args config to init function
      nonebot.init()
      app = nonebot.get_asgi()
      
      driver = nonebot.get_driver()
      driver.register_adapter("cqhttp", CQHTTPBot)
      nonebot.load_builtin_plugins()
      nonebot.load_from_toml("pyproject.toml")
      
      # Modify some config / config depends on loaded configs
      # 
      # config = driver.config
      # do something...
      
      
      if __name__ == "__main__":
          nonebot.logger.warning("Always use `nb run` to start the bot instead of manually running!")
          nonebot.run(app="__mp_main__:app")
      
    3. go-cqhttp设置(文档地址:https://docs.go-cqhttp.org/)
      下载单独的go-cqhttp.exe文件,下载地址:https://github.com/Mrs4s/go-cqhttp/releases
      下载完先运行一下,有的第一次要选功能(我直接12345全选了),生成其它的文件,关闭

      image-20210805190712532

      然后需要修改config.yml文件,可以参考官网,需要修改两个地方一个是你要用的QQ号和密码,一个是反向WS设置,直接复制我下面的代码替换就可以了。
      image-20210805191559733
      image-20210805191637160

      # 反向WS设置
        - ws-reverse:
            # 反向WS Universal 地址
            # 注意 设置了此项地址后下面两项将会被忽略
            # universal: ws://your_websocket_universal.server
            universal: ws://127.0.0.1:8080/cqhttp/ws
            # 反向WS API 地址
            # api: ws://your_websocket_api.server
            api: ""
            # 反向WS Event 地址
            # event: ws://your_websocket_event.server
            event: ""
            # 重连间隔 单位毫秒
            reconnect-interval: 3000
            middlewares:
              <<: *default # 引用默认中间件
      

      这个时候在运行go-cqhttp.exe程序,就可以登录了

      将nonebot和go-cqhttp.exe关联,先运行bot.py文件,看到下面的就可以运行go-cqhttp了

      image-20210805192302579

      再运行go-cqhttp.exe(可以双击、powershell、cmd中运行,也可以在pycharm中运行)
      image-20210805192415289

      至此QQ机器人搭建完成

  • 将爬虫和QQ机器人结合,实现短信转发

    编写插件,在nonebot之前建的项目文件夹下的src目录中新建插件py文件(运行bot.py时,插件会自动加载)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQO0Cizq-1628411124045)(C:/Users/13589/AppData/Roaming/Typora/typora-user-images/image-20210808155129185.png)]

    # -*- coding: utf-8 -*-
    # @FileName: message_send_self_flask.py
    # @Author  : XuLei
    # @Time    : 2021/8/7 23:12
    # @Software: PyCharm
    # @Version : 1.0
    
    
    from nonebot import require
    import nonebot
    import requests
    
    # 自己的页面没必要反爬,生成随机的UserAgent
    
    url = "http://192.168.1.113:5555/msg"
    
    message_old = ""    # 用来控制爬取到的短信是否是新短信,新的才转发到QQ,旧的不转发
    
    # 间隔发送,1s
    scheduler = require("nonebot_plugin_apscheduler").scheduler
    @scheduler.scheduled_job("cron", second="*/1", id="sleep_sched")
    
    async def message_send():
        r = requests.get(url)    # post过去的消息好像存不了多长时间就变为none了
        message = r.json()["msg"]  # 返回json数据{'from': '18852853719', 'msg': '你好吗'},无便返回None,注意message中包括来源,只用msg即可
        global message_old
        if message != None:
            if message != message_old:
                print("最新短信:{}\n".format(message))
                bot = nonebot.get_bots()["QQ机器人QQ号"]
                await bot.call_api("send_msg", **{
                    "message": message,
                    "user_id": "接收端QQ号"
                })
                message_old = message
    

    至此整个短信转发项目就搭建完成了

开启花生壳,运行flask短信转发服务器.py,再运行bot.py文件,最后运行go-cqhttp.exe程序就可以实时将手机短信实时转发到手表端的QQ上了,运行一下试试吧!

效果:

img


较上一版改进部分

  • 搭建了自己的flask短信接受页面,信息自主可控,而且获取信息方便快捷(不想上面爬虫老费事了)简单post、get即可
  • 利用花生壳内网穿透,实现公网访问
  • 代码精简,新建了none-bot机器人的插件,用于定时获取短信信息、转发
  • 开启顺序flask→bot→go-cqhttp
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值