首页 > 其他分享 >使用go-cqhttp搭建qq机器人

使用go-cqhttp搭建qq机器人

时间:2023-05-13 19:22:05浏览次数:53  
标签:qq socket rev cqhttp msg go import type

使用go-cqhttp搭建qq机器人--python处理消息

1.环境部署

  • 下载后解压,会有三个文件,点击运行exe

  • 生成bat文件,再运行

  • 运行bat,填入0,然后生成配置文件config.yml;填入qq号和密码(不过填入密码,一直登陆失败,最后还是选择扫码登陆)

  • 取消倒数三四排的代码注释,开启监听端口api,方便后续操作

  • 打开device.json文件,修改protocol的值为2,否则一直登陆失败

  • 最后再次点击bat文件运行,扫码登陆;显示如下就表示登陆成功以及cqhttp接管qq成功

2.python代码

  • receive.py文件负责监听socket(端口要和上面配置文件中的端口一致),接收由cqhttp传来的消息;

    import socket
    import json
    
    ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ListenSocket.bind(('127.0.0.1', 5701))
    ListenSocket.listen(100)
    HttpResponseHeader = '''HTTP/1.1 200 OK\r\n
    Content-Type: text/html\r\n\r\n
    '''
    
    
    def request_to_json(msg):
        for i in range(len(msg)):
            if msg[i] == "{" and msg[-1] == "\n":
                return json.loads(msg[i:])
        return None
    
    
    # 需要循环执行,返回值为json格式
    def rev_msg():  # json or None
        Client, Address = ListenSocket.accept()
        Request = Client.recv(1024).decode(encoding='utf-8')
        rev_json = request_to_json(Request)
        Client.sendall((HttpResponseHeader).encode(encoding='utf-8'))
        Client.close()
        return rev_json
    
    
  • send_msg.py;python后端处理消息后返回的消息由该文件发出

    import socket
    
    port = 5700
    
    
    def send_msg(resp_dict):
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        ip = '127.0.0.1'
        client.connect((ip, port))
    
        msg_type = resp_dict['msg_type']  # 回复类型(群聊/私聊)
        number = resp_dict['number']  # 回复账号(群号/好友号)
        msg = resp_dict['msg']  # 要回复的消息
    
        # 将字符中的特殊字符进行url编码
        msg = msg.replace(" ", "%20")
        msg = msg.replace("\n", "%0a")
    
        if msg_type == 'group':
            payload = "GET /send_group_msg?group_id=" + str(
                number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + f":{port}\r\nConnection: close\r\n\r\n"
        elif msg_type == 'private':
            payload = "GET /send_private_msg?user_id=" + str(
                number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + f":{port}\r\nConnection: close\r\n\r\n"
        print("发送" + payload)
        client.send(payload.encode("utf-8"))
        client.close()
        return 0
    
  • bot.py最关键的文件,负责写一些逻辑,像接收到什么消息返回特点的消息

    import re
    
    from receive import rev_msg
    from send_msg import send_msg
    import socket
    import requests
    import random
    import urllib.request, json
    import other_api
    
    while True:
        try:
            rev = rev_msg()
            print(rev)
            if rev == None:
                continue
        except:
            continue
    
        if rev["post_type"] == "message":
            if rev["message_type"] == "private":  # 私聊
    
                if '在吗' in rev['raw_message']:
                    qq = rev['sender']['user_id']  # 获取消息发出者的qq号
                    send_msg({'msg_type': 'private', 'number': qq, 'msg': '我在'})  # 发送
    
    
    
            elif rev["message_type"] == "group":  # 群聊
                group = rev['group_id']
                if '在吗' in rev['raw_message']:
                    qq = rev['sender']['user_id']
                    send_msg({'msg_type': 'group', 'number': group, 'msg': '你好'})
            else:
                continue
        else:  # rev["post_type"]=="meta_event":
            continue
    
    
  • 记得将所有py文件放在同一目录,最后运行bot.py文件

  • 测试效果:

  • 一些测试代码:

    •                 elif '热搜' in rev['raw_message']:
                          qq = rev['sender']['user_id']
                          result = other_api.rs()
                          result_rs = ''
                          for i in range(15):
                              t = str(i + 1) + ":" + result[i] + "\n"
                              result_rs = result_rs + t
                          send_msg({'msg_type': 'group', 'number': group,
                                    'msg': result_rs})
      
      def rs():  # 微博热搜
          header = {
              "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0",
              "Accept": "*/*",
              "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
              "Accept-Encoding": "gzip, deflate",
          }
          url = "https://tophub.today/n/KqndgxeLl9"
          res = requests.get(url, headers=header)
          selector = etree.HTML(res.text)
          result = []
          for i in range(30):
              t = selector.xpath(f"/html/body/div[1]/div[2]/div[2]/div[1]/div[2]/div/div[1]/table/tbody/tr[{i + 1}]/td[2]/a")
              result.append(t[0].text)
              # print(i+1, t[0].text)
          return result
      
      

      当@机器人并输入热搜时,会展示15天热搜新闻:

  • 搭建成功,后面就靠自己DIY了;

    • 免费API:ALAPI
    • 官方文档:https://docs.go-cqhttp.org/(有一些其他有趣的接口,可以尝试下)

标签:qq,socket,rev,cqhttp,msg,go,import,type
From: https://www.cnblogs.com/Azazel-gh3/p/17397961.html

相关文章

  • golang 实现一个自动注入跟踪代码工具
    如下面代码所示:packagemainimport("bytes""fmt""runtime""strconv")/**实现一个自动注入跟踪代码,并输出有层次感的函数调用链跟踪命令行工具.*/funcTrace()func(){//通过runtime.Caller函数获得当前Goroutine的函数调用栈上的信息,......
  • golang netlink 方便的网络管理包
    netlink可以方便的处理golang对于系统网络相关测试,比如我们需要设置网桥,配置ip,设置路由。。。。参考使用packagemain import("github.com/vishvananda/netlink") funcmain(){eth,_:=netlink.LinkByName("enp0s2")addr,_:=netli......
  • go语言调度gmp数据结构
    go语言调度gmp数据结构g表示goroutine,它是待执行的任务m表示操作系统的线程,它由操作系统的调度器调度和管理p表示处理器,可以把它看作在线程上运行的本地调度器Ggoroutine是go语言调度器中待执行的任务,它在运行时调度器中的地位和线程在操作系统中的地位差不多,但是它占......
  • 浅谈如何使用 github.com/yuin/gopher-lua
    最近熟悉go项目时,发现项目中有用到github.com/yuin/gopher-lua这个包,之前并没有接触过,特意去看了官方文档和找了些网上的资料,特此记录下。本次介绍计划分为两篇文章,这一次主要介绍github.com/yuin/gopher-lua这个包的介绍以及基础使用,下一边将介绍github.com/yuin/goph......
  • CS61B_project_gold
    题目描述 1importstaticorg.junit.Assert.*;2importorg.junit.Test;34publicclassTestArrayDequeGold{5@Test6publicvoidtestStudentArrayDeque(){7StudentArrayDeque<Integer>testArray=newStudentArrayDeque<>......
  • go相当详细的基础语法
    运行命令gorunxx.go或者gobuildxx.go+./xxpackagemainimport( "fmt")funcmain(){ fmt.Println("helloworld")}​基础语法packagemainimport( "fmt" "math")funcmain(){ vara="ivanlee&......
  • MongoDB 功能详解之时间序列集合(Time Series Collections)
    MongoDB功能详解之时间序列集合(TimeSeriesCollections)      时间序列集合(TimeSeriesCollections):MongoDB5.0版本中的新功能。时间序列数据是一系列数据点,通过分析这些随时间变化的数据点而获得对数据的深刻理解。时间序列数据通常由以下组成部分组成:时间:数......
  • [golang] logrus日志包如何自定义级别
    在Logrus中,可以使用logrus.Level类型定义自定义的日志级别,以便更精细地控制日志输出。以下是使用Logrus自定义级别的基本步骤:首先,在代码中使用 logrus.New() 方法创建一个新的logrus.Logger对象,并使用 AddHook() 方法注册所需的Hook对象(可选)。例如,以下代码创建了一个......
  • 用go设计开发一个自己的轻量级登录库/框架吧(业务篇)
    用go设计开发一个自己的轻量级登录库/框架吧(业务篇)本篇会讲讲框架的登录业务的实现。实现三种登录模式:同一用户只能登录一次同一用户多次登录多token同一用户多次登录共享一个token源码:weloe/token-go:alightloginlibrary(github.com)存储结构首先从我们要考虑是......
  • 【acwing】Django课程笔记
     工程课Linux-8.0.SSH的简易安全配置-AcWing  (避免服务器被偷家)怎样修改远程登录的端口?_弹性云服务器ECS_常见问题_登录与连接_远程连接类_华为云(huaweicloud.com)vim/etc/ssh/sshd_configservicesshdrestart ......