Python带你来一次说走就走的环球旅行
1、目 标 场 景
十一长假,相信大部分的朋友这会应该是在全国各地浪或者是在浪的路上,朋友圈成为你们表演的场所。
当然,也有一小戳朋友是选择家里蹲,你们是否感觉到无聊?是否想出去浪,参加朋友圈摄影比赛?
本篇文章的目的是利用 Python 带我们实现一次 说走就走的环球旅行,完胜这次的朋友圈摄影比赛。
2、准 备 工 作
在开始编写脚本之前,需要做如下准备工作:
1、一部 Root 后的 Android 手机
2、配置好 Android ADB 开发环境
3、Python 虚拟环境内安装 pocoui 依赖库
4、虚拟定位应用 FackLocation
5、选好一个景点,下载对应景点的一些照片,并准备一段装逼的文字
注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑。为此小编建了个Python全栈免费答疑交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python教程项目可拿,,一起相互监督共同进步!
3、编 写 代 码
一共分 6 个步骤来完成这次操作,分别是:通过位置拿到经度和纬度、开启虚拟定位服务、导入图片到手机相册、打开朋友圈、选择相册图片、编辑内容和选择地理位置、发布朋友圈。
首先,利用 adb 命令拿到 FackLocation 和微信的应用包名和 LaunchActivity。
adb shell dumpsys activity | grep -i run
拿到应用包名和 LaunchActivity 之后,利用 Airtest 和 Monitor 工具可以非常方便的打开 FackLocation 应用、添加地理位置。
到达搜索界面之后,由于搜索的结果在 Monitor 下找不到。
因此,这里借助开发者选项内的 指针位置,拿到列表第一项的坐标,利用 adb 执行点击操作,既可以完成选择经纬度的操作。
def __mock_location(self):
"""
模拟定位
:return:
"""
home()
stop_app(package_name_location)
start_my_app(package_name_location, activity_location)
# 点击添加位置
self.poco('com.lerist.fakelocation:id/fab').click()
# 点击搜索
self.poco('com.lerist.fakelocation:id/m_item_search').click()
# 输入框输入目的地
self.poco('com.lerist.fakelocation:id/l_search_panel_et_input').set_text(self.location)
sleep(2)
# 宽、高
size = self.poco.get_screen_size()
# 由于选择结果UI树查找不到,这里使用坐标来执行点击操作
adb_click(500, 283)
# 确定位置
while self.poco('com.lerist.fakelocation:id/a_map_btn_done').exists():
self.poco('com.lerist.fakelocation:id/a_map_btn_done').click()
第 2 步,通过元素文字内容来判断服务是否开启,如果没有开启,就通过一次点击操作,完成定位服务的开启。
def __start_mock(self):
"""
开启模拟位置
:return:
"""
mock_element = self.poco('com.lerist.fakelocation:id/f_fakeloc_tv_service_switch')
if mock_element.get_text() == '启动模拟':
mock_element.click()
# 等待启动模拟完成
self.poco('com.lerist.fakelocation:id/f_fakeloc_tv_service_switch', text='停止模拟').wait_for_appearance()
else:
pass
print('模拟已经开启')
第 3 步,把 PC 端的图片利用 adb push 命令导入到 **手机相册目录 **下。
# 本地等待发送的图片
files = get_all_files('./image/')
# 一共待发送的图片数目
self.image_num = 9 if len(files) > 9 else len(files)
# 手机相册目录
phone_image_path = 'sdcard/DCIM/Camera/'
# 一张一张图片导入到手机相册内
for file in files[:self.image_num]:
exec_cmd('adb push %s %s' % (file, phone_image_path))
需要注意的是,导入图片后需要再 发送一次刷新广播,相册中才能找到这些图片。
# 更新手机相册
exec_cmd('adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///%s' % phone_image_path)
第 4 步,同样是利用 Airtest 打开微信客户端,然后自动化跳转到朋友圈界面。
def __open_friend_circle(self):
"""
打开朋友圈
:return:
"""
# 等待完全打开微信App
self.poco(text='微信').wait_for_appearance()
self.poco(text='通讯录').wait_for_appearance()
self.poco(text='发现').wait_for_appearance()
self.poco(text='我').wait_for_appearance()
print('微信完全打开')
# 点击【发现】Tab
self.poco('com.tencent.mm:id/djv', text='发现').parent().click()
# 打开朋友圈
self.poco('android:id/title', text='朋友圈').click()
# 等待朋友圈动态加载完全
self.poco('com.tencent.mm:id/eyx').wait_for_appearance()
第 5 步,从手机相册内选择图片。
手机相册的照片是按时间进行排序的,根据上面推送的图片数目,选择相册的前面的 **具体数目 **的照片即可。
# 选择指定数目的照片
cbs = self.poco('com.tencent.mm:id/ek8').offspring('com.tencent.mm:id/bwn')
index = 0
# 选中固定数目的照片
for cb in cbs:
if index < self.image_num:
cb.click()
else:
break
index += 1
# 确认选择图片
self.poco('com.tencent.mm:id/lm').click()
第 6 步,输入文字内容,并选择具体的位置。
由于虚拟定位刷新的不及时,为了保证位置的准确性,连续进行两次定位。
def __put_content_and_gps(self):
"""
输入内容和定位
:return:
"""
# 输入朋友圈内容
self.poco('com.tencent.mm:id/d3k').set_text(self.msg)
# 定位的次数,一般需要两次
location_count = 0
# 点击定位图标
while True:
self.poco('com.tencent.mm:id/d0a', text='所在位置').click()
# 等待搜索列表中有结果出现
self.poco('com.tencent.mm:id/du7').wait_for_appearance()
if location_count == 0:
# 返回
keyevent('BACK')
location_count += 1
else:
# 排除ListView的前两项(不显示、市区),直接点击第三项(具体位置)
self.poco('com.tencent.mm:id/dul').children()[2].click()
break
第 7 步,拿到顶部的发布按钮,就可以 一键发布动态了。
比如,我在深圳就发了一条在北京 TAM 看 YB 的朋友圈。
4、结 果 结 论
跟着上面的操作,就能实现全国任意一个景点,随时随地去玩这一骚操作。
注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑。为此小编建了个Python全栈免费答疑交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python教程项目可拿,,一起相互监督共同进步!
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
Python带你来一次说走就走的环球旅行的更多相关文章
- 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发
让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...
- 让Python带你看一场唯美的横飘雪!
“北国风光,千里冰封,万里雪飘”,这句诗描写了一句美丽肃静的风光图,恰逢昨天笔者这边也下了一场比较大的雪,要不今天就用Python带大家也来领略一次美丽的雪景? 开发环境 版本:Python3.6 系 ...
- python带颜色打印字符串
python带颜色打印字符串 之前调试pwn题的时候,有时候需要将某些特别的,重要的信息用不一样的颜色打印出来.查阅一些资料,了解了print函数的特性后,自己写了一个脚本,可以用来获取带颜色信息的字 ...
- Python带我起飞——入门、进阶、商业实战_ 入门版电子书籍分享,
Python带我起飞--入门.进阶.商业实战_ 免费下载地址 内容简介 · · · · · · <Python带我起飞--入门.进阶.商业实战>针对Python 3.5 以上版本,采用&q ...
- (DIjsktra算法) nyoj1401-一场说走就走的旅行
题目描述: 有一天,孩子回来对我说:“妈妈,听说马尔代夫很不错,放假了我想去玩.”马尔代夫?我也想去!没有人不向往一场说走就走的旅行!“其实我想去的地方很多,呼伦贝尔大草原.玉龙雪山.布达拉宫.艾菲尔 ...
- Python带括号的计算器
带括号的计算器也是第一个自我感觉完成最好的 毕竟真的弄了一个多星期 虽然前期这路真的很难走 我会努力加油 将Python学好学踏实 参考了两位博主的文章 http://www.cnblogs.co ...
- Python带参数的装饰器
在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passi ...
- Python 带参数的装饰器 [2] 函数参数类型检查
在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...
- Python带_的变量或函数命名
python中的标识符可以包含数字.字母和_,但必须以字母或者_开头,其中以_开头的命名一般具有特殊的意义. 前后均带有双下划线__的命名 一般用于特殊方法的命名,用来实现对象的一些行为或者功能,比如 ...
随机推荐
- 利用ionic3进行上一行和左一行不动,中间移动的功能
首先在html中的写法是 <ion-header> <ion-navbar> <ion-title>历史数据</ion-title> </ion- ...
- JFrame的getContentPane
我们可以在 JFrame 对象中添加 AWT 或者 Swing 组件.但是,虽然它有 add 方法,却不能直接用于添加组件,否则会抛出异常.造成这个现象的原因只有一个解释:JFrame 不是一个容器, ...
- 利用视频解析网站免费观看各大平台VIP电影
需求: 观看VIP电影.VIP电视 准备: 1.视频解析网站 2.VIP电影URL 教程开始: 1.百度搜索[视频解析],会索引出大量的视频解析网站,随便选择一个网站. 2.找到想观看的VIP视频,复 ...
- yukongDSRM账户安全防护
一.DSRM简介 1.DSRM(Diretcory Service Restore Mode,目录服务恢复模式)是windows域环境中域控制器的安全模式启动选项.域控制器的本地管理员账户也就是DSR ...
- C2440 “初始化”: 无法从“std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”转换为“std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”
错误原因vs已经提醒的很清楚了:无法将const_iterator转换为iterator 我的出错代码是这样的 思考了很久,最后发现原来是因为将函数定义为const的缘故. 总结:当将函数定义为con ...
- 简化 Spring Boot 项目部署,Flyway 搞起来
虽然我之前录了一个微人事(https://github.com/lenve/vhr)部署视频(新版微人事部署教程来啦),但是由于这次升级涉及到了 Redis 和 RabbitMQ,所以在本地跑微人事还 ...
- MySQL的简介
什么是数据库 1. 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 的API(接口)用于创建,访问,管理,搜索和复制所保存的数据 2. 我们也可以将 ...
- web渗透步骤流程
2013-11-13 23:03 (分类:网络安全) 这篇流程写的非常细,思路上很完整很全面,非常值得参考,做渗透思路要非常清晰,要不然我感觉真的容易乱,或者漏掉一些可能存在的点. 1.渗透目标 渗透 ...
- IIS停止服务 报错Connections_Refused
IIS版本6.0 无故停止工作. 重启IIS 没有效果,必须重启web服务器.出现客户端无法访问Web服务器上的站点,错误信息提示为"页面无法显示"的情况.登录服 ...
- shell脚本自动备份MySQL数据库
脚本如下: #!/bin/bash #数据库IP dbserver='127.0.0.1' #数据库用户名 dbuser='root' #数据密码 dbpasswd=' #数据库,如有多个库用空格分开 ...