代挂功能第一版实现
需求分析
容易用户操作登录
扫描二维码登录是目前最容易的登录方式
比较完善、容易获得二维码的是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.没有办法自动关闭已经登录的机器人