| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 889 人关注过本帖
标题:看到狐友们对于 webview2 的学习热情高涨,我出个实战题,挑战一下呗!答卷 ...
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:586
专家分:383
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:4 
看到狐友们对于 webview2 的学习热情高涨,我出个实战题,挑战一下呗!答卷时间只剩三天!
实现一个“抢火车票”或“抢飞机票”脚本,就用vfp!
此刻距离本年度春运票开抢,大约仅剩72小时!
冲鸭!!!
搜索更多相关主题的帖子: webview2 学习 挑战 时间 距离 
2026-01-14 23:17
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:586
专家分:383
注 册:2013-10-4
收藏
得分:0 
deepseek 答:我来解释一下如何使用VFP实现一个基本的火车票自动查询和预订脚本。请注意,这只是一个技术演示示例,实际抢票需要考虑更多因素。

1. 基本思路

```foxpro
* 火车票抢票脚本基本流程
* 1. 登录12306网站
* 2. 查询车票信息
* 3. 检测有余票的车次
* 4. 自动提交订单
* 5. 处理验证码(难点)
```

2. 核心代码示例

2.1 使用WinHTTP进行网络请求

```foxpro
LOCAL loHTTP
loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")

* 设置请求头模拟浏览器
WITH loHTTP
    .Open("GET", "https://kyfw., .F.)
    .SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
    .SetRequestHeader("Accept", "application/json")
    .SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
ENDWITH
```

2.2 查询车票函数

```foxpro
FUNCTION QueryTickets(tcFrom, tcTo, tcDate)
    LOCAL loHTTP, lcResponse, lcURL
   
    lcURL = "https://kyfw. + ;
            "leftTicketDTO.train_date=" + tcDate + ;
            "&leftTicketDTO.from_station=" + tcFrom + ;
            "&leftTicketDTO.to_station=" + tcTo + ;
            "&purpose_codes=ADULT"
   
    loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
   
    TRY
        loHTTP.Open("GET", lcURL, .F.)
        loHTTP.Send()
        
        IF loHTTP.Status = 200
            lcResponse = loHTTP.ResponseText
            RETURN ParseTicketResponse(lcResponse)
        ELSE
            RETURN .F.
        ENDIF
    CATCH
        RETURN .F.
    ENDTRY
ENDFUNC
```

2.3 解析车票响应

```foxpro
FUNCTION ParseTicketResponse(tcJSON)
    LOCAL loJSON, laTrains[1], lnCount, i
    LOCAL ARRAY laResult[1]
   
    * 假设使用第三方JSON解析库
    loJSON = CREATEOBJECT("JsonConverter")
    loJSON.Parse(tcJSON)
   
    lnCount = 0
    FOR i = 1 TO ALEN(loJSON.data.result, 1)
        lcTrainInfo = loJSON.data.result[i]
        
        * 解析车票信息(格式示例:车次|出发时间|到达时间...)
        laFields = STRTOARRAY(lcTrainInfo, "|")
        
        * 检查是否有余票
        IF VAL(laFields[27]) > 0  && 硬座余票
            lnCount = lnCount + 1
            DIMENSION laResult[lnCount, 8]
            laResult[lnCount, 1] = laFields[3]  && 车次
            laResult[lnCount, 2] = laFields[8]  && 出发时间
            laResult[lnCount, 3] = laFields[9]  && 到达时间
            laResult[lnCount, 4] = laFields[10] && 历时
            laResult[lnCount, 5] = laFields[27] && 硬座
            laResult[lnCount, 6] = laFields[31] && 二等座
            laResult[lnCount, 7] = laFields[32] && 一等座
            laResult[lnCount, 8] = .F.          && 是否已预订
        ENDIF
    ENDFOR
   
    RETURN lnCount
ENDFUNC
```

2.4 自动预订函数

```foxpro
FUNCTION AutoBookTicket(tcTrainNo, tcSeatType, tcPassenger)
    LOCAL loHTTP, lcPostData, lcResponse
   
    * 构建提交数据
    lcPostData = "train_no=" + tcTrainNo + ;
                 "&seat_type=" + tcSeatType + ;
                 "&passenger=" + tcPassenger + ;
                 "&token=" + GetToken()  && 需要先获取token
   
    loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
   
    TRY
        loHTTP.Open("POST", "https://kyfw., .F.)
        loHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        loHTTP.Send(lcPostData)
        
        IF loHTTP.Status = 200
            lcResponse = loHTTP.ResponseText
            RETURN CheckOrderResult(lcResponse)
        ELSE
            RETURN .F.
        ENDIF
    CATCH
        RETURN .F.
    ENDTRY
ENDFUNC
```

