因为群友要AI画图功能,但又不想花钱接入官方的api,也没法拿自己服务器直接进行搭建,所以只能去找别人已经搭好了的,在各种方式寻找后,发现了一个每天签到获取次数的网站符合要求,接下来就是发包模拟请求看能不能做进去
已知注册会给你一段16位token,登录直接用这个,所以抓个包看看
/api/user_login?token=你的token
直接返回一大串不知道是什么的字符串,但别急,看看下面那个包
/api/get_left?pass=接的是返回的这段
/api/dreambooth/get_model?pass=接的是返回的这段
得知登录得到这串字符串是与cookie作用相同的pass(注意,请求头里没有带任何认证用的如cookie,Authorization等),get_left顾名思义获取剩余次数,get_model获取模型(实际返回是NULL)
接下来,直接随便输入点tag生成模型看看,毕竟这才是关键,依旧先抓包看看(一下*均为手动打码)
POST /api/generate-image HTTP/2
Host: ****
Content-Length: 744
Sec-Ch-Ua: "Chromium";v="95", ";Not A Brand";v="99"
Accept: application/json, text/javascript
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Origin: ***
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: ***
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
{"pass":"你的pass","prompt":"masterpiece,best quality,1 girl,mika (blue archive) ,scrunchie,very long hair,yellow eyes,pink hair,halo,breasts,white wings, low wings,single side bun,blue ribbon,blunt bangs,low wings,white pantyhose,smile,sleeveless dress,Masturbation,thighs,nsfw,straddling,sex,rape","nprompt":",lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry","step":40,"scale":12,"seed":1168765599,"sampler":"DPM++ 2M Karras","wh":"square_l","progress_id":"1b9854b1-****-4517-80d9-a6703df53e55","dreambooth":"anything-v4.0-fp16-default"}
Pass是登录给的,prompt是tag,nprompt我直接留空,说明默认是这些,step是迭代次数,scale是服从度,seed随机种子不填写他会自己随机,sampler是采样器,wh是尺寸,progress_id暂时存疑,dreambooth是模型
返回结果如下,种子编号,成功状态,模型和图片链接
看接下来的包,
忽略掉/speed这个host都不是这个网站的包(也没有返回参数,直接不管)
/api/progress?id=接progress_id,返回如图,很明显是展示图片生成的进展,但实际上并没有用在生成图片里,只是一个指示进度的功能罢了,在调用层面上可以直接使用await强行等待返回结果即可
接下来的问题就是查明progress_id是如何生成的,当然你可能会说既然没用,为什么不去掉这个参数直接发包,如下图
既然是前面包里没有的参数,那就去看看生成功能的这段JS,非常幸运,直接ctrl+F就定位到了代码位置并且js没有进行混淆
可以看到seed是随机0到1之间的数再乘4294967296最后再向下取整
而Progress_id是u,而u又是uuid()方法生成的,那就去看uuid()
有点意思了,36个字符的数组s,最后这个s会拼接成字符串uuid,而这个uuid的第9,14,19,24位是“-”,第15位必定是4,其余位数(除第20位)是在0123456789abcdef里随机(16进制),第20位是随机出来的数按位与 0x3,再按位或0x8
既然如此,所有参数都知道来源了,甚至还带一个/api/pass_check?pass=的接口给你验证自己的pass是否依旧有效,那么自己写程序构造就好了。
最后需要注意的一点是,如果请求头没带够或者有误会直接403forbidden,而如果json发送的格式有误则会400bad request
Sec-Fetch-*请求头必须全部带上,请求头Referer那更不用说(关于Referer防盗链),否则必定403