PyQQbot Python 实现的 QQ 机器人开源项目

我要开发同款
匿名用户2016年08月05日
99阅读

技术信息

开源地址
https://github.com/huangfangyi/fangyuanshili
授权协议
MIT

作品详情

一、介绍QQBot是一个用pytho实现的、基于腾讯SmartQQ协议的简单QQ机器人,可运行在Liux和Widows平台下,所有代码均集成在一个[qqbot.py][code]文件中,代码量仅400多行(不包括注释)。程序采用单线程的方式运行,且尽可能的减少了网络和登录错误(特别是所谓的103error)发生的概率。[code]:https://raw.githubusercotet.com/padolia/qqbot/master/qqbot.py本项目github地址:https://github.com/padolia/qqbot/你可以用QQBot来实现:*监控、收集QQ消息*自动消息推送*聊天机器人*通过QQ远程控制电脑、智能家电二、安装方法在Pytho2.7下使用,用pip安装,安装命令:

$ pip istall qqbot

也可以直接下载[qqbot.py][code]运行,但需先安装[requests](https://pypi.pytho.org/pypi/requests)库。三、使用方法#####1.启动QQBot在命令行输入:**qqbot**,或直接运行[qqbot.py][code]:**pythoqqbot.py**。启动过程中会自动弹出二维码图片(Liux下需安装有gvfs,否则需要手动打开图片),需要用手机QQ客户端扫码并授权登录。启动成功后,会将本次登录信息保存到本地文件中,下次启动时,可以输入:**qqbotqq号码**,或:**pythoqqbot.pyqq号码**,先尝试从本地文件中恢复登录信息(不需要手动扫码),只有恢复不成功或登录信息已过期时才会需要手动扫码登录。#####2.操作QQBotQQ机器人启动后,用另外一个QQ向本QQ发送消息即可操作QQBot。目前提供以下命令:  1)帮助:    -help  2)列出好友/群/讨论组:    -listbuddy/group/discuss  3)向好友/群/讨论组发送消息:    -sedbuddy/group/discussuimessage    其中ui是临时qq号,利用-list命令查看好友等的临时qq号。    4)停止QQBot:    -stop

四、实现你自己的QQ机器人实现自己的QQ机器人非常简单,只需要继承[qqbot.py][code]中提供的**QQBot**类并重新实现此类中的消息响应方法**oPullComplete**方法。示例代码:

    from qqbot import QQBot        class MyQQBot(QQBot):        def oPollComplete(self, msgType, from_ui, buddy_ui, message):            if message == '-hello':                self.sed(msgType, from_ui, '你好,我是QQ机器人')            elif message == '-stop':                self.stopped = True                self.sed(msgType, from_ui, 'QQ机器人已关闭')        myqqbot = MyQQBot()    myqqbot.Logi()    myqqbot.PollForever()

以上代码运行后,用另外一个QQ向本QQ发送消息**“-hello”**,则会自动回复**“你好,我是QQ机器人”**,发送消息**“-stop”**则会关闭QQ机器人。五、QQBot类中的主要方法、属性####1.构造方法、登录方法、主要属性

    >>> bot = QQBot()    >>> bot.Logi()    ...

构造方法生成一个QQBot实例,其实没做任何工作。全部的登录、获取好友/群/讨论组列表的工作在**Logi**方法中完成。Logi方法会检查命令行参数sys.argv中是否提供了qq号码。若没有提供qq号码,则需要手动扫码登录。登录后会将登录信息保存在本地。若提供了qq号码,则会先尝试从本地恢复会话信息(不需要手动扫码),只有恢复不成功或登录信息已过期时才会需要手动扫码登录。QQBot登录完成后,可以进行消息收发了,且好友/群/讨论组的列表保存在**buddy,buddyStr,group,groupStr,discuss,discussStr**属性当中。

    >>> bot.buddy    ((1880557506, 'Jack'), (2776164208, 'Mike'), ..., (2536444957, 'Kebi'))    >>> prit bot.buddyStr

  好友列表:    0,Jack(2348993434)    1,Mike(348093248)    ...####2.消息收发

    >>> bot.poll()    ('buddy', 207353438, 207353438, 'hello')    >>> bot.poll()    ('', 0, 0, '')    >>> bot.sed('buddy', 45789321, 'hello')

向buddy45789321发送消息成功**poll**方法向QQ服务器查询消息,如果有未读消息则会立即返回,返回值为一个四元tuple:  (msgType,from_ui,buddy_ui,message)其中**msgType**可以为**'buddy'**、**'group'**或**'discuss'**,分别表示这是一个**好友消息**、**群消息**或**讨论组消息**;**from_ui**和**buddy_ui**代表消息发送者的**ui**,可以通过ui向发送者回复消息,如果这是一个好友消息,则from_ui和buddy_ui相同,均为好友的ui,如果是群消息或讨论组消息,则from_ui为该群或讨论组的ui,buddy_ui为消息发送人的ui;**message**为消息内容,是一个**utf8**编码的strig。如果没有未读消息,则**poll**方法会一直等待两分钟,若期间没有其他人发消息过来,则返回一个只含空值的四元tuple:  ('',0,0,'')**sed**方法的三个参数为**msgType**、**to_ui**和**message**,分别代表**消息类型**、**接收者的ui**以及**消息内容**,消息内容必须是一个**utf8**编码的strig。如果发送消息的频率过快,qq号码可能会被锁定甚至封号。因此每发送一条消息,会强制sleep3秒钟,每发送10条消息,会强制sleep30秒钟。同一条消息重复发送多次也可能被锁号或封号,因此每条消息发送之前都会在开头附加一个随机数字。这里需要注意的是,当poll方法因等待消息而阻塞时,不要试图在另一个线程中调用sed方法发送消息,也不要试图用多线程的方式同时调用sed方法,否则可能引起一些无法预料的错误。####3.无限消息轮询

    >>> bot.PullForever()

**PullForever**方法会不停的调用poll方法,并将poll方法的返回值传递给**oPullComplete**方法,直到stopped属性变为True。如下:

    def PollForever(self):        self.stopped = False        while ot self.stopped:            pullResult = self.poll()            self.oPollComplete(*pullResult)

oPollComplete方法是QQ机器人的灵魂。你可以自由发挥,重写此方法,实现更智能的机器人。六、参考资料QQBot参考了以下开源项目:-[ScieJus/qqbot](https://github.com/ScieJus/qqbothttps://github.com/padolia/qqbot/)(ruby)-[floatighotpot/qqbot](https://github.com/floatighotpot/qqbot)(ode.js)在此感谢以上两位作者的无私分享,特别是感谢ScieJus对SmartQQ协议所做出的深入细致的分析。###七、反馈有任何问题或建议可以发邮件给我,邮箱:<padolia@yeah.et>。

功能介绍

一、介绍 QQBot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的简单 QQ 机器人,可运行在 Linux 和 Windows 平台下,所有代码均集成在一个 [qqbot.p...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论