红帽子AI软件开发系列4:《开发火车票提醒软件》
发表于 2024-11-16 15:00:50

        大家好,我是你们的InsCode老师红帽子先生,今天我将带领大家进入AI软件开发的神奇之旅,希望在这一系列的软件开发课程中,能够让大家认识到InsCode AI编程的魅力。

         下载安装 InsCode AI IDE 

        前两天国务院发布关于修改《全国年节及纪念日放假办法》的决定,春节自农历除夕起,放假调休8天。高兴之余,又想到订火车票的困难,我们现在学习了InsCode AI IDE的使用,能不能也结合前面的知识做一个火车票的提醒软件,到时候就能派上大用场了。        

一、创建工程

        双击“InsCode”图标后进入到欢迎界面,在这里我们可以选择创建Java或Python工程,咱们当前教学案例主要基于Python为主,所以就点击“创建Python工程”进入到“新建工程”的向导界面。

        在“新建工程”页面,我们填写项目名称为“TrainTickets”,然后选择一个位置来创建工程文件夹,然后是Python解释器的环境选择项,可以使用新建一个虚拟环境或使用当前电脑上安装好的Python版本的解释器。点击“创建”后,InsCode AI IDE就按需求创建好工程文件夹,并创建好一个简单的main.py文件作为当前项目的启动文件。

二、代码生成

        下面我们按下CTRL+A全选代码后删除,在空白代码编辑区中按下CTRL+J组合键,呼出AI对话框,在输入框中输入我们的需求:“基于tkinter编写一个从12306进行火车票定时查询的小工具,输入日期、起点、终点后点击查询,会在下方的列表中每行列出查询到的车次和各等座票是否有票信息,点击“监控”按钮,可以让系统每10秒刷新一下查询结果,如果有票,则调用WINDOWS系统消息通知对应车次的对应票有票。”。

        输入完成后,我们按下回车键,稍作等待后,InsCode AI IDE就会在代码编程区中生成出相应的代码了。

        等生成过程结束后,点击“接受”采纳生成的结果,然后在IDE右上角点击绿色的运行按钮,这时可以看到弹出的窗口程序。

三、网站分析

        有了基本的代码界面,就可以进行火车票查询了,但是我们要确定API的参数具体应该怎么填写。在代码中需要填写日期、起始车站的编码和终点车站编码,那该怎么获取到车站编码呢?

url = f"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from_station_encoded}&leftTicketDTO.to_station={to_station_encoded}&purpose_codes=ADULT" 

        我们打开12306网站,我们选择出发地是“北京”,到达地是“上海”,然后按F12进入浏览器的开发者工具,先点击开发者工具里的左上角上图标用鼠标来捕捉网页元素,然后再将鼠标移动到城市名称上,这时就可以在源码栏看到城市及对应编码信息了。

        现在有了编码,我们就只需要填写日期就可以了,假设我们要查询2024年11月22日北京到上海的车票,那么我们就可以使用:

url=f"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2024-11-22&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT"

        来进行查询,我们可以将这个URL放入浏览器测试一下,可以看到会返回一个JSON文件:

        我们只需要解析这个JSON文件就可以整理出需要的车次信息了,如何解析呢?我们也只需要在网页上正常查询一下,并对照输出的JSON信息就可以知道哪些字符串是对应哪些信息了。       

        通过上图对比可以看到

        在Json的data字段下的result列表中,每一个字符串就是一个车次的信息,第一个字符串中可以找到“G103、有、有、3”,分别对应车次、一等座、二等级、商务座,第二个字符串可以找到“G1、有、有、无”,第三个字符串可以找到“G105、有、有、9”,在字符串中使用|分隔符处理一下可以获取出一个列表,只要根据索引提取一下就可以得出这四个项的值了。

        我们可以先使用|分隔符数一下G103和一等座的索引位置,分别是3和30,所以我们可以对函数fetch_train_data(self, date, from_station, to_station)使用推荐语进行修改:“创建一个新的结果列表,对tranin_results列表中的每一个字符串按照|进行字符串分割,提取第3,30,31,32个分割项放到一个列表中存入结果列表作为最后函数返回结果。


            经过改造后,按理说是应该能获取到火车票信息了,但尝试还是不行,是为什么呢?原因为request.get() 只是一次独立请求,12306认为不是合法的浏览器,所以我们需要增加一些头信息和Cookie以模拟一下浏览器。

四、浏览器Cookie

        在12306网页上打开F12,选择“应用程序”栏,可以看到Cookie项,Cookie是网站保存在您的电脑或移动设备上的一种小文本文件,以便网站以后检索或读取其中的内容,有不少服务器也会通过浏览器请求时附带Cookie来进行用户访问身份的识别。

        下面我们就需要给代码中Request按照咱们浏览器的Cookie值来设置Cookie了,比如改成这样:

cookie = {'JSESSIONID':'19244E64B10E57EFB354E317CC0DD2C5',
          'BIGipServerotn':'535822858.50210.0000',
          'RAIL_EXPIRATION':'1582333451491',
'RAIL_DEVICEID':'McIuEPF2UftrVKz1eNePew8hyOmYixP1IVU1JOTtULuRy2igIY3K71OCqb2YQni1FEkLyWbxf508zd6v91pHbnHRZ2UU0SLJBBsbittDazpLO-ZB7zoirqGyH9ao0cAv_d76BNGKrAVsosQuv0EkQuOczvUHWMcx',
          'BIGipServerpool_passport':'317522442.50215.0000',
          'route':'9036359bb8a8a461c164a04f8f50b252',
          '_jc_save_toStation':'%u4E0A%u6D77%2CSHH',
          '_jc_save_wfdc_flag':'dc',
          '_jc_save_fromStation':'%u957F%u6C99%2CCSQ',
          '_jc_save_fromDate':'2024-10-19',
          '_jc_save_toDate':'2024-10-19'}
        response = requests.get(url,cookies = cookie)

            这时候再运行,就会获得和浏览器打开查询地址后一样的JSON信息了。

五、美化界面

        

        虽然有了基础的功能,但是界面还不能正确显示出车次和余票,下面我们全选代码,按下CTRL+J,在弹出的对话框里输入:“使用ttkbootstrap中的黑色主题进一步美化界面,修改界面,将列表控件显示车次、一等座、二等座、商务座四列信息,并将查询返回的列表值填充到列表控件中。,调整界面控件的尺寸和字体,使界面更加美观。

        再次运行、可以看到界面已经换成了下面的样式。

        从需求的角度看,我们似乎还应该能够对一些车次和座位进行监控,这时我们可以再次CTRL+A选中所有代码,然后在对话框中输入“修改代码,在界面下方的“监控”按钮前增加一个输入车次的输入框和三个复选框,分别对应一等座,二等座,三等府,用户可以在输入框里输入多个车次,使用逗号作为分隔符,并勾选相应的座位类型,点击“监控”按钮后,会每10秒查询一次,如果输入框中输入的一些车次有对应勾选的座位类型,调用系统的通知提示当前有的车票,如果输入车次为空则对所有车次进行有票判断和提示。

        经过一番修改,界面已经修改成如下样式:

        

        在上一节的股票提醒软件中,我们讲解了如何通过AI对话来完成托盘和消息通知的开发,还没学会的同学可以直接使用上节课的知识来进一步完善,最后我们找个图标放在工程目录下,并在终端输入:

pyinstaller --name=TrainTicket--onefile --icon=icon.ico --noconsole main.py

        将工程打包成EXE,就可以交付使用了!

六、总结

        本节我们通过 AI 对话的方式开发出了12306的查票助手,相信大家一定能在即将到来的年终抢票大战中拔得头筹!不过要注意目前输入起点和终点需要先找一下城市编码哈,否则返回不到正确的JSON信息。

        最后、感兴趣的小伙伴可以加用户群、和红帽子先生一起讨论如何使用AI来进行软件开发啦!

        

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】