这是本文档旧的修订版!
这个存档项目正在进行中,请加入 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 |
画吧是一个成立于 2013 年的绘画 APP,其特点是用户上传作品到社区时,APP 会同时上传工程文件。浏览者可以播放工程文件,看到每一笔一画的作画过程。 在 2024-01-13 ,画吧宣布将于 2024-02-08 关站。
截图
Android
条目以下内容还需要完善
欠银行 25 万。1)
#TODO: 投资方撤资
#TODO: 安全漏洞
#TODO: 人员流失
#TODO: API 列表
#TODO: 存档过程
#TODO: APK 反编译
绘画作品
画吧主要使用七牛云的 oss 和 cdn ,我们如果从公网下载这 10TB 的数据, 那么将给他们带来 4000 元以上的账单。因此我们在同地域设了一台 VPS,通过内网 下载画吧的数据,再打包发送到我们的各个存储服务器。
元数据
首先爬取全站绘画作品的元数据,扔进 MongoDB:(#TODO: github href)
API = S_HTTP_PREFIX + "/RegisterDemo1/servlet/GetNoteInfo" params = { 'noteid': noteid, # int: [0, ++] 'jid': jid, # 访客的 jid 'reqtype': 1, # 恒为 1,不知道是否存在其它值 }
响应示例:TODO: 示例
方便起见,我们将响应里的 ["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
下载
然后 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 可在七牛杭州内网用下面的方式下载:
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%。
上传
每个 ZIP 压缩包(以及他们的 .keys
文件)根据它们的文件名上传到 huabar_[ali|qiniu]-draw-YYYYMMDD-HH
这样的 identifier 中——也就是同一小时的下载放进同一个 item 里。例如 huabar_qiniu-draw-20240128-01和huabar_ali-draw-20240130-00。
APK 反编译
有两种格式的工程文件。新的用:
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 就行。
功能
用户收藏夹(collection)
作品(note)收藏
收藏按钮放在了分享按钮的次级菜单里,因此用的人很少。
用户收藏夹由OverflowCat负责存档。所有发布过作品的用户(画师)的收藏夹已遍历;其他一般用户数量太多,存档效益不高,只存了部分就暂停了。
OverflowCat 明天整理后发 sqlite 数据。
论坛帖子收藏
#abandon
玄珠画板
手动导入外部工程文件
要将外部的工程文件导入草稿,可以新建一个相同长和宽的空白作品,然后保持为草稿,再把草稿删除。
删除的草稿进入“系统备份”后,强制停止 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,AB 存档f0y9uwxoja117muh7543b4mjr
#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日