2.5 主控程序

```foxpro
* 主程序 - 火车票自动查询和预订
CLEAR

* 设置参数
lcFrom = "BJP"    && 北京
lcTo = "SHH"      && 上海
lcDate = "2024-01-20"
lcTrainFilter = "G"  && 高铁
lnCheckInterval = 5  && 查询间隔(秒)
lnMaxRetry = 100     && 最大重试次数

* 登录(需要先处理验证码)
IF !Login12306()
    MESSAGEBOX("登录失败!")
    RETURN
ENDIF

* 循环查询
lnRetry = 0
DO WHILE lnRetry < lnMaxRetry
    lnRetry = lnRetry + 1
   
    ? "第" + TRANSFORM(lnRetry) + "次查询 (" + TIME() + ")"
   
    * 查询车票
    lnTicketCount = QueryTickets(lcFrom, lcTo, lcDate)
   
    IF lnTicketCount > 0
        * 找到车票,尝试预订
        IF AutoBookTicket(lcTrainNo, "O", "张三")  && O表示二等座
            MESSAGEBOX("预订成功!")
            EXIT
        ELSE
            ? "预订失败,继续尝试..."
        ENDIF
    ELSE
        ? "暂无余票,等待重试..."
    ENDIF
   
    * 等待指定时间后重试
    lnWaitTime = lnCheckInterval * 1000  && 毫秒
    DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
    = Sleep(lnWaitTime)
ENDDO

IF lnRetry >= lnMaxRetry
    MESSAGEBOX("超过最大尝试次数,程序结束")
ENDIF
```

3. 注意事项和难点

3.1 验证码处理

```foxpro
* 验证码是最大难点,需要:
* 1. 下载验证码图片
* 2. 人工识别或使用OCR
* 3. 提交验证码答案

FUNCTION HandleCaptcha()
    * 需要集成图像识别或人工干预
    * 这里只是一个框架
    LOCAL lcCaptchaURL, lcImagePath
   
    lcCaptchaURL = "https://kyfw.
    lcImagePath = "captcha.jpg"
   
    * 下载验证码图片
    IF DownloadFile(lcCaptchaURL, lcImagePath)
        * 显示图片让用户识别
        MODIFY GENERAL oleCaptcha FROM FILE lcImagePath
        
        * 获取用户输入的验证码坐标
        lcAnswer = GetUserInput()
        
        RETURN SubmitCaptcha(lcAnswer)
    ENDIF
   
    RETURN .F.
ENDFUNC
```

3.2 必要的准备工作

1. 引用必要的库:

```foxpro
* 可能需要安装的组件
* 1. WinHTTP (系统自带)
* 2. JSON解析库
* 3. 加密库(用于密码加密)
```

1. 配置文件:

```foxpro
* Config.ini 示例
[SETTINGS]
Username=你的账号
Password=加密后的密码
FromStation=北京
ToStation=上海
TravelDate=2024-01-20
SeatType=二等座
TrainType=G,D  ;高铁和动车
CheckInterval=3
AutoSubmit=1
```

4. 法律和道德声明

重要提示:

1. 此代码仅为技术学习目的
2. 实际使用可能违反12306的使用条款
3. 过度频繁的请求可能导致IP被封禁
4. 请尊重公平购票原则
5. 建议使用官方候补功能

5. 更实际的建议

对于实际的抢票需求,建议:

1. 使用12306官方候补功能
2. 使用官方授权的第三方购票平台
3. 避开购票高峰时段
4. 提前规划行程,关注放票时间

这个示例展示了基本的技术思路,实际实现需要处理更多细节,如会话保持、错误处理、多线程查询等。
2026-01-14 23:48
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2447
专家分:4937
注 册:2012-2-29
收藏
得分:0 
2026-01-15 06:35
chychychy
Rank: 4
等 级:业余侠客
帖 子:510
专家分:220
注 册:2015-4-18
收藏
得分:0 
期待中
2026-01-15 08:05
easyppt
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:503
专家分:1026
注 册:2021-11-24
收藏
得分:0 
没研究过 120306,技术难点主要是:验证码和数据加密,没有这个限制,VFP实现应该也不难



[此贴子已经被作者于2026-1-15 10:01编辑过]

2026-01-15 09:34
快速回复:看到狐友们对于 webview2 的学习热情高涨,我出个实战题,挑战一下呗! ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022161 second(s), 8 queries.
Copyright©2004-2026, BCCN.NET, All Rights Reserved