“抢火车票,红包技术”


一、抢火车票
终于抢到票啦
1、抢火车票软件的技术原理

目前主流的抢票软件是安装在浏览器上的插件,像猎豹,360浏览器等,用于在12306网站上抢票。

常规情况下,使用12306网站订票时,如果刷新页面就需要再次填写个人信息,这就耽误了不少时间。这一耽误,可能需要“秒杀”的热门火车票就已经落入他人之手,而查看剩余车票时也需要在计算机前不断地点击刷新页面。

人工操作效率远不如刷票软件

而抢票软件能够记录个人信息,自动重复登录,直到登录成功,代替缓慢的人工操作。并通过对12306网站的不断刷新和监控,一旦有人退票,抢票软件能立即发现。此外,部分软件从查询到下单可以直接勾选,不需再填写任何信息。有了这些便利功能,抢票软件确实可以将抢票成功率大大提高。
2、教大家一个自动抢票技术脚本

1)先准备好工具:

12306网站用户名和密码
铬浏览器及下载chromedriver
Python的代码
代码用的Python的+分裂开发,分裂是一个使用Python的开发的开源的Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互。

斯普林特执行的时候会自动打开你指定的浏览器,访问指定的网址。然后你所开发的模拟的任何行为,都会自动完成,你只需要坐在电脑面前,像看电影一样看着屏幕上各种动作自动完成然后收集结果即可。

2)基本实现原理:

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

12306查询网址:
https://kyfw.12306.cn/otn/leftTicket/init
12306登录URL:
https://kyfw.12306.cn/otn/login/init
我的12306URL:
https://kyfw.12306.cn/otn/index/initMy12306
购票确认网址:
https://kyfw.12306.cn/otn/confirmPassenger/initDc
Python的代码打开网址,找到控件填充值:

def login(self):

self.driver.visit(self.login_url)

#填充用户名

self.driver.fill(“loginUserDTO.user_name”,self.username)

#

填充密码self.driver.fill(“userDTO.password” ,self.passwd)
print u“等待验证码,自行输入...”


找到用户名密码控件名


找到起始地控件名:

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


饼干中起始地的值

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

cities = {成都:%u6210%u90FD%2CCDW,

重庆:%u91CD%u5E86%2CCQW,

北京:%u5317%u4EAC%2CBJP,

广州:%u5E7F% u5DDE%2CGZQ,

杭州:%u676D%u5DDE%2CHZH,

宜昌:%u5B9C%u660C%2CYCN,

郑州:%u90D1%u5DDE%2CZZF,

深圳:% u6DF1%u5733%2CSZQ,

西安:%u897F%u5B89%2CXAY,

大连:%u5927%u8FDE%2CDLT,

武汉:%u6B66%u6C49%2CWHN,

上海: %u4E0A%u6D77%2CSHH,

南京:%u5357%u4EAC%2CNJH,

合肥:%u5408%u80A5%2CHFH}

查询车票代码:

打印你“购票页面开始……”

#加载查询信息

self.driver.cookies.add({“_ jc_save_fromStation”:self.starts})

self.driver.cookies.add({“_ jc_save_toStation”:self.ends})

self.driver.cookies.add({“_ jc_save_fromDate”:self .dtime})

self.driver.find_by_text(u“查询”).click()

运行代码:

 python tickets.py上海广州2018-12-25

最后手动点一下的12306验证码,抢到票后确认支付就行啦。


以上就是自动抢票的方法,小伙伴抓紧试试吧!
二、抢红包

1、实现微信自动抢红包

微信自动抢红包的实现方法,主要实现以下几个功能:

  • 自动拆开屏幕上出现的红包
  • 处于桌面或聊天列表时接收到红包信息时自动进入聊天界面并拆红包
  • 日志功能,记录抢红包的详细日志

实现原理

  • 利用AccessibilityService辅助服务,监测屏幕内容,实现自动拆红包的目的。
  • 利用ActiveAndroid数据库简单记录红包日志
  • 利用偏好实现监控选项纪录

最终界面:


抢红包核心代码:

AccessibilityService配置

机器人:accessibilityEventTypes设置触发监听回调的事件类型; 
机器人:packageNames设置监听的应用,这里监听的是微信,因此填上微信的包名com.tencent.mm 
<无障碍服务的xmlns:机器人=“HTTP:// schemas.android.com/apk/res/android “ 
机器人:accessibilityEventTypes = ”typeNotificationStateChanged | typeWindowStateChanged | typeWindowContentChanged“ 
机器人:accessibilityFeedbackType = ”feedbackGeneric“ 
机器人:accessibilityFlags = ”flagDefault“ 
机器人:canRetrieveWindowContent = ”真正的“ 
机器人:描述=” @串/ accessibility_description” 
机器人:notificationTimeout = “100” 
机器人:packageNames = “com.tencent.mm” 
机器人:settingsActivity = “com.oden.annotations.app.activity.ManActivity”/>

在AndroidManifest.xml中中声明:

<service 
android:name =“。app.service.HongbaoService_” 
android:enabled =“true” 
android:exported =“true” 
android:label =“@ string / app_name” 
android:permission =“android.permission.BIND_ACCESSIBILITY_SERVICE”> 
<intent-filter> 
<action android:name =“android.accessibilityservice.AccessibilityService”/> 
</ intent-filter> 
<meta-data 
android:name =“android.accessibilityservice” 
android:resource =“@ xml / accessibility_service_config”/ > 
</ service>

抢红包实现代码

接收系统发送来的AccessibilityEvent

private static final String GET_RED_PACKET =“领取红包”; 
private static final String CHECK_RED_PACKET =“查看红包”; 
private static final String RED_PACKET_PICKED =“手慢了,红包派完了”; 
private static final String RED_PACKET_PICKED2 =“手气”; 
private static final String RED_PACKET_PICKED_DETAIL =“红包详情”; 
private static final String RED_PACKET_SAVE =“已存入零钱”; 
private static final String RED_PACKET_NOTIFICATION =“[微信红包]”; 

@覆盖
公共无效onAccessibilityEvent(AccessibilityEvent事件){ 
LD( “接收事件!”); 
if(watchedFlags == null)返回; 
/ *检测通知消息* / 
if(!mMutex){ 
if(watchedFlags.get(“pref_watch_notification”)&&
if(watchedFlags.get(“pref_watch_list”)&& watchList(event))return; 
} 
if(!watchedFlags.get(“pref_watch_chat”))return; 

this.rootNodeInfo = event.getSource(); 
if(rootNodeInfo == null)返回; 

mReceiveNode = null; 
mUnpackNode = null; 

checkNodeInfo(); 

/ *如果已经接收到红包并且还没有戳开* / 
if(mLuckyMoneyReceived &&!mLuckyMoneyPicked &&(mReceiveNode!= null)){ 
mMutex = true; 
AccessibilityNodeInfo cellNode = mReceiveNode; 
。cellNode.getParent()的performAction(AccessibilityNodeInfo.ACTION_CLICK); 
mLuckyMoneyReceived = false; 
mLuckyMoneyPicked = true; 
LD( “正在打开!”); 
} 

/ *如果戳开但还未领取* /
if(mNeedUnpack &&(mUnpackNode!= null)){ 
AccessibilityNodeInfo cellNode = mUnpackNode; 
cellNode.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
mNeedUnpack = false; 
LD( “正在领取!”); 
} 

if(mNeedBack){ 
performGlobalAction(GLOBAL_ACTION_BACK); 
mMutex = false; 
mNeedBack = false; 
LD( “正在返回!”); 
//总次数和金额统计
if(isGetMoney){ 
T.showShort(this,“抢到一个红包:”+ gotMoney +“元!”); 
totalMoney = totalMoney + gotMoney; 
totalSuccessNum ++; 
。myPrefs.totalMoney()把(totalMoney); 
。myPrefs.successNum()把(totalSuccessNum); 
Ld(“totalMoney:”+ totalMoney); 
Ld(“totalSuccessNum:”
saveToLog(hongbaoInfo); 
isGetMoney = false; 
} 
} 
}

检测监听事件的节点信息

private void checkNodeInfo(){ 
Ld(“checkNodeInfo!”); 
if(this.rootNodeInfo == null)返回; 
/ *聊天会话窗口,遍历节点匹配“领取红包”和“查看红包”* / 
List <AccessibilityNodeInfo> nodes1 = this.findAccessibilityNodeInfosByTexts(this.rootNodeInfo,new String [] { 
GET_RED_PACKET,CHECK_RED_PACKET}); 
if(!nodes1.isEmpty()){ 
Ld(“!nodes1.isEmpty()”); 
AccessibilityNodeInfo targetNode = nodes1.get(nodes1.size() -  1); 
if(“android.widget.LinearLayout”.equals(targetNode.getParent()。getClassName()))//避免被文字干扰导致外挂失效
{ 
if(this.signature.generateSignature(targetNode)){ 
mLuckyMoneyReceived = true; 
mReceiveNode = targetNode; 
Ld(“签名:”+ this.signature。的toString()); 
}
} else { 
Ld(“this is text”); 
} 
return; 
} 

列表<AccessibilityNodeInfo> nodes2 = this.findAccessibilityNodeInfosByTexts(this.rootNodeInfo,新的String [] { 
“拆红包”}); 
if(!nodes2.isEmpty()){ 
Ld(“node2!= null”); 
for(AccessibilityNodeInfo nodeInfo:nodes2){ 
if(nodeInfo.getClassName()。equals(“android.widget.Button”))
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
} 
} { 
/ *戳开红包,红包还没抢完,遍历节点匹配“拆红包”* / 
AccessibilityNodeInfo node2 =(this.rootNodeInfo.getChildCount()> 3)?this.rootNodeInfo.getChild(3):null; 
if(node2!= null && node2.getClassName()。equals(“android.widget.Button”)

mNeedUnpack = true; 
isToGetMoney = true; 
Ld(“找红包!”); 
返回; 
} 
} 
/ *戳开红包,红包已被抢完,遍历节点匹配“已存入零钱”和“手慢了”* / 
if(mLuckyMoneyPicked){ 
List <AccessibilityNodeInfo> nodes3 = this.findAccessibilityNodeInfosByTexts(this.rootNodeInfo,new String [] { 
RED_PACKET_PICKED,RED_PACKET_SAVE,RED_PACKET_PICKED2,RED_PACKET_PICKED_DETAIL}); 
if(!nodes3.isEmpty()){ 
Ld(“!nodes3.isEmpty()”); 
if(rootNodeInfo.getChildCount()> 1){ 
Ld(“RED_PACKET_PICKED!”); 
} else { 
Ld(“nodes3.get(0).toString():”+ nodes3.get(0).getText()。toString()); 
if(!nodes3.get(0).getText()。toString()。equals(RED_PACKET_PICKED_DETAIL)){
AccessibilityNodeInfo targetNode = nodes3.get(nodes3.size() -  1); 
hongbaoInfo.getInfo(targetNode); 
if(isToGetMoney){ 
isGetMoney = true; 
isToGetMoney = false; 
gotMoney = hongbaoInfo.getMoney(); 
Ld(“gotMoney:”+ gotMoney); 
} 
Ld(“RED_PACKET_SAVE!”); 
Ld(“hongbaoInfo:”+ hongbaoInfo.toString()); 
} else { 
Ld(“这个包就是我自己!”); 
} 

} 
mNeedBack = TRUE; 
mLuckyMoneyPicked = false; 
} 
} 
}

主要通过检测“领取红包”等关键文字信息来判断是否有新红包

检测收到红包时判断是否 “android.widget.LinearLayout”,屏蔽聊天信息中的文字干扰

拆红包时,由于微信版本可能不同,同时进行两种判断,以兼容部分版本

拆完红包需自动返回,有以下几种情况:抢到了,手慢了,以及该红包是自己发出的红包

下面是监听聊天列表的代码:

private boolean watchList(AccessibilityEvent event){ 
// 
如果没有消息(event.getEventType()!= AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED || event.getSource()== null)则
返回false; 

List <AccessibilityNodeInfo> nodes = event.getSource()。findAccessibilityNodeInfosByText(RED_PACKET_NOTIFICATION); 
if(!nodes.isEmpty()){ 
AccessibilityNodeInfo nodeToClick = nodes.get(0); 
CharSequence contentDescription = nodeToClick.getContentDescription(); 
if(contentDescription!= null &&!lastContentDescription.equals(contentDescription)){ 
nodeToClick.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
lastContentDescription = contentDescription.toString(); 
返回true; 
} 
}
返回虚假; 
}

下面是监听通知信息的代码:

private boolean watchNotifications(AccessibilityEvent event){ 
// 
if(event.getEventType()!= AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
返回false时不通知; 

//不是hongbao 
String tip = event.getText()。toString(); 
if(!tip.contains(RED_PACKET_NOTIFICATION))返回true; 

Parcelable parcelable = event.getParcelableData(); 
if(parcelable instanceof Notification){ 
Notification notification =(Notification)parcelable; 
尝试{ 
notification.contentIntent.send(); 
} catch(PendingIntent.CanceledException e){ 
e.printStackTrace(); 
} 
} 
返回true; 
}

红包信息的获取,及日志的存储:

通过获取节点的子信息,分别获得红包发送者及抢到的金额,抢红包时间等信息,建立简单的表单分别记录该信息。

@Table(name =“HongbaoInfos”)
公共类HongbaoInfo扩展模型{ 

private int month; 
私人日; 
私人小时; 
private int min; 
private int sec; 

@Column(name =“sender”)
public String sender; 

@Column(name =“money”)
public String money; 

@Column(name =“time”)
public String time; 

public void getInfo(AccessibilityNodeInfo node){ 

AccessibilityNodeInfo hongbaoNode = node.getParent(); 
sender = hongbaoNode.getChild(0).getText()。toString(); 
money = hongbaoNode.getChild(2).getText()。toString(); 
time = getStringTime(); 
} 

私人字符串getStringTime(){
日历c = Calendar.getInstance(); 
month = c.get(Calendar.MONTH)+ 1; 
day = c.get(Calendar.DAY_OF_MONTH); 
小时= c.get(Calendar.HOUR_OF_DAY); 
min = c.get(Calendar.MINUTE); 
sec = c.get(Calendar.SECOND); 
返回月份+“月”+天+“日”+小时+“:”+ min +“:”+ sec; 
} 

@Override 
public String toString(){ 
return“HongbaoInfo [sender =”+ sender +“,money =”+ money +“,time =”+ time +“]”; 
} 

公共静态列表<HongbaoInfo> GETALL(){ 
返回新选择() 
。从(HongbaoInfo.class)
.orderBy( “ID ASC”)
.execute(); 
} 

公共静态无效deleteALL(){ 
新删除()将来自(HongbaoInfo.class).execute(); 
}

public float getMoney(){ 
return Float.parseFloat(money); 
} 

公共字符串getSender(){ 
返回发送者; 
} 

公共字符串的getTime(){ 
返回时间; 
} 
}

存储操作:

private void saveToLog(HongbaoInfo hongbaoInfo){ 
if(watchedFlags.get(“pref_etc_log”)){ 
HongbaoInfo hongbaoInfo1 = new HongbaoInfo(); 
hongbaoInfo1 = hongbaoInfo; 
hongbaoInfo1.save(); 
} else { 
Ld(“log closed!”); 
} 
}

以上是微信自动抢红包方法


评论列表 4
张航

#1张航

厉害呀

165天以前
叶秋

#2叶秋

6666666

149天以前
张三

#3张三

长知识了,大神呀

130天以前
无聊分子

#4无聊分子

现在不是说封第三方购票软件吗?

127天以前
Benjamin

#5Benjamin

很强

72天以前
杭州-Java
太菜了,来学习
  • 1
    文章
  • 0
    评论