网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
元素的定位需要借助 Airtes,需要在 PC 端进行安装,具体可以参考上一篇。另外这里以 Android 系统手机为例,所以提前配置好了 adb 环境。
另外,需要在虚拟环境内安装「pocoui」库。
pip3 install pocoui
3 分 析 思 路
首先我们需要利用 adb 命令打开东方头条 App。
使用 Android Studio 的 Analyze Apk 工具,可以获取应用包名和初始 Activity 分别是:
com.songheng.eastnews
com.oa.eastfirst.activity.WelcomeActivity
然后使用「adb shell am start」命令去打开东方头条的客户端。
# 应用包名
package_name = 'com.songheng.eastnews'
# 初始Activity
activity = 'com.oa.eastfirst.activity.WelcomeActivity'
def start_my_app(package_name, activity_name):
"""
打开应用
adb shell am start -n com.tencent.mm/.ui.LauncherUI
:param package_name:
:return:
"""
os.popen('adb shell am start -n %s/%s' % (package_name, activity_name))
start_my_app(package_name, activity)
由于第一次打开应用,会有一个显示广告的界面,我们需要通过 Airtest 获取到「跳过广告」元素,执行点击操作,让应用快速进入到主页面。
def __pre_and_skip_ads(self):
"""
预加载和跳过广告
:return:
"""
# 1.广告页面元素的出现
# 两种样式:跳过、跳过广告*秒
try:
poco('com.songheng.eastnews:id/aoy').wait_for_appearance(10)
except Exception as e:
print('等待广告元素异常')
print(e)
ads_element = poco(name='com.songheng.eastnews:id/aoy', textMatches='^跳过广告.*$')
ads_element1 = poco(name='android.widget.TextView', text='跳过')
# 跳过广告(0s)
if ads_element.exists():
print('跳过广告1!!!')
ads_element.click()
if ads_element1.exists():
print('跳过广告2!!!')
ads_element1.click()
# 2.等到到达主页面
poco('com.songheng.eastnews:id/g_').wait_for_appearance(120)
到达主页面之后,我们发现主要有 3 种方式获取金币,分别是「阅读文章」、「播放视频」、「播放小视频」,另外一种获取金币的方式就是归纳于其他方式中。
首先,我们使用 Airtest 来分析新闻 Tab 的列表。
新闻列表可以通过获取 name 为「com.songheng.eastnews:id/g_」 的元素,再取其所有子元素就能获取到第一页的新闻列表。
lv_elements = poco('com.songheng.eastnews:id/g_').children()
if not lv_elements.exists():
print('新闻列表不存在')
return
# 遍历每一条新闻
for news_element in lv_elements:
# 新闻标题
news_title = news_element.offspring('com.songheng.eastnews:id/pb')
#作者
author_element = news_element.offspring('com.songheng.eastnews:id/a4f')
需要注意的是,上面获取的新闻列表中有很多广告和点击下载的内容,需要过滤掉。
# 4.过滤广告
# 到这里标识此条新闻:是一条有效的新闻【包含广告】
# 注意:部分广告【包含点击标题就自动下载,左下角显示广告字眼等】要过滤掉
# 场景一:
if news_element.attr('name') == 'android.widget.FrameLayout':
print('广告!这是一个FrameLayout广告,标题是:%s' % news_title.get_text())
continue
# 常见二:点击标题直接下载其他应用
ads_tips_element = news_element.offspring(name='com.songheng.eastnews:id/a4f', text='广告通')
if ads_tips_element.exists():
print('广告!这是一个【广点通】广告,标题是:%s' % news_title.get_text())
continue
# 常见三:有效角标识是广告的图标【奇虎广告】
ads_tips_element2 = news_element.offspring('com.songheng.eastnews:id/q5')
if ads_tips_element2.exists():
print('广告!广告标题是:%s' % news_title.get_text())
continue
只有判断是一条正常的新闻,才点击新闻的标题元素进入新闻详情页面,如果右下角的「时间条元素」存在才代表阅读此篇新闻能获取到金币。
red_coin_element = poco('com.songheng.eastnews:id/aq8')
if not red_coin_element.exists():
print('当前新闻没有红包,返回!')
self.__back_keyevent()
continue
为了更真实的模拟人为看新闻这一操作,随机地模拟向上或向下滑动屏幕。
这里设置每篇文章阅读时间为 30 秒,阅读完成之后,执行返回操作,直到回到主界面,这样就完成了查看一篇新闻获取金币的流程。
oldtime = datetime.datetime.now()
while True:
self.__swipe(True if random.randint(0, 1) == 0 else False)
newtime = datetime.datetime.now()
interval_time = (newtime - oldtime).seconds
if interval_time >= 30:
print('阅读30秒新闻完成')
break
self.__read_key_news()
接着可以从下往上滑动页面,获取到新的页面的新闻列表,循环的进行阅读。
while True:
self.watch_news_recommend()
print('查看一页完成,继续查看下一页的新闻。')
# 滑动下一页的新闻
poco.swipe([0.5, 0.8], [0.5, 0.3], duration=1)
另外,注意应用的标题栏隔一段时间可以领取金币,定义一个方法去领取。
最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!