当前位置:   article > 正文

python模拟春节集五福_用Python分析支付宝红包和2018年集五福活动,你准备好了吗?...

python模拟春节集五福的过程

想必各位对于支付宝“集五福”活动一定都有深入的了解,从2016年开始,中国网友们关于过年的记忆再次更新,除了看春晚,年夜饭以外,集“五福”突然成了一个全家参与的新年活动。从16年全民疯抢“敬业福”到17年的“AR”扫福,无一不是调动了全国人民的热情。随着春节的临近,和往年一样,支付宝每年的必备活动-支付宝集五福又来了!只要集齐五福,你就可以在除夕夜平分五亿现金红包。今年的五福依然是「富强福」「和谐福」「友善福」「爱国福」「敬业福」时间是2月6日-2月15日。和往年有点不同的是,2018年“集福”的方式有三种!

方法一:AR扫福字(2月6日-2月15日)

这次五福依然有扫福字的玩法,打开支付宝,点击左上方的扫一扫,选择右下方的AR

那么哪里有福字呢?

用电脑搜福字

甚至手写都可以

你还可以让你的朋友做一个「Give me five」的手势,同样有机会获得福卡。

方法二:蚂蚁庄园领福卡(2月8日-2月15日)

打开支付宝,搜索蚂蚁庄园,用你的手抚摸这只小鸡儿。

这时候它会掉下一个金蛋,点击金蛋就有机会拿到福卡。

方法三:蚂蚁森林赢福卡(2月11日-2月15日)

打开支付宝,搜索蚂蚁森林,给好友的小树苗浇水也有机会获得福卡。

土豪的福利:如果你的蚂蚁会员等级达到钻石会员,你就可以获得三张「万能福」,「万能福」能变成任意一张福卡。你还可以把你多余的挖能福转赠给朋友。

你集齐了几张福卡?听说已经有好多人集齐五福了!

下面分析如何让我的手脱离手机去发送分享支付宝的链接?程序,Python程序。在最初的时候想着支付宝有没有像微信一样的程序接口,去批量的给支付宝中的好友去发送红包的链接,查找资料后,发现支付宝只提供商业的接口,再下面一点的接口不提供了。也许是担心安全和骚扰问题!

在年末火的微信跳一跳中,程序辅助中用到了ADB,ADB是Android操作系统与桌面电脑间沟通的一个命令列工具。可以在电脑上通过命令达到操作手机的效果。这个工具可以说在测试中的等级范围属于低级的一种。能达到的效果:我在手机上的各种操作(点,滑动,写文字,截屏)都可以通过ADB使用命令的方式实现。具体的使用方法在上一篇文章中有详细的讲述。在上篇的文章中adb应用的方面在“截屏”、“传输数据”与“按压”。本篇文章中将生活中的事件抽象模型化,完成简单的数理建模,使用ADB的“滑动”与“按压”的组和完成“自动化”分享支付宝红包链接。

分为这几个步骤,介绍上篇文章的流量。

搞这个东西的原因,受什么启发

贴上一波女朋友的广告

贴上支付宝码,要钱 打赏一次

电脑端

手机端保存图片

准备工具:

电脑

安卓手机

数据线

Python作为辅助

施行方案

位置测距

抽象模型

Python代码

位置测距

操作手机使用adb,原理与使用方法参考详细介绍。在平常使用手机过程中,最常用的动作就是点点点,滑滑滑。模拟分享红包链接的过程中也使用到了两步

一个是上下左右滑动

adb shell input swipe x1 x2 y1 y2

另一个是点击

adb shell input tap x y

X、Y是手机的分辨率像素对应的位置。手机上左上位置坐标为(0,0),相应的右下的坐标(Xmax,Ymax)。每一个位置都可以通过坐标的方式表达,例如滑动屏幕是从一个坐标到另一个坐标,点击屏幕是直接tap坐标,获取分辨率的方法

adb shell wm size

例如:我的手机720*1280,宽720,长1280

点击某个位置

abd shell input tap 100 100

这时候点击位置,但是这个(100,100)如何快速的确定呢!

发明出专用的“尺子”

根据手机的尺度打造一个度量,方便后期进行测量大概的位置。

ADB中input的常用方法,具体内容参见我上篇文章

D:>adb shell inputusage: input ... input text input keyevent input [touchscreen|touchpad|touchnavigation] tap input [touchscreen|touchpad|touchnavigation] swipe [duration(ms)] input trackball press input trackball roll

抽象模型

其实发送的过程就两个大的过程。

点击发送按钮

多选联系人

点击发送按钮

实现点击发送按钮的过程十分的简单。例如下图中需要点击“发送”,就只需要定位到发送按钮的位置区域,在这个区域内点击任何一个点即可完成发送的动作。

实现代码

定位到发送按钮的位置的一点(600 650)

import osos.system('adb shell input tap 600 650') # 完成发送

点击按钮是属于傻瓜式的操作,在与去准确的测量其位置信息,找到对应的位置的信息即可完成操作,同样比如发送、确定、取消等出现在手机上的可点可选内容都能操作。

多选联系人

为了做到快速的发送链接给好友,使用多选联系人发送方式,选择每次点击联系人便能加入到多选框,支付宝的限制每次的多选在0~9人的范围,最多不能超过9人。

依照字母格式将整个联系人分成26组。例如定位到A组后,A组中有9位联系人,确定第一位联系人的点击位置,然后第二位联系人在第一位联系人的基础上加上一个联系人的长度(测试长度为111)。

实现9个联系人。

first = 初始位置for i in range(9): # 循环点击联系人 point = first + i * 111 print('固定9个人的位置:',point) os.system('adb shell input tap 220 ' + str(point) + ' ') # 点击联系人的位置 time.sleep(0)

现在整个实现过程的主干已经清楚了,再优化逻辑。

首先如果以某一个字母开头的联系人未满足9人或者超过9人,我们的不再代码适用,选择可以更改的易维护的方案。将某个以字母开头的所有联系人记录,然后判断是否超过9人,如果超过9人,就选着9个人,然后总人数减去9;如果人数达不到9人,便将人数加入到上面代码中的range()位置。

在算法中超过9次每次经历一个全选的过程都减去一次9,例如A中的人数有19个,每9次一个循环,需要进行3次循环分别是第1次选择9人,第2次选择9人,第3次选择1人。这样来来回回的减去i*9个数字略显智障。

for w in range(int(math.ceil(总人数/9))+1): # 总人数分成9人/组,能分成组数 if w==0: pass else: if w==int(math.ceil(总人数/9)): # 如果人数不够9人/组,就只选剩下的人 for i in range(剩下的人数): # 循环点击联系人 point = first + i * 111 os.system('adb shell input tap 220 ' + str(num2) + ' ') time.sleep(0) else: # 人数超过9人/组,进行一组满的选择 for i in range(9): # 循环点击联系人 point = first + i * 111 os.system('adb shell input tap 220 ' + str(num2) + ' ') 点击固定9的联系人的位置 time.sleep(0)

在实际的应用中发现,选择7~9个人后最后发送的过程中,有两行联系人头像的位置,而6个人以下(包括6人)只有一个人的头像位置,这样发送的位置就不能固定,于是将分组改成6人,进而避免了来回判断位置的情况。

for w in range(int(math.ceil(总人数/6))+1): # 总人数分成6人/组,能分成组数 if w==0 pass else: 程序

这样我们就有基础了,可以走一遍发送的整个过程,每次发送完成后会返回到支付宝红包的首页,每次都是从首页开始进行

选择依字母开头的联系人,定位到字母联系人的位置

list=['*','a','b','c','d'······] # 建立列表便于遍历dic2={ '0':0, # * '1':29, # a '2':14, # b '3':19, # c '4':8, # d······} # 创建字典 里面的值是对应通讯录中的人数 for l in range(列表长度): zero = int(304) # 通讯录右边 最初的位置 num = zero + 36 * l # 每一个字母之间的位置大概 36 time.sleep(1) os.system('adb shell input tap 700 ' + str(num) + '') # 选择通讯录最右边字母

然后去选择联系人。超过6个人就去选满6人,然后等下次在定位到这个字母联系人的时候,就要把6个人去舍弃掉,可以转化为不再选这6个人,也就是向下滑动6个联系人的单位。

for i in range(int(w)-1): #减去1,当w=1时候就不用滑动了。 time.sleep(1) print('要向下滑动{}个单位,此时滑动到{}个单位'.format(i,int(w)-1)) os.system('adb shell input swipe 400 900 400 300 1000') # 滑动的位置都是经过多次的实验得到的

在发送红包的时候可以写一段留言

adb shell input text Red_bagre 写下一段文字

Python代码

完整代码,鄙人手拙。

import osimport timeimport sysimport mathlist=['*','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','#']dic2={ '0':0, # * '1':29, # a '2':14, # b '3':19, # c '4':8, # d '5':0, # e '6':6, # f '7':12, # g '8':12, # h '9':0, # i '10':11, # j '11':1, # k '12':61, # l '13':7, # m '14':4, # n '15':2, # o '16':6, # p '17':4, # q '18':3, # r '19':17, # s '20':8, # t '21':0, # u '22':0, # v '23':28, # w '24':15, # x '25':16, # y '26':28, # z '27':0 # #} #a = 0for i in range(28): a = a + dic2[str(i)]print(a) #总共有联系人def alipay(): flag = os.system('adb devices') if flag == 1: print('安装adb或配置环境便令') sys.exit() os.system('adb shell input keyevent 3') #依照我手机的图形摆放位置 os.system('adb shell input keyevent 3') # 返回到home键 os.system('adb shell input swipe 600 600 300 600') os.system('adb shell input swipe 600 600 300 600') # 向左滑动两次 os.system('adb shell input tap 280 100') # 点击打开支付宝的位置 os.system('adb shell input tap 80 1250') # 定位到首页的位置 time.sleep(5) os.system('adb shell input swipe 400 1150 400 300') os.system('adb shell input tap 600 400') # 发红包赚赏金 for l in range(28): # 大的循环 没发一次就循环一次的,每一个字母循环一次 for w in range(int(math.ceil(dic2[str(l)]/6))+1): if w==0: pass else: print('以{}开头联系人,第{}位,要循环的{}次,此时第{}次循环'.format(list[l],l,int(math.ceil(dic2[str(l)]/6)),w)) time.sleep(4) os.system('adb shell input tap 388 1088') # 立即赚赏金 time.sleep(1) os.system('adb shell input tap 688 938') # 发送给朋友 time.sleep(1) os.system('adb shell input tap 666 100') # 点击多选 time.sleep(1) os.system('adb shell input tap 300 300') # 从通讯录选择 # # 循环选着联系人 a = int(304) num = a + 36 * l time.sleep(1) os.system('adb shell input tap 700 ' + str(num) + '') # 选择字母 # for i in range(int(w)-1): time.sleep(1) print('要向下滑动{}个单位,此时滑动到{}个单位'.format(i,int(w)-1)) os.system('adb shell input swipe 400 900 400 300 1000') # 滑动 num3 = 320 if w==int(math.ceil(dic2[str(l)]/6)): for i in range(dic2[str(l)]-(w-1)*6): # 循环点击联系人 num2 = num3 + i * 111 print('{}要循环{}次,此时第{}次循环,选择到第{}个联系人,距离是{}'.format(list[l],int(math.ceil(dic2[str(l)]/6)),w,i,num2)) os.system('adb shell input tap 220 ' + str(num2) + ' ') time.sleep(0) else: for i in range(6): # 循环点击联系人 num2 = num3 + i * 111 print('{}要循环{}次,此时第{}次循环,选择固定6个人。选择到第{}个联系人,距离是{}'.format(list[l],int(math.ceil(dic2[str(l)]/6)),w,i,num2)) os.system('adb shell input tap 220 ' + str(num2) + ' ') time.sleep(0) time.sleep(1) os.system('adb shell input tap 620 100') # 两次确定 time.sleep(1) #程序自动发送早上好早上好Good_morning_Program_automatic_transmission #Good_morning_Happy_day os.system('adb shell input tap 620 100') # 发送 time.sleep(1.5) os.system('adb shell input tap 300 840') # 发送 time.sleep(0.1) os.system('adb shell input text Red_bagre') time.sleep(0.5) # os.system('adb shell input tap 522 910') # 发送 os.system('adb shell input tap 600 650') # 发送 time.sleep(2) #防止网卡。 print('发送成功')alipay()

里面添加了多处的time,主要还是自己的手机反应慢的原因。不得已而为之。

添加联系人

在经过多次实验,代码可以无误的在我的手机上跑起来,这样分分钟把所有的人跑完了,这样0就觉得联系人太少了额!没几次就发送完了。另外支付宝可以很方便的通过手机通讯录添加联系人。

批量添加联系人

安卓的手机通讯录可以导出.vcf格式。然后传送到电脑上,查看文档的内容

其中的TEL CELL是电话号码,然后批量添加手机号,生成txt中的内容。导入到手机里面更新通讯录,大功告成。

手机号码为了提高可使用率,可以从大学的贴吧中爬取,面向学生获取的手机号,日常的支付宝使用率比较高。

或者去批量的生产几千个

with open('00003.txt','w')as f: for i in range(99): a = random.randint(1700, 8000) print(a) f.writelines('BEGIN:VCARD'+\n') f.writelines('VERSION:2.1'+\n') f.writelines('N:;'+str(a)+';;;'+\n') f.writelines('FN:1'+\n') f.writelines('TEL;CELL:132 5337 '+str(a)+\n') f.writelines('END:VCARD'+\n')

实在搞笑的事情,在导入完成后,足足有4000多个电话号码。刚登陆上支付宝的小号准备加人,支付宝立即把我的帐号封了,说我存在风险,然后打客服电话,直接给我封了一个月。可见支付宝的安全措施真的强,那里都不能钻空子,钻到一点空子实属捡到的便宜。

既然你支付宝不让我通过通讯录添加好友,那我就手动的添加

for i in range(100): print('第几次添加好友',i) l = random.randint(1000,9999) print('手机号是:1599567',l) os.system('adb shell input text 1325337'+str(l)) # 搜索联系人 time.sleep(3) os.system('adb shell input tap 680 220') #选择联系人 time.sleep(3) os.system('adb shell input tap 680 400') os.system('adb shell input tap 680 500') # 添加好友 os.system('adb shell input tap 680 555') os.system('adb shell input tap 680 600') time.sleep(3) os.system('adb shell input tap 680 100') # 发送 time.sleep(3) os.system('adb shell input keyevent 4') # back time.sleep(3) os.system('adb shell input tap 680 80') #点叉 time.sleep(3)

这几串代码能保证无论是否添加过好友,还是没有搜索到好友,还是允许添加都能应对。

每天最多添加的只有30个好友,多了之后就不让添加了。

总结

在这次的文章中没有什么难的技术上面的问题,主要是应用方面,如何将一系列的问题模型化,程序化。

如何做到自动呢!将电脑的主板改成每天早上6点自动开启,然后定时执行脚本。(让360手机助手不自启动,防止端口占用),现在我的笔记本游戏本,也不支持自启,寝室断电更不能抗住一夜,回去用家里的台式机进行实验。(我记得我的电脑能通过调节主板把频率和功耗降到最低。不过也不值得我去倒持它了。)

理论化分析:活动举行3个月,支付宝好友最多有500人的上限,每天能添加30人,就算一天只有10个人去同意,现在我的通讯录有280多人,在未来一个月内能加满人,同时还有一部分人受不了我的骚扰单方面删除我,同时也能保证500人的状态。每天发送500分分享,大概需要一个小时的时间,按照10%的人去愿意点开链接,每天就有500*10%=50个红包,在红包使用后折算不立即使用的人,支付宝领取红包金额最多在0.11元与0.34元最多。但是使用红包后我能获得的奖励金却是翻了几倍的金额。每天收入十几元以上。按照这样想想,月入百万都是梦。

毕竟这些都是理论化的分析,可能根本就到不到这个数值。但是这个方法大家可以去试一下。

好了,今天就分享到这里,有想学习Python编程的伙伴们,欢迎留言和小编交流学习,最后祝大家早日集齐五福!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/74628
推荐阅读
相关标签
  

闽ICP备14008679号