快捷搜索:
来自 计算机编程 2019-07-28 12:23 的文章
当前位置: 67677新澳门手机版 > 计算机编程 > 正文

基于python使用qqbot接入qq做一个简单的文字消息自

member对象__dict__大概如下:

四、完结您和煦的 QQ 机器人

福寿绵绵自身的 QQ 机器人极其轻松,只供给登记八个投机的音讯响应函数。示例代码:

?

123456789101112 from qqbot import QQBotSlot as qqbotslot, [email protected] onQQMessage(bot, contact, member, content):if content == '-hello':bot.SendTo(contact, '你好,我是QQ机器人')elif content == '-stop':bot.SendTo(contact, 'QQ机器人已关闭')bot.Stop()if __name__ == '__main__':RunBot()

留神,上面注册的响应函数的函数名必须为 “onQQMessage” ,函数参数也务必和上边的大同小异。

将上述代码另存为 sample.py ,关掉后边的 qqbot 进度,再在指令行输入 “python sample.py -q QQ号码” ,就足以运行自个儿的 QQ 机器人。此时,用别的多个 QQ 向本 QQ 发送音讯 “-hello”,则会自行回复 “你好,小编是 QQ 机器人”,发送信息 “-stop” 则会关闭 QQ 机器人。

QQBot 开首运维后,每收到一条 QQ 音信,会将音信来源、新闻内容以及三个QQBot 对象传递给地点注册的新闻响应函数。当中:

?

1234 bot : QQBot 对象,提供 List/SendTo/Stop/Restart 四个接口,详见本文档第五节contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 属性,这些属性都是 str 对象member : QContact 对象,仅当本消息为 群或讨论组 消息时有效,代表实际发消息的成员content : str 对象,消息内容

几个 QContact 对象表示三个调换人,它的 ctype 属性可感到'buddy'/'group'/'discuss'/'group-member'/'discuss-member' ,代表 好朋友/群/研究组/群成员/斟酌组成员 。注意有所 QContact 对象都以 只读对象 ,只可以读取它的品质,不可能安装它的性质,也不可能向它增加额外的性质。 分化类型的 QContact 对象的 nick/mark/card/name 属性所表示的含义有所区别,参见 contact-attr-meannings.png 。

能够调用 QQBot 对象的 SendTo 接口向 QContact 对象发送音讯,但要注意:只能向 好朋友/群/商讨组 发新闻, 无法向 群成员/研商组成员 发送新闻 。

除外直接运营 sample.py 文件,仍是能够将此文件作为贰个插件,在 qqbot 的周转进程中动态的加载和卸载。将该文件保留在系统中能够 import 到的目录下(如 python 的装置目录下的 Lib/site-packages 目录),之后,运转 qqbot ,待 QQBot 完全运转后,在另一个说了算台输入 qq plug sample ,则能够将此文件中的 onQQMessage 函数注册到 QQBot 的附和事件上去。输入 qq unplugin sample 能够卸载此插件。能够並且加载四个插件,此时各插件中的相应函数会挨个被调用(但调用顺序和加载次序非亲非故)。

一旦按插件的样式加载 sample.py ,则该文件的从头到尾的经过可简化为:

?

123456 def onQQMessage(bot, contact, member, content):if content == '-hello':bot.SendTo(contact, '你好,我是QQ机器人')elif content == '-stop':bot.SendTo(contact, 'QQ机器人已关闭')bot.Stop()

插件本质上是三个模块,由此,它能够是三个 py 文件,也足以是三个 package ,只要它放在系统中得以 import 到的目录就可以(本文档第七节介绍了点名插件目录的艺术)。提议尽量接纳插件的款型来扩充QQBot 。

原 2.1.10 版中的使用持续 QQBot 类来举办扩张的点子得以一连运用,但是,若使用此措施,则插件功效不能够采纳。

qqbot提供了三种发送二维码登入验证的方法,分别有GUI形式,邮箱情势,服务器方式,文本形式。暗中同意是GUI方式,当展开了别样形式时,GUI格局是倒闭的。一般常用的是GUI和信箱情势。在第1回运营qqbot后,在Computer系统盘里的用户目录C:Users村办Computer账号名(有相当大希望是C:用户处理器的账号名)目录下会有三个.qqbot-tmp文件夹,在那个文件夹里,有一个v2.3.conf文本,这些文件正是登入验证的布署文件,张开配置文件,里面有介绍配置的机能,能够和睦复制一份somebody更换为协调想要的登入格局,如果自个儿复制了一份somebody加多在somebody前面,并取名字为some,修改定制some的剧情,后一次运行时能够输入qqbot -u some可能python xx.py -u some运营qqbot。

