赞
踩
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"])
大功告成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。