当前位置:首页 > 代码 > 正文

12306抢票软件源代码(12306抢票软件官方下载)

admin 发布:2022-12-19 04:42 288


今天给各位分享12306抢票软件源代码的知识,其中也会对12306抢票软件官方下载进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

12306火车票抢票软件最新有哪些好用的?

有以下几款好用的抢票软件:

1、12306bypass分流抢票

分流抢票是一款完全免费的抢票软件,全程自动抢票,自动识别验证码,多线程秒单、稳定捡漏,支持多天、多车次、多席别、多乘客等功能,目前仅支持电脑版。

下载安装登陆12306账号,选择车次,预定,然后开始抢票即可,完全自动化操作。抢到票后,会有语音提示,付款即可。

2、360抢票

360抢票同样自动识别验证码,24小时无间断自动刷票,退票余票自动下单,并且能预约购票。无需下载软件,只要打开360浏览器(电脑手机均可)搜索“360抢票王”即可,进入页面后登陆12306账号后,选择好乘客、席别、车次、日期等信息后点击“高速刷票”就能自动抢票了,抢票成功会有语音提示。

3、去哪儿火车票

去哪火车票最大的特点就是方便,直接在微信小程序上搜索“去哪儿火车票”添加小程序即可使用,登陆与否都能买票,若所选车次当时没有票可以填写好信息付款后抢票,订单可以随时取消,全额退款,还可以将抢票信息发送给微信好友,让好友帮忙加速抢票。

程序员小哥开源12306自动抢票源码(机会难得)

想当初小邹为了抢个票也是费尽心思了,尝试了各种手段,还曾写了UI自动化的脚本,简直心酸。好了,废话不多说,我们下面做个简短说明,具体的大伙可以自己看readme。

目录结构说明

思路图

这图还挺清晰的

大伙下载下来学习为主,不要做其他不应该做的事,不然后果可是很严重的啊。— —

我从github上下载了python12306的抢票程序,但运行时一堆错误,求各位大神帮帮忙哈

可以看看TickerConfig.py中有没有Files的定义,提示是找不到这个变量

12306抢票软件是怎么实现的

浏览器插件:常规情况下,使用12306网站订票时,如果刷新页面就需要再次填写个人信息,这就耽误了不少时

间。这一耽误,可能需要“秒杀”的热门火车票就已经落入他人之手,而查看剩余车票时也需要在计算机前不断地点击刷新页面。而抢票软件能够记录个人信

息,自动重复登录,直到登录成功,代替缓慢的人工操作。并通过对12306网站的不断刷新和监控,一旦有人退票,抢票软件能立即发现。此外,部分软件从查

询到下单可以直接勾选,不需再填写任何信息。有了这些便利功能,抢票软件确实有资格声称“抢票成功率将提高10倍”。目前,Chrome、火狐、360

安全浏览器、搜狗浏览器和猎豹浏览器等都可以此类“抢票插件”。在淘宝上,各类抢票软件也热销。

安卓手机软件:电话订票最容易遇到的问题就是占线打不进去,为了打通订票热线只能不停的重拨直到接通为止。这一类抢票软件可以实现多次自动重拨并提供接通提醒,以安卓系统上的应用为主。

如何定制一款12306抢票浏览器

检查是否进入订票页面

判断是否进入订票页面,我是确定了两个标准:

1 网址是否为

2 该页面否有查询按钮

[cpp]

BOOL CDeal12306WebPage::IsQueryPage( CComPtr spDoc, CComBSTR bstrUrl )

{

HRESULT hr = E_FAIL;

do {

CString cstrUrl = CString((LPWSTR)bstrUrl);

if ( 0 == cstrUrl.CompareNoCase(LOGIN12306URL) ) {

CComPtr spQueryButton;

hr = GetQueryButtonInQueryPage( spDoc, spQueryButton);

CHECKHRPOINTER(hr, spQueryButton);

}

} while (0);

return FAILED(hr) ? FALSE : TRUE;

}

URL很好检测,那么我们如何判断是否存在查询按钮呢?我们先看一下订票页面的页面特征。

解决跨域问题

可以见得订票页面内部嵌入了两个Iframe,而我们关心的那块页面恰恰就是最里面一层IFrame。那我们直接通过最外层的Doc获取到最里面的Doc,然后在最里面的Doc执行有关的查询操作即可。然而熟悉javascript的同学可能马上就会想到“跨域”问题。其实在浏览器层面,跨域问题是很好解决的。

[cpp]

HRESULT CDeal12306WebPage::GetIFrameDoc( CComPtr spDoc,

const CString cstrIFrameName, CComPtr spInnerDoc )

{

HRESULT hr = E_FAIL;

do {

CComQIPtr spFrameCollection;

hr = spDoc-get_frames(spFrameCollection);

CHECKHRPOINTER(hr, spFrameCollection);

CComVariant IframeNameReq = CComBSTR(cstrIFrameName.GetString());

CComVariant FramePage;

hr = spFrameCollection-item(IframeNameReq, FramePage);

CHECKHRPOINTER(hr,FramePage.pdispVal);

CComPtr spIFramePage;

hr = FramePage.pdispVal-QueryInterface(IID_IHTMLWindow2, (LPVOID*)spIFramePage);

CHECKHRPOINTER(hr, spIFramePage);

hr = spIFramePage-get_document(spInnerDoc);

if ( E_ACCESSDENIED == hr ) {

CComQIPtr spServiceProvider = spIFramePage;

CHECKPOINT(spServiceProvider);

CComQIPtr spInnerWebBrowser;

hr = spServiceProvider-QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (LPVOID*)spInnerWebBrowser);

CHECKHRPOINTER(hr, spInnerWebBrowser);

CComPtr spDisp;

hr = spInnerWebBrowser-get_Document(spDisp);

CHECKHRPOINTER(hr, spDisp);

hr = spDisp-QueryInterface(IID_IHTMLDocument2, (LPVOID*)spInnerDoc);

CHECKHRPOINTER(hr, spInnerDoc);

}

} while (0);

return hr;

}

上面这个函数试图在spDoc页面中获取其内嵌的名字是cstrIFrameName的IFrame的Doc。于是我们要获取其中最里面一层Iframe的Doc可以如下调用

[cpp]

HRESULT CDeal12306WebPage::GetIFrameNamedIFramePageDoc( CComPtr spDoc,

CComPtr spInnerDoc )

{

HRESULT hr = E_FAIL;

do {

hr = GetIFrameDoc(spDoc, L"iframepage", spInnerDoc);

CHECKHRPOINTER(hr, spInnerDoc);

} while (0);

return hr;

}

HRESULT CDeal12306WebPage::GetIFrameNamedMainDoc( CComPtr spIFramPageDoc,

CComPtr spMainDoc )

{

HRESULT hr = E_FAIL;

do {

hr = GetIFrameDoc(spIFramPageDoc, L"main", spMainDoc);

CHECKHRPOINTER(hr, spMainDoc);

} while (0);

return hr;

}

HRESULT CDeal12306WebPage::GetMainDoc( CComPtr spDoc,

CComPtr spMainDoc )

{

HRESULT hr = E_FAIL;

do {

CComPtr spIFramePageDoc;

hr = GetIFrameNamedIFramePageDoc(spDoc, spIFramePageDoc);

CHECKHRPOINTER(hr, spIFramePageDoc);

hr = GetIFrameNamedMainDoc(spIFramePageDoc, spMainDoc);

CHECKHRPOINTER(hr, spMainDoc);

} while (0);

return hr;

}

当我们获得最里层的Doc后,我们将根据页面结构获取Class为cx_from的Table元素。

获取这个Table的原因是,之后我们会以该Table为节点,执行“查询按钮”查找的操作。

[cpp]

HRESULT CDeal12306WebPage::GetQueryButtonInQueryPage( CComPtr spDoc, CComPtr spQueryButtonElem )

{

HRESULT hr = E_FAIL;

do {

CComPtr spMainDoc;

hr = GetMainDoc( spDoc, spMainDoc);

CHECKHRPOINTER(hr, spMainDoc);

CComPtr spEnter_wElem;

hr = GetEnter_wElement(spMainDoc, spEnter_wElem );

CHECKHRPOINTER(hr, spEnter_wElem);

CComPtr spQueryTable;

hr = GetQueryTable(spEnter_wElem, spQueryTable);

CHECKHRPOINTER(hr, spQueryTable);

CComPtr spQueryButton;

hr = GetQueryButtonInQueryPage(spQueryTable, spQueryButton);

CHECKHRPOINTER(hr, spQueryButton);

hr = spQueryButton-QueryInterface(IID_IHTMLElement, (LPVOID*) spQueryButtonElem);

CHECKHRPOINTER(hr, spQueryButtonElem);

} while (0);

return hr;

}

查询按钮在这个table中的位置是

于是通过该Table查询”查询“按钮的代码是

[cpp]

HRESULT CDeal12306WebPage::GetQueryButtonInQueryPage( CComPtr spQueryTable,

CComPtr spQueryButton )

{

HRESULT hr = E_FAIL;

do {

CComPtr spTBody;

hr = GetElementByIndex(spQueryTable, 0, spTBody);

CHECKHRPOINTER(hr, spTBody);

CComPtr spFirstTR;

hr = GetElementByIndex(spTBody, 0, spFirstTR);

CHECKHRPOINTER(hr, spFirstTR);

CComPtr spEighthTR;

hr = GetElementByIndex(spFirstTR, 8, spEighthTR);

CHECKHRPOINTER(hr, spEighthTR);

CComPtr spButtonTemp;

hr = GetElementByIndex(spEighthTR, 0, spButtonTemp);

CHECKHRPOINTER(hr, spButtonTemp);

hr = spButtonTemp-QueryInterface(IID_IHTMLButtonElement, (LPVOID*)spQueryButton);

CHECKHRPOINTER(hr, spQueryButton);

} while (0);

return hr;

}

插入开始和停止自动查询按钮

为了在该页面中提供给用于控制开启和关闭自动查询功能的按钮,我插入了两个按钮。如下图

我们看下”单程“和”返程“按钮的页面结构

我会在Name为querySingleForm的form下的class为cx_tab的Div下插入“开始”和“停止”按钮。

[cpp]

HRESULT CDeal12306WebPage::InsertButtonInQueryPage( CComPtr spDoc )

{

HRESULT hr = E_FAIL;

do {

CComPtr spMainDoc;

hr = GetMainDoc( spDoc, spMainDoc);

CHECKHRPOINTER(hr, spMainDoc);

CComPtr spEnter_wElem;

hr = GetEnter_wElement(spMainDoc, spEnter_wElem );

CHECKHRPOINTER(hr, spEnter_wElem);

CComPtr spForm;

hr = GetQuerySingleForm(spEnter_wElem, spForm);

CHECKHRPOINTER(hr, spForm);

hr = InsertButtons( spForm. );

} while (0);

return hr;

}

[cpp]

HRESULT CDeal12306WebPage::InsertButtons(CComPtr spEnter_wElem )

{

HRESULT hr = E_FAIL;

do {

CComPtr spDiv;

hr = GetInsertButtonElem(spEnter_wElem, spDiv);

if ( FALSE == IsStartButtonExist(spDiv) ) {

hr = InsertStartButton(spDiv);

CHECKHR(hr);

#ifdef DEBUG

if ( FALSE == IsStartButtonExist(spDiv) ) {

DebugBreak();

}

#endif

}

if ( FALSE == IsStopButtonExist(spDiv) ) {

hr = InsertStopButton(spDiv);

CHECKHR(hr);

#ifdef DEBUG

if ( FALSE == IsStopButtonExist(spDiv) ) {

DebugBreak();

}

#endif

}

} while (0);

return hr ;

}

[cpp]

HRESULT CDeal12306WebPage::GetInsertButtonElem( CComPtr spForm,

CComPtr spDiv )

{

HRESULT hr = E_FAIL;

do {

CComPtr spCx_TabDiv;

hr = GetElementByClassName(spForm, L"cx_tab", spCx_TabDiv);

CHECKHRPOINTER(hr, spCx_TabDiv);

hr = GetElementByIndex(spCx_TabDiv, 0, spDiv);

CHECKHRPOINTER(hr, spDiv);

} while (0);

return hr;

}

HRESULT CDeal12306WebPage::InsertStartButton( CComPtr spElem )

{

HRESULT hr = E_FAIL;

do {

CComBSTR bstrWhere(L"beforeEnd");

CString cstrHTML;

cstrHTML.Format( BUTTONFORMAT, STARTBUTTONID, STARTCOMD, L"开始" );

CComBSTR bstrHTML(cstrHTML.GetString());

hr = spElem-insertAdjacentHTML( bstrWhere, bstrHTML );

CHECKHR(hr);

} while (0);

return hr ;

}

HRESULT CDeal12306WebPage::InsertStopButton( CComPtr spElem )

{

HRESULT hr = E_FAIL;

do {

CComBSTR bstrWhere(L"beforeEnd");

CString cstrHTML;

cstrHTML.Format( BUTTONFORMAT, STOPBUTTONID, STOPCMD, L"停止" );

CComBSTR bstrHTML(cstrHTML.GetString());

hr = spElem-insertAdjacentHTML( bstrWhere, bstrHTML );

CHECKHR(hr);

} while (0);

return hr ;

}

[cpp]

#define BUTTONFORMAT L"

%s

"

#define STARTBUTTONID L"StartButton"

#define STOPBUTTONID L"StopButton"

[cpp]

#define STARTCOMD L""

#define STOPCMD L""

当我们点击开始按钮是,页面将试图跳转到,此时,我将终止该跳转,同时将“开启查询”标志设置为TRUE。

[cpp] view plaincopy

void CBrowserHost::BeforeNavigate2(IDispatch *pDisp, VARIANT *url,

VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData,

VARIANT *Headers, VARIANT_BOOL *Cancel)

{

do {

if ( NULL != url ) {

CString cstrUrl((LPWSTR)(url-bstrVal));

if ( 0 == cstrUrl.CompareNoCase(SETTINGOK) ) {

……

}

else if ( 0 == cstrUrl.CompareNoCase(STARTCOMD) ) {

*Cancel = VARIANT_TRUE;

m_AutoMan.SetStart(TRUE);

break;

}

else if ( 0 == cstrUrl.CompareNoCase(STOPCMD) ) {

*Cancel = VARIANT_TRUE;

m_AutoMan.SetStart(FALSE);

break;

}

}

*Cancel = VARIANT_FALSE;

} while (0);

}

点击停止按钮原理同点击开始按钮原理一致。此处不再赘述。

当用户选择好出发地和目的地及时间后,用户点击查询按钮。并点击“开始”按钮。我们的“人”线程就开始了自动查询操作。

查询是否存在票,有票则预定,无票则再次查询

当我们执行完一次查询后,我们要查看下搜索结果列表信息中用户选择的车次是否存在票。我们先看一下页面结构

如何用python写一个简单的12306抢票软件

自问题都详细别给详细答案 抢票软件般模拟浏览器发请求纯粹模拟问题比验证码请求数等等具体看要实现

12306抢票软件源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于12306抢票软件官方下载、12306抢票软件源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/2556.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载