

协同办公软件可以帮助团队成员更好地协同工作,提高工作效率和质量,加快项目进度,减少沟通成本和避免信息丢失等问题。目前国内主流的几个软件有钉钉、飞书、企微(微信)、teams。当然也不是说企业就只用一个
其中以钉钉(免费)、企微/微信(普及度高)尤为常见。
除此之外,一个较为古早的软件——QQ也作为协同工作平台的一个补充
QQ作为一款国民级即时通信软件,普及度极其高,基本是人手一个账号甚至多个。它支持消息漫游、文件留存、记录导出、快速建群管理等(这边要点名一个同公司旗下“小而美”的软件)。是一个相当优秀的协同工作平台补充。
应用举例:某片区内,多家电商公司对接快递公司,绝大部分人均采用的是以QQ群对接的方式。由不同的快递公司/快递点为区分,建立XX快递群。日常工作中由电商公司方发送物流拦截信息/文件通知对应的联系人。
案例:D食品公司每日早上需要导出各平台物流数据,依照订单类型发送到不同的QQ对接群(如催发货信息给A货仓联系人,发拦截订单信息给B快递负责人)。现已采用该机器人,本地维护一份人员分工QQ信息,依照需求自动导出、汇总、整理、发送
早期QQ机器人的软件还是比较多的,近年来由于官方的清理,市面上现成的软件机器人就少了很多,大部分为现有的框架。go-cqhttp是一款基于Goland开发的跨平台QQ机器人框架,支持多种平台和协议,可通过HTTP API进行交互。到现在为止还在更新维护,并且是免费的(这很重要)。只需简单的配置,就能实现基本功能的搭建,适合萌新使用。
帮助中心网址:https://docs.go-cqhttp.org/
GitHub对应下载网址:https://github.com/Mrs4s/go-cqhttp/releases
(没法直连下载的请配合科学上网)
版本众多,请小伙伴根据自己电脑情况下载对应版本的文件(小白这边以Windows版本作为演示)

在下载解压之后,会得到三个文件,运行后缀为exe的文件(期间一直点确定就行了),直到得到一个名为go-cqhttp.bat的文件(后续运行机器人也是用这个文件打开)

双击运行bat文件,由于是第一次运行,该文件夹下会生成对应的配置文档(文件名为config.yml),选择http通信。之后修改一下配置文档信息

需要修改的点,修改完之后记得保存:
1.默认配置文件config.yml(源文件太长就不全部丢上来了)
1).登录方式(请将第3行【已高亮】QQ号码、登录密码放空,这样运行的时候采用手机扫码登录)
2).端口设置(请将123、124行【已高亮】前的'#'号删除以启用,5700端口是用于向服务器发送请求的端口,5701端口是用于监听返回的消息的端口,以上两个端口如果跟本地电脑使用的端口有重复可以进行修改,防止出问题)
———————————————————————————————————————————————————————————————
# go-cqhttp 默认配置文件
account: # 账号相关
uin: # QQ账号
password: '' # 密码为空时使用扫码登录
encrypt: false # 是否开启密码加密
status: 0 # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
relogin: # 重连设置
delay: 3 # 首次重连延迟, 单位秒
interval: 3 # 重连间隔
max-times: 0 # 最大重连次数, 0为无限制
- http: # HTTP 通信设置
address: 0.0.0.0:5700 # HTTP监听地址
version: 11 # OneBot协议版本, 支持 11/12
timeout: 5 # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
long-polling: # 长轮询拓展
enabled: false # 是否开启
max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
middlewares:
<<: *default # 引用默认中间件
post: # 反向HTTP POST地址列表
#- url: '' # 地址
# secret: '' # 密钥
# max-retries: 3 # 最大重试,0 时禁用
# retries-interval: 1500 # 重试时间,单位毫秒,0 时立即
- url: http://127.0.0.1:5701/ # 地址
secret: '' # 密钥
# max-retries: 10 # 最大重试,0 时禁用
———————————————————————————————————————————————————————————————
2.生成的设备信息文件device.json
请将protocol字段【已高亮】的协议信息对应的值修改为2
此前其他协议如Mac、iPad、企点、Android的协议,已被QQ方修改,现在时间段仍可以使用的协议只有安卓手机协议。
———————————————————————————————————————————————————————————————
#device.json 部分字段
{"display":"MIRAI.802927.001","product":"mirai","device":"mirai","board":"mirai","model":"mirai","finger_print":"mamoe/mirai/mirai:10/MIRAI.200122.001/9183214:user/release-keys","boot_id":"a31c3816-ade6-d9b1-37ad-ad7f8d78f08f","proc_version":"Linux version 3.0.31-6V4D8cw6 (android-build@xxx.xxx.xxx.xxx.com)","protocol":2}
———————————————————————————————————————————————————————————————
3.手机QQ设置
设置-账号安全-安全登录检查-关闭
设置-账号安全-登录设备检查-关闭(如有)
之后重新运行bat文件,扫码登录,如出现以下情况则代表账号已经成功登录,可调用接口发送/获取信息了。
提示:如果出现上报event数据到5701端口失败,请无视。后续开启监听之后就不会出现此类报告。

