1.动机和效果展示
最近b站上有很多的AI续写工具:
感觉挺有趣的,但是自己python写这样的ai不太现实,仔细看了看它们的特点,发现其实是用不同的ai续写工具完成的。碰巧的是,其中一款叫“****尝鲜版”(## 这回不侵权了吧)的工具,不仅免费,效果好,而且是网页版本。于是萌生出了一个用python爬虫进行续写的工具。
效果如图:
只有红框部分是我自己上写的过来的,其他都是续写出来的。
在学校电脑晚自习的时候后台运行差不多一个4个小时可以破万字。
2.原理及实现
(1).进入网页进行分析:
这么多的网页信息请求等,我发现最重要的其实是novel_ai请求
为何?
这里我遮挡些不必要的东西,可以发现content就是我们要拿去续写的文本,
而branchid,lastnode,mid,nid,uid里面重要的就是lastnode,这个记录了之前续写节点的_id
看一下返回的response
{
"status": 0,
"msg": "ok",
"data": {
"nodes": [{
"_id": "61e37690a487af67fba10e8e",
"created_at": 1642296976,
"updated_text": "just now",
"nid": "61e3768c1c5f5018d2e731e3",
"values": [{
"from": "model",
"value": ",我叫李天宇,我是一个学生。\n这里是我的家庭住址。\n我的家庭是一个农村人,父亲是一个普通工薪阶层,母亲是一个中医师,而我自己则是一个医科学生。\n我在国内的家族是华夏最有权势、最神秘的几个之一"
}],
"children": [],
"nodeid": "61e37690a487af67fba10e8e",
"parentid": "61e3768c1c5f5018d2e731e4",
"content": ",我叫李天宇,我是一个学生。\n这里是我的家庭住址。\n我的家庭是一个农村人,父亲是一个普通工薪阶层,母亲是一个中医师,而我自己则是一个医科学生。\n我在国内的家族是华夏最有权势、最神秘的几个之一",
"isedit": false,
"hidden": false,
"brother": ["61e37690a487af67fba10e8e", "61e37690a487af67fba10e8c", "61e37690a487af67fba10e8a"]
}, {
"_id": "61e37690a487af67fba10e8c",
"created_at": 1642296976,
"updated_text": "just now",
"nid": "61e3768c1c5f5018d2e731e3",
"values": [{
"from": "model",
"value": "!我叫王文。\n\"你好。\"\n\"嗯?我叫王文。\"\n\"嗯,你好,我叫王文,你呢?\"\n\"我叫李文轩。\"\n\"哦,原来你是王文轩啊,真的没有想到。\"\n\"你也没有想到啊。\"\n\"是啊。\"\n\"对了。\"\n\"怎么了?\"\n\""
}],
"children": [],
"nodeid": "61e37690a487af67fba10e8c",
"parentid": "61e3768c1c5f5018d2e731e4",
"content": "!我叫王文。\n\"你好。\"\n\"嗯?我叫王文。\"\n\"嗯,你好,我叫王文,你呢?\"\n\"我叫李文轩。\"\n\"哦,原来你是王文轩啊,真的没有想到。\"\n\"你也没有想到啊。\"\n\"是啊。\"\n\"对了。\"\n\"怎么了?\"\n\"",
"isedit": false,
"hidden": false,
"brother": ["61e37690a487af67fba10e8e", "61e37690a487af67fba10e8c", "61e37690a487af67fba10e8a"]
}, {
"_id": "61e37690a487af67fba10e8a",
"created_at": 1642296976,
"updated_text": "just now",
"nid": "61e3768c1c5f5018d2e731e3",
"values": [{
"from": "model",
"value": "!我叫赵飞羽,是一名高中生,现任职于某县的公务员。我是一名勤劳踏实,有责任心的人,请大家放心。\n我会继续努力,不辜负大家的期望。\n这是我的手机号码,希望我们以后可以联系。\n感谢大家!\n新书《"
}],
"children": [],
"nodeid": "61e37690a487af67fba10e8a",
"parentid": "61e3768c1c5f5018d2e731e4",
"content": "!我叫赵飞羽,是一名高中生,现任职于某县的公务员。我是一名勤劳踏实,有责任心的人,请大家放心。\n我会继续努力,不辜负大家的期望。\n这是我的手机号码,希望我们以后可以联系。\n感谢大家!\n新书《",
"isedit": false,
"hidden": false,
"brother": ["61e37690a487af67fba10e8e", "61e37690a487af67fba10e8c", "61e37690a487af67fba10e8a"]
}],
"count": 0,
"cur_nodeid": "61e3768c1c5f5018d2e731e4"
}
}
返回一个列表,记录了续写的返回值,如果我们每次都选择第一个,无线循环访问,就可以实现一直续写了。
思路是:
先novel_ai把自己要续写的内容传过去,收到回复后在把回复的内容第一个加到源文本中,继续传过去,循环往复即可。
而novel_ai:
这里我隐藏的原因是这是我的访问地址,你要进去访问要先手机号验证,我总不能把我的给你去玩吧。。。。
提示:这个网页访问不需要填写headers,管的很宽的,毕竟每次续写都要15——20s…
上代码:
import requests
import json
url = "http://if.caiyunai.com/v2/novel/?????????/novel_ai"
payloaddata = {
"branchid":"61dab2c7c14c1171b19578a9",
"content": "我不是神,我只是一介凡人!", #默认值,挺中二的。。。
"lang": "zh",
"lastnode": "61dab2c7c14c1171b19578a8",
"mid": "60094a2a9661080dc490f75a",
"nid": "61dab2c7c14c1171b19578a7",
"ostype": "",
"status": "http",
"storyline": "true",
"title": "",
"uid": "????????"
}
#这里我加入了文本输入,这样方便一点
f_path = input("输入自己的内容文件:")
f = open(f_path,mode="a+",encoding="utf-8")
f.seek(0,0)
str=""
for each_line in f:
str=str + each_line + "\n"
payloaddata["content"] = str
f.close()
temp="2"
while temp != "1" :
#为什么每次我都重新打开呢,因为是无限循环,所以中途退出的可能没有保存
#所以每次都打开关闭,确保保存了
f = open(f_path,mode="a+",encoding="utf-8")
f.seek(0,0)
str=""
for each_line in f:
str=str + each_line + "\n"
payloaddata["content"] = str
rep = requests.post(url,data=json.dumps(payloaddata))
dit = rep.json()
rep.close()
dit = dit["data"]["nodes"][0]
print("为你返回续写的内容为:"+"--------------------------------------------------------------------\n"+dit["content"])
payloaddata["content"] = payloaddata["content"] + dit["content"]
payloaddata["lastnode"] = dit["_id"]
f.write(dit["content"])
f.close()
#print(dit["data"]["nodes"]["_id"])
大功告成!