Python自动抢红包,超详细教程,再也不会错过微信红包了

Python015

Python自动抢红包,超详细教程,再也不会错过微信红包了,第1张

提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一个前提条件:手机需要root,对于苹果手机的话就需要越狱了。现在的手机想要root或越狱并不容易,同时这会对手机安全性带来一些风险,抢红包本身只是个 娱乐 活动,这样做就得不偿失了。

为了自动抢红包,python能帮我们实现吗?

答案是肯定的,本文就带大家一起 探索 下用Python如何实现自动抢红包。

操作系统:Windows

Python版本:3.7.2

手机系统:Android

这里我们的需求是实现自动抢红包。首先要打开微信,进入到指定的群聊,识别微信红包、执行抢红包的动作。这就是关键的步骤,简单清晰。

因为电脑版本的微信没有抢红包的功能,我们只能手机微信,那么就需要把手机连上电脑,通过电脑控制手机来自动抢,那就需要确保「 adb 」命令可正常执行。

识别微信中的消息,是红包还是普通的信息,这里我们通过聊天消息的元素标识来判断。这里我们借助了「 Airtest IDE 」工具来实现。

要正常使用「adb」需要打开USB调试,设置项通常出现在手机系统设置中的[开发人员选项]里面。

在手机上打开USB调试后,接下来我们通过Airttest IDE验证 adb 运行是否正常。

开始之前先,先解释下airttest相关概念:

Airtest IDE 的下载地址:

下载之后,解压打开就可以使用,Airtest IDE的界面如下:

使用AirtestIDE对Android应用进行自动化操作,第一步就需要连接Android设备。

若连接遇到问题,请参考Airtest的官方教程:Android真机连接

打开微信,在最左侧的Tab页,微信消息列表,我们需要从这里选择指定的群聊来抢红包。

在AirtestIDE中,我们可以通过暂停功能,冻结当前的UI树形结构来精确地检视UI控件,我们先来分析下这个页面中元素标识。

聊天页面中整体的群聊消息的元素标识 com.tencent.mm:id/d1v

聊天页面中单个群聊消息的元素标识 com.tencent.mm:id/b6e

接下来进入我们准备要抢红包的群聊中,识别出红包并执行抢红包的动作。

我们先来看看红包的标识:

红包标识的示例1 com.tencent.mm:id/aql

红包标识的示例2 com.tencent.mm:id/aql

点击红包,记录下弹出的大红包页面中“开”的元素标识

大红包页面中”开“的标识 com.tencent.mm:id/d02

这里我们需要判断是红包是否有效,比如已被领完或是已被自己领取的红包就是无效的,我们在执行时可以跳过这些。

已领取红包的标识 com.tencent.mm:id/apk

已被领完红包的标识 com.tencent.mm:id/apk

我们用的各元素的标识都已取到,接下来就是组织我们的代码

首先得打开微信,利用Airtest启动app应用,只须一行代码即可搞定,如下

获取当前页面中所有所有群聊的名称

选择并进入指定的群聊

遍历消息并查找红包

在LuckyMoney中定义抢红包的动作

若我们在一台电脑上并不想安装Airtest IDE,还能执行这个脚本吗?

当然可以,只需要安装好「 pocoui 」这个第三方库就可以“抛弃”它了!

利用 AirtestIDE 创建一个项目时,设备类型选中 Android,就会在编码区生成一段初始化的代码。

我们自己编写的Python代码中也需要加上这段初始化的代码。

再次强调,在执行脚本时要确保手机连上电脑,并确保「adb」命令正常运行。

对Airtest有兴趣的小伙伴,可以参考airtest官方教程:AirtestIDE官方文档

评论区评论: python抢红包 ,获取本文所涉及的完整代码

1

为什么会实行抢票机制?

其他所谓的抢票,根本原理就是帮你时时刻刻盯着12306而已。无论哪一家的抢票,最终都是要通过.

2

有人知道抢票软件的原理是什么吗?

“购票者提供个人信息,将被上传至服务器数据库。 一旦检测到余票就迅速锁定,并通过高速填写乘车人信息和自动识别验证码来抢票

3

12306是抢票原理分析 - 多线程之间实现同步 - evanYang - 的博客...

2020年5月3日程序执行的顺序按照代码的先后顺序执行。 一般来说处理器为了提高程序运行效率

4

python自动抢票的原理

python自动抢票的原理_利用Python代码自动抢火车票的原理以及代码解析

weixin_39890629

原创

关注

1点赞·1024人阅读

今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool。

准备工具:

12306网站用户名和密码

chrome浏览器及下载chromedriver

下载Python代码

代码用的Python+Splinter开发,Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互。Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL。然后你所开发的模拟的任何行为,都会自动完成,你只需要坐在电脑面前,像看电影一样看着屏幕上各种动作自动完成然后收集结果即可。

了解原理:

找到相应URL,找到控件模拟登录、查询、订票操作。关键是找到控件名称,难点是起始地不是直接输入的页面值,需要在cookie中查出。

12306查询URL:

12306登录URL:

我的12306URL:

购票确认URL:

Python代码打开URL,找到控件填充值:

找到用户名密码控件名

找到起始地控件名

确定起始地的值,方法Chrome浏览器中的“检查”功能(按F12),Network--->Cookies中找到:

cookie中起始地的值

拷贝起始地的cookie值,我把几个常用的城市拷出来,放到了字典中:

查询车票代码:

其实,你只需要运行代码:

当然,还需要手动点一下的还是万恶的12306验证码,抢到票后确认支付就行啦。

抢票进行中

抢票成功!

5

登录

首页

学习

实践

活动

专区

工具

TVP

返回腾讯云官网

阿黎逸阳

111 篇文章

关注

100行代码自动买火车票——和你一起探索抢票软件背后的原理

2021-10-08 15:32:42阅读 6940

大家有没有这种感觉,一到国庆、春节这种长假,抢火车票就非常困难?

各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率。

有些火车票代售网点和一些加速买票软件,说你只要给100元服务费就可以优先帮忙抢到票。

本文和你一起探索抢票软件背后的原理。

本文目录

效果展示

代码详解

2.1 导入库

2.2 确定好基本购票信息

2.3 登录12306

2.4 模拟滑动滑块

2.5 处理疫情特殊要求

2.6 点击购票并填写相关信息

2.7 锁定车票

一、效果展示

在正式进入代码讲解之前,先来看下本文的实现效果。

如果不是为了演示效果,直接在最后确定阶段加一个延时点击确定,应该不到45秒可以锁定一张票,只要在30分钟之内付款即可。

二、代码详解

本小节会详细解锁抢票软件是如何模拟登录网站,进行自动买票的。

为了更清晰地给大家展示,部分代码没有写成函数,直接裸代码运行,让需要买票的朋友可以自己应用软件进行购票。

1 导入库

首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在Anaconda Prompt中用pip方法安装。

import json

import time

from captcha import *

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support import wait

from selenium.webdriver.common.keys import Keys

from selenium.common.exceptions import NoSuchElementException

from selenium.webdriver.common.action_chains import ActionChains

from selenium.webdriver.support import expected_conditions as EC

#导入库

复制

2 确定好购票基本信息

导入库后,在python代码中填写你购票的基本信息。

purpose = 'ADULT' #购买成人票,如果是学生票,需调整代码

names = ['谢朝阳'] #填写购票人姓名

date = '2021-09-21' #填写购票日期

start_station = '深圳' #购票出发站

end_station = '长沙南' #购票目的站

password = '11234567xyz'#登录12306的秘密

username ='xiezhaoyang122700' #登录12306的账号

trains = ['G1004', 'G80', 'G6028', 'G6182', 'G6016'] #你想买的班次

#填写基本信息

复制

本文预订的是2021年9月21日从深圳到长沙南的高铁票,你可以根据自己的实际需要进行调整。

由于有些班次的时间过早或过晚,买了也很不方便,所以可以在trains中挑选出你满意的班次进行购票。

在这里需要提醒大家,我之前在尝试代码时碰到的坑,那就是时间中如果有个位数要在前面填0。

比如2021年9月2日,你在填写购票日期date时要写成'2021-09-02',否则在运行代码时日期总是填不进去。

3 登录12306

确定好购票的基本信息后,就可以应用python模拟登录12306了,代码如下:

options = webdriver.ChromeOptions()

options.add_argument("--disable-blink-features=AutomationControlled")

browser = webdriver.Chrome(options=options)

browser.maximize_window()

login_url = 'https://kyfw.12306.cn/otn/resources/login.html'

#ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'

browser.get(login_url)

time.sleep(0.5)

wait.WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.CLASS_NAME,'login-hd-account'))).click()

input_name = browser.find_element_by_id('J-userName')

input_pd = browser.find_element_by_id('J-password')

input_name.send_keys(username)

input_pd.send_keys(password)

login = browser.find_element_by_id('J-login')

login.click()

#登录12306

复制

整体思路是:

应用python模拟调用google浏览器;

输入12306网址;

等网页加载完全后点击账户密码登录;

找到账号密码的id,把账户密码信息填充进去;

找到登录id,模拟点击登录按钮。

在这一小节中要注意两个点。一是要在python安装目录中放和google版本匹配的chromedriver,供python调用。

二是要学会找填写账户密码信息的id。

首先,在google浏览器中输入12306登录网址:https://kyfw.12306.cn/otn/resources/login.html。

接着点击账户密码登录,会出现如下界面。

然后点击红框中的三个点,找到更多工具,点击开发者工具,会出现如下界面。

点击红框中的箭头,把鼠标移动到账户框上去,就会出现如下界面:

undefined

右边变灰的框里就会出现对应的id,点击账号框,再把鼠标移动到右边变灰的字符上去,点击右键,会出现copy element的选项,复制下来即可。

<input type="text" class="input" id="J-userName" placeholder="用户名/邮箱/手机号" style="height: 44pxline-height: 44pxoutline: black 0px" aria-label="请输入用户名/邮箱/手机号" title="请输入用户名/邮箱/手机号">

复制

发现了吗?源代码input_name中要填写的browser.find_element_by_id('J-userName')内容,即为id="J-userName"中的信息。

4 模拟滑动滑块

输入完用户名和密码,点击立即登录后,会出现如下滑块验证要求。

运行如下代码即可拖动滑块进行验证。

browser.implicitly_wait(5)

print('=====开始处理滑动验证码=====')

track = [300, 400, 500]

for i in track:

try:

btn = browser.find_element_by_xpath('//*[@id="nc_1__scale_text"]/span')

ActionChains(browser).drag_and_drop_by_offset(btn,i,0).perform()

except:

time.sleep(2)

#拉动滑块验证

复制

其中,browser.implicitly_wait(5)表示隐性等待5秒,track中放的是滑块拉动的距离。

5 处理疫情特殊要求

完成滑块验证要求后,会出现如下疫情特殊要求提示:

用如下代码点击确认即可。

browser.implicitly_wait(5)

browser.find_element_by_xpath('/html/body/div[5]/div[2]/div[3]/a').click()

time.sleep(2)

#疫情特殊要求

复制

browser.find_element_by_xpath和id的区别是,在右键复制时要copy XPath或copy full XPath。

6 点击购票并填写出发地、目的地、出发时间

接下来是选择买票,并将出发地、目的地、出发时间等信息填写进去。

browser.find_element_by_xpath('//*[@id="J-chepiao"]/a').click()

browser.find_element_by_xpath('//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()

browser.find_element_by_xpath('//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()

#选择买票

def input_info():

print('=====开始买票=====')

from_station = browser.find_element_by_xpath('//*[@id="fromStationText"]')

from_station.send_keys(Keys.ENTER)

from_station.send_keys(Keys.CONTROL, 'a')

from_station.send_keys(start_station, Keys.ENTER)

browser.implicitly_wait(5)

to_station = browser.find_element_by_xpath('//*[@id="toStationText"]')

to_station.send_keys(Keys.ENTER)

to_station.send_keys(Keys.CONTROL, 'a')

to_station.send_keys(end_station, Keys.ENTER)

browser.implicitly_wait(5)

start_date = browser.find_element_by_xpath('//*[@id="train_date"]')

start_date.send_keys(Keys.ENTER)

start_date.send_keys(Keys.CONTROL, 'a')

start_date.send_keys(Keys.CONTROL, 'x')

start_date.send_keys(date, Keys.ENTER)

browser.implicitly_wait(5)

wait.WebDriverWait(browser, 3).until(EC.element_to_be_clickable((By.ID,'query_ticket'))).click()

input_info()

input_info()

#将出发地、目的地、出发日期填进去

复制

得到结果如下:

这里需要注意的是我调用了两遍input_info函数,因为12306可能采取了一些反爬措施,一遍输入进去后查不出东西,显示为灰色。

7 锁定车票

最后是依次查找trains中的车次是否有票,有的话点击购买锁定车票。

trList = browser.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")

for tr in trList:

trainNum = tr.find_element_by_class_name("number").text

if trainNum in trains:

leftTicket = tr.find_element_by_xpath(".//td[4]").text

print('leftTicket', leftTicket)

if leftTicket == '有' or leftTicket.isdigit():

orderBtn = tr.find_element_by_class_name("btn72")

orderBtn.click()

browser.implicitly_wait(5)

passengerLabels = browser.find_elements_by_xpath(".//ul[@id='normal_passenger_id']/li/label")

for passengerLabel in passengerLabels:

name = passengerLabel.text

if name in names:

passengerLabel.click()

browser.implicitly_wait(20)

# 获取提交按钮

submitBtn = browser.find_element_by_id("submitOrder_id")

submitBtn.click()

browser.implicitly_wait(20)

confirmBtn = browser.find_element_by_id("qr_submit_id")

confirmBtn.click()

time.sleep(2)

browser.implicitly_wait(20)

confirmBtn = browser.find_element_by_id("qr_submit_id")

confirmBtn.click()

break

#依次查找trains中的车次是否有票,有的话点击购买

复制

所以,如果你有特别心仪的车次,可以在trains中放在最前面,依次填写觉得还行的车次。

至此,应用python解锁抢票软件背后的原理已讲解完毕,感兴趣的朋友可以自己跟着本文实现一遍。

12306不定期会更新买票界面,所以过一段时间可能之前的代码就要进行一些调整,需要自己弄清里面的原理,才可以以不变应万变。

本文的代码没有进行高级的封装,只为大家能更清楚地了解每一步,能在抢票高峰期买到自己心仪的票。

也写得很基础,没有进一步的调优缩短时效,感兴趣的朋友可以自行研究,如有任何疑问可以跟我沟通。

6

抢票软件原理 - Python实战案例教学(视频讲解) 12306...

2020年12月7日python有很多方法去实现抢票,其基本原理,就是让程序自动模拟人去操作12306网站

7

为什么会实行抢票机制?

其他所谓的抢票,根本原理就是帮你时时刻刻盯着12306而已。无论哪一家的抢票,最终都是要通过.