记QQ群机器人刷分辅助

背景

  2月1日,OurEDA大群进了一个名叫小紫的机器人,具备聊天、积分系统、打劫系统等功能。先是把小紫当聊天机器人,随后就当个游戏来玩。OurEDA群自那天起,画风突变。
  积分并不好赚,大家都想快点赚够1W积分,买下最贵的武器轩辕剑和最贵的防具捆仙锁。于是大家找到了赚积分最快的方法:24点和猜字谜。拼手速的时候到了。大家把题目放到百度中,得到结果后粘贴到对话框中发送。2月4日,已经厌倦持续n天的机械式的刷分,于是写个脚(wai)本(gua)的想法诞生了。


小紫进入前
小紫进入后

实现过程

1、数据通道的建立

  要完成这个辅助,最重要的任务就是搭建信息的传输通道。下行即获取到小紫在eda群中的发言,上行即自己可以通过脚本进行发言。
  QQ电脑版与手机版的数据传输都是TCP/UDP经过加密的,要实现脚本收发消息几乎不可能。我知道几年前有个叫web qq的东西,一查,现在web qq已经改名为smart qq。于是抱着试试看的态度扫二维码登上smart qq,抓包,惊喜地发现消息传输全是明文的,所以可行性就明朗了,发两种post请求即可。


poll数据_JSON

  起初用JS发ajax请求,但是我对JS不是很熟悉,不造是碰到了跨域ajax请求的问题还是cookie等请求头的问题。于是改用Python,却在编码问题上遭遇不少坑,还得感谢Python老司机@XSky晓天的帮助。2月4日晚,成功拉取到了QQ群里的消息。2月5日早上,成功地实现了发消息。

2、猜字谜的百度爬虫

  猜字谜的爬虫很简单,百度XXX打一字,会直接在搜索结果页一个class为op_exactqa_s_answer的div中显示结果。采用requests库发请求,配合BeautifulSoup进行页面信息提取。这是我自己手写的第一个爬虫。
  下午,放到群里试,又一个机器人诞生了。两边机器人开始对刷了。刷太快小紫还会说我刷屏。没办法,两条之间加点延时。

1
2
3
4
5
6
7
8
9
10
11
def zimi_baidu_search(msg):
data = {'wd': u"%s" % msg, 'ie': 'utf-8'}
response = requests.get('http://www.baidu.com/s', params=data, timeout=5, verify=False)
html = response.text
soup = BeautifulSoup(html, "html.parser")
t = soup.div.select('.op_exactqa_s_answer')
if len(t) > 0:
return t[0].text.replace(' ', '').replace('\n', '')[0]
else:
return None

3、24点的自动计算

  上网找了个在线计算24点的网站,对那个计算按钮右键,审查元素。发现按按钮时没发网络请求,那就是在Js中直接计算出来的。于是直接找到那段Js代码,使用Python去执行它,就能得出结果了。
Python执行Js用

1
2
pip install pyexecjs
import execjs


自动24点
24点

4、一些附加功能

  至此,自动猜字谜和自动刷24点都已经实现。但是自动猜字谜每天有次数限制,自动刷24点无限。于是就想找个夜深人静的时候(3点)自动开始刷,然后6点自动停止。那就用定时器呗。第一个晚上没有成功,因为深夜大家发消息少,拉消息要阻塞很久才返回,在2点多,服务器返回了一个errcode:0,误判为Cookie过期而导致程序退出。
  第二个晚上还是没成功,因为设错了定时器,Python的timer只能执行一次的,改用新线程来写。第三个晚上还没到。

1
2
# timer = threading.Timer(300, timer_tick)
# timer.start()# timer将只执行一次

1
2
3
t1 = threading.Thread(target=timer_tick)# timer_tick是线程执行的函数
t1.setDaemon(True) # 该线程为后台线程,主线程退出程序直接结束
t1.start()

  后来,又实现了远程控制开关的功能。即我在聊天窗口发一条消息,即可控制自动答24点、自动猜字谜的开启与关闭,还可在软院大群、eda群之间切换。由于实现方法存在漏洞,暂不透露实现原理。