Coder Social home page Coder Social logo

smartqqbot's People

Contributors

ahuigo avatar akidan avatar gucheen avatar john123951 avatar jseagull avatar pjkui avatar renothing avatar sknife avatar superfsm avatar szsam avatar winkidney avatar wtlyu avatar xqin avatar xuefer avatar yinzo avatar zeruniverse avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

smartqqbot's Issues

uin_to_account(send_uin) 这个方法似乎失效了

如题,咱用这个函数获取用户名,拿到的变成了奇怪的字串,同一用户每次会话的返回还不一样

log如下
2016-02-11 06:02:58,821 QQLogin.py[line:340] INFO Requesting the account by uin: 1050104160
2016-02-11 06:02:59,473 QQLogin.py[line:346] DEBUG uin_to_account html: {u'retcode': 0, u'result': {u'account': 875585845, u'uin': 1050104160, u'uiuin': u''}}

希望能修复下(
以上。

关于二次开发的建议

建议1:

能否把接口合并起来?比如我在群聊里面开发了一个网络接口,但是只能在群聊里面使用,而不能在私聊里面,能否合并为一种实现即可?

目前是需要3个文件都实现才行
群聊功能:Group.py
私聊功能:Pm.py
临时对话功能:Sess.py

建议2

能否在接口里面提供接口获取发送者详细信息,比如发送的人真实qq号码,群里面或者本人昵称,群号,群昵称。

建议3

关键词拦截处理能否统一,插件代码彻底模块化,比如我写一个插件A,那么里面可以配置拦截信息,不需要修改Group.py文件达到拦截。

建议4

能否添加一个批量发送接口,比如需要通知特定几个人,直接在插件里面调用发送私有消息

建议5

插件开发的时候能否提供个优雅的debug方式? 还有能否动态加载插件呢?比如我修改了插件文件,然后可以自动重新加载插件,我记得python好像可以实现这个方式,每次执行插件的时候动态加载。程序给个配置正常运行模式,开发模式。开发模式就动态加载插件,正常模式一次性加载完成
比如开发的时候,难免有bug,每次都要重新扫码登入,再调试代码,这个好繁琐

ps

这些是我开发插件的时候需要的问题和一些想法,由于python好久没有用了,就不直接改造了,以上想法实现可能需要很多时间,但是实现对于插件开发者来说就太好了,另外感谢作者,希望作者越做越好

retcode 100000?

retcode 100000?是不是COOKIE校验不通过啊,
我看了下机器人的COOKIE和浏览器还不一样,是不是有JS再启用加了什么东西?目前项目中一些接口都没有调用,我重新启用了这些接口都报1000000

get_group_name_list_mask2()中get_online_buddies2 result error

[ERROR] Sun, 23 Oct 2016 12:54:21 handler.py line 123: Error occurs when runnin
g task from plugin [SamplePlugin].
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\spider_160720\QQ\src\smart_qq_bot\handler
.py", line 119, in run
task.func(*_task.kwargs)
File "C:\Users\Administrator\Desktop\spider_160720\QQ\src\smart_qq_bot\signals
.py", line 15, in wrapper
return func(_args, **kwargs)
File "C:\Users\Administrator\Desktop\spider_160720\QQ\src\smart_qq_plugins\sam
ple_plugin.py", line 24, in sample_plugin
gnamelist = bot.get_group_name_list_mask2()['gnamelist']
File "C:\Users\Administrator\Desktop\spider_160720\QQ\src\smart_qq_bot\bot.py"
, line 410, in get_group_name_list_mask2
raise TypeError('get_online_buddies2 result error')
TypeError: get_online_buddies2 result error

意见贴

  • 建议配置相关命令全部沿用 !(行为) (参数) (参数) 的格式
  • 是否准许用户调教可以做个开关从command_handler配置
  • 组消息和私聊消息处理可以做成两个函数,在一起代码相对凌乱
  • 机器人学习相关的储存是否可改用pickle库存入文件
  • 工程尽量模块化后可以分发任务一起搞

无法接受临时聊天群的信息?

拉入群中一收到消息就出现这个错误

[ERROR] Thu, 21 Jul 2016 20:25:01  main.py line 59: Exception occurs when checking msg.
Traceback (most recent call last):
  File "/Users/Mofe/_git/SmartQQBot/src/smart_qq_bot/main.py", line 52, in main_loop
    [mk_msg(msg) for msg in msg_list]
  File "/Users/Mofe/_git/SmartQQBot/src/smart_qq_bot/messages.py", line 103, in mk_msg
    return MSG_TYPE_MAP[msg_dict['poll_type']](msg_dict)
KeyError: u'discu_message'

私聊的判重

防止私聊同一条消息被处理两次

消息的id在msg['value']['msg_id2']里。 msg是你代码121行的变量。

在发送消息的线程中记录上一处理的消息id

能不能添web接口支持

能不能添加个web接口,这样特别方便进行二次扩展,比如提供个收到信息网络回调接口,再提供个发送消息的接口,这样不管收发都可以web服务托管,保持核心小巧。

一些功能建议

  1. 希望有可选登陆模式( 二维码 \ 账户密码)
  2. 希望有Web界面(Flask或者Tornado完成选择登陆\下线\状态改变\拉取聊天记录Log\输入自定义消息 etc)

因为很多时候部署到LInux都是终端界面,所以查看二维码也不太方便,如果有web直接将二维码输出就方便了.
并且Web可以将Log筛选分类之后入库(SQLite也是可以的),方便信息的查找和功能Debug
如果大体框架稳定了,我可以加入到这个项目来,一起编码
:)

发送图片问题

如果一条群消息里面既有文字也有图片(不是表情),我想把这条文字+图片转发给两外一个群,怎么转发图片呢?或者怎么发送图片呢

can't publish group message

the log shows the return code is 0, and everything seems ok, but the group messages are not actually published.

I meet this trouble when deploy code on linux server.

如何写一个RPC服务?

我想开发一个 自定义的QQ服务。比如利用机器人,跟我们公司的OA集成。oa更新了什么公告,我想通过QQ机器人在群里发一个公告:

如:5.1 公司为大家提供了100元家乐福购物卡,请各部门同事来领取,领取时间4-27 至4-29

所以我想写个RPC插件,但是没有弄懂怎么写

转发消息到web,我可以调用on_all_message, 那么我要发送消息呢?

请指教,我怎么做比较好

关于无法再通过web登陆的问题

从12月9日开始,发现用这个代码的扫描二维码的方式登陆不了。
通过浏览器上追踪登陆过程,发现了些问题:原来的d.web2.qq.com被改成了d1.web2.qq.com,所以原代码中通过这个url访问的方法都会返回403 forbidden;在修改完相关代码之后,登陆过程又会在访问http://d1.web2.qq.com/channel/login2的时候失败,在日志中查看到返回的是{"errmsg":"","retcode":100001}的信息,而不是原来的登陆成功的响应了,搜索了一下100001是代表下线的意思。可能是webqq有了新的更新之后登陆过程发生了改变。
所以想请问一下您那边方不方便修改一下,或者您那里有没有比较详细的或者更新的webqq的协议文档可以共享一下的呢?

插件全部没起作用

python run.py

[INFO] Thu, 06 Oct 2016 14:37:11  main.py line 51: Initializing...
[INFO] Thu, 06 Oct 2016 14:37:11  plugin.py line 94: Plugin [basic] loaded.
[INFO] Thu, 06 Oct 2016 14:37:12  plugin.py line 94: Plugin [manager] loaded.
[INFO] Thu, 06 Oct 2016 14:37:12  plugin.py line 94: Plugin [satoru] loaded.
[INFO] Thu, 06 Oct 2016 14:37:12  bot.py line 140: Try cookie login...
[ERROR] Thu, 06 Oct 2016 14:37:15  bot.py line 302: <class 'smart_qq_bot.bot.CookieLoginFailed'>
Traceback (most recent call last):
  File "/home/my/tmp/SmartQQBot-master/src/smart_qq_bot/bot.py", line 300, in login
    self._login_by_cookie()
  File "/home/my/tmp/SmartQQBot-master/src/smart_qq_bot/bot.py", line 164, in _login_by_cookie
    raise CookieLoginFailed("Login step 1 failed with response:\n %s " % ret)
smart_qq_bot.bot.CookieLoginFailed: Login step 1 failed with response:
 {'errmsg': 'error!!!', 'retcode': 100012} 
[INFO] Thu, 06 Oct 2016 14:37:15  bot.py line 188: RUNTIMELOG Trying to login by qrcode.
[INFO] Thu, 06 Oct 2016 14:37:15  bot.py line 189: RUNTIMELOG Requesting the qrcode login pages...
[INFO] Thu, 06 Oct 2016 14:37:15  bot.py line 237: Downloading QRCode file...
[INFO] Thu, 06 Oct 2016 14:37:32  bot.py line 140: Try cookie login...
[INFO] Thu, 06 Oct 2016 14:37:32  bot.py line 184: Login by cookie succeed. account: 765106786
[INFO] Thu, 06 Oct 2016 14:37:32  bot.py line 438: RUNTIMELOG Requesting the online buddies.
[INFO] Thu, 06 Oct 2016 14:37:32  bot.py line 564: RUNTIMELOG Requesting the group list.
[INFO] Thu, 06 Oct 2016 14:37:33  bot.py line 315: User information got: user name is [分析师]
[INFO] Thu, 06 Oct 2016 14:37:33  bot.py line 324: RUNTIMELOG QQ:765106786 login successfully, Username:分析师
[INFO] Thu, 06 Oct 2016 14:37:33  manager.py line 49: Plugin Manager is available now:)
[INFO] Thu, 06 Oct 2016 14:39:09  satoru.py line 61: Satoru's data file saved.
^C[INFO] Thu, 06 Oct 2016 14:39:46  run.py line 14: User stop. exit.

登陆上了,但是插件不起作用。

您好,请问你的IDE是什么?

昨天晚上的时候,我开发了一个群天气查询的功能,发现了一个问题,由于我是python初学者,发现作者您在打印信息的时候,采用的是logging。由于logging输出到一个logging文件中,但是不在终端中显示。但是作者您的readme的提示,是可以随时查看程序输出信息的。所以,我感觉应该是IDE支持的问题,我用的是sublime 3,没有logging的支持。

!list_plugin 报错

[ERROR] Fri, 29 Apr 2016 08:57:38 handler.py line 123: Error occurs when running task from plugin [PluginManger].
Traceback (most recent call last):
File "/home/huzhifeng/workspace/netroby/SmartQQBot/src/smart_qq_bot/handler.py", line 119, in run
task.func(*_task.kwargs)
File "/home/huzhifeng/workspace/netroby/SmartQQBot/src/smart_qq_bot/signals.py", line 15, in wrapper
return func(_args, **kwargs)
File "/home/huzhifeng/workspace/netroby/SmartQQBot/src/smart_qq_plugins/manager.py", line 70, in hello_bot
return bot.reply_msg(msg, result)
File "/home/huzhifeng/workspace/netroby/SmartQQBot/src/smart_qq_bot/bot.py", line 670, in reply_msg
return self.send_buddy_msg(tuin=msg.from_uin, reply_content=reply_content, msg_id=msg.msg_id+1)
File "/home/huzhifeng/workspace/netroby/SmartQQBot/src/smart_qq_bot/bot.py", line 570, in send_buddy_msg
self.send_buddy_msg(tuin, reply_content, msg_id, fail_times + 1)
File "/home/huzhifeng/workspace/netroby/SmartQQBot/src/smart_qq_bot/bot.py", line 547, in send_buddy_msg
fix_content = str(reply_content.replace("", "\\").replace("\n", "\n").replace("\t", "\t"))
AttributeError: 'int' object has no attribute 'replace'

WARNING:root:No plugin config file found.

就clone完第一次会弹验证码,然后第二次就停了,只会显示No plugin config file found.。

这个是不是要先人肉登录一次SMARTQQ,再运行你的程序的啊?

TODO: third party plugin develop support advice

刚刚提交了两个小自己写的第三方功能插件。已经pull request.
开发过程很简单,但是也有一些小建议 ; P

