精华内容
下载资源
问答
  • 12306自动登录刷票脚本

    千次阅读 2012-01-10 16:24:27
     注意,如果您以前有安装过类似的脚本(如自动登录、自动查询等等),请先移除它们。 Firefox下的功能介绍 在登录页面,本脚本会加入密码记录功能和自动登录功能: 记录密码后,下次登录直接...
    
    

    12306.cn 可以网上购火车票了,但由于我镇的『国情』决定了春节时分它竟然比电话购票都不靠谱。但是,毕竟它是最方便的,所以在意识到其实这不仅是个技术活、更是一个体力活之后,终于决定博彩众家之长搞这么一个一条龙的轮子……现在放出来也许有点晚了,但是对于赶年前一两天以及回程票的同学还是有点用的,所以还是放出来吧 :-)

    半原创,借鉴了不少别人的思想和思路,但代码基本上都是重写的。目前实现的功能有:

    记录登录的用户名和密码,在打开登录页面后自动填写;
    运行需求

    您必须准备以下条件之一: 
    1. Firefox,最好比较新的版本(6+),并安装 Scriptish 扩展;
    2. Chrome(4以上版本)
     注意,如果您以前有安装过类似的脚本(如自动登录、自动查询等等),请先移除它们。

    Firefox下的功能介绍

    在登录页面,本脚本会加入密码记录功能和自动登录功能:



    记录密码后,下次登录直接就会填入,并自动定位到验证码段。需要提醒的是,密码是明文记录在Cookies中的,所以如果不是你自己的电脑,建议不要记录。

    填完后,你可以用传统方式登录。不过现在不是有了自动登录了吗?点击自动登录呗。在没有成功登录的情况下,系统会自动反复重试,重试的时候桌面右下角会有弹窗提示正在进行的操作:



    登录成功后,也会有提示,并且页面会自动进入查询页面:



    进入查询页面后,在查询下面有加一条选项,选项意思简单明了,不需要解释的吧 :-)

    当没有查询到符合要求的车次时,会自动重试。由于系统按钮有5秒钟的限制,所以不允许设置在6秒内重试。




    (上图木有查到,是因为过滤了“仅卧铺”)。

    如果查到了,会停止刷新,高亮行,并在桌面右下角弹出提示:





    Chrome下的功能介绍

    在Chrome下的功能基本上是一致的,以下不再做详细描述。

    不过Chrome的桌面提示是需要授权的,所以有提示的界面上会有按钮提示:



    “请点击以启用通告”,点击后在浏览器上方点击“允许”,否则通告无法使用。

    登录过程的界面提示,内容基本一致,不过就是换个样子:



    登录成功后会一样进入:



    呃,查询界面一样经典呐:





    查询成功时会有声音提示(可以选择开启或关闭),并弹出提示:



    小贴士请注意喔

    1. Chrome下的桌面提示仅在浏览器正常模式下才起效(也就是说你要是把浏览器最小化了,提示看不到的),不知道是不是Chrome都是这样,但我测试的结果是这样……所以一定要注意声音啊
    2. Firefox下的桌面提示是可以在桌面上弹出来的。我这里用的是Scriptish,没有测试GreaseMonkey的兼容性……木有时间啊
    3. 很多人说又要用IE去付款,还不是要反复登录的体力活吗?建议用银联在线支付,关联银行卡后用手机即可在Firefox或Chrome下直接付款(值得注意的是,Firefox6以上的版本它的安全控件暂时不支持,可以用我制作的安全控件补丁,点击下载)。

    感谢前人

    12306 Auto Query ,Jingqin Lynn
    12306 Booking Assistant,Hidden
    12306 Auto Login,Kevintop

    下载

    请选择您需要的版本(根据您的浏览器选择):

    Chrome:http://www.u-tide.com/fish/Service.asmx/Download/44/45/12306_ticket_helper_for_chrome.user.js
    Firefox:http://www.u-tide.com/fish/Service.asmx/Download/44/46/12306_ticket_helper_for_firefox.user.js

    点击链接后在提示中点击安装或继续即可。
    自动登录,遇到人过多或繁忙的时候自动重试,直到登录成功(有点儿抢线的味道);自动记录查询信息,一次查询线路后下次再查询自动填入;自动刷新查询,当没有需要的车次时,自动重新刷新;支持 Firefox + Scriptish 或 Chrome。在 Chrome下,查票和登录有右下角提示和声音提示;Firefox下暂不支持声音提示,但有桌面弹窗提示。



    转载于:http://www.cnbeta.com/articles/168627.htm 
    展开全文
  • 传送门~我也在刷票,不过发现12306还是发生了一些变化,在使用过程中,发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下:防自动退出添加刷到票后发起桌面通知勾选某些类型的车选择发站...

    马上就要回家了,票还没有。你是否用到了我去年发布的刷票脚本呢。传送门~

    我也在刷票,不过发现12306还是发生了一些变化,在使用过程中,发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下:

     

    1. 防自动退出
    2. 添加刷到票后发起桌面通知
    3. 勾选某些类型的车
    4. 选择发站站点
    5. 选择到站站点
    6. 选择乘车时间

    最重要的是前2个功能,第一个功能主要是解决因为12306可能对刷票做了特殊处理,自动刷票一段时间后,session会过期。导致后续刷到票后无法自动提交订单。第二个功能则是方便在刷票时,自动给的桌面提示。毕竟在单位戴耳机工作不太好。其余功能均为减少人为操作的功能。

    桌面提醒功能,需要提前在12306网站上开启允许桌面提示的功能。具体操作如图所示:

    好了,Talk is cheap, show you the code。

    功能脚本:

     

    //记录等待时间  
    var waittime=0;
    
      
    //统计等待时间,防止刷新间隔时间短时导致卡住不再刷票
    function waitforRestart(){
    	if($(".ad-gt").length>0){
    		$(".ad-gt").remove();
    	}
    	if($(".audiojs").length>0){
    		$(".audiojs").remove();
    	}
        if(!$("#autoSubmit").prop("checked"))return ;  
        if($("#query_ticket").text()=="停止查询"){  
            waittime++;  
        }  
        if(waittime>10){  
            $("#query_ticket").click();  
            setTimeout(function(){  
                waittime=0;  
                if($("#query_ticket").text()=="查询") {  
                    $("#query_ticket").click();  
                }  
            },1000);  
        }  
    }
    
    //防自动退出-1分钟刷新一次“个人信息”页面,保证登录状态
    function preventLogout(){
      setInterval(function(){
        if($(".footer").length>0){
    	  $("#footer-my").remove();
          var htmlStr="<iframe id='footer-my' width='0' height='0' src='https://kyfw.12306.cn/otn/index/initMy12306?t="+(new Date().getTime())+"'></iframe>";
          $(".footer").append(htmlStr);
        }
      },1000*30);
    }
    
    //添加桌面通知
    function showNotice() {
      var timer_desktopNotice = setInterval(function(){
        if($("#tryPlayer").length>0 && $("#tryPlayer").text=="停止提示音乐"){
    	  Notification.requestPermission(function (perm) {
            if (perm == "granted") {
                var notification = new Notification("【恭喜恭喜】", {
                    dir: "auto",
                    lang: "hi",
                    tag: "12306刷票提示",
                    icon: "https://kyfw.12306.cn/otn/resources/images/ots/favicon.ico",
                    body: "恭喜你,终于抢到票了!!!"
                });
    			clearInterval(timer_desktopNotice);
            }
          });
    	}
      },500);
    }
    
    //页面关闭或者跳转时,自动提示(当提供提交票时,自动提示)
    $(window).bind('beforeunload',function(){
        Notification.requestPermission(function (perm) {  
            if (perm == "granted") {
                var notification = new Notification("【恭喜恭喜】", {
                    dir: "auto",
                    lang: "hi",
                    tag: "12306刷票提示",
                    icon: "https://kyfw.12306.cn/otn/resources/images/ots/favicon.ico",
                    body: "恭喜你,终于抢到票了!!!"
                });
            }
        });
    	$(window).unbind('beforeunload');
    });
      
    //注册回调方法  
    function callback(fun1,fun2){  
      fun1();  
      fun2();  
    }  
      
      
    //添加乘车人  
    function addBuyer(name){  
      callback($.showSelectBuyer,function(){  
        $("#buyer-list li[p_value^="+name+"]").click();  
        $.closeSelectBuyer();  
      });  
    }  
      
    //突破限制,添加车次  
    function addTrain(trainCode){
      $("#prior_train").append('<span name="prior_train-span" class="sel-box w80">'+trainCode+'<a class="close" href="javascript:" onclick="$.removeSel(this,\''+trainCode+'\',4)"></a></span>');
    }  
      
    //添加优先席别  
    function addSeat(seat){  
      callback($.showSelectSeat, function(){  
        $("#seat-list li[name^="+seat+"]").click();  
        $.closeSelectSeat();  
      });
    }
    
    //添加备选日期  
    function addDate(date){  
      callback($.showSelectDate, function(){  
        $("#date-list li[name^="+date+"]").click();  
        $.closeSelectDate();  
      });
    }
      
    //自定义查询区间
    function addTimes(startTime,endTime){  
        $("#cc_start_time").append('<option value="'+startTime.replace(":","")+endTime.replace(":","")+'">'+startTime+'--'+endTime+'</option>');  
        $("#cc_start_time option:last").selected();  
    }  
      
    //根据时间段、车次类型查询所有满足的车次。  
    function queryByTimeAndTrainType(){  
      callback($.showYxTrain, function(){  
        var yxTrainTimer = setInterval(function(){  
          if($("#filterTic").length>0){  
            $("#filterTic").prop("checked",true);  
            $("#yxtrain_close").click();   
            clearInterval(yxTrainTimer);  
          }  
        },10);  
      });  
    }
    
    //勾选某些类型的车
    function selectTrainType(types){
      $("#_ul_station_train_code input").each(function(i,e){
        $(e).prop("checked", false);
      });
      var typelist = types.split("/");
      for(var i=0;i<typelist.length;i++){
        $("input[value='"+typelist[i]+"']").prop("checked",true); 
      }
    }
    
    //选择发站站点
    function selectFrom(station){
    	$("#fromStationText").trigger('keydown');
    	$("#fromStationText").val(station);
    	$("#fromStationText").trigger('keyup');
    	$("#panel_cities div").each(function(i,s){
    		var t = $(s).find("span").first();
    		if(t.text()==station){
    			$(s).trigger('mouseover').trigger('click');
    		}
    	});
    }
    //选择到站站点
    function selectTo(station){
    	$("#toStationText").trigger('keydown');
    	$("#toStationText").val(station);
    	$("#toStationText").trigger('keyup');
    	$("#panel_cities div").each(function(i,s){
    		var t = $(s).find("span").first();
    		if(t.text()==station){
    			$(s).trigger('mouseover').trigger('click');
    		}
    	});
    }
    //选择发站-到站站点
    function selectFromTo(s1,s2){
    	selectFrom(s1);
    	selectTo(s2);
    }
    
    //选择乘车时间
    function selectDate(date){
    	$("#train_date").val(date);
    }
    
    //打开订票助手
    if($("#sear-sel .up").length==0){
      $("#sear-sel").append($('<a href="#nogo" class="up"></a>'));
      $("#sear-sel .quick-gif").show();
    }

    自设置参数脚本,以以下信息为例

    购票人:张三、李四,
    乘车日期:2018-02-13
    车次类型:高铁、动车
    起止车站:北京西-石家庄
    车次(6个):D2001、G71、G601、G529、G485、G403、G653
    座次:二等座
    车次区间:07:00-08:10
    开启桌面通知:开启
    刷票频率:0.5秒

    脚本如下:

    //==========================================  
    //  以下则根据需求自行配置:  
    //      乘车人、车次、席别  
    //      仅显示要刷的车次、查询区间、刷新时间  
    //==========================================  
    
    
    //开启桌面通知
    showNotice();
    
    //选择北京西-石家庄的车
    selectFromTo("北京西","石家庄");
      
    //勾选车次类型:G-高铁/城际,D-动车,Z-直达,T-特快,K-快速,QT-其他
    selectTrainType("G/D");
    
    //选择乘车日期
    selectDate('2018-02-13');
    
    
    //选择乘车人  
    addBuyer("张三");  
    addBuyer("'李四'");
      
    //手动添加车次,按优先顺序添加(轻松突破5车次限制)  
    addTrain("D2001");
    addTrain("G71");  
    addTrain("G601");  
    addTrain("G529");  
    addTrain("G485");  
    addTrain("G403");  
    addTrain("G653");  
    
    //添加备选日期
    //addDate('2018-01-01');
      
    //添加优先席别,按优先顺序添加  
    addSeat("二等座");
    
    //自定义时间区间
    addTimes('07:00','08:10');
      
    //自动刷新时间0.5s
    autoSearchTime=500;
      
    //收起订票助手  
    $(".up").click();  
      
    //启动检测防挂
    var timer = setInterval(waitforRestart,autoSearchTime);
    
    //开启防退出功能
    preventLogout();
    
    //开始刷票  
    if($("#query_ticket").text()=="查询"){
      //仅查看勾选的车次
      $("#filterTic").prop("checked",true);
      var timer2 = setInterval(function(){
        if($("#auto_query").prop("checked") && $("#autoSubmit").prop("checked")&& ($("#filterTic").length==0 || $("#filterTic").prop("checked"))){
    	  console.log("----开始刷票-----at:"+new Date().toLocaleString());
          $("#query_ticket").click();
    	  if($("#filterTic").length>0){
            $("#filterTic").prop("checked",true);
          }
          clearInterval(timer2);
        }
      },10);
    }

    整理好自己的脚本后,将这2段js,贴到一起,然后打开这个页面,按步骤操作,即可。

    最后恭祝各位早日刷到回家的票~

     

     

    展开全文
  • 12306刷票脚本

    千次阅读 2018-10-29 18:00:34
    我也在刷票,不过发现12306还是发生了一些变化,在使用过程中,发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下:  防自动退出  添加刷到票后发起桌面通知  勾选某些类型的车  ...

    我也在刷票,不过发现12306还是发生了一些变化,在使用过程中,发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下:

        防自动退出
        添加刷到票后发起桌面通知
        勾选某些类型的车
        选择发站站点
        选择到站站点
        选择乘车时间

    最重要的是前2个功能,第一个功能主要是解决因为12306可能对刷票做了特殊处理,自动刷票一段时间后,session会过期。导致后续刷到票后无法自动提交订单。第二个功能则是方便在刷票时,自动给的桌面提示。毕竟在单位戴耳机工作不太好。其余功能均为减少人为操作的功能。

    桌面提醒功能,需要提前在12306网站上开启允许桌面提示的功能。具体操作如图所示:


    好了,Talk is cheap, show you the code。

    功能脚本:

        //记录等待时间  
        var waittime=0;
         
          
        //统计等待时间,防止刷新间隔时间短时导致卡住不再刷票
        function waitforRestart(){
            if($(".ad-gt").length>0){
                $(".ad-gt").remove();
            }
            if($(".audiojs").length>0){
                $(".audiojs").remove();
            }
            if(!$("#autoSubmit").prop("checked"))return ;  
            if($("#query_ticket").text()=="停止查询"){  
                waittime++;  
            }  
            if(waittime>10){  
                $("#query_ticket").click();  
                setTimeout(function(){  
                    waittime=0;  
                    if($("#query_ticket").text()=="查询") {  
                        $("#query_ticket").click();  
                    }  
                },1000);  
            }  
        }
         
        //防自动退出-1分钟刷新一次“个人信息”页面,保证登录状态
        function preventLogout(){
          setInterval(function(){
            if($(".footer").length>0){
              $("#footer-my").remove();
              var htmlStr="<iframe id='footer-my' width='0' height='0' src='https://kyfw.12306.cn/otn/index/initMy12306?t="+(new Date().getTime())+"'></iframe>";
              $(".footer").append(htmlStr);
            }
          },1000*30);
        }
         
        //添加桌面通知
        function showNotice() {
          var timer_desktopNotice = setInterval(function(){
            if($("#tryPlayer").length>0 && $("#tryPlayer").text=="停止提示音乐"){
              Notification.requestPermission(function (perm) {
                if (perm == "granted") {
                    var notification = new Notification("【恭喜恭喜】", {
                        dir: "auto",
                        lang: "hi",
                        tag: "12306刷票提示",
                        icon: "https://kyfw.12306.cn/otn/resources/images/ots/favicon.ico",
                        body: "恭喜你,终于抢到票了!!!"
                    });
                    clearInterval(timer_desktopNotice);
                }
              });
            }
          },500);
        }
         
        //页面关闭或者跳转时,自动提示(当提供提交票时,自动提示)
        $(window).bind('beforeunload',function(){
            Notification.requestPermission(function (perm) {  
                if (perm == "granted") {
                    var notification = new Notification("【恭喜恭喜】", {
                        dir: "auto",
                        lang: "hi",
                        tag: "12306刷票提示",
                        icon: "https://kyfw.12306.cn/otn/resources/images/ots/favicon.ico",
                        body: "恭喜你,终于抢到票了!!!"
                    });
                }
            });
            $(window).unbind('beforeunload');
        });
          
        //注册回调方法  
        function callback(fun1,fun2){  
          fun1();  
          fun2();  
        }  
          
          
        //添加乘车人  
        function addBuyer(name){  
          callback($.showSelectBuyer,function(){  
            $("#buyer-list li[p_value^="+name+"]").click();  
            $.closeSelectBuyer();  
          });  
        }  
          
        //突破限制,添加车次  
        function addTrain(trainCode){
          $("#prior_train").append('<span name="prior_train-span" class="sel-box w80">'+trainCode+'<a class="close" href="javascript:" onclick="$.removeSel(this,\''+trainCode+'\',4)"></a></span>');
        }  
          
        //添加优先席别  
        function addSeat(seat){  
          callback($.showSelectSeat, function(){  
            $("#seat-list li[name^="+seat+"]").click();  
            $.closeSelectSeat();  
          });
        }
         
        //添加备选日期  
        function addDate(date){  
          callback($.showSelectDate, function(){  
            $("#date-list li[name^="+date+"]").click();  
            $.closeSelectDate();  
          });
        }
          
        //自定义查询区间
        function addTimes(startTime,endTime){  
            $("#cc_start_time").append('<option value="'+startTime.replace(":","")+endTime.replace(":","")+'">'+startTime+'--'+endTime+'</option>');  
            $("#cc_start_time option:last").selected();  
        }  
          
        //根据时间段、车次类型查询所有满足的车次。  
        function queryByTimeAndTrainType(){  
          callback($.showYxTrain, function(){  
            var yxTrainTimer = setInterval(function(){  
              if($("#filterTic").length>0){  
                $("#filterTic").prop("checked",true);  
                $("#yxtrain_close").click();   
                clearInterval(yxTrainTimer);  
              }  
            },10);  
          });  
        }
         
        //勾选某些类型的车
        function selectTrainType(types){
          $("#_ul_station_train_code input").each(function(i,e){
            $(e).prop("checked", false);
          });
          var typelist = types.split("/");
          for(var i=0;i<typelist.length;i++){
            $("input[value='"+typelist[i]+"']").prop("checked",true);
          }
        }
         
        //选择发站站点
        function selectFrom(station){
            $("#fromStationText").trigger('keydown');
            $("#fromStationText").val(station);
            $("#fromStationText").trigger('keyup');
            $("#panel_cities div").each(function(i,s){
                var t = $(s).find("span").first();
                if(t.text()==station){
                    $(s).trigger('mouseover').trigger('click');
                }
            });
        }
        //选择到站站点
        function selectTo(station){
            $("#toStationText").trigger('keydown');
            $("#toStationText").val(station);
            $("#toStationText").trigger('keyup');
            $("#panel_cities div").each(function(i,s){
                var t = $(s).find("span").first();
                if(t.text()==station){
                    $(s).trigger('mouseover').trigger('click');
                }
            });
        }
        //选择发站-到站站点
        function selectFromTo(s1,s2){
            selectFrom(s1);
            selectTo(s2);
        }
         
        //选择乘车时间
        function selectDate(date){
            $("#train_date").val(date);
        }

    自设置参数脚本,以以下信息为例

    购票人:张三、李四,
    乘车日期:2018-02-13
    车次类型:高铁、动车
    起止车站:北京西-石家庄
    车次(6个):D2001、G71、G601、G529、G485、G403、G653
    座次:二等座
    车次区间:07:00-08:10
    开启桌面通知:开启
    刷票频率:0.5秒

    脚本如下:

        //==========================================  
        //  以下则根据需求自行配置:  
        //      乘车人、车次、席别  
        //      仅显示要刷的车次、查询区间、刷新时间  
        //==========================================  
         
         
        //开启桌面通知
        showNotice();
         
        //选择北京西-石家庄的车
        selectFromTo("北京西","石家庄");
          
        //勾选车次类型:G-高铁/城际,D-动车,Z-直达,T-特快,K-快速,QT-其他
        selectTrainType("G/D");
         
        //选择乘车日期
        selectDate('2018-02-13');
         
         
        //选择乘车人  
        addBuyer("张三");  
        addBuyer("'李四'");
          
        //手动添加车次,按优先顺序添加(轻松突破5车次限制)  
        addTrain("D2001");
        addTrain("G71");  
        addTrain("G601");  
        addTrain("G529");  
        addTrain("G485");  
        addTrain("G403");  
        addTrain("G653");  
         
        //添加备选日期
        //addDate('2018-01-01');
          
        //添加优先席别,按优先顺序添加  
        addSeat("二等座");
         
        //自定义时间区间
        addTimes('07:00','08:10');
          
        //自动刷新时间0.5s
        autoSearchTime=500;
          
        //收起订票助手  
        $(".up").click();  
          
        //启动检测防挂
        var timer = setInterval(waitforRestart,autoSearchTime);
         
        //开启防退出功能
        preventLogout();
         
        //开始刷票  
        if($("#query_ticket").text()=="查询"){
          //仅查看勾选的车次
          $("#filterTic").prop("checked",true);
          var timer2 = setInterval(function(){
            if($("#auto_query").prop("checked") && $("#autoSubmit").prop("checked")&& ($("#filterTic").length==0 || $("#filterTic").prop("checked"))){
              console.log("----开始刷票-----at:"+new Date().toLocaleString());
              $("#query_ticket").click();
              if($("#filterTic").length>0){
                $("#filterTic").prop("checked",true);
              }
              clearInterval(timer2);
            }
          },10);
        }

    整理好自己的脚本后,将这2段js,贴到一起,然后打开这个页面,按步骤操作,即可。

    最后恭祝各位早日刷到回家的票~

    展开全文
  • python——刷票脚本

    万次阅读 多人点赞 2017-06-03 09:45:33
    前言现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行...原理刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程序代替人到网站去投票。具体一点说把,首先是客户端(我们)发出

    前言

    现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行网上拉票,甚至票数还会占一定比例的成绩。因此,刷票也就应运而生了。此次我们团队参加一个比赛,就需要网上投票决出前几名,作为一位技术人员,当然是得“解决”技术能解决的问题嘛,所以就写了个刷票插件来刷一刷。

    原理

    刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程序代替人到网站去投票。具体一点说把,首先是客户端(我们)发出请求(Request)给服务端(投票网站),跟他们说,我们需要看他们网站的信息,然后服务端就会回复(Respose)我们,我们再把填好的表单发给他们(Request),他们收到后就会回复我们(Respose)。

    主要内容

    • 分析网站
    • 表单提交
    • 构造代理IP池

    1. 分析网站

    由于每个网站需要提交的信息都不一样,那么首先我们需要对目标网站进行相对应的分析,找出他们的表单接口(也就是URL或者叫网址)以及我们需要提交的信息。

    1.1 收集信息

    首先我们登录目标网站

    目标网站

    使用F12,打开审核元素,点击Network,真实地进行一次表单提交

    框住的两个内容就是我们需要知道的一部分表单信息
    - Request URL:请求网址,我们提交的信息就是传到这个url里面去
    - Request method:请求方法,我们提交的方法

    表单信息1

    下面有两个框分别框住两个不同的信息区域,具体有什么用呢?下面就来详细解释一下这个
    - Request Headers:请求头,当我们访问网站的时候,我们都需要提交一个请求头过去,以证明我们不是爬虫,而是真实的访问,所以我们要把这个拿到,以便假装我们不是爬虫。
    - From Data:这就是我们要提交的数据了,现在提交的数据都是以json格式提交,按照这些信息写好我们需要提交的json数据就好

    表单信息2

    以上就是需要获得的基本信息,根据这些信息我们就可以编写刷票插件了,但作为一个对自身有高标准严要求的程序员来说,仅仅这样就足够吗?当然不会啦,我们得找一找这个提交过程有没有什么漏洞。

    怎么找?分析源代码,找了找,果真还让我找到了!
    表单漏洞

    看出什么没有,它这里有两个致命的漏洞:
    1. 它允许提交3支或3支以上的队伍,并且没有限制最大数量,只限制了最少数量。
    2. 它没有进行相同数据的筛选。

    意思就是说,我们可以一次提交几百上千个,甚至上万个==相同的==数据。但我会这么做吗?考虑到后果的话肯定不会,因为没有人可以在很短时间内投很多票,要是他们追查起来,那发现还不简单?毕竟我们是在模拟真实投票嘛,所以就投3票给自己好了,隐藏功与名。

    2. 表单提交

    好了,既然把收集到的数据都整理好了,那么就开始写代码进行表单提交了。

    2.1 运用到的库

    • requests:非常好用的第三方库,用于表单提交

    Requests库官方技术文档

    把它看一遍,所有操作就没问题了,下面就来写代码吧!

    2.2 构造表单信息

    拿着这个代码就能去投票啦,开不开心?

    # 请求头信息
    headers = {
        'Accept': '*/*',
        'Accept-Encoding': 'gzip',
        'Accept-Language': 'zh-CN',
        'Connection': 'keep-alive',
        'Content-Length': '16',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': 'www.dingnf.com',
        'Origin': 'http://www.dingnf.com',
        'Referer': 'http://www.dingnf.com/active/wxws_s',
        'User-Agent': 'Mozilla/4.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.3029.110 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }
    
    # post表单网址
    url = "http://www.dingnf.com/active/wxws_t"
    params = {'ids': ['22', '22', '22']}
    r = requests.post(url=url, data=params, headers=headers, proxies=proxies)

    突然发现问题来了,只能提交一次!这是为什么?

    3. 构造代理IP池

    大部分投票网站都会记录投票的IP地址,避免同一个IP多次投票,那怎么办?我们能模仿真实投票,还换不了IP地址?换IP地址是可以的,不过比较麻烦,我们有一种更加简便的方法:使用代理服务器去爬去某个网站的内容,那对方网站上显示的就不是我们真实的IP地址了,而是代理服务器的IP地址,在python中,使用代理服务器设置很简单。

    3.1 找到代理IP

    这里推荐西刺免费代理IP,西刺,值得你拥有

    代理IP

    使用API可以快速获得我们需要的IP地址,当然,我们也可以做个爬虫,去爬它网站上的URL,这里就不展开说了。
    网站API

    3.2 构造IP代理容器

    由于从API上获得的数据多出一些换行符和回车符,不利于直接提取IP地址,所以就先用正则表达式直接提取需要的信息,再写进列表里面,方便之后读取。

    def WriteIPadress():
        all_url = [] # 存储IP地址的容器
        # 代理IP的网址
        url = "http://api.xicidaili.com/free2016.txt"
        r = requests.get(url=url)
        all_url = re.findall("\d+\.\d+\.\d+\.\d+\:\d+",r.text)
        with open("D:\\code\\python\\new\\Brush ticket\\IP.txt",'w') as f:
            for i in all_url:
                f.write(i)
                f.write('\n')
        return all_url

    4. 主函数

    count = 0 # 计数器
    while count < 4000:
        all_url = WriteIPadress()
        for i in all_url:
            proxies = {"http": i}
            try:
                r = requests.post(url=url, data=params, headers=headers, proxies=proxies)
                if(r.json()['flag'] == True):
                    count += 1
                    print("成功投票%d次!" % (count))
                print(r.json())
            except Exception as reason:
                print("错误原因是:",reason)

    由于某些IP地址是存在问题的,所以需要设置异常处理,以便让程序能够正常运行,而API的数据每15分钟更新一次,我们每跑完一遍列表的时间也差不多,因此也就不做其他处理了。

    运行日志
    日志

    源代码

    完整源代码

    个人博客,最新更新的文章都发在这,欢迎关注:https://yeah-kun.github.io/

    展开全文
  • 我感兴趣的是,目前大多数投票活动实际上都是明显的漏洞,“刷票”可以通过简单的技术手段实现。第一步是弄清楚具体的投票过程和可能的限制。 经过研究,总结如下: 投票需要登录 注册帐户需要验证电子邮件地址 登录...
  • 刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程序代替人到网站去投票。具体一点说把,首先是客户端(我们)发出请求(Request)给服务端(投票网站),跟他们说,我们需要看他们...
  • linux ssh 登录脚本

    2015-04-28 06:41:09
    最近公司的积分商城被人刷票。...所以写了一个自动化登录的shell脚本。省去了很多麻烦。这个只是一个小功能,如果想做的更加智能化,可以在这个基础上优化 #!/usr/bin/expect set timeout 5 set user xxx set pass...
  • 前些天网上出了google内核的刷票脚本,因为一直用的google的浏览器,所以也是第一时间安装,并且实验了一把,感谢那些开发者们,果然不错,简单实用。而且代码初期的版本差不多400多行,更新文档写的很详细,很漂亮...
  • 刚好在朋友圈发现了一个音乐打榜网站,由于该网站不需要登录即可投票,这就给了脚本刷票可乘之机。 在浏览该网站的民歌榜单时,无意间发现了一位得票数为0的兵哥哥,点进去后觉得《崛起的中国》这歌唱的相当好听,...
  • 原标题:Python自动化刷投票脚本开发,微信投票再也不需要发红包了前言现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行网上拉...原理刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程...
  • Python自动化刷投票脚本开发程序分享 前言 现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行网上拉票,甚至票数还会...刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程...
  • 前言 现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行网上拉票,甚至...刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程序代替人到网站去投票。具体一点说把,首先是...
  • 那么我写了个脚本,让程序来自动刷票。实现机制: 1 浏览器设置为每次关闭清除cookie 2 使用python的webbrowser模块打开链接 3 模拟鼠标点击投票按钮 4 杀死浏览器进程## -*- coding: UTF-8 -*- import win32...
  • Python刷投票自动化【刷微信投票】脚本开发,源代码分析 前言 现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行网上拉票,甚至票数还会占一定...刷票的原理很简单,就是相当于模拟人登录网站去投票...
  • 刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程序代替人到网站去投票。具体一点说把,首先是客户端(我们)发出请求(Request)给服务端(投票网站),跟他们说,我们需要看他们...
  • 直到上周,一家做业务安全的公司给出我们现在Web网站的安全报告,我才意识到:验证码的本质属性安全性,除了防止恶意破解密码、刷票、羊毛党、论坛灌水、爬虫等行为外,还是用户与网站信息安全的有力保障。...
  • python自动刷新12306抢票

    万次阅读 多人点赞 2019-12-18 18:20:17
    ** 使用python自动刷新抢票 #!/usr/bin/env python ...然后手动识别验证码,并登陆,接下来的事情,交由脚本来做了,静静的等待抢票结果就好(刷票过程中,浏览器不可关闭) “”" import re from splinter.bro...
  • *- coding: utf-8 -*-"""通过splinter刷列车火车票可以自动填充账号密码,同时,在登录时,也可以修改账号密码然后手动识别验证码,并登陆,接下来的事情,交由脚本来做了,静静的等待抢票结果就好(刷票过程中,...
  • 12306抢票

    2018-06-15 15:19:46
    然后手动识别验证码,并登陆,接下来的事情,交由脚本来做了,静静的等待抢票结果就好(刷票过程中,浏览器不可关闭) """ import re from splinter.browser import Browser from time import sleep...
  • QTP版"12306订票助手

    2013-01-21 21:38:00
    12306把订票助手封杀了,闲来无事用QTP写了个简单的刷票脚本登录以及设置始发、终点 、日期部分未做;一是简单,二是没有做的必要!(因为订票时,可能随时修改始、终站及购票日期,由QTP来控制不合理) 目前...
  • python 订票系统

    2013-02-16 10:46:10
    #这只是一个半成品,只是实现了,一个完整的订票过程,对于,如果刷票,自己研究 #简单过程 # 第一、getRandAndCookie() 获得cook 和一个随机数用于登录 # 第二、getEnterRandCode() 得到登录时的识别码 # 第三、...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

脚本登录刷票