zoukankan      html  css  js  c++  java
  • 打python&adb组合拳,实现微信读书永久免费读

    用过“微信读书”的朋友都知道,如果我们想阅读全本的付费书籍,除了购买整本(使用书币)外,还可以使用无限卡。可无论是购买全书还是无限卡,归根结底都是要花银子的。

    除此之外,还有一种方式——用阅读时长兑换书币。根据目前微信读书的兑换策略,阅读半个小时,即可兑换1枚赠币,每周最多可兑换10枚赠币。因此,理论上每周我们可以使用5个小时的时间,获得最多10元等价书币。

    本篇文章博主就教大家一种方法,通过模拟书籍的手动翻页,快速免费获得书币的方法,该方法仅适用于Android平台。

    首先要配置好Android SDK环境变量和Python环境,最关键的是可以正常使用adb命令。这一步就不再赘述了,这里简要说明一下模拟翻页的原理,注意看下面一行命令:

    adb shell input swipe 1000 600 200 600

    这一行指令包含两部分操作:

    1. adb shell:进入设备的Shell命令行;
    2. input swipe 1000 600 200 600:模拟屏幕滑动,从x=1000,y=600坐标处滑动到x=200,y=600坐标处。即从右向左滑屏,也就是翻页的触摸操作;

    好了,理解了这行命令后,剩下的事情就好办多了。我们只需要间隔一段时间,循环执行这句话即可。即将下面两行命令放在循环中,循环的次数由书籍的未读页数决定。

    1 time.sleep(random.uniform(rv_t1,rv_t2))
    2 run('adb shell input swipe 1000 600 200 600', shell=True)

    为了尽量模拟人类阅读的真实性,这里的时间间隔是给定时间范围内的随机值。

    最后,为了更方便地使用这个脚本,除了正序(即从右向左滑屏)外,还增加了倒序(即从左向右滑屏)和无尽模式(即正序结束后自动倒序,倒序结束后自动正序,循环往复)。完整的Python脚本如下:

     1 # encoding:utf-8
     2 
     3 
     4 from subprocess import run
     5 import time
     6 import random
     7 import os
     8 
     9 def book(rv_sel, rv_page_num, rv_t1, rv_t2):
    10     rv_sel = int(rv_sel)
    11     if rv_sel == 1:
    12         print('程序运行中')
    13         for i in range(rv_page_num):
    14             time.sleep(random.uniform(rv_t1,rv_t2))
    15             run('adb shell input swipe 1000 600 200 600', shell=True)
    16             n = i + 1
    17             print('总计需翻阅 %d 页,已翻阅 %d 页,剩余 %d 页' % (rv_page_num, n, rv_page_num - n))
    18         exit()
    19     elif rv_sel == 2:
    20         print('程序运行中')
    21         for i in range(rv_page_num):
    22             time.sleep(random.uniform(rv_t1,rv_t2))
    23             run('adb shell input swipe 200 600 1000 600', shell=True)
    24             n = i + 1
    25             print('总计需翻阅 %d 页,已翻阅 %d 页,剩余 %d 页' % (rv_page_num, n, rv_page_num - n))
    26         exit()
    27     else:
    28         print()
    29         print('* ' * 8, '1.正循环-倒循环,无限循环', '* ' * 8)
    30         print('* ' * 8, '2.倒循环-正循环,无限循环', '* ' * 8)
    31         print()
    32         loop = int(input('请选择循环方式:'))
    33         print('程序运行中')
    34         if loop == 1:
    35             while 1:
    36                 for i in range(rv_page_num):
    37                     time.sleep(random.uniform(rv_t1,rv_t2))
    38                     run('adb shell input swipe 1000 600 200 600', shell=True)
    39                     n = i + 1
    40                     print('总计需翻阅 %d 页,已翻阅 %d 页,剩余 %d 页' % (rv_page_num, n, rv_page_num - n))
    41                 for i in range(rv_page_num):
    42                     time.sleep(random.uniform(rv_t1,rv_t2))
    43                     run('adb shell input swipe 200 600 1000 600', shell=True)
    44                     n = i + 1
    45                     print('总计需翻阅 %d 页,已翻阅 %d 页,剩余 %d 页' % (rv_page_num, n, rv_page_num - n))
    46         else:
    47             while 1:
    48                 for i in range(rv_page_num):
    49                     time.sleep(random.uniform(rv_t1,rv_t2))
    50                     run('adb shell input swipe 200 600 1000 600', shell=True)
    51                     n = i + 1
    52                     print('总计需翻阅 %d 页,已翻阅 %d 页,剩余 %d 页' % (rv_page_num, n, rv_page_num - n))
    53                 for i in range(rv_page_num):
    54                     time.sleep(random.uniform(rv_t1,rv_t2))
    55                     run('adb shell input swipe 1000 600 200 600', shell=True)
    56                     n = i + 1
    57                     print('总计需翻阅 %d 页,已翻阅 %d 页,剩余 %d 页' % (rv_page_num, n, rv_page_num - n))
    58 
    59 def rand_time(rv_xh):
    60     if int(rv_xh) == 1:
    61         return 10,20
    62     else:
    63         while 1:
    64             t1 = int(input('请输入最小等待时间:'))
    65             t2 = int(input('请输入最大等待时间:'))
    66             if t2 >= t1:
    67                 return t1,t2
    68                 break
    69             else:
    70                 print('最小时间不得小于最大时间,请重新输入')
    71 
    72 print('* ' * 50,)
    73 print('请选择翻页间隔时间:')
    74 print('1.预设(10秒 - 20秒之间):')
    75 print('2.自定义(大于0):',)
    76 print('* ' * 50,)
    77 while 1:
    78     xh = input('请输入序号:')
    79     if xh == '':
    80         print('输入有误,请重新输入')
    81     elif xh in str([1,2]):
    82         t1,t2 = rand_time(xh)
    83         break
    84     else:
    85         print('输入有误,请重新输入')
    86 while 1:
    87     print()
    88     print('* ' * 8, '1.正序', '* ' * 8)
    89     print('* ' * 8, '2.倒序', '* ' * 8)
    90     print('* ' * 8, '3.无尽', '* ' * 8)
    91     print()
    92     sel = input('请选择翻书方式:')
    93     if sel in str([1,2,3]):
    94         page_num = int(input('请输入书籍总页数:'))
    95         book(sel,page_num,t1,t2)
    96     elif sel == '':
    97         print('输入错误')
    98     else:
    99         print('输入错误')

    下面开始连接真机,然后启动App,随便打开一本书,最后打开命令行,运行这个Python脚本吧!提醒一下:不要忘了去兑换书币,否则这些努力就白费了。

    最后,请广大读者在经济允许的情况下购买正版书籍,支持作者和出版社。

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/wenhanxiao/p/11752785.html
Copyright © 2011-2022 走看看