用python实现QQ机器人

 

一、介绍

QQBot 是贰个用 python 实现的、基于Tencent 斯马特QQ 协议的简约 QQ 机器人,可运营在 Linux 、 Windows 和 Mac OSX 平台下。

本项目 github 地址:

你能够透过增加 QQBot 来贯彻:

  • 监控、收集 QQ 消息
  • 自动音讯推送
  • 闲电话机器人
  • 通过 QQ 远程序调整制你的配备

# 'role': '#NULL', 'role_id': -1, 'is_buddy': -1, 'level': -1, 'levelname': '#NULL',

二、安装格局

在 Python 2.7/3.4/3.5 下使用,用 pip 安装:

?

1 pip install qqbot

原 2.0 版的用户请先到 issue74 查看 2.1 版的进级换代和转移。

注:一般安装有 Python 的系统都早已自带 pip 了。 Windows 下,请确认保障卫安全装 Python 的时候勾选了 pip 和 Add python.exe to Path。假若系统中绝非 pip ,请到 pip主页 下载 get-pip.py 并运转,可将 pip 安装至系统中。

 

三、使用方法

  1. 启动 QQBot

在命令行输入: qqbot 。运行进度中会自动掸出二维码图片,需求用手提式有线电话机 QQ 客户端扫码并授权登陆。运行成功后,会将本次登入新闻保存到地面文件中,下一次运行时,能够输入: qqbot -q qq号码 ,先品尝从本地文件中恢复生机登入音讯(无需手动扫码),仅有复苏不成功或登陆音讯已过期时才会必要手动扫码登陆。一般的话,保存的登陆消息将在2 天之后过期。

当心: Linux 下,须要系统中有 gvfs-open 可能 shotwell 命令手艺自动掸出二维码图片(一般设置有 GNOME 虚构文件系统 gvfs 的系统中都会含那四个指令之一)。 Windows10 下,须求系统中已设置了 png 图片文件的默许展开程序才具自动掸出二维码图片。

若系统不可能活动掸出二维码图片,能够手动张开图片文件举办扫码,也足以将二维码彰显方式设置为 邮箱方式/服务器形式/文本方式 举办扫码,详见本文书档案的第七节。

  1. 操作 QQBot

QQBot 运维后,在另三个说了算台窗口使用 qq 命令来操作 QQBot ,最近提供以下命令:

?

1234567891011121314151617181920 1) 帮助、停机和重启命令qq help|stop|restart2) 联系人查询命令qq list buddy|group|discuss|group-member|discuss-member [oqq|oname|okey=oval] [qq|name|key=val]3) 消息发送命令qq send buddy|group|discuss qq|name|key=val message4) 群管理命令: 设置/取消管理员 、 设置/删除群名片 、 群成员禁言 以及 踢除群成员qq group-set-admin ginfo minfo1,minfo2,...qq group-unset-admin ginfo minfo1,minfo2,...qq group-set-card ginfo minfo1,minfo2,... cardqq group-unset-card ginfo minfo1,minfo2,...qq group-shut ginfo minfo1,minfo2,... [t]qq group-kick ginfo minfo1,minfo2,...5) 加载/卸载/显示 插件qq plug/unplug plugin-nameqq plugins

list 命令提供强有力的关联人询问成效,用法示举例下:

?

1234567891011121314151617 # 列出所有好友qq list buddy# 列出 QQ 为 123456 的群qq list group 123456# 列出备注名为 jack 的好友qq list buddy mark=jack# 列出 群“456班” 的所有成员qq list group-member 456班# 列出 群“456班” 中名片为 “mike” 的成员qq list group-member 456班 card=mike# 列出 讨论组“XX小组” 中名为 jack 的好友qq list discuss-member XX小组 jack

个中第三、三个参数假设是 key=val 的格式,则应为name=xx|nick=xx|mark=xx|card=xx|qq=xx 的格式,假如不是 key=val 的格式,则按以下原则开始展览管理:就算一串数字,则按 QQ 号进行查询,不然,按名称举办询问。

