自动化篇 | 实现自动化抢茅台超详细过程!

点击上方 “AirPython”,选择 “加为星标”

第一时间关注 Python 原创干货!

a85cd837d23f8c60733e2bb365949650.png

1. 前言

大家好,我是安果!

最近,随着 i 茅台 App 的上线,国内再次掀起了「 抢茅台」的浪潮,每天早上 9-10 时可以通过 App 进行申购,晚上 18 点后会公布当天的申购结果

虽然中签率很低,但是和打新一样,没有任何成本,只需要随手点一下,就有一定的几率会中签,带来一定的收益

本篇文章将通过下面几点聊聊自动化抢茅台、查询申购结果的完整详细流程

  • 自动化申购

  • 自动化查询申购结果

  • 参数化及配置

  • 定时任务

  • 总结一下

2. 自动化申购

自动化方案这里选择 Hamibot,基础教程可以看下面这篇文章

推荐一款好用且能兼职赚钱的自动化工具 - Hamibot

2-1  打开应用并进入到主界面

在开发阶段可以通过 console.show() 开启日志悬浮窗

首先,通过应用名称打开 App

然后,通过主界面特有的文本元素进行等待,直到界面完全加载完全

...
//阻塞等待
function wait_come_home_page(){
    //等待加载到主页
    textContains('首页').waitFor();
    textContains('申购').waitFor();
    log("完全进入到主页")
}
...
function purchase_buy(){
  //打开日志控制台
  console.show();

  //打开App
  launchApp('i茅台');

  //进入主页
  wait_come_home_page()
  ...

2-2  进入申购 Tab 并寻找入口

首先,通过文本内容找到底部的「 申购」Tab,执行点击操作

然后,循环滑动屏幕,查找页面中所有的申购入口

PS:由于申购数目有限,为了方便,这里默认最多滑动 5 次

...
//根据文本内容查找元素,并执行点击操作
function click_text_element(content,is_wait){
    //是否需要等待
    if(is_wait){
         textContains(content).waitFor();
    }
    log("等待元素加载完成,继续点击操作。。。")
    //查找元素
    var buy_element = text(content).findOne()
    if(buy_element){
        click(buy_element.bounds().centerX(), buy_element.bounds().centerY());
    }
}
...
//进入【申购】Tab
click_text_element("申购",is_wait=false)
let index = 0;
  while(index<5){
    //滑动一次
    swipe(450, 1500, 450, 450, 500) 
    ...
    index+=1;
  }
...

2-3  进入申购页面

遍历申购列表中的所有入口按钮控件,判断控件的文本内容,当控件的文本内容为「 预约申购」时才进行预约动作

...
var good_enterences = id("bt_goods").find() 

log("本次入口有:",good_enterences.length)

//商品标题
for(let good_enterence of good_enterences){
    log("文本:",good_enterence.text())
    if(good_enterence.text()==='预约申购'){
          good_enterence.click()
          ...
    }else{
          log("该条已经申购,过滤掉。。。")
    }    
}
...

2-4  确认申购

在确认申购前,我们需要先选择一个门店,我们需要做一个等待操作,直到页面元素完全加载成功

由于抢到即是赚到,为了省事,我这里直接从默认门店列表中取第一个门店为取货地址,确定申购后,我们点击「 查看详情」按钮进行到申购详情页面

PS:考虑到不同门店可能存在概率不一样的情况,大家可以根据实际需求自行拓展,选择一个合适的门店作为取货地址

最后,模拟按压返回键,直到回退到 App 的首页

...
//返回到应用首页
function back_main_page() {
    //判断是否在主界面
    while (true) {
        if (textContains('首页').exists()&&textContains('申购').exists()&&textContains('个人').exists()) {
            break;
        } else {
            back();
        }
        sleep(1000)
    }
}
...
//真实预约
function real_buy(){
   log("确定开始申购")
   //等待【选择门店】页面加载完全
   id("btReserve").waitFor()
   //由于抢到即使赚到,这里直接取默认地址的第一个
   id("btReserve").click()
   //确定申购
   text("确定申购").findOne().click()
   //点击【查看详情】,返回申购列表
   text("查看详情").findOne().click()
   //返回
   back_main_page()
}
...

2-5  发送信息到群聊中

申购完成后,我们可以将申购结果发送到群聊中

...
function send_wx_msg(send_msg){
    //如果休眠,唤醒设备
    device.wakeUpIfNeeded()
    app.launch("**");
    text("*信").waitFor()
    text("通讯录").waitFor()
    sleep(2000)

    //点击进入到聊天界面
    var chat_element= id("fzg").text(group_name).findOne();

    //获取坐标点
    var chat_element_bounds = chat_element.bounds();

    click_many_times(chat_element_bounds,id("auj").className("EditText"))
    sleep(3000)

    //1--发送消息
    id("auj").className("EditText").findOne().setText(send_msg)
    sleep(3000)
    //发送
    text("发送").click()
    sleep(1000)

    //3- 返回
    back_to_home()
    home();
    exit()
}
...

3. 申购结果

3-1  打开应用并进入到主页

和上面申购的代码一样

3-2  进入到申购记录列表页面

...
function click_desc_element(content,is_wait){
    //是否需要等待
    if(is_wait){
         descContains(content).waitFor();
    }
    log("等待元素加载完成,继续点击操作。。。")
    //查找元素
    var buy_element = desc(content).findOne()
    if(buy_element){
        click(buy_element.bounds().centerX(), buy_element.bounds().centerY());
    }
}
...
//点击【个人】Tab
click_text_element("个人",is_wait=false)

//点击申购单
click_desc_element("申购单",is_wait=true)
...

3-3  查询列表元素,获取所有子元素列表,筛选出当天所有申购记录

首先,通过 id 获取页面中的列表控件及其子元素列表

然后,遍历子元素列表,过滤出申购时间为当天的记录

最后,根据满足条件的记录,查询当条申购记录的状态

...
//获取所有的item元素
var rv_element= id("reservation_rv").findOne()

//获取当前日期
var current = get_today()
console.log("当前日期:",current)

//获取下面的所有子元素Item
let result = ""

if(rv_element){
    var elements = rv_element.children()
    for(let element of elements){
          //获取预约时间
        var time = element.findOne(id("date_time")).text()
        if(time===current){
            //获取结果
            var status =element.findOne(id("draw_status")).text()
            //品种
            var title = element.findOne(id("mt_goods_name")).text()
            console.log("种类:",title,",结果:",status)
            result+="种类:"+title+",结果:"+status+"\n\n"
         }
      }
  } 
...

3-4  组装结果,回退到应用首页,并发送群聊

将当天所有的申购结果组装一下,回退到 App 首页,最后发送信息到目标群聊中

66a82dd3d6773c00dab6cbe8a3c5b5a5.png

3-5  异步

将「 申购」、「 查询结果」两个动作定义为函数,放入到线程中执行,这样就完成了自动化脚本的开发

...
//申购
function buy_task(){
            //定义子线程
        threads.start(function(){
         log("申购任务。。。")
                purchase_buy()
        })
}

//查询
function result_task(){
        threads.start(function(){
               log("查询任务。。。")
          purchase_result()
        })
} 
...

3-6  发布并安装

脚本开发完成后,在脚本控制台进行脚本发布,编辑产品基本信息后提交审核,审核完成后安装到脚本列表

PS:建议免费发布到私有地址,通过私有地址安装到脚本列表中

d546e13fc2622a9139b5479c9bbae7f7.png

4. 参数化及配置

在 Hamibot 在线编辑器中编写完脚本后,就可以将一些参数写入到配置文件中

比如,本例中我们首先添加一个输入框,用于指定群聊的名称;然后添加一个下拉选择框,用于选择执行类型,包含:申购和查询结果

  • 7
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 写一个自动抢购京东茅台的脚本需要以下步骤: 1. 打开京东茅台商品页面,确定你想要抢购的商品的 URL。 2. 使用 Python 的网络爬虫模块,例如 requests 库,来爬取商品页面的 HTML 代码。 3. 解析 HTML 代码,找到抢购按钮的位置。 4. 使用 Python自动化测试模块,例如 selenium,来模拟点击抢购按钮。 5. 设置一个循环,不断检查商品是否已经抢购成功。如果成功,退出循环;如果未成功,继续循环。 下面是一个简单的示例代码: ```python import time from selenium import webdriver # 打开浏览器 driver = webdriver.Chrome() # 访问商品页面 driver.get("商品页面 URL") while True: # 点击抢购按钮 driver.find_element_by_css_selector("抢购按钮的 CSS 选择器").click() # 检查是否抢购成功 result = driver.find_element_by_css_selector("抢购结果的 CSS 选择器").text if result == "抢购成功": print("抢购成功!") break else: print("抢购未成功,继续尝试...") # 等待一段时间再继续尝试 time.sleep(1) # 关闭浏览器 driver. ### 回答2: 使用Python写一个自动抢购京东茅台的脚本有以下步骤: 1. 导入相关的模块,如selenium和webdriver,用于实现自动化操作。 2. 设置浏览器驱动,如ChromeDriver,确保能在代码中对浏览器进行控制。 3. 打开京东网站,并登录账号。 4. 进入茅台商品页面,获取抢购按钮的位置和状态。 5. 判断抢购按钮的状态,如果是可点击状态,则点击抢购按钮。 6. 进入结算页面,选择收货地址、支付方式等相关信息。 7. 确认订单并完成支付。 上述步骤中,一般比较关键的是第4步和第5步。在第4步中,需要通过网页元素定位的方式找到抢购按钮,并获取其状态信息,常用的定位方式有XPath和CSS选择器。在第5步中,需要判断抢购按钮的状态,如果是可点击状态,则调用点击操作,实现抢购功能。 在编写脚本时,可以结合selenium的API文档和浏览器开发者工具来查找和定位页面元素,以及了解元素的属性和状态。此外,还可以使用隐式等待或显式等待来确保页面加载完毕后再进行操作,避免因页面未加载完而导致的错误。 需要注意的是,使用自动化脚本抢购商品可能会违反京东的使用规定,甚至涉及到法律问题。因此,在实际操作中应遵循相关法律法规和京东的规定,建议合法合规地使用自动化脚本,并确保不会对他人造成不公平竞争或恶意利用的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值