消息发送分为私聊和群聊,均采用同一个发送模板,即:
resp_dict={'msg_type':'group或者private','number':群号或QQ号,'msg':'这边是消息字符串'}
消息的格式均为字符串格式,所以如果是一个消息内包含了普通文本、图片、艾特信息下面定义了一个函数msglist_to_msgstr(),可将不同类型的消息类型列表,转化为框架可识别的字符串文本信息。之后修改发送模板的值,调用send_msg()发送即可。
参考代码:
———————————————————————————————————————————————————————————————
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import socket
import json
import re
import os
def main(args):
pass
#目前只做一部分简单的消息列表转化,将图片、@信息以及普通文本转化为框架发送的格式,详细情况可以参考https://docs.go-cqhttp.org/api/#%E5%9F%BA%E7%A1%80%E4%BC%A0%E8%BE%93
def msglist_to_msgstr(msg_list):
new_list=[]
for i in msg_list:
if i.startswith('@') and i[1:].isdigit() and 11>= len(i) >=7:
new_list.append('[CQ:at,qq='+i[1:]+',name=无效的QQ]')
elif os.path.isfile(i) and (i.endswith('.jpg') or i.endswith('.png')):#这边暂时只考虑普通图片
new_list.append('[CQ:image,file=file:///'+ i + ',id=40000]')
else:
new_list.append(i)
return ''.join(new_list)
#发送模板
# resp_dict={'msg_type':'group或者private','number':'这边请用数值格式填写群号或私聊号码','msg':'这边是消息字符串'}
def send_msg(resp_dict):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定IP及端口号
client.connect(('127.0.0.1', 5700))
msg_type = resp_dict['msg_type'] # 回复类型(群聊/私聊)
number = resp_dict['number'] # 回复账号(群号/好友号)
msg = resp_dict['msg'] # 要回复的消息
# 将字符中的特殊字符进行url编码
msg = msg.replace(" ", "%20").replace("\n", "%0a")
#拼接回复信息
send_msg_str=str(number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + '127.0.0.1' + ":5700\r\nConnection: close\r\n\r\n"
#发送信息
if msg_type == 'group':
payload = "GET /send_group_msg?group_id=" + send_msg_str
elif msg_type == 'private':
payload = "GET /send_private_msg?user_id=" + send_msg_str
client.send(payload.encode("utf-8"))
client.close()
# return 0
———————————————————————————————————————————————————————————————
效果如下

消息监听目前做了个简单的循环,一直监听获取到的信息,根据事件类型输出对应的信息。(后续其实可以考虑接入GPT做一个智能回复)
参考代码:
———————————————————————————————————————————————————————————————
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import socket
import json
import re
import os
def main(args):
pass
#目前做了一个简单的循环,监听信息并判断是否为聊天信息
print('============start==================')
SK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SK.bind(('127.0.0.1', 5701)) # 绑定IP及端口号
SK.listen(100) # 开始监听
HttpResponseHeader = '''HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n'''
while True:
Client, Address = SK.accept() # 被动接受TCP客户端连接,(阻塞式)等待连接的到来
Reporting_events = Client.recv(1024).decode(encoding='utf-8') # 主动初始化TCP服务器连接,并解码
Client.sendall((HttpResponseHeader).encode(encoding='utf-8')) # 完整发送TCP数据,并回复go-cqhttp的上报
Client.close() # 关闭连接
# 处理上报文字,正则提取出关键信息,并转为json对象
res_str='{'+ re.search(r'{(.*)}', Reporting_events).group(1)+'}'
# print(res_str)
res_dict=json.loads(res_str)
# 判断事件类型/系统事件还是群里还是私聊
if res_dict['post_type'] == 'meta_event':
continue
elif res_dict['message_type']=='group':
print('群消息,来源为群{}'.format(res_dict['group_id']))
else:
print('私聊消息,发送者为{}'.format(res_dict['user_id']))
print(res_dict['raw_message'])
———————————————————————————————————————————————————————————————
效果如下:

1.Q:登陆失败,提示“当前设备网络不稳定或处于复杂网络环境”
A:最简单的办法,将登录电脑与登录手机的网络链接至同一个WiFi下,然后重新登录。如果这情况也不行,先使用手机热点,让PC端链接,再重新登录即可。登录成功之后,切换至任意网络均不会有问题。并且在成功登录一次之后,下一次执行时,无需再扫码登录。
2.Q:群消息发送失败(常见于图片),提示“群消息发送失败:账号可能被风控”
A:正常情况下较少见,推荐拿几个经常挂着的小号来执行。如果一直这个情况的话,用go-cqhttp挂两三天能解决这个问题。如果一直提示这个情况,请删除原有配置信息重新登录。
登录手机端QQ,开启设备锁(登录保护,将原设备信息全部删除)-> 将go-cqhttp目录下的session.token与device.json删除 -> 确保config.yml内不含账号密码 -> 重新扫码登录