目录
此存档项目已结束,请加入 https://t.me/saveweb_projects/15874 了解详情。
画吧
画吧 | |
---|---|
URL | http://haowanlab.com |
成立于 | 2013 |
关闭于 | 2024-02-08 |
别名 | huaba, huabar |
拥有者 | 苏州友家软件有限公司 |
数据量 | 10~13 TiB |
App Store | id930358179 |
APK | huabarelease768.apk |
Android 包名 | com.haowan.huabar |
project code | saveweb/huabar |
画吧是一个成立于 2013 年的绘画 APP,其特点是用户上传作品到社区时,APP 会同时上传工程文件。浏览者可以播放工程文件,看到每一笔一画的作画过程。 在 2024-01-13 ,画吧宣布将于 2024-02-08 关站。1)
截图
Android
绘画作品(note)
画吧主要使用七牛云的 oss 和 cdn ,我们如果从公网下载这 10TB 的数据, 那么将给他们带来 4000 元以上的账单。因此我们在同地域设了一台 VPS,通过内网 下载画吧的数据,再打包发送到我们的各个存储服务器暂存。
元数据
首先爬取全站绘画作品的元数据,扔进 MongoDB:
API = S_HTTP_PREFIX + "/RegisterDemo1/servlet/GetNoteInfo" params = { 'noteid': noteid, # int: [0, ++] 'jid': jid, # 访客的 jid 'reqtype': 1, # 恒为 1,不知道是否存在其它值 }
方便起见,我们将响应里的 ["recomNotes"]
(用于在页面底部显示其它的作品推荐)全替换为空列表。
["noteossurl"] 绘画过程数据,实际上就是工程文件。3D 没有,被删除的没有 "" # 空,需要走 GetNoteContent 获取,如 10417637 http://notecontent.oss-cn-hangzhou.aliyuncs.com/{noteid} # 早期 http://qncdn.haowanlab.com/19116313b2bbfd63948971e593f60c51 http://imax.vmall.com/resource/20140515/40d6cf0e-a8f7-40a9-b8be-f6637393eb8a.png?x-oss-process=style/picmax # 如 199197 的远古,已失效 http://oss-cn-hangzhou.aliyuncs.com/haowanlab/e26e54af070de2d76ad214e847e67033.data # “此作品已被删除,过程无法播放” ["3dcommodity"] 3D 模型信息 {"url": "http://ngx.haowanlab.com/3dshop/index.html?from=notedetail#/ModShopDetail/s_c_37","ctext": "同款模型"} ["elementid"] 3D 作品的 elementid ch_s_c_37j8mo3t5601587443400720022803835 查看 3D 需要: http://ngx.haowanlab.com/3dshop/3dh5_share.html?eid={elementid}&jid={作者的jid} 不加作者 jid 的话没有音乐(?) ["original_url"] 为原图: http://haowanlab.qiniudn.com/964206cba38d4cb7ba6411dac146bfba.png # 替换为 http(s)://qncdn.haowanlab.com/ 可访问 http://qncdn.haowanlab.com/d0b42ecac71f7deee881e08db1554887 http://huaba-operate.oss-cn-hangzhou.aliyuncs.com/deletepic.png # note 被删除,远古帖子 http://haowanlab.oss.aliyuncs.com/967aae5243d682bffa474ddff5b4969b # 因 18 禁的原因被删除的帖子会显示这张图 ["voice"] 为音乐: http://qncdn.haowanlab.com/3cb2ea432cfd1d34943255f2308be23f.mp3 ["notestatus"] 0 正常 2 被删除(过程无法播放,但图片还在)如 19173235
notes 元数据:huabar.mongodb.notes.jsonl.zst
下载
然后 mongoexport --db huabar --collection notes --query '{}' --fields noteid,payload.noteossurl,payload.original_url --type csv --sort '{"noteid": -1}' | zstd --adapt -v > huabar_works.oss_pics.urls.raw.csv.zst
导出。
导出后将 noteossurl
和 original_url
标准化、舍弃坏链后合并去重,得到
- haowanlab.qiniudn.com 22061473(非最终数量)
- haowanlab.oss-cn-hangzhou.aliyuncs.com 555843(非最终数量)
- notecontent.oss-cn-hangzhou.aliyuncs.com 7577(非最终数量)
- huaba-operate.oss-cn-hangzhou.aliyuncs.com 32(非最终数量)
haowanlab.qiniudn.com 可在七牛杭州内网2)用下面的方式下载:
GET http://free-qvm-nbxs-gate-io.qiniu.com/{key} Host: haowanlab.qiniudn.com
每下载满 5GiB,将每个文件以 qiniu/{key}
为文件打包进 f'qiniu-draw-{datetime.datetime.now().strftime("%Y%m%d-%H%M%S")}.{random.randint(1000, 9999)}.zip'
。
这个 zip 里的全部 key 也会被写进同名的 *.keys
文件中当索引。
haowanlab.oss-cn-hangzhou.aliyuncs.com 可在阿里杭州内网用下面的方式下载:
GET http://haowanlab.oss-cn-hangzhou-internal.aliyuncs.com/{key}
同理,每下载满 5GiB,将每个文件以 ali/{key}
为文件名打包进 f'ali-draw-{datetime.datetime.now().strftime("%Y%m%d-%H%M%S")}.{random.randint(1000, 9999)}.zip'
。
*.keys
同理。
notecontent.oss-cn-hangzhou.aliyuncs.com 和 huaba-operate.oss-cn-hangzhou.aliyuncs.com 这两种 URL 的数量少,公网下载它们就行。
—
另外,满足条件 {notestatus: 0, noteossurl: ""}
的作品需要通过 GET /RegisterDemo1/servlet/GetNoteContent?noteid={}
API 来下载过程数据。
URLS 列表:yP0fm/huabar_works.old_content.notestatus_0.empty_ossurl.urls.txt.zst (7ksk89yddm7hdywkmvnf74gr6)
由于 /GetNoteContent
API 极其缓慢(并发、多 IP也无改善),且响应越大,等待越久。这部分我们预计只能在关站前存 10%。
JAA 发现并发实际上是有用的
The endpoint is slow, yeah, but I don't see any difference in response time between 50 and 100 connections, so that's nice. With a simple calculation, it looks like I'd need about 170 connections to retrieve it all in 2 days. More tests to follow.
由于 AB 对同一个 host 限制 6 并发,JAA 就在本地跑 WARC。存档已上传至huabar_note_content_20240205。 而后 JAA 注意到一个糟糕的情况:
some notes with `null` in my archives that actually exist: noteid=1001301
It's a bit tricky to get decent numbers on this, but I have roughly 900 cases among my test runs where the response differed from the final run. The test runs covered roughly 20k IDs.
返回 null
的 noteid 可能等一段时间后重试时又神奇地好了。但我们这时候已经没时间了。
上传
每个 ZIP 包(以及他们的 .keys
文件)根据它们的文件名上传到 huabar_[ali|qiniu]-draw-YYYYMMDD-HH
这样的 identifier 中——也就是同一小时的下载放进同一个 item 里。例如 huabar_qiniu-draw-20240128-01
和huabar_ali-draw-20240130-00
。
直接打开工程文件
有两种格式的工程文件。新的用:
com.haowan.openglnew.NewOpenglRead noteurl: {oss链接} jid: {} (可选) mjid: {} (可选)
就能显示绘画过程。把 isOffice()
始终返回 true 就可以去水印。
com.haowan.huabar.ui.NoteReadActivity noteId: {}
旧格式的画需要用这个 activity 打开。一样可以改 isOffice()
去水印。
有三个变量 mJid mJID(–jid) mFjid(–fjid),第一个是从配置文件读的。isSelf() 对比的是 mJid 和 mJID 。
lockDraft()
用来把过期vip用户的云草稿变成不可点击,改成 do nothing 就行。
登录貌似强制要求是 https,用 http 会弹 toast “server busy” 之类的,且没有实际请求发出。
功能
用户关注(fans/follow)
保存了用户之间的关注关系。没有做到全量保存,因为新用户默认关注画郎/画娘,数量太大,处理分页不方便。计 14,205,933 个用户 31,688,768 条关注关系(包含关注时时间戳)。
SQLite 数据(未整理):huabar.follow.db.xz
查看方法:
CREATE TEMP VIEW IF NOT EXISTS follow_view AS SELECT u1.jid AS from_jid, u2.jid AS to_jid, f.orderid FROM follow f JOIN users u1 ON f.from_uid = u1.uid JOIN users u2 ON f.to_uid = u2.uid;
用户收藏(collection)
收藏按钮放在了分享按钮的次级菜单里,因此用的人很少。
POST S_HTTP_PREFIX + "/RegisterDemo1/servlet/Collecting"
参数名 | 类型 | 描述 |
---|---|---|
jid | string | 用户 ID |
subtype | 枚举 | 作品 2 ,贴子 5 |
collectionid | uint | 用于分页加载数据。若为 0 ,则返回最新;不为 0 ,返回数据中的所有项的 collectionid 小于此值 |
作品(note)收藏
示例
curl -X POST -H "Content-Type: application/octet-stream" -H "Accept-Encoding: gzip" -d '{"jid":"f3bhs-0@zhizhiyaya.com/HuaLiao","subtype":2,"collectionid":0}' http://s.haowanlab.com:8900/RegisterDemo1/servlet/Collecting
- response.json
{ "subtype": 2, "requestid": "8b672a561fc64119a93c12c1ea449084", "relist": [ {"headline": "这可是葬礼24h啊","noteid": 19065929,"bookid": 0,"nickname": "鉴奈小队长","pagenum": 0,"notetype": 3,"praise": 627,"jid": "q9q5xsbj-0@zhizhiyaya.com/HuaLiao","collectionid": 9509959,"url": "http://qncdn.haowanlab.com/5bb0ac88a68bc70515bd247488d79686-mid800","faceurl": "http://qncdn.haowanlab.com/5b4d035b7144b1812e0978fd1e4c4f23","aspectratio": 1.564,"user_ex": {"remark": "","frameid": 34}}, ..., {"headline": "character setting 4","noteid": 18052405,"bookid": 0,"nickname": "贰拾肆","pagenum": 0,"notetype": 11,"praise": 231,"jid": "r3fhqp09-0@zhizhiyaya.com/HuaLiao","collectionid": 9261119,"url": "http://qncdn.haowanlab.com/7d05623c3827b585b7ece24fc20e9c19-mid800","faceurl": "http://qncdn.haowanlab.com/41b22bc9adbeaa2239f471d60bc5b8a5","aspectratio": 0.806,"user_ex": {"remark": "","frameid": 60}} ] }
最后一项的 collectionid = 9261119
作为下一次请求的 collectionid
:
curl -X POST -H "Content-Type: application/octet-stream" -H "Accept-Encoding: gzip" -d '{"jid":"f3bhs-0@zhizhiyaya.com/HuaLiao","subtype":2,"collectionid":9261119}' http://s.haowanlab.com:8900/RegisterDemo1/servlet/Collecting
存档情况
用户收藏夹由OverflowCat负责存档。所有发布过作品的用户(画师)的收藏夹已遍历;其他一般用户数量太多,存档效益不高,只存了部分就暂停了。
SQLite 数据(未整理):huabar.note-collections.db.xz
论坛帖子收藏
所有发布过作品的用户(画师)的收藏夹已遍历,待整理。
画册(book)
每个画册需要画币建立,可以放入作品(element
),每个作品下可写图片的描述(elementbrief
)。API 返回一个 elementlist
。
没爬完,数据待整理。
玄珠画板
手动导入外部工程文件
要将外部的工程文件导入草稿,可以新建一个相同长和宽的空白作品,然后保持为草稿,再把草稿删除。
删除的草稿进入“系统备份”后,强制停止 APP。进入 .hbfolder/{你的jid}/xuanzhu_backup/
,将里面最新的那个 .du
文件替换为你想替换的工程文件。
gzip 压缩后的工程文件需要先解压,否则恢复备份的时候 APP 会 OOM 崩溃。
然后再打开 app,恢复备份即可。
我们还没有探索过旧版工程文件的导入方法。也许是类似的。
笔刷
GET /RegisterDemo1/servlet/CustomBrush?jid={}&reqtype=getcblist&subtype={}
获取某个用户拥有的笔刷。subtype: 1 笔刷,2 纹理, 3 塑体模型
玉米狐狸遍历了发过作品的用户(?)的笔刷(包含纹理和塑体模型)。第一次提出来的 URL 列表见:10b1Zu/huabar_brush.20240202.urls.txt.zst(f0y9uwxoja117muh7543b4mjr),关站前增量补了一次新爬到和漏爬的 URL C7NFI/huabar_brush.20240202-20240208.increment.urls.txt(9iv8nzda1sxui9hptilae2lkb)
#TODO: 数据库整理后发布。
玄珠3D绘画
3D 其实就是把图贴在模型上,用的人也很少,且没有过程数据。
画吧课堂
首页:https://s.haowanlab.com:8008/draw/h_b_course_index.html (20240129085501id_/https://s.haowanlab.com:8008/draw/h_b_course_index.html)
获取课程列表
POST /RegisterDemo1/servlet/Course reqtype=courselist&page=1
响应: 115gr8/huabar_api_Course_courselist.json,这只能获取到 23 个正常的在售课程,隐藏的课程要遍历获取课程API。
点击一些讲师的名字,会跳进课程宣传页(如有)。跳转规则是硬编码到 HTML 里的 masterDetail()
中。
截至 2024-01-29,有以下跳转规则。
case 23 = "activity/indexB_Blue.html"; case 24 = "activity/indexA_Yellow.html"; case 25 = "activity/indexC_Aliceblue.html"; case 27 = "activity/indexD_Cayann.html"; case 30 = "activity/indexE_Tor.html"; case 31 = "activity/indexF_Redfire.html"; case 33 = "activity/indexG_Qbanrenwu.html"; case 34 = "activity/indexH_Renti.html"; case 35 = "activity/indexI_Beijing.html"; case 36 = "activity/indexJ_Rentijichuhuafa.html"; case 37 = "activity/indexK_xuanzhujinjie.html"; case 39 = "activity/indexL_Huihuazhongdeguangying.html"; case 40 = "activity/indexM_Biaoqingbao.html"; case 41 = "activity/indexN_3Dxuanzhu.html"; case 42 = "activity/indexO_Tiankongshangse.html"; case 43 = "activity/indexP_guisu.html"; case 44 = "activity/indexQ_35eth.html"; case 45 = "activity/indexR_Water.html"; case 46 = "activity/indexS_StarSky.html"; case 47 = "activity/indexT_GufengCJ.html"; case 48 = "activity/indexU_ZYzhiwu.html"; case 49 = "activity/indexV_ZYdongwu.html"; case 52 = "activity/indexAA_ZYchangjing.html"; case 53 = "activity/indexAB_bixiu.html"; case 55 = "activity/indexAC_tuilansecai.html";
以全部通过 SPN 存档。
获取课程
GET /RegisterDemo1/servlet/Course?jid={}&reqtype=courseinfo&courseid={}
courseid 填课程id
jid 填画吧老板的 jid f3bhs-0@zhizhiyaya.com/HuaLiao
可以免费获取全部视频。
遍历全部课程:
ss = requests.session() api = "http://s.haowanlab.com:8900/RegisterDemo1/servlet/Course?jid=f3bhs-0@zhizhiyaya.com/HuaLiao&reqtype=courseinfo&courseid=" for i in range(0, 100): r = ss.get(f'{api}{i}') r_json = r.json() if r_json['catalog']: print(r.text)
结果: 16hLUJ/huabar_all_courses.jsonl。提取的全部 URL:8buty/huabar_all_courses.urls.txt (20240129104500cxqb0)
关站公告
APP 首页放置的关服公告: https://web.archive.org/web/20240125181915/https://s.haowanlab.com:8008/activities/saybye/huababye.html
创始人在画吧论坛发布的公告:
11载相伴,终于到了要说再见的时候。
画吧停服计划:
1、2024年01月15日停止微信、支付宝支付,停止茶绘;
2、2024年02月08日关停所有网络服务,包括账户登录、作品发表、个人主页、作品广场、作品交易、排行榜、次元册、论坛、绘本、消息、笔刷市场、画吧课堂、玄珠3D、提现、签到、打分等等所有由服务器提供的服务;
善后事宜:
1、请大家尽快下载保存自己在画吧里的作品数据和美好回忆。
2、画吧网络服务关停后,玄珠画板依然可用,但云草稿不可再打开,字体不可再下载,自定义笔刷、纹理、素体模型不可再同步;所以请大家务必在2月8日之前下载备份云草稿,同步自己的自定义笔刷、纹理、素体模型,下载自己喜欢的字体;
3、2023年12月15日之后在画吧通过微信支付、支付宝支付开通会员、购买课程的用户,可在2024年02月08日前通过微信支付、支付宝支付相应交易记录中的退款功能申请全额退款。
4、2023年12月15日之后在画吧通过微信支付、支付宝支付购买了画币但尚未使用完的用户,可在2024年02月08日前通过微信支付、支付宝支付相应交易记录中的退款功能申请退款尚未使用的部分(注意申请时提供画吧id及画币余额的截图)。
5、历史遗留稿酬提现,可在2024年02月08日前联系微信号BankOfHuabar,提供画吧id及稿酬提现金额,后台核实后进行提现。
6、历史遗留画币提现,可在2024年02月08日前联系微信号BankOfHuabar,提供画吧id及画币提现金额,后台核实后进行登记备案,后续妥善处理。
7、其他各种未尽事宜,请联系微信号huabakefu,我们将为您妥善处理。
画吧APP
2024年01月12日
告别
下午,一个人坐在电脑前,阳光热烈的晒在脸上,让映在屏幕中的自己格外清晰,我对自己说:“放手吧,你已经尽力了!”
本以为我已被这几年公司经营中的各种麻烦事折磨到对画吧心如死灰,彻底麻木,但真的点开那些尘封已久的图片和文字,经历的种种,还是想在这个时候与大家分享些什么。。。
现在已是2024年01月13日凌晨,我整理了几十张图片,从创建画吧以来的主要改版的首页截图、画吧重大线上线下活动值得纪念的历史性时刻等等,但最后又将这些图片一一删除,只留下了一段文字,过去的就让都过去吧,值得怀念的总会被怀念,从2013到2024!
感谢每一位来到画吧的用户,特别是为画吧运营发展义务做了大量工作的版主、管理员们!
感谢每一位为画吧奋斗过的兄弟姐妹!
感谢每一位支持过画吧发展的投资人、合作伙伴、亲朋好友!
在此还要对我的家人表示深深的歉意,这些年,你们为我的“任性”承担了太多太多。。。
最后分享这段来自画吧用户的文字,与大家告别,这是画吧所获至高无上的荣誉!
小学生
2024年01月13日