前言

今天早上起来出去锻炼,公交车上闲来无事,刷空间,看到朋友打王者被骂,对面叫嚣加QQ要喷爆他,不能忍!回家后拿起电脑就开始敲,写了这个祖安神器准备帮朋友一把。

准备工作

先得准备语料,咱这不会骂人,也没积累啥语料,网上找找吧。先百度一下祖安,找到这个“骂人宝典”,顺手嫖了一个api,正写着,发现api有访问频率的限制,咱是去对线,速度慢可不行呀(滑稽)。果断改变方法,github上搜祖安看能不能找到别人的库

果然不出所料,找到了这个

脏话爬取\垃圾话\祖安对线\quicker动作

下载其中的 sql.sql 文件,导入自己的mysql中,语料准备完成。

用到的功能

  1. 监听键盘快捷键pynput
  2. 模拟键盘按键 pykeyboard
  3. 多线程 threading
  4. 操作剪贴板 pyperclip

代码实现

从数据库读数据

为了减少连接数据库的时间消耗,采用封装的方法一次性连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class SQL:
def __init__(self):
user = '' # mysql用户名
password = '' # mysql密码
# 数据库来源:https://github.com/Oohuo/rubbish/blob/master/sql/sql.sql
self.db = pymysql.connect('localhost', user, password, 'zanghua', charset='utf8')
self.cursor = self.db.cursor()
random.seed(a=None, version=2)

# name: 被骂人的名字,默认为空
# id: 指定哪一条,默认为0不指定用随机id
# level: 1表示口吐莲花,2表示火力全开
def get_zuan(self, name='', id=0, level=1):
table = 'lajihuamin'
max_id = 416 # 口吐莲花416条
if level == 2:
table = 'lajihuamax'
max_id = 690 # 火力全开690条
if not id:
id = random.randint(1, max_id) # 不指定,随机id
sql = 'select msg from %s where id=%d' % (table, id)
self.cursor.execute(sql)
res = self.cursor.fetchall()[0][0]
if name is not '':
res = res.replace('xx', name) # 把xx换成名字
res = re.sub(r'^\n', '', res) # 去首字符换行
res = re.sub(r'(.*)', '', res) # 去除括号
res = re.sub(r'\n$', '', res) # 去末尾换行
return res

创建线程

1
2
3
4
def create_thread(target, args=(), thread_num=5):
for i in range(thread_num):
t = threading.Thread(target=target, args=args)
t.start()

发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def send_zuan(sleep_time, name='', id=0, level=1):
sql = SQL()

def send():
res = sql.get_zuan(name=name, id=id, level=level)
lock.acquire() # 线程锁,防止剪贴板混乱
pyperclip.copy(res)
print(res)
k = PyKeyboard()
k.press_keys([k.control_r_key, 'v'])
k.press_keys([k.control_r_key, k.enter_key])
lock.release()

while True:
if flag:
send()
if sleep_time:
time.sleep(sleep_time)

监听快捷键(我这里设置的是 左Ctrl + B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def listening_keykoard():
pressed = set()

def on_press(key):
pressed.add(key)
# print('pressed:', pressed)
global flag
if pressed == {keyboard.Key.ctrl_l, keyboard.KeyCode(char="\x02")}:
if flag: # 开启状态按快捷键停止
print('stop')
flag = 0
else: # 停止状态按快捷键开始
print("begin")
flag = 1

def on_release(key):
if key in pressed:
pressed.remove(key)

print("start up")
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
print("shutdown")

最后,启动

1
2
3
4
5
6
7
8
9
10
11
12
if __name__ == "__main__":
# target: 目标函数,不要修改
# args:
# 第一个参数 sleep_time 是每个线程内两次发消息的间隔,经过多次尝试,线程太多或者间隔太短都不太行,可能是我电脑不行
# 第二个参数 name 对方名字
# 第三个参数 id 不为0时指定固定的一句,为0时随机
# 第四个参数 level 1级口吐莲花,2级火力全开
# thread_num: 线程数
create_thread(target=send_zuan, args=(0.1,), thread_num=1)

# 创建监听快捷键的线程
threading.Thread(target=listening_keykoard).start()

github 项目地址:

https://github.com/Roc136/zuan

欢迎star~

展示:

结语:

当然最后没有和对方对线,毕竟狗咬咱一口咱没必要还一口~

写这个纯属娱乐和学习新知识,但是祖安可不好哦~