e特快美国价格怎么上传文件订单

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
请扫描分享到朋友圈加载中,请稍候...
加载中,请稍候...
购买日期:
商品名称:
京&&东&&价:
商品评分:
评&&价&&数:& 上一页 1
锁定老帖子
该帖已经被评为精华帖
来自: 广州
发表时间:&&
最后修改:
前两天女友要在线订火车在票,一直都没有办法订到票,最后没办法,便给她写了个自动抢票的脚本,可周边的朋友听她说通过软件订到票了,都先后向她要软件,可原来的脚本只是基于控制台输入,这样给别人也没法用,兴趣一起,就花了一天的时间做了个WEB界面,然后分享给朋友用。先上几张图,看大家看看。
这个是登录界面,要使用前先设置一下常用的邮箱和登录密码,自动抢票过程中,如需要再输入登录验证码和订单验证码,或订单成功时,将通过此email通知您,建议使用qq邮箱,这样只要您在电脑时开打QQ,收到邮件时,qq会弹出窗口通知您,您可以即时响应。&&
第一次使用时,要先把在火车票官网注册的资料填在这里:
这资料都必码是已在官方上注册过的,在自动订票时,需要用到这些资料。
第一次登录后需要求先填写官网上的登录验证码和订单提交验证码,只要填写正确后,在填票过程中就一直可以使用,这也是官网的BUG,应该是他们在较正验证码后,没有让当前验证码失效,这样就只要不去刷新验证码,就可以一直使用第一次输入的正确验证码。
填写一下订票任务,主要就填写订票人资料(当然这个也是要在官网上添加过的),和订票信息,什么时候从哪到哪,从几列车等,保存完后,点开始,就则可以自动登录,找票,然后订票,订票成功后发邮件通知。
执行过程中,会时间更新执行的结果信息。
留言板功能,收集问题的反馈。
网友提供http代理,官方网站对一个IP的单位时间内访问次数据有限制,超过这个超制值IP会被封锁一段时间。
因为使用的人多,所以系统需要使用代理来向官网发送请求。
看到系统的整体内容后,再来介绍一下相关的技术
这个自动发送请求,提交数据,都依赖于httpclient4,火车票订票官方是使用ssl加密,这里是启用httpclient的ssl功能
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[]{easyTrustManager}, null);
SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
Scheme sch = new Scheme("https", sf,443);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
大家都知道,这个官网的反映速度有时实在是惨不忍睹,所以我们也要设计一下请求等待的最长时间(30秒):
httpclient.getParams().setIntParameter("http.socket.timeout",30000);//毫秒
官方网站对一个IP的单位时间内访问次数据有限制,超过这个超制值IP会被封锁一段时间。
因为使用的人多,所以系统需要使用代理来向官网发送请求,这个代理需要支持ssl,所以先网上找到一批代理IP过来,存在一个txt文字,格式为 ip:端口\n,以下读取IP代理,并且进行速试测试
public void run(){
System.out.println("-----设置代理服务器----");
String proxyFileString0 = FileUtils.readFileToString(new File(ApplicationUtils.getWebrootDir()+"/order/proxy_add.txt"), "UTF-8");
String proxyFileString1 = FileUtils.readFileToString(new File(ApplicationUtils.getWebrootDir()+"/order/proxy_enable.txt"), "UTF-8");
String proxyFileString = proxyFileString0+"\n"+proxyFileString1;
for(String proxyString : StringUtils.split(proxyFileString, "\n")){
proxyString = proxyString.trim();
if(StringUtils.isNotEmpty(proxyString)){
System.out.print("-----测试代理服务器: "+proxyString);
String[] proxyInfo = proxyString.split(":");
HttpHost httpHost = new HttpHost(proxyInfo[0], Integer.valueOf(proxyInfo[1]));
long start = System.currentTimeMillis();
if(HttpUtils.testProxy(httpHost)){
long usetime = System.currentTimeMillis()-
if(usetime & 10000){
System.out.println(" 不使用,响应时间太长时间:"+usetime+"毫秒----");
System.out.println(" 可使用,使用时间:"+usetime+"毫秒----");
httpHostList.add(httpHost);
System.out.println("-----设置代理服务器成功,总数:"+httpHostList.size()+"----");
} catch (Exception e) {
最后在每次请求时,选择一个代理
//设置代理对象 ip/代理名称,端口
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,ProxyHostUtils.next());
}catch(Exception e){}
每个用户在发送请求前,先从官网上读取两个验证码,一个是登录验证码,一个是提交订单验证码,一次性读取就可以了。
* 读取登录验证码
* @throws Exception
@Transient
public void getRemoteLoginCode() throws Exception {
File file = HttpUtils.doGetFile(OrderRunTask.loginCodeUrl+"&nocache="+Utils.getRandomString(10), cookieContext);
if(file != null){
File codeFile = new File(ApplicationUtils.getWebrootDir()+getLoginCodeUrl());
FileUtils.copyFile(file, codeFile);
* 读取提交订单验证码
* @throws Exception
@Transient
public void getRemoteSumitCode() throws Exception {
File file = HttpUtils.doGetFile(OrderRunTask.submitCodeUrl+"&nocache="+Utils.getRandomString(10), cookieContext);
if(file != null){
File codeFile = new File(ApplicationUtils.getWebrootDir()+getSubmitCodeUrl());
FileUtils.copyFile(file, codeFile);
每个用户可以同时订多张火车票,系统为每张火车票启动一个线程,持续的运行,直到订票成功或者是被中断。
//建立线程池
public static ExecutorService runningTaskPool = Executors.newFixedThreadPool(1000);
//启动订票任务
OrderRunTask orderRunTask = new OrderRunTask(account, orderTask);
OrderRunTaskUtils.runningTaskMap.put(orderTask.getId(), orderRunTask);
Future&?& future = OrderRunTaskUtils.runningTaskPool.submit(orderRunTask);
orderRunTask.setFuture(future);
//中断任务
OrderRunTask orderRunTask = OrderRunTaskUtils.runningTaskMap.get(taskId);
orderRunTask.setStop();
orderRunTask.getFuture().cancel(true);
}catch(Exception e){
e.printStackTrace();
//判断是否订票成功,并且发送邮件
if(body.indexOf("45分钟") != -1){
Date now = new Date();
account.sendMail(orderTask.getQueryTrainDate()+"_订票成功",
orderTask.getQueryTrainDate() +" "+
orderTask.getFromStation()+"到"+orderTask.getToStation()+(StringUtils.isEmpty(orderTask.getTrainNo())?orderTask.getTrainNo():"")+" --订票时间:"
+DateUtils.getDateTime("HH:mm:ss", now)
account.setReload(true);
orderTask.setState(200);
orderTask.setRuningTime(now);
this.account.error(orderTask.toString()+": 订票成功。");
这也只是本人兴趣开发,不使用在商品场合,以上分享的只是这个系统的设计思想,有时间再深入讨论。
顺便附上本机(随时变动的)的一个链接地址,地址已关闭,访问太多了,小小的笔记本,顶不住压力。
大伙这么好热情啊,现在已上传了控制台输入版本(jar包太大,没上传,需要的自己网上下载),欢迎大家讨论,至于web版本的,现在不好上传,里面有其他项目的内容,不好整理,这就不好意思了,见谅。
如果使用中报出javax.net.ssl.SSLException: hostname in certificate didn't match异常,是检查一下jar,httpclient4.0.1不会有这个问题,至少具体原因是没什么,还没有去调试。
如果报出java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.
这个因为所有线程都共享一下httpclient,造成http发送请求的冲突,可以改造一下HttpUtils,为每个线程分配一个独立的httpclient,使用ThreadL 可以更新一下HttpUtils。
下面有网友回复程序“开始搜索”后就停止了,因为程序对每个订票任务开始时只打印一下次"--开始搜索:"+ queryStrs[0]+"到"+queryStrs[1],在while中没有再打印搜索票过程的信息,所以看着是停止了,如果要看搜索过程只要在while里面打印消息提示就可以了。这在源代码中,可以很容易就发现的。
OrderMain中有句代码需要改一下,68行for(String train :StringUtils.split(queryBody, "\\n")){
之前这样是可以,但现在有人发现这个不行了,建议改成:
queryBody= queryBody.replace("\\n", "@@@");
for(String train :StringUtils.split(queryBody, "@@@")){
在开发时,这里也测试了用几遍,之前用queryBody.split(("\\n");是一直没有办法成功。不知网站返回来的字符串有问题,还是java的split有问题,看哪位能解释一下,OrderMain.rar已上传。
提交订单的时候,有两个参数设置出错,
//设置座位信息
orderParam.put("passengerTickets", seatValue+",1,"+TrainDataUtils.name+",1,"+TrainDataUtils.cardid+","+TrainDataUtils.mobile+",Y"); orderParam.put("passenger_1_seat", seatValue);
//这个地方不需要
postOrderParam.putAll(TrainDataUtils.submitOrderParams);
//这里添加
postOrderParam.put("passengerTickets", seatValue+",1,"+TrainDataUtils.name+",1,"+TrainDataUtils.cardid+","+TrainDataUtils.mobile+",Y");
postOrderParam.put("passenger_1_seat", seatValue);
OrderMain.rar已上传。
这份代码于1月9号之前可以成功订票,但不代表就一直可以订票,若官网程序一更新升级,肯定就不能订了,但分享源代码是为了与大家做技术交流,至于用不用于订票吧,自己决定,如果有出什么订票之类的问题,源代码都在,自己调试一下,一般是小改一下就可以订了(官方此时应该不会做太大的改动的),或者在从网上其他地方下载订票软件(目前挺多),所以这代码我不会去升级什么内容来让它可以一直保持能订票,但如果发现有什么设计上问题,会更新代码继续上传。
(108.6 KB)
下载次数: 7564
下载次数: 3293
下载次数: 2299
来自: 深圳
发表时间:&&
嘿嘿……这个有意思,好玩
请登录后投票
文章: 3527
积分: 1500
来自: 中华大丈夫学院
发表时间:&&
还没订过票,,,需要支付么?
请登录后投票
来自: 武汉
发表时间:&&
kimmking 写道还没订过票,,,需要支付么?同上,你这个是订票但不包含支付吧?
请登录后投票
来自: 广州
发表时间:&&
json 写道kimmking 写道还没订过票,,,需要支付么?
同上,你这个是订票但不包含支付吧?
只是自动抢票,不会支付,成功了,就自己去支付。
其实就是自己在手动订票过程,用程序模拟。
请登录后投票
等级: 初级会员
来自: 北京
发表时间:&&
最后修改:
这玩意不会泄露个人信息吧,里面身份证号码哟。
请登录后投票
等级: 初级会员
来自: 北京
发表时间:&&
人才啊 强悍
请登录后投票
等级: 初级会员
来自: 北京
发表时间:&&
这才叫学以致用呢,楼主动手能力强!
请登录后投票
等级: 初级会员
来自: 合肥
发表时间:&&
还是你厉害,我用Php Snoopy写了俩天了都没写好。
请登录后投票
来自: 杭州
发表时间:&&
哥们能不能把源代码 发布过来让大家研究一下
请登录后投票
& 上一页 1
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术加载中,请稍候...
加载中,请稍候...
商品名称:
京东价:暂无报价
评价得分:
·常见问题
·购买须知
·名词解释
·实用指南
咨询内容:
我在小乡镇,只能收到EMS(特快、E邮宝经济快递),我购买大件(如家电、空调等)也能发EMS吗?
京东回复:
请参照我司大家电配送范围/help/helectronic.aspx下单选购。目前大家电有配送区域购买限制,如无法提交订单暂不支持购买,详情以提交订单为准。感谢您对京东的支持!祝您购物愉快!
发表咨询:
声明:您可在购买前对产品包装、颜色、运输、库存等方面进行咨询,我们有专人进行回复!因厂家随时会更改一些产品的包装、颜色、产地等参数,所以该回复仅在当时对提问者有效,其他网友仅供参考!咨询回复的工作时间为:周一至周五,9:00至18:00,请耐心等待工作人员回复。
咨询类型:
库存及配送
发票及保修
促销及赠品
京东承诺:商品均为原装正品行货,自带机打发票,严格执行国家三包政策,享受全国联保服务。
功能咨询:咨询商品功能建议您拨打各品牌的官方客服电话,以便获得更准确的信息。
发货时间:现货:下单后一日内即可发货;在途:一般1-2天发货; 预订:一般1-6天可发货;无货:已售完,相应物流中心覆盖地区内的用户不能购买
运&&&&费:如需查看快递运输收费标准及免运费规则,
货到付款:如需查看开通货到付款地区及运费,
上门自提:上门自提不收取运费,如需查看全部自提点位置、地图、注意事项,
物流中心:京东商城拥有北京、上海、广州三个物流中心,各物流中心覆盖不同的城市,
限&&&&额:如需查看各银行在线支付限额,
大额支付:快钱支付中的招行、工行、建行、农行、广发支持大额支付,最高单笔一次支付10000元
分期付款:单个商品价格在500元以上,可使用中国银行、招商银行发行的信用卡申请分期付款,
货到付款:如需查看开通货到付款地区及运费,
京东承诺:商品均为原装正品行货,自带机打发票,严格执行国家三包政策,享受全国联保服务。
发票类型:京东商城所售商品均自带机打发票,在提供相关企业资料证明后,可申请开取增值税发票。
退 换 货:京东商城为您提供完善的退换货服务,
咨询内容:
&将客服的回复发到我的邮箱

我要回帖

更多关于 国际e特快 的文章

 

随机推荐