如果我想让天气查询功能,在group,pm,和sess中都能用。需要重复工作三次。每次功能添加 需要修改四个文件。QQRobot_default.conf文件,写明此插件是否使用,然后在group.py,pm.py以及'sess.py重复工作三次,写相同的代码才可以。这样的重复工作,我想我们的框架[暂时叫框架]是可以完全避免的。只要用户开发一个第三方类,比如在plugin目录下,然后让用户提供一个run方法,把核心运行代码写在run里面。然后在配置QQRobot_default.conf`来指定哪儿可以调用这个第三方模块,并提供类名。然后就算是开发完成了。

这样不会让用户修改框架的核心代码,只要专注写好自己的插件就行啦

估计作者最近比较忙,以后有空可以考虑一下这个三方插件的支持,但是不需要着急实现。

关于谁是卧底部分的两个问题

shuishiwodi.py中的ReadyStatus类里面,在用
playerInfo.name = game.uin2name(msgDto.send_uin)
获取name的时候,得到的字符串为空

然后AssignRolesStatus类中,
game.writePrivate(x.uin, u'[%s]谁是卧底,您本局[%s]的词语是:%s' % (x.name,game.gameId, x.word))
接收到的网页是404 Not Found,发不出私信

请问是什么问题?

缺少tkinter

archlinux,py2,py3都有,依赖里的Pillow没有安装上(pip list可以看到没有这个包),执行python run.py或者phthon2 run.py:

raise SystemError('缺少Tkinter模块, 可使用sudo pip install Tkinter尝试安装')
SystemError: 缺少Tkinter模块, 可使用sudo pip install Tkinter尝试安装

请问下怎么解决啊

是否考虑制作一个可以在linux下聊QQ的软件 ?

我实在是搞不懂,为什么要费这么大的气力做一个机器人的软件,并且这个软件还没有多少用户群体,呵呵。
其实我只是想说,最好能制作一份可以在linux上正常与人沟通的QQ复刻版,可以正常接收文件,发送文字、图片、视频、gif动态图片、语音等等,这样更具实用性。

如果之前一个项目叫:pidgin-lwqq,这个项目就很好,无奈作者转入苹果的工作后,停止了开发。

我等代码能力为零的用户还是非常需要高校的人才来编写这样的实用软件的。
期待神作出现。

协议似乎改动了

retcode 103

附日志:


[WARNING] Fri, 01 Apr 2016 11:13:09  plugin.py line 46: No plugin config file found.
[INFO] Fri, 01 Apr 2016 11:13:09  bot.py line 130: Try cookie login...
[INFO] Fri, 01 Apr 2016 11:13:09  bot.py line 165: Login by cookie succeed. account: xxxxxxxxx
[DEBUG] Fri, 01 Apr 2016 11:13:09  bot.py line 319: Pooling returns response:
 {"errmsg":"","retcode":103}

[WARNING] Fri, 01 Apr 2016 11:13:09  bot.py line 328: Pooling received retcode: 103: Check error.retrying..
[DEBUG] Fri, 01 Apr 2016 11:13:09  bot.py line 319: Pooling returns response:
 {"errmsg":"","retcode":103}

多用户登陆cookie相互覆盖

http_client.py中的urllib2.install_opener(self._req)会设置一个全局的opener,这个操作会导致cookie文件的覆盖。如果需要细致的请求处理,建议不要采用这样的全局opener。

以下给一个可行的方案,

# -*- coding: utf-8 -*-
# Code by zhongjingjogy
# Email: [email protected]
import cookielib
import urllib
import urllib2
import time
import os
from httplib import BadStatusLine

from exceptions import ServerResponseEmpty
from logger import logger

class HttpClient(object):
    def __init__(self, load_cookie=False,
        smart_qq_refer="http://d1.web2.qq.com/proxy.html?v=20030916001&callback=1&id=2",
        cookie_file="cookie.data"):

        logger.debug("initilizing HttpClient")

        logger.debug(cookie_file)

        self.smart_qq_refer = smart_qq_refer
        self.cookie_file = cookie_file
        self.cookie = None

    def init_cookie(self):
        self.cookie = cookielib.LWPCookieJar(self.cookie_file)

        try:
            self.cookie.load(ignore_discard=True, ignore_expires=True)
        except Exception:
            self.cookie.save(ignore_discard=True, ignore_expires=True)

    def build_opener(self, refer):
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
        opener.addheaders = [
            ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'),
            ('User-Agent',
             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) "
             "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"),
            ('Referer', refer)
        ]
        return opener

    def get(self, url, refer=None):
        opener = self.build_opener(refer or self.smart_qq_refer)

        try:
            tmp_req = opener.open(url)
            logger.debug("get request info : %s" % tmp_req.info())
            self.cookie.save(self.cookie_file,ignore_discard=True,ignore_expires=True)
            return tmp_req.read()
        except urllib2.HTTPError, e:
            return e.read()

    def post(self, url, data, refer=None):
        opener = self.build_opener(refer or self.smart_qq_refer)
        try:
            tmp_req = opener.open(url, urllib.urlencode(data))
            logger.debug("get request info : %s" % tmp_req.info())
            self.cookie.save(self.cookie_file,ignore_discard=True,ignore_expires=True)
            return tmp_req.read()
        except urllib2.HTTPError, e:
            return e.read()

    def print_cookie(self):
        logger.debug("printing cookie")
        for each in self.cookie:
            logger.debug(each)

    @staticmethod
    def get_timestamp():
        return str(int(time.time()*1000))

    def get_cookie(self, key):
        for c in self.cookie:
            if c.name == key:
                return c.value
        return ''

    def set_cookie(self, key, val, domain):
        ck = cookielib.Cookie(
            version=0, name=key, value=val, port=None, port_specified=False, domain=domain,
            domain_specified=False, domain_initial_dot=False, path='/', path_specified=True,
            secure=False, expires=None, discard=True, comment=None, comment_url=None,
            rest={'HttpOnly': None}, rfc2109=False
        )
        self._cookie.set_cookie(ck)
        self._cookie.save(ignore_discard=True, ignore_expires=True)

    def download(self, url, file):
        opener = self.build_opener(self.smart_qq_refer)
        output = open(file, 'wb')
        output.write(opener.open(url).read())
        output.close()

bot.py line 331: RUNTIMELOG decode poll res ponse error

[INFO] Sun, 23 Oct 2016 17:20:20 bot.py line 170: Login by cookie succeed. acco
unt: 2564794432
[WARNING] Sun, 23 Oct 2016 17:20:20 bot.py line 331: RUNTIMELOG decode poll res
ponse error.
[WARNING] Sun, 23 Oct 2016 17:20:20 bot.py line 331: RUNTIMELOG decode poll res
ponse error.

Python3语言版本

我这里维护了一个Python3的兼容版本,就当前项目而言,我认为Python3更适合,因为Urllib、Urllib2、Cookie等库合并为一个库,同时不必单独处理Unicode等等改变比较适合我们当前的开发。顺带Python3版本天然解决了Python2版本Ctrl-C无法退出的问题(尽管不知道为什么)

多用户登陆的cookie相互覆盖(网络延迟,重复提交。)

http_client.py中的urllib2.install_opener(self._req)会设置一个全局的opener,这个操作会导致cookie文件的覆盖。如果需要细致的请求处理,建议不要采用这样的全局opener。

以下给一个可行的方案,

# -*- coding: utf-8 -*-
# Code by zhongjingjogy
# Email: [email protected]
import cookielib
import urllib
import urllib2
import time
import os
from httplib import BadStatusLine

from exceptions import ServerResponseEmpty
from logger import logger

class HttpClient(object):
    def __init__(self, load_cookie=False,
        smart_qq_refer="http://d1.web2.qq.com/proxy.html?v=20030916001&callback=1&id=2",
        cookie_file="cookie.data"):

        logger.debug("initilizing HttpClient")

        logger.debug(cookie_file)

        self.smart_qq_refer = smart_qq_refer
        self.cookie_file = cookie_file
        self.cookie = None

    def init_cookie(self):
        self.cookie = cookielib.LWPCookieJar(self.cookie_file)

        try:
            self.cookie.load(ignore_discard=True, ignore_expires=True)
        except Exception:
            self.cookie.save(ignore_discard=True, ignore_expires=True)

    def build_opener(self, refer):
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
        opener.addheaders = [
            ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'),
            ('User-Agent',
             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) "
             "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"),
            ('Referer', refer)
        ]
        return opener

    def get(self, url, refer=None):
        opener = self.build_opener(refer or self.smart_qq_refer)

        try:
            tmp_req = opener.open(url)
            logger.debug("get request info : %s" % tmp_req.info())
            self.cookie.save(self.cookie_file,ignore_discard=True,ignore_expires=True)
            return tmp_req.read()
        except urllib2.HTTPError, e:
            return e.read()

    def post(self, url, data, refer=None):
        opener = self.build_opener(refer or self.smart_qq_refer)
        try:
            tmp_req = opener.open(url, urllib.urlencode(data))
            logger.debug("get request info : %s" % tmp_req.info())
            self.cookie.save(self.cookie_file,ignore_discard=True,ignore_expires=True)
            return tmp_req.read()
        except urllib2.HTTPError, e:
            return e.read()

    def print_cookie(self):
        logger.debug("printing cookie")
        for each in self.cookie:
            logger.debug(each)

    @staticmethod
    def get_timestamp():
        return str(int(time.time()*1000))

    def get_cookie(self, key):
        for c in self.cookie:
            if c.name == key:
                return c.value
        return ''

    def set_cookie(self, key, val, domain):
        ck = cookielib.Cookie(
            version=0, name=key, value=val, port=None, port_specified=False, domain=domain,
            domain_specified=False, domain_initial_dot=False, path='/', path_specified=True,
            secure=False, expires=None, discard=True, comment=None, comment_url=None,
            rest={'HttpOnly': None}, rfc2109=False
        )
        self._cookie.set_cookie(ck)
        self._cookie.save(ignore_discard=True, ignore_expires=True)

    def download(self, url, file):
        opener = self.build_opener(self.smart_qq_refer)
        output = open(file, 'wb')
        output.write(opener.open(url).read())
        output.close()

获取群信息失败,"retcode":6

在 插件里面用get_group_info_ext2获取群信息,失败,"retcode":6。
得到的群信息为空,不知道是什么原因
插件代码:
from smart_qq_bot.signals import on_all_message

@on_all_message(name="SamplePlugin")
def sample_plugin(msg, bot):
print bot.get_group_info_ext2(4136146546)
print bot.get_friend_info(3535848264)

self.reply() 出现不工作情况

修改自最后部分“智障机器人”

def callout(self, content):

  if ".jita " in content:

        itemName = content[6:].encode("utf-8")

        self.reply(itemName) 

        #在此处正常

        se = urllib.urlopen("http://meowo.me/eve-api.php?name=" + urlencode(itemName))

        rs = se.read()

        se.close()

        re = urllib.urlopen("http://www.ceve-market.org/api/market/region/10000002/type/" + rs + ".json")

        rp = re.read()

        re.close()

        #self.reply(rp)

        #放到这里就不工作了 

        print str(self.gid) + itemName + '  ' + rs + '  ' + rp

        #打印没有错误

        return True

return False

请问下是什么原因导致的呢 又如何修改呢 (为了修改成想要的功能特意去看了 Python 入门

是否存在被BAN的可能?

我手头有一个机器人跑了一天之后出现了这种情况:
1、有些消息发送成功,但是对方收不到
2、消息发送发送成功返回1202

换qq之后没有这个问题。
能排除不会是过频因为实际上两句间隔大概在几十分钟以上。

增加plugin_init的装饰器

在登录完成之后,载入插件的时候,会执行这个插件里面的初始化代码。
这个的必要性主要是传入一个已经初始化好的bot对象,而不用直接用app中导入(难以确定bot的可用性状态)。
是否有必要?

BTW:群里有人提到做爬虫的那个可以借由这个实现(虽然实际上没啥关系……)

将QQ部分分离出来

尝试看了一下代码,有点难理解。想请问一下能不能将QQ部分抽象出来,只提供收发消息的接口。对http方面的内容不是很懂,个人改起来无从下手,高手能不能指导一下。我看到github上另外一些人也用了smartqq,还做能把其他一些机器人api的接进来。还有pyaiml这个项目也能做一些聊天机器人的活。要是能够把代码优化一下,把接发消息的接口完善一下,那样和其他模块结合会方便很多。

能不能看看群文件的相关功能

  1. 比如我有多个群,能不能实现把一个文件上传到多个群
  2. 我看淘宝上买有刷群活跃的软件 ,但他们基本是刷表情,能不能做到按事先编好的话术或文字来直接刷文字等

这个线程的用法我有点看不懂啊。

由于GIL,我线程写的少,今天看了一下代码。发现MsgHandler用的线程的start()方法但是没有找到对应的run()方法。我不明白这样写有什么深意,我自己测了一下。发现跟串行差不多啊。莫非我火星了?

import threading

class mt(threading.Thread):
    def __init__(self):
        super(mt, self).__init__()
        pass

    def show(self):
        for i in range(100):
            print self.name + "WTF?"

if __name__ == '__main__':
    x = []
    for i in range(5):
        t = mt()
        x.append(t)
        t.start()
    for j in range(5):
        x[j].show()
        print "---------------------------------"

retcode为103

Check error. 请前往http://w.qq.com/ 手动登陆SmartQQ一次.

我觉得这个错误是因为本地cookie是存在问题,需要删除cookie并重新扫描二维码登陆的。这个问题的产生原因应该是重复登陆,也就是说用户已经通过smartqq登陆了一次了,在没有下线的情况下又登陆了一次,服务器端就会出现将cookie视为有问题的。但是具体那个会有问题,这个还需要重现一下。

临时对话协议

  • 先获取group_sig:
    json.loads(HttpClient_Ist.Get('http://d.web2.qq.com/channel/get_c2cmsg_sig2?id={0}&to_uin={1}&clientid={2}&psessionid={3}&service_type={4}&t={5}'.format(myid, tuin, ClientID, PSessionID, service_type, ts), Referer))
  • 然后POST消息
        reqURL = "http://d.web2.qq.com/channel/send_sess_msg2"
        data = (
            ('r', '{{"to":{0}, "face":594, "content":"[\\"{4}\\", [\\"font\\", {{\\"name\\":\\"Arial\\", \\"size\\":\\"10\\", \\"style\\":[0, 0, 0], \\"color\\":\\"000000\\"}}]]", "clientid":"{1}", "msg_id":{2}, "psessionid":"{3}", "group_sig":"{5}", "service_type":{6}}}'.format(tuin, ClientID, msgId, PSessionID, str(content), group_sig, service_type)),
            ('clientid', ClientID),
            ('psessionid', PSessionID),
            ('group_sig', group_sig),
            ('service_type',service_type)
        )
        rsp = HttpClient_Ist.Post(reqURL, data, Referer)      

实现见https://github.com/zeruniverse/QQBot_LinuxVPS/blob/master/QQBot.py
部分代码跟你不同,不PULL了。

关于webQQ新登陆协议的一些说明

抽空抓包看了一下新协议,登陆流程和逻辑似乎没有太大的改动,主要是登陆时的url由"http://d.web2.qq.com/channel/login2"变为了"http://d1.web2.qq.com/channel/login2",但是修改后尝试登陆login2的POST时返回retcode100001 。

并且,发现官方的webQQ在扫描完二维码后与发出登陆POST之间多了两个proxy请求,仔细看了一下是在进行cookies跨域,那么我觉得应该是新版本加强了对于请求cookies的要求(以前机器人发出的请求cookies并没有在意跨域的问题)。

而我之前是直接使用xqin封装的HttpClient.py进行请求操作的,我不太熟悉urllib/2/cookielib的相关操作,故我可能会在过一段时间后将机器人内的请求改为使用requests库,便于管理跨域的cookies。

如果这周末我没抽出时间那就至少要等我考完6级才能更新了。。。

Needs operating Group, Pm and Sess at the same time

希望 MsgHandler层能提供插件支持

我在谁是卧底模块开发时遇到一个问题,我需要在一场游戏中同时操作Group、Pm以及Sess三个类。
比如我希望用户可以在游戏过程中 发送临时消息给机器人,以得到本局的游戏词信息,这就需要同时向Group和Sess中值入模块代码,且保证是同一个游戏实例。
采用目前的架构不太好实现,迫切希望重构部分代码,以提供支持。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.