只要存在重名现象,会列出具备重名的联系人。如:

?

1 qq list group 机器人测试

将列出所著名叫 “机器人测量检验” 的群。

send 命令中第多个参数和 list 命令中的第三、八个参数格式一致。要留神,假诺有重名现象,会给全体重名的维系人发音讯。 别的要注意,第二个参数只好是 buddy/group/discuss ,不可能是 group-member/discuss-member 。

能够在消息内容中贮存“/微笑”等神情关键词来向对方发送表情,详见 facemap.py。还是能在音讯内容中运用 n,t 那多个转义字符(如: send buddy jack 第一行n第二行)。

群管理命令中的 ginfo 和 minfo 和 list 命令中的第三、四个参数格式一致。比方:

?

12345 # 设置 jack,mike,jim 为 群“456班” 的管理员qq group-set-admin 456班 jack,mike,jm# 禁止 群“456班” 中的 jack,mike,jim 发言( 2 分钟)qq group-shut 456班 jack,mike,jm 120

以上全体命令都提供对应的 HTTP API 接口,供 web 前端开拓者调用,接口的 url 地址为 ,只需求将 qq 前面包车型客车命令各参数用 "/" 分隔开分离替换 url 中的 command 就足以了,如: ,别的示例详见 urltestbot.txt 。注意:假如命令中带有中文或特殊字符,须要先实行 url 编码( utf8 ),举例,调用 将发送音讯 ”nihao 你好 wohao“ 。(提醒:在 JavaScript 中,能够采纳encodeUOdysseyIComponent 函数举办编码)。

除此以外,QQBot 运营后,用另外五个 QQ 向本 QQ 发送 “--version” ,则 QQBot 会自动还原: “QQBot-v2.x.x” 。

 

七、二维码管理器、QQBot 配置及命令行参数

二维码的来得情势

斯马特QQ 登陆时索要用手提式有线电话机 QQ 扫描二维码图片,在 QQBot 中,二维码图片可以透过以下二种格局展现:

  • GUI形式: 在 GUI 分界面中活动掸出二维码图片
  • 邮箱形式: 将二维码图片发送到内定的邮箱
  • 服务器形式: 在三个 HTTP 服务器中浮现二维码图片
  • 文件方式: 在 Term 中以文件格局显示二维码(须要活动安装 pillow 库)

GUI 情势是暗中认可的形式,只适用于民用Computer。邮箱形式能够适用于个人Computer和长距离服务器。服务器形式相似只在有公网ip的系列中动用。如若运用 QQ 邮箱来采纳二维码,则当发送二维码图片后,手提式有线电话机 QQ 客户端会立刻接受通告,在手提式有线电话机 QQ 客户端上开荒邮件,再长按二维码就足以扫描了。文本情势方便在开荒过程大概服务器安排时选取,为开荒者提供连忙方式登录QQ ,注意:文本情势在少数 terminal 中(如 gnome-terminal , mate-terminal )的显得效果不太好。

在意:当展开了 邮箱方式/服务器方式/文本方式 时, GUI 格局是倒闭的,登入时不会自动掸出二维码图片。

历次登入时会创设三个二维码管理器 (QrcodeManager 对象) ,二维码管理器会基于计划文件及命令行参数来抉择二维码图片的展现格局。

配置文件的运用方法

布置文件为 ~/.qqbot-tmp/v2.1.conf ,第一遍运维 QQBot 后就能够自行创建这么些布局文件,在这之中内容如下:

?

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 {# QQBot 的配置文件# 使用 qqbot -u somebody 启动程序时,依次加载:# 根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置# 使用 qqbot 启动程序时,依次加载:# 根配置 -> 默认配置 -> 命令行参数配置# 用户 somebody 的配置"somebody" : {# QQBot-term 服务器端口号(HTTP-API也将使用这个端口)"termServerPort" : 8188,# 二维码 http 服务器 ip,请设置为公网 ip 或空字符串"httpServerIP" : "127.0.0.1",# 二维码 http 服务器端口号"httpServerPort" : 8189,# 自动登录的 QQ 号"qq" : "3497303033",# 接收二维码图片的邮箱账号"mailAccount" : "[email protected]",# 该邮箱的 IMAP/SMTP 服务授权码"mailAuthCode" : "feregfgftrasdsew",# 是否以文本模式显示二维码"cmdQrcode" : False,# 显示/关闭调试信息"debug" : False,# QQBot 掉线后自动重启"restartOnOffline" : False,# 完成一轮联系人列表刷新后的间歇时间"fetchInterval" : 120,# 完成全部联系人列表获取之后才启动 QQBot "startAfterFetch" : False,# 需要被特别监视的联系人列表# 'buddy'/'group'/'discuss' 表示需要特别监视:# 好友列表/群列表/讨论组列表 中的联系人变动事件# 'group-member-456班'/'discuss-member-xx小组' 表示需要特别监视:# 群”456班“成员列表/讨论组”xx小组“成员列表 中的联系人变动事件# 若此项中的列表的数量较少,则被特别监视的列表中的联系人变动事件滞后时间可大幅缩短"monitorTables" : ['buddy', 'group-member-456班'],# 插件目录"pluginPath" : ".",# 启动时需加载的插件"plugins" : ['sample1'],},# 可以在 默认配置 中配置所有用户都通用的设置"默认配置" : {"qq" : "","pluginPath" : "","plugins" : [],},# # 注意:根配置是固定的,用户无法修改(在本文件中修改根配置不会生效)# "根配置" : {# "termServerPort" : 8188,# "httpServerIP" : "",# "httpServerPort" : 8189,# "qq" : "",# "mailAccount" : "",# "mailAuthCode" : "",# "cmdQrcode" : False,# "debug" : False,# "restartOnOffline" : False,# "fetchInterval" : 120, # "startAfterFetch" : False,# "monitorTables" : [],# "pluginPath" : "",# "plugins" : [],# },}

能够在安插文件中增多自身的用户配置(即在该公文的字典中新扩张一个 item ,此 item 的 key 就代表三个用户),例如,该公文中已有的 somebody 项目就意味着名称为 somebody 的用户,运维 QQBot 时,输入 qqbot -u somebody 或 python sample.py -u somebody ,则会加载 somebody 项目下的每一类安顿。

下边介绍配置文件中各队安顿的成效,以下内容均假定已修改了 somebody 下的布局,且以 qqbot -u somebody 或 python sample.py -u somebody 的秘籍运维。

邮箱格局的计划( mailAccount 和 mailAuthCode )

假设急需运用邮箱方式展现二维码,可以将 mailAccount 和 mailAuthCode 项中分头安装为邮箱帐号和授权码,运维后,二维码管理器会将二维码图片发送至该邮筒。

在意:授权码不是邮箱的登入密码,而是邮箱服务商提供的开明 IMAP/SMTP 服务的授权码, QQ 邮箱能够在网页版的邮箱设置里面开通此项服务,并获得授权码。要是只定义了 mailAccount 而没概念 mailAuthCode ,则程序运营的始发时会须求手工业输入此授权码。

是因为天涯论坛的信箱对 IMAP 协议的援助极度轻易,不可能在 QQBot 中央银行使。 QQ 的信箱已透过测量检验,别的服务商的信箱还未测量试验过,由此指出依然选用 QQ 邮箱。

服务器形式的布置( httpServerIP 和 httpServerPort )

比如要求使用服务器格局,可以配备 httpServerIP 和 httpServerPort 项,一般的话应该设置为公网 ip 。服务器形式开启后,能够通过 来访问二维码图片。

当邮箱格局和服务器格局同一时候开启时,发邮件时不会发送真正的图片,只会将图片地址发到邮箱中去,并且只发送一遍,二维码过期时刷新一下邮件就能够了。假如只开启邮箱格局,则发邮件时会发送真正的图样,当二维码过期时,须要将邮件设置为已读(用手提式无线电话机QQ 展开邮件后该邮件便是已读了),之后才会发送最新的二维码图片。

活动登入的 QQ 号码( qq )

布局文件中各样用户都有 qq 这一项,若此项已设置为某 QQ 号码,会先使用此 QQ 号上次报到保存的记名音信来机关登入。

掉线后活动重启( restartOnOffline )

万一安顿文件中将 restartOnOffline 项设置为 True ,则当 QQBot 掉线或出错终止时,会自动重新开动 QQBot 。

牵连人列表更新的间歇时间( fetchInterval )

QQBot 运维后,会在后台获取并革新联系人列表,当全部联系人列表获取达成后,会 sleep 两分钟然后起先下一轮获得及立异。能够在计划文件准将 fetchInterval 项设置为其余值(单位:秒)来决定这一个间歇时间。要是此值设置为负数,则只举办叁遍沟通人列表获取(之后再也不获得了)。

关联人列表获取成功后再开发银行( startAfterFetch )

诚如情况下,扫码登入成功就当下运维QQBot,相同的时候开班在后台获取并更新联系人列表。若是将配置文件中的 startAfterFetch 设置为 True ,则 QQBot 会等待全数联系人列表获取成功后才启动,注意,假设联系人很多,会费用较长的年华。

QQBot-term 服务器端口号( termServerPort )

QQBot 运行后,会张开贰个 QQBot-term 服务器监听用户通过 qq 命令行工具发过来的操作命令以及通过 HTTP API 接口发过来的操作命令,此服务器端口号默以为 8188 ,能够透过修改 termServerPort 的值来修改此端口号。

假若计划的 QQBot-term 服务器端口号不是私下认可的 8188 ,那么在运营 qq 命令时,需求在第二个参数中内定端口号,如:

?

12 $ qq 8100 send buddy jack hello$ qq 8100 list group-member chatbot

一律,HTTP API 接口的端口号也供给改造,如: 。

要是需求在同样台机械上登陆多少个 QQ 号码,则要求对不一样的 QQ 号码设置不一致的 termServerPort 和 httpServerPort ,以防端口号争论。

文件格局显示二维码(cmdQrcode)

若 cmdQrcode 项设置为 True ,则会在 term 中以文件格局呈现二维码。注意:要动用文本格局,供给活动设置 pillow 库,可使用 pip 安装。

调节和测验情势( debug )

若 debug 项设置为 True ,则运行进度中会打字与印刷调节和测验音信。

急需被监视的牵连人列表( monitorTables )

貌似情状下联系人改变事件(onNewContact/onLostContact)滞后 5 ~ 10 分钟,能够将关爱的关系人列表插手到计划文件的 monitorTables 中去,若 monitorTables 中的列表数量很少,则被监视的列表中的联系人改换事件延后时间将小幅度缩水。比方,要是关注群”456班“ 的联系人退换,能够安装 monitorTables = ['group-member-456班'] ,则该群的积极分子变动事件仅落后 1~3 秒。

插件的安插( pluginPath 和 plugins )

诚如情况下,插件须求贮存在系统的 import 目录下,能够在 pluginPath 选项中布置插件的贮存目录,放在该选项钦命的目录下也得以被 QQBot 动态加载。别的,在 plugins 选项中得以内定 QQBot 运维时须要加载的插件(注意:这一个插件必要保留在系统的 import 目录下或 pluginPath 所内定的目录下)。

命令行参数及布局的先行级

布署文件中的全部选项皆有相应的命令行参数,在命令行参数中输入的选项先行级比配置文件高。输入 qqbot -h 或 python sample.py -h 可查看全体命令行参数格式。

次第一共有三个级其余配置,其事先级如下:

?

12345 使用 qqbot -u somebody 启动程序时,依次加载:根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置使用 qqbot 启动程序时,依次加载:根配置 -> 默认配置 -> 命令行参数配置

中间:根配置 是一直的,用户不能够修改; 暗许配置 和 用户配置 可由用户在 v2.1.conf 文件中开始展览修改;最终,仍是能够在 命令行参数 中输入配置。

在意那个音信响应函数名必须是onQQMessage,函数参数也亟须一致。

五、 QQBot 对象的接口

QQBot 对象提供 List/SendTo/GroupSetAdmin/GroupSetCard/GroupShut/GroupKick/Stop/Restart 多个领悟接口,一般意况下,请勿 调用/存取 此对象的另外 方法/属性 。以下介绍前 6 个接口。

(1) bot.List(tinfo, [cinfo]) --> [contact0, contact1, ..., ]/[]/None

对应上面的 list 命令。重回联系人对象( QContact 对象)列表只怕 None 。

List 接口的率先个参数 tinfo 可以为 'buddy'/'group'/'discuss' ,第2个参数是可选的(和 list 命令的第五个参数格式一致)。示例:

?

12345 # 返回所有好友的列表:>>> bot.List('buddy')# 返回名为 “机器人测试” 的群的列表:>>> bot.List('group', '机器人测试')

List 接口的第多少个参数 tinfo 也能够是一个 ctype 等于 'group'/'discuss' 的 QContact 对象,此时,再次来到的是该 群/探究组 的分子列表,如以下第二句和第三句分别重回 群“456班” 的成员列表和该群中名片为 “jack” 的分子列表:

?

123 >>> g = bot.List('group', "456班")[0]>>> bot.List(g)>>> bot.List(g, 'card=jack')

在意上边第三句分歧意是 bot.List(g, card='jack') 的格式。

List 接口的内部施行种种: 首先在 QQBot 的关联人数据库内搜寻 tinfo 所表示的牵连人列表;若数据库内已有此列表,则在此列表内进行查找,并赶回二个暗含 “此列表中颇具和 cinfo 相配的联系人” 的列表;若数据库内未有此列表,则向 QQ 服务器央浼数据得到联系人列表,获取成功后将关系人列表保存到数据库内,然后再打开检索并再次回到二个包蕴“此列表中全部和 cinfo 相称的联络员” 的列表;要是在向 QQ 服务器央求数据的长河中出错了,则打字与印刷相关的失利新闻,并赶回 None 。

List 接口重回值的含义: 重返二个非空驶列车表表示 tinfo 所内定的联络人列表内存有和 cinfo 相配的联络员;重回一个空驶列车表表示该联系人列表内未有和 cinfo 相配的联系人;重返 None 表示向 QQ 服务器央求联系人列表和资料失败,不亮堂是还是不是有相相配的联系人。

调用 List 接口后, 务必 先依据以上两种情景对重临值实行判别,然后再实行后续代码。

(2) bot.SendTo(contact, content) --> '向 xx 发消息成功'/'错误:...'

向联系人发送音讯。第多少个参数为 QContact 对象,第二个参数为新闻内容。再次提醒: 只可以够向 好朋友/群/商讨组 发音讯, 不容许向 群成员/探讨组成员 发音信 。

能够在音讯内容中放置“/微笑”等神情关键词来向对方发送表情,详见 facemap.py。

若发送成功,再次来到字符串('向 xx 发音讯成功')。不然,重临含错误原因的字符串('错误:...')。

(3) bot.GroupXXX(group, membs[, arg]) --> ['成功:...', '成功:...', '错误:...']

对应第3节的群管理命令,共八个接口:

  • 安装/撤消管理员: bot.GroupSetAdmin(group, membs, admin=True)
  • 设置/撤销群成员著名影片: bot.GroupSetCard(group, membs, card)
  • 明确命令禁止群成员发言: bot.GroupShut(group, membs, t=60)
  • 踢除群成员: bot.GroupKick(group, membs)

其间第二个参数 group 为 群对象( ctype 等于 'group' 的 QContact 对象),第4个参数 membs 为被操作的成员列表。重临值为 membs 中各成员的操作音讯。

留神: 1) 第一个参数 membs 是贰个 list 对象(如: [memb0,memb1,...] ),并非多少个 QContact 对象; 2) 若 membs 中的有些成员是管理员,则除 SetCard 外的别的接口或者对其低效,尽管此时回去成功音信。 3) 使用那八个接口时,请自行保管登陆的用户是该群的管理人,且 membs 中的各成员均属于该群。

from qqbot import QQBotSlot as qqbotslot,RunBot
import mysql

@qqbotslot
def onQQMessage(bot,contact,member,content):

    if content == '笑话':
        bot.SendTo(contact,mysql.get_one())
    elif content=='-stop':
        bot.SendTo(contact,'机器人已关闭')
        bot.Stop()

if __name__=='__main__':
    RunBot()

六、 注册回调函数、被别人 @ 的通知、定制订时任务

登记回调函数

除此之外上边提到的 onQQMessage 响应函数,还足以登记 onNewContact/onLostContact/onInterval/onStartupComplete/onFetchComplete 各个事件的回调函数,全数事件以及函数参数格式、含义如下:

?

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 @qqbotslotdef onQQMessage(bot, contact, member, content):# 当收到 QQ 消息时被调用# bot : QQBot 对象,提供 List/SendTo/Stop/Restart 四个接口,详见文档第五节# contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/name/nick/mark/card 属性,这些属性都是 str 对象# member : QContact 对象,仅当本消息为 群或讨论组 消息时有效,代表实际发消息的成员# content : str 对象,消息内容if content == '--version':bot.SendTo(contact, 'QQbot-' bot.conf.version)@qqbotslotdef onNewContact(bot, contact, owner):# 当新增 好友/群/讨论组/群成员/讨论组成员 时被调用# 一般情况下联系人变动事件滞后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去# 若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件滞后时间将大幅缩短# bot : QQBot 对象# contact : QContact 对象,代表新增的联系人# owner : QContact 对象,仅在新增 群成员/讨论组成员 时有效,代表新增成员所在的 群/讨论组[email protected] onLostContact(bot, contact, owner):# 当失去 好友/群/讨论组/群成员/讨论组成员 时被调用# 一般情况下联系人变动事件滞后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去# 若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件滞后时间将大幅缩短# bot : QQBot 对象# contact : QContact 对象,代表失去的联系人# owner : QContact 对象,仅在失去 群成员/讨论组成员 时有效,代表失去成员所在的 群/讨论组[email protected] onInterval(bot):# 每隔 5 分钟被调用# bot : QQBot 对象[email protected] onStartupComplete(bot):# 启动工作完成时被调用(本函数被调用后,开始监听 QQ 消息和 qq 命令行工具的命令)# bot : QQBot 对象[email protected] onFetchComplete(bot):# 完成一轮联系人列表刷新时被调用# bot : QQBot 对象pass

重新提醒:注册的响应函数的函数名以及函数参数(数量和名称)必须和上边一样,不容许注册其余名指标函数 。

被群内别的成员 @ 的通报

QQBot 收到群音讯时,会先依照新闻内容决断是或不是有人 @ 自身。即使是,则在消息内容的开始加贰个 '[@ME] ' 的号子,再传递给 onQQMessage 函数;不然,将音信内容中的全体 '@ME' 替换来 '@Me' 再传给 onQQMessage 。由此,在 onQQMessage 函数内,只须要推断 content 内是还是不是富含'@ME' 就清楚自身是或不是被新闻发送者 @ 了。比方:

?

1234 @qqbotslotdef onQQMessage(bot, contact, member, content):if '@ME' in content:bot.SendTo(contact, member.name ',又在想我了吧')

定制订时职分

从 2.1.13 起, qqbot 中提供三个成效强大的函数装饰器 -- QQBotSched 来定制订时职务,示例代码:

?

1234567891011 from qqbot import QQBotSched as qqbotsched, [email protected](hour='11,17', minute='55')def mytask(bot):gl = bot.List('group', '456班')if gl is not None:for group in gl:bot.SendTo(group, '同志们:开饭啦啦啦啦啦啦!!!')if __name__ == '__main__':RunBot()

以上代码运转(或以插件格局加载)后,每到 11:55 和 17:55 ,都会活动向 群“456班” 发送音信:“同志们:开饭呀啦啦啦啦啦!!!” 。

QQBotSched 装饰器接受 year, month, day, week, day_of_week, hour, minute, second, start_date, end_date, timezone 共计 拾二个根本词作者为参数,各类参数表示任务的定制时间的分量所应相配的值。举个例子: hour='11,17' 表示应在 11:xx 或 17:xx 试行职务, minute='55' 表示应在 xx:55 执行任务, minute='0-55/5' 表示应在 xx:x0 或 xx:x5 推行任务。

QQBotSched 是对 Python 的定期职务框架 apscheduler 的粗略包装,其每一类参数应利用 Unix 系统中的 crontab 格式输入。有关 crontab 以及 Python 的按期职分框架 apscheduler 的内容可参见以下参谋资料:

登记回调函数和定拟定时职务的注意事项

  • 回调函数的函数名、参数名、参数数量、参数顺序都不得改换,必须和上述 6 个函数完全一致。
  • 定期任务的函数名能够友善定义,但参数有且唯有七个,参数名必须为 bot ,为叁个 QQBot 对象。
  • 假使利用插件的款型编写,则回调函数前边的 @qqbotslot 是足以简单的,定时职务前边的 @qqbotsched 无法轻松。
  • 装有回调函数和定期任务都就要主线程中被调用,因而不用顾忌数据的线程安全难点。
  • 具备回调函数和定时职分的运维时刻应竭尽短,不应在这么些函数中张开围堵式的 IO 操作,不然会阻塞整个程序的周转。

写好音讯响应函数后,保存为xx.py,假设qqbot已经运转请关闭qqbot进度,然后在命令行输入python xx.py -q qq号码,那样就能够运转qqbot,而且会把xx.py自动注册到qqbot的新闻响应函数上,当qq收到消息时会在命令行上来看。还恐怕有一种运维xx.py的章程,正是把此文件作为八个插件,在qqbot运转进度中动态加载卸载。首先要将此文件保留在系统中得以import到的目录下,如python的设置目录下的Lib/site-packages目录,在qqbot运营后,在另外多个调整台输入qq plug xx就能够将onQQMessage函数注册到qqbot中去,输入qq unplugin xx。借使以插件情势加载xx.py,文件内容可以简化,只保留def onMessage函数,别的的都得以去除。

九、参谋资料

QQBot 参照他事他说加以考察了以下开源项目:

  • ScienJus/qqbot (ruby)
  • floatinghotpot/qqbot (node.js)
  • sjdy521/Mojo-Webqq (perl)

在此多谢以上肆位小编的无私分享,特别是谢谢 ScienJus 对 SmartQQ 协议所做出的深刻细致的剖析。

一、介绍 QQBot 是五个用 python 完成的、基于腾讯 斯马特QQ 协议的粗略 QQ 机器人,可运维在 Linux 、 Windows 和 Mac OSX 平台下...

from qqbot import QQBotSlot as qqbotslot,RunBot

@qqbotslot
def onQQMessage(bot,contact,member,content):

    if content == '-hello':
        bot.SendTo(contact,'你好')
    elif content=='-stop':
        bot.SendTo(contact,'机器人已关闭')
        bot.Stop()

if __name__=='__main__':
    RunBot()

八、 smartqq 协议支持及范围

本项目已实现绝超越50% smartqq 协议辅助的效果与利益,如下:

  • 消息收/发
  • 联系人(包罗 老铁/群/研商组/群成员/斟酌组成员)资料获得和询问(包括QQ号/小名/名称/备注名/群成员名片)
  • 关系人资料动态更新,新扩大和吐弃 基友/群/探究组/群成员/钻探组成员 事件的文告
  • 被群内其余成员 @ 的布告
  • 群处理职能: 设置管理员 、 设置群名片 、 群成员禁言 以及 踢除群成员
  • 发送、接收表情(详见 facemap.py)

另外职能

  • 调用系统暗许图片浏览器呈现登陆二维码、将登陆二维码发送至邮箱、开启四个http 服务器用来显示登陆二维码、在命令行窗口使用文本格局呈现二维码
  • 用 qq 命令行工具发音讯和查询联系人
  • 掉线后自行重启功效(不经常必要手工扫码)
  • 定期实行职责(通过 QQBotSched 完结)

因 smartqq 协议的限制,以下问题无搞定办法

  • 心有余而力不足长日子维系在线状态,每一回登陆成功后的 cookie 会每在 1 ~ 2 天后失效,将被Tencent服务器强制下线,此时 必须 手工业扫码重新登陆。能够将二维码展现格局设置为邮箱情势并张开自动重启情势,在被下线时自动重启并将二维码发送到邮箱,落成远程扫码
  • 力不能支发送图片、文件、音频、 xml 卡牌音信
  • 相当的小概获取到本身通过另外客户端(手提式有线电话机 QQ 、PC-QQ)发送的音讯
  • 心有余而力不足在群内 @ 其余成员,就算用本程序在群里发送了 “@jack xxx” 这样的新闻, jack 也只好抽出那些纯文本,收不到“有人@小编”的提示。
  • 不可能向 群/研讨组 内的别样非亲密的朋友成员发音信,也敬敏不谢吸纳非好朋友成员发过来的一时会话音讯
  • 在很少的状态下,发音信时会重复发送很多次,也大概对方已接到消息但再次回到发送失利的结果

# 'card': 'XXXX', 'name': 'XXXX', 'join_time': -1, 'last_speak_time': -1,

uin独一标记,群聊天时标志群,一对一私聊时标记qq。nick是群名称,ctype表明这次音讯是何种类型的,group表示是群,buddy代表是私聊。

contact对象__dict__大概如下:

 

实际通过onQQMessage大家已经得以做过多事情了,qqbot还提供了任何一些功力,能够参谋百度相关资料获得。下一篇将介绍接入图灵机器人落成智能聊天。

本文由67677新澳门手机版发布于计算机编程,转载请注明出处:基于python使用qqbot接入qq做一个简单的文字消息自

关键词: