用户工具

站点工具


画吧

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
画吧 [2024/01/27 13:59] yzqzss画吧 [2024/03/27 01:53] (当前版本) – [元数据] yzqzss
行 1: 行 1:
-{{tag>inprogress closing}}+{{:画吧:huabar_byebye_alpha.png?420 }} 
 +<wrap right> 
 +©《拜拜》由画吧用户“早点睡觉”创作,我们购得了这张画。 
 +</wrap> 
 + 
 +{{tag>saved closed}} 
 <WRAP center round info 60%> <WRAP center round info 60%>
-这个存档项目正在进行中,请加入 https://t.me/saveweb_projects/15874 了解详情。+存档项目已结束,请加入 https://t.me/saveweb_projects/15874 了解详情。 
 +</WRAP> 
 + 
 +<WRAP center round info> 
 +如果您是画师,查看[[画吧:Takeout]]了解如何获取您的作品备份。 \\  
 +如果你在找“[[画吧:画吧纪念版]]”,请前往[[画吧:画吧纪念版]]
 </WRAP> </WRAP>
  
行 14: 行 25:
 | 拥有者  | 苏州友家软件有限公司 | | 拥有者  | 苏州友家软件有限公司 |
 | 数据量  | 10~13 TiB | | 数据量  | 10~13 TiB |
-| [[https://itunes.apple.com/cn/app/id930358179|App Store]] | #TODO: APK |+| App Store | [[https://itunes.apple.com/cn/app/id930358179|id930358179]] | 
 +APK | [[wbm>20240129084549/https://huaba-operate.oss-cn-hangzhou.aliyuncs.com/huabarelease768.apk|huabarelease768.apk]] |
 | Android 包名 | com.haowan.huabar | | Android 包名 | com.haowan.huabar |
 +| project code | [[github>saveweb/huabar]] |
 </WRAP> </WRAP>
  
 画吧是一个成立于 2013 年的绘画 APP,其特点是用户上传作品到社区时,APP 会同时上传工程文件。浏览者可以播放工程文件,看到每一笔一画的作画过程。 画吧是一个成立于 2013 年的绘画 APP,其特点是用户上传作品到社区时,APP 会同时上传工程文件。浏览者可以播放工程文件,看到每一笔一画的作画过程。
-在 2024-01-13 ,画吧宣布将于 2024-02-08 关站。+在 2024-01-13 ,[[#关站公告|画吧宣布将于 2024-02-08 关站]]((老板还欠着银行 25 万没有还,hhh。 {{ :画吧:2023_苏0591执1084号之一.pdf |}}))
  
 +===== 截图 =====
 +
 +==== Android ====
 +
 +<gallery>
 +:画吧:huabar_home.jpg
 +:画吧:huabar_me.jpg
 +:画吧:huabar_bbs.jpg
 +</gallery>
  
 ---- ----
  
-<WRAP center round todo 60%> +===== 绘画作品(note) =====
-条目以下内容还需要完善 +
-</WRAP>+
  
 +画吧主要使用七牛云的 oss 和 cdn ,我们如果从公网下载这 10TB 的数据,
 +那么将给他们带来 4000 元以上的账单。因此我们在同地域设了一台 VPS,通过内网
 +下载画吧的数据,再打包发送到我们的各个存储服务器暂存。
  
 +==== 元数据 ====
  
-欠银行 25 万。(({{ ::2023_苏0591执1084号之一.pdf |}}))+首先爬取全站绘作品的元数据,扔进 MongoDB:
  
 +<code>
 +API = S_HTTP_PREFIX + "/RegisterDemo1/servlet/GetNoteInfo"
 +params = {
 +    'noteid': noteid, # int: [0, ++]
 +    'jid': jid,       # 访客的 jid
 +    'reqtype': 1,     # 恒为 1,不知道是否存在其它值
 +}
 +</code>
  
-#TODO: 投资撤资+便起见,我们将响应里的 ''%%["recomNotes"]%%''(用于在页面底部显示其它的作品推荐)全替换为空列表。
  
-#TODO安全漏洞+<code> 
 +["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 
 +</code>
  
-#TODO人员流失+notes 元数据:[[https://archive.org/download/huabar_dumps/huabar.mongodb.notes.jsonl.zst|huabar.mongodb.notes.jsonl.zst]] 
 +==== 下载 ====
  
-#TODOAPI 列表+然后 ''%%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%%'' 导出。
  
-#TODO: 存档过程+导出后将 ''%%noteossurl%%'' 和 ''%%original_url%%'' 标准化、舍弃坏链后合并去重,得到
  
-#TODO: APK 反编译+  * 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 可在七牛杭州内网((一个有趣的事实:七牛卖身阿里了,它的QVM其实是阿里云的ECS。而且从真阿里内网拉七牛OSS的带宽比七牛对七牛要大一个数量级。))用下面的方式下载:
  
-画吧主要使七牛云的 oss 和 cdn 我们如果从公网下载这 10TB 的数 +<code> 
-那么将给他带来 4000 元以上的账单因此我们在同地域设了一台 VPS,通过内网 +GET http://free-qvm-nbxs-gate-io.qiniu.com/{key} 
-下载画吧的数据,再打包到我们的存储服务器+Host: haowanlab.qiniudn.com 
 +</code> 
 + 
 +每下载满 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 可在阿里杭州内网下面方式下载: 
 + 
 +<code> 
 +GET http://haowanlab.oss-cn-hangzhou-internal.aliyuncs.com/{key} 
 +</code> 
 + 
 +同理下载满 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 列表:[[atfile>yP0fm/huabar_works.old_content.notestatus_0.empty_ossurl.urls.txt.zst]] ([[abjob>7ksk89yddm7hdywkmvnf74gr6]]) 
 + 
 +<del>由于 ''%%/GetNoteContent%%'' API 极其缓慢(并发、多 IP也无改善)且响应越大,等待越久。这部分我们预计只能在关站前存 10%。</del> \\ 
 +[[atwiki>User:JustAnotherArchivist|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。存档已上传至[[ia>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''
  
-===== APK 反编译 =====+===== 直接打开工程文件 =====
  
 有两种格式的工程文件。新的用: 有两种格式的工程文件。新的用:
行 79: 行 179:
  
 用来把过期vip用户的云草稿变成不可点击,改成 do nothing 就行。 用来把过期vip用户的云草稿变成不可点击,改成 do nothing 就行。
 +
 +登录貌似强制要求是 https,用 http 会弹 toast "server busy" 之类的,且没有实际请求发出。
  
 ===== 功能 ===== ===== 功能 =====
  
-  * 玄珠画板 +  * [[#玄珠画板]] 
-  * 玄珠3D绘画 +  * [[#玄珠3D绘画]] 
-  * 画吧课堂+  * [[#画吧课堂]]
   * 次元册   * 次元册
   * 约稿及作品交易   * 约稿及作品交易
   * 画吧论坛   * 画吧论坛
-  * 画吧活动 
  
-===== 截图 =====+==== 用户关注(fans/follow)====
  
-==== Android ====+保存了用户之间的关注关系。没有做到全量保存,因为新用户默认关注画郎/画娘,数量太大,处理分页不方便。计 14,205,933 个用户 31,688,768 条关注关系(包含关注时时间戳)。
  
-<gallery+SQLite 数据(未整理):[[https://archive.org/download/huabar_dumps/huabar.follow.db.xz|huabar.follow.db.xz]] 
-:画:huabar_home.jpg + 
-:画吧:huabar_me.jpg +查看方法: 
-:画吧:huabar_bbs.jpg + 
-</gallery>+<file sql
 +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; 
 +</file> 
 + 
 +==== 用户收藏(collection)==== 
 + 
 +收藏按钮放在了分享按钮的次级菜单里,因此用的人很少。 
 + 
 +<code> 
 +POST S_HTTP_PREFIX + "/RegisterDemo1/servlet/Collecting" 
 +</code> 
 + 
 +^ 参数名 ^ 类型 ^ 描述 ^ 
 +| ''jid'' | ''string'' | 用户 ID | 
 +| ''subtype'' | 枚举 | 作品 ''2'',贴子 ''5''
 +| ''collectionid'' | ''uint'' | 用于分页加载数据。若为 ''0'',则返回最新;不为 ''0'',返回数据中的所有项的 ''collectionid'' 小于此值 | 
 + 
 +=== 作品(note)收藏 === 
 + 
 +== 示例 == 
 + 
 +<code powershell> 
 +curl -X POST -H "Content-Typeapplication/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 
 +</code> 
 + 
 +<file json 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}} 
 +    ] 
 +
 +</file> 
 + 
 +最后一项的 ''collectionid = 9261119'' 作为下一次请求的 ''collectionid'': 
 + 
 +<code powershell> 
 +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 
 +</code> 
 + 
 +== 存档情况 == 
 + 
 +用户收藏夹由//OverflowCat//负责存档。所有发布过作品的用户(师)的收藏夹已遍历;其他一般用户数量太多,存档效益不高,只存了部分就暂停了。 
 + 
 +SQLite 数据(未整理):[[https://archive.org/download/huabar_dumps/huabar.note-collections.db.xz|huabar.note-collections.db.xz]] 
 + 
 +=== 论坛帖子收藏 === 
 + 
 +所有发布过作品的用户(画师)的收藏夹已遍历,待整理。 
 + 
 +==== 画册(book) ==== 
 + 
 +每个画册需要画币建立,可以放入作品(''element''),每个作品下可写图片的描述(''elementbrief'')。API 返回一个 ''elementlist''。 
 + 
 +没爬完,数据待整理。 
 + 
 +==== 玄珠画板 ==== 
 + 
 +=== 手动导入外部工程文件 === 
 + 
 +要将外部的工程文件导入草稿,可以新建一个相同长和宽的空白作品,然后保持为草稿,再把草稿删除。 
 +删除的草稿进入“系统备份”后,强制停止 APP。进入 ''%%.hbfolder/{你的jid}/xuanzhu_backup/%%'',将里面最新的那个 ''%%.du%%'' 文件替换为你想替换的工程文件。 
 + 
 +<WRAP center round alert 60%> 
 +gzip 压缩后的工程文件需要先解压,否则恢复备份的时候 APP 会 OOM 崩溃。 
 +</WRAP> 
 + 
 +然后再打开 app,恢复备份即可。 
 + 
 +<WRAP center round important 60%> 
 +我们还没有探索过旧版工程文件的导入方法。也许是类似的。 
 +</WRAP> 
 + 
 +=== 笔刷 === 
 + 
 +<code>GET /RegisterDemo1/servlet/CustomBrush?jid={}&reqtype=getcblist&subtype={}</code> 
 + 
 +获取某个用户拥有的笔刷。''%%subtype1 笔刷,2 纹理, 3 塑体模型%%'' 
 + 
 +//玉米狐狸//遍历了发过作品的用户(?)的笔刷(包含纹理和塑体模型)。第一次提出来的 URL 列表见:[[atfile>10b1Zu/huabar_brush.20240202.urls.txt.zst]]([[abjob>f0y9uwxoja117muh7543b4mjr]]),关站前增量补了一次新爬到和漏爬的 URL [[atfile>C7NFI/huabar_brush.20240202-20240208.increment.urls.txt]]([[abjob>9iv8nzda1sxui9hptilae2lkb]]) 
 + 
 +#TODO: 数据库整理后发布。 
 + 
 +==== 玄珠3D绘画 ==== 
 + 
 +3D 其实就是把图贴在模型上,用的人也很少,且没有过程数据。 
 + 
 +==== 画吧课堂 ==== 
 + 
 +首页:https://s.haowanlab.com:8008/draw/h_b_course_index.html ([[wbm>20240129085501id_/https://s.haowanlab.com:8008/draw/h_b_course_index.html]]) 
 + 
 +=== 获取课程列表 === 
 + 
 +<code> 
 +POST /RegisterDemo1/servlet/Course 
 + 
 +reqtype=courselist&page=1 
 +</code> 
 + 
 +响应: [[atfile>115gr8/huabar_api_Course_courselist.json]],这只能获取到 23 个正常的在售课程,隐藏的课程要遍历[[#获取课程]]API。 
 + 
 +点击一些讲师的名字,会跳进课程宣传页(如有)。跳转规则是硬编码到 HTML 里的 ''%%masterDetail()%%'' 中。 
 +截至 2024-01-29,有以下跳转规则。 
 + 
 +<code> 
 +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"; 
 +</code> 
 + 
 +以全部通过 SPN 存档。 
 + 
 +=== 获取课程 === 
 + 
 +<code> 
 +GET /RegisterDemo1/servlet/Course?jid={}&reqtype=courseinfo&courseid={} 
 +</code> 
 + 
 +courseid 填课程id \\ 
 +jid 填画吧老板的 jid ''%%f3bhs-0@zhizhiyaya.com/HuaLiao%%'' 可以//免费//获取全部视频。 
 + 
 +[[wbm>20240129092609/http://s.haowanlab.com:8900/RegisterDemo1/servlet/Course?jid=f3bhs-0@zhizhiyaya.com/HuaLiao&reqtype=courseinfo&courseid=53]] 
 + 
 +遍历全部课程: 
 + 
 +<code> 
 +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) 
 +</code> 
 + 
 +结果: [[atfile>16hLUJ/huabar_all_courses.jsonl]]。提取的全部 URL:[[atfile>8buty/huabar_all_courses.urls.txt]] ([[abjob>20240129104500cxqb0]])
  
 ===== 关站公告 ===== ===== 关站公告 =====
画吧.1706363984.txt.gz · 最后更改: 2024/01/27 13:59 由 yzqzss

除额外注明的地方外,本维基上的内容按下列许可协议发布: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki