代挂功能第一版实现

需求分析

容易用户操作登录

扫描二维码登录是目前最容易的登录方式

比较完善、容易获得二维码的是webqq协议端

实现收、发消息

具体设计

步骤8-12不断重复操作,实现自动玩机器人功能

代码实现

屌猫代挂服务实现:

主要基于https://github.com/pandolia/qqbot 实现,并实现了基本插件功能

修改安装后的sampleslot.py 为如下代码

# -*- coding: utf-8 -*-

# 本插件为默认插件,将在 qqbot 启动时自动加载。
# 如果不希望加载本插件,可以在配置文件中的 plugins 选项中删除 qqbot.plugins.sampleslots 。

from qqbot.utf8logger import DEBUG
import requests
import json
import os
import redis

count = 0
redishost = '127.0.0.1'

def onQrcode(bot, pngPath, pngContent):
    # 获取到二维码时被调用
    # 注意 : 此时 bot 尚未启动,因此请勿在本函数中调用 bot.List/SendTo/GroupXXX/Stop/Restart 等接口
    #       只可以访问配置信息 bot.conf
    # bot : QQBot 对象
    # pngPath : 二维码图片路径
    # pngContent : 二维码图片内容
    global count
    count = count + 1
    print 'onQrcode  is  %d count ' % count
    dst = '/home/xiaodiaomao/static/qqbot/erweima-%s.png' % bot.conf.qq
    if count > 2:
        os.system('rm -rf %s ' % dst)
        bot.Stop()
    os.system('rm -rf %s ' % dst)
    os.system('cp %s %s' % (pngPath, dst))


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

    # 自己发的消息
    if getattr(member, 'uin', None) == bot.conf.qq:
        if  content =='--stop--':  #自己发送--stop--表示自动退出
            bot.Stop()
        elif content == '--isactive--': #是否活着
            msg = '\n主人\n我在线\n使用屌猫代挂服务\n免费赚积分'
            bot.SendTo(contact, msg)

        return
    # time.sleep(1)
    if content is None or contact is None or member is None:
        return

    # 封装消息 发送到本地
    url = 'http://127.0.0.1:9090/api_qq/getmessage.php'
    data = {}
    data['frame'] = 'smartqq'
    data['msg_robot_qq'] = bot.conf.qq  # 机器人qq
    data['msg_qq'] = member.uin
    data['msg_content'] = content
    data['msg_qqqun'] = ''  # 群号
    try:
        if contact.ctype == 'group':  #群消息
            data['msg_type'] = 2

        elif contact.ctype == 'buddy':
            data['msg_type'] = 1
        p = {}
        p['qqrobot'] = 'caoNiMabi'
        p['msg_content'] = json.dumps(data)
        r = requests.get(url, params=p)
        if r.status_code == 200:
            data = json.loads(r.text)
            if 's' in data and data['s'] == 'Y':
                msg = data['msg']
                bot.SendTo(contact, msg)
    except Exception,e:
        print 'onQQMessage ', str(e)



def onStartupComplete(bot):
    # 启动完成时被调用
    # bot : QQBot 对象,提供 List/SendTo/GroupXXX/Stop/Restart 等接口,详见文档第五节
    DEBUG('%s.onStartupComplete', __name__)
    try:
        key = 'qq-smart-' + bot.conf.qq
        pool = redis.ConnectionPool(host=redishost, port=6379, db=0)
        r = redis.StrictRedis(connection_pool=pool)
        v = r.get(key)
        if v:
            data = json.loads(v)
        else:
            data = {}


        data['online'] = True

        r.set(key, json.dumps(data))

    except Exception, e:
        pass

def onExit(bot, code, reason, error):
    try:
        key = 'qq-smart-'+ bot.conf.qq
        pool = redis.ConnectionPool(host=redishost, port=6379, db=0)
        r = redis.StrictRedis(connection_pool=pool)
        v = r.get(key)
        if v:
            data = json.loads(v)
            if 'online' in data:
                data['online'] = False

                r.set(key,json.dumps(data))

    except Exception,e:
        pass

屌猫服务端修改

def worker(qq):
    try:
        port = random.randint(9000,50000)
        cmd = 'qqbot -q  %s  -p %d   -b /root/qqconf/%s' %(qq,port,qq)
        os.system(cmd)

    except Exception,e:
        print 'worker is dead ' + str(e)

# 删除老的二维码
dst = '/home/xiaodiaomao/static/qqbot/erweima-%s.png' % qq

os.system('rm -rf %s ' % dst)
# 开始新的二维码

p = multiprocessing.Process(target=worker, args=(qq,))
p.daemon = True
p.start()
# 等待2秒 开始返回图片二维码

send_msg = '[IR:pic=http://1.015ka.top/static/qqbot/erweima-%s.png]\n\n手机扫码完成登录\n\n退出登录指令:--stop--\n查看状态指令:--isactive--' % qq
print send_msg
time.sleep(5)

遗留问题

1.webqq目前没有办法获得发送的群号,没有办法根据群号进行控制

2.没有办法自动关闭已经登录的机器人

results matching ""

    No results matching ""