最近有个读书的app搞限时免费阅读, 有几本书我想看, 但是又没有时间, 以前想过更改系统时间来延长阅读时间, 大概是同样有人这么干, 所以现在的限时阅读都是要联网验证一次才能看, 其实这种东西让懂前端的人写几个js就能把人家一整本书的文字全部抠下来永久免费看.

如果说是Android端, 比较好的思路是反编译代码再移除一些判断逻辑, 不过既然我能想到, 别人估计也防御了. 一个笨方法就是一页一页的截图, 不过我要是有这时间, 早就把书看完了.

刚好最近跑了几次monkey, 于是就想让那些自动化测试的工具帮我干这事.

其实说来也简单, 就是模拟我们的操作, 翻一页, 截图, 再翻一页, 截图.

Android SDK自带一个搞黑盒测试的工具–monkeyrunner, 这个和平时说的monkey不大一样, 那个monkey是做压力测试的, 这个则是功能更强大的工具.

流程如下

Created with Raphaël 2.1.0 Start 截A图 翻页 等待1秒 截B图 图A和图B 是否相同 End 保存A图 将图B赋给A图 yes no

比较是为了能区分是否到最后一页了, 等待1秒是为了让app能翻到下一页, 不至于截图的时候还是截的上一页的图.

代码如下:

#Mac OS X, freeder.py
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
import sys, os, time

if (__name__ == '__main__'):
PNG = "png"
PF_PNG = ".png"
PN_WIDTH = "display.width"
PN_HEIGHT = "display.height"
DOWN_AND_UP = "down_and_up"
TARGET_PATH = os.getcwd() + '/freeder' + str(int(round(time.time()*1000))) + '/'
os.mkdir(TARGET_PATH)
print 'create dir: ' + TARGET_PATH
device = MonkeyRunner.waitForConnection()
print 'device connected'
touch_x = int(device.getProperty(PN_WIDTH)) - 10
touch_y = int(device.getProperty(PN_HEIGHT)) / 2

page = 1
if (len(sys.argv) == 2):
page = int(sys.argv[1])

old_img = device.takeSnapshot()
while (True):
device.touch(touch_x, touch_y, DOWN_AND_UP)
time.sleep(1)
new_img = device.takeSnapshot()
if (new_img.sameAs(old_img)):
print 'snapshot is same, exit'
break
else:
old_img.writeToFile(TARGET_PATH + str(page) + PF_PNG, PNG)
print 'write image to file, nameing ' + str(page) + '.png'
old_img = new_img
page += 1
print 'done exit'

将手机连上电脑, 开USB调试, 打开读书app, 打开那本书, 终端执行

$ monkeyrunner freeder.py 1

就会开始截图, 文件名从1开始(Windows用户务必将脚本的路径写全, 且生成的图片文件夹在sdk的tools目录下)

这个东西运行起来其实挺费时间的, 我能想到, 大家早就想到了, 所以根本没有藏着掖着的必要, 写个博客给愿意折腾的人去截书玩. 其实看得懂那段代码的人, 能力都不在我之下, 只会比我做的更好, 分享一下纯属兴趣.

不过总有一天, 我们会懒得折腾, 觉得花钱解决问题是最简单的方式.

后续优化monkeyrunner截图限时免费阅读#2:多线程保存

更多相关文章

  1. ffmpeg从视频中提取帧时间戳
  2. js实现把整数秒转化为"hh:mm:ss"的时间格式.
  3. Java获得文件的创建时间(精确到秒)
  4. Java中累计时间的计算(以小时为最终结果)
  5. 如果服务器位于不同的位置,如何保存客户端机器时间
  6. java时间转换,long , string和date和时间戳的互转
  7. Java时区转换与时间格式

随机推荐

  1. Android简易实战教程--第三十九话《Chron
  2. .Net 转战 Android 4.4 日常笔记(5)--新软
  3. 小胖加入Android Fans的 大军了 呵呵
  4. 在android的java代码中自定义log
  5. Android热修复(一):底层替换、类加载原理总
  6. Android(安卓)长按电源键关机整个流程小
  7. 松下将在日本推出 7 寸和 10 寸企业用三
  8. Android 的网络编程
  9. init进程【4】——属性服务
  10. android系统体系结构