写了一个人人网信息备份工具,敬请指教

2018-08-20 11:35:12 +08:00
 whusnoopy

前阵子人人网又冒了个热点,在热点事件前就考虑是不是把自己的人人信息备份下来。找了一圈,之前的各个备份工具在 2017 年人人登录机制改变后就都不能用了。参考前辈们的经验,写了这么一个工具:

https://github.com/whusnoopy/renrenBackup

目前可以

  1. 邮箱密码登录
  2. 抓取自己的 状态、留言板、相册、日志 及对应的评论和点赞信息
  3. 抓取指定用户,被当前登录用户可见的上述内容
  4. 用 Flask 展示抓取的信息

  1. 头像、照片都抓到本地了,但是可能有因为人人的原因导致原图不存在的情况
  2. 原文评论和点赞评论都抓了,但有遗漏多半是人人自己的锅,登录到官方网页版都看不到
  3. 点赞数是对的,但只能显示最近 8 个点赞的人,也是人人接口的锅,官方网页版也只显示 8 个人

还打算做的工作

  1. 纯静态输出(即脱离 Flask 查看,方便抓取后导给没有 Python 环境的其他人看)
  2. 对抓挂了的图的补救抓取(对应上面注 1 )
  3. RESTful + Vue.js 纯动态输出(自我学习玩)
5706 次点击
所在节点    Python
30 条回复
whusnoopy
2019-05-19 08:42:01 +08:00
@hackpro 展示大图对宽高比过高的图片现在也加了最大高度限制,通过点击图片查看原图(可能会影响习惯了点图是看下一张操作),详见 https://github.com/whusnoopy/renrenBackup/issues/39
hackpro
2019-05-19 10:33:43 +08:00
@whusnoopy 感谢 键盘快捷键现在已经很好用了 但是图片显示还是有的问题 每次都要上下拖动滚动条才能看全图片
另外请教下如何按用户名 /相册名称层级导出原始图片 方便用其他软件查看 谢谢🙏
whusnoopy
2019-05-19 10:54:04 +08:00
@hackpro 看全图片这个可能还要再考虑下屏幕大小的适配优化,我开发调试是在 1920x1080 或 2560x1440 的分辨率下弄的,对更低分辨率或开了高 DPI 的是不太友好(捂脸

按用户名和相册名称导出原始图片,这个可以参考下 export.py 下的 export_albums 这个方法,就是导出的时候别渲染页面,直接新建文件夹拷贝图片就好
hackpro
2019-05-19 16:42:19 +08:00
@whusnoopy 可以按照长宽中取 max 按照一定的比例缩放就行了
另外更新之后的版本似乎经常出现验证码的问题 而且验证码按照弹出的图片输入四个汉字总是通不过

get icode image, output to ./static/icode.jpg
Input text on Captcha icode image
whusnoopy
2019-05-19 17:20:01 +08:00
@hackpro 就是这个缩放尺度把握不好,而且还有外部容器和内部图片的比例问题,前端设计还是见仁见智并且各种坑

验证码的问题,建议换个 IP 后把之前的登录信息清掉后再试,这个是触发安全阈值的问题,如果你的号在不同的地方登录或同一个 IP 不停的登不同的号,容易触发验证码,这个和代码版本没有关系
hackpro
2019-10-24 10:08:30 +08:00
@whusnoopy 老哥 GitHub 上最新 pull 的代码有点问题 希望检查下😄
whusnoopy
2019-10-24 10:58:37 +08:00
@hackpro 问题是什么。。。没看到 issue 这里也没有任何有效信息,猜猜我是谁么
hackpro
2019-10-30 21:15:26 +08:00
@whusnoopy 抱歉 我没有说清楚
>>> python manage.py fetch -e mobile -p 'pwd' -u id_num -s -g -a -b -r
最后报错的部分结果为:
fetched 8 albums
prepare to fetch blogs
start crawl blog list page 0
Traceback (most recent call last):
File "manage.py", line 116, in <module>
manager.run()
File "/usr/local/anaconda3/lib/python3.6/site-packages/flask_script/__init__.py", line 417, in run
result = self.handle(argv[0], argv[1:])
File "/usr/local/anaconda3/lib/python3.6/site-packages/flask_script/__init__.py", line 386, in handle
res = handle(*args, **config)
File "/usr/local/anaconda3/lib/python3.6/site-packages/flask_script/commands.py", line 216, in __call__
return self.run(*args, **kwargs)
File "manage.py", line 41, in fetch
fetched = fetch_user(uid, fetch_status=status, fetch_gossip=gossip, fetch_album=album, fetch_blog=blog)
File "/Users/XXX/Code/Python/renrenBackup/fetch.py", line 99, in fetch_user
fetch_blog(uid)
File "/Users/XXX/Code/Python/renrenBackup/fetch.py", line 76, in fetch_blog
blog_count = crawl_blog.get_blogs(uid)
File "/Users/XXX/Code/Python/renrenBackup/crawl/blog.py", line 83, in get_blogs
total = load_blog_list(cur_page, uid)
File "/Users/XXX/Code/Python/renrenBackup/crawl/blog.py", line 26, in load_blog_list
r = crawler.get_json(config.BLOG_LIST_URL.format(uid=uid), {'curpage': page})
File "/Users/XXX/Code/Python/renrenBackup/crawl/crawler.py", line 123, in get_json
r = json.loads(resp.text.replace(',}', '}'))
File "/usr/local/anaconda3/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/local/anaconda3/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/anaconda3/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
whusnoopy
2019-10-31 11:23:12 +08:00
@hackpro 这不是最新的代码更新带来的问题,而是人人网 Web 端的 blog 页面全挂导致的解析问题,在人人网自己解决这个问题前,暂时没有办法处理,建议跳过 `-b` 参数抓取 blog。这个在项目介绍文档一开始就有更新说明 https://github.com/whusnoopy/renrenBackup#%E4%BA%BA%E4%BA%BA%E7%BD%91%E4%BF%A1%E6%81%AF%E5%A4%87%E4%BB%BD%E5%B7%A5%E5%85%B7

有人提议可以用网页手机版来抓取,但是网页手机版的 blog 输出里,排版格式基本全挂,且不一定能输出全文,还有登陆安全问题(非 HTTPS,授权走明文参数),所以只能等待

另:遇到问题先看 Issue 列表也是个好习惯,可能你遇到的问题已经有其他人提出过了,如果没有,也在 Issue 里提出会更有助于他人了解问题
hackpro
2019-10-31 15:17:33 +08:00
@whusnoopy 好的好的 感谢开发者👍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/481371

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX