Board logo

主題: [其他] [原創][分享]分享一個更換PPPoE IP的程式,含 Perl 原始碼分享 [打印本頁]

發表人: charleshwu    時間: 2017-10-9 06:26 PM     主題: [原創][分享]分享一個更換PPPoE IP的程式,含 Perl 原始碼分享

有跟我一樣有在下載免空的朋友嗎?也許你會跟我一樣常常遇到頻寬限制,這時就會需要換一個 IP 了。

假如你也是跟我一樣用 PPPOE 連線,你可以寫一個批次檔來呼叫 rasphone 或 rasdial 來重新連線,但有時候你會拿到跟剛剛一樣的 IP,在斷線與連線之間插入一些約幾十秒的等待可以降低 IP 一樣的機率,但這樣會需要多花時間。

這裡分享一個自己寫的更換 IP 程式,它會檢查目前的 IP,然後呼叫更換 IP 的批次檔,然後再檢查一次IP,直到這個 IP 是新的,或是已經好一段時間沒用過。

純心得分享,所以附上所有原始碼,歡迎有需要的朋友自行取用。

****記得使用前要修改一下 DoRedial.bat 的內容以配合你的 PPPoE 設定

主程式 : Redial_NewIP_V0.1.pl ====

#!/usr/bin/perl
use strict;
use LWP;
use DB_File;

$|=1;

my $nTime_=time();
my $nOldEnough_=7200;

my %hDB_IP_Time;

my $stIP_Time='IP_Time.DB';
tie(%hDB_IP_Time, 'DB_File', $stIP_Time)
      or die "Can't tie $stIP_Time: $!";

use LWP::UserAgent;
my $oLWP_=LWP::UserAgent->new(agent => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");

sub HttpGetWithProxy{
        my ($oLWP,$stURL,$stProxy)=@_;
       
        #print Dumper([($oLWP,$stURL,$stProxy)]);
        #$oLWP->no_proxy();
        $oLWP->proxy('http',$stProxy?$stProxy:"");
        my $oResponse=$oLWP->get($stURL);
        return $oResponse->is_success?$oResponse->content:undef
}

sub CheckIPWithProxy{
        my ($oLWP,$stProxy)=@_;

        my $stURL_="http://checkip.dyndns.org/";
       
        my $stWebIPCheck=HttpGetWithProxy($oLWP,$stURL_,$stProxy);
        my ($stIPAddr)=$stWebIPCheck=~/^<html><head><title>Current IP Check<\/title><\/head><body>Current IP Address: ([0-9.]+)/;
        return $stIPAddr;
}


sub ChangeIP {
        my ($oLWP,$stIP)=@_;
        print "Old IP=>$stIP\n";
       
        my $iIpAge;
       
        $hDB_IP_Time{$stIP}=$nTime_;

        my $stCmdChgIP='cmd /c DoRedial.bat';
       
        my $stProxy='';
        my $nLoopCnt=0;
       
        while (1) {
               
                system($stCmdChgIP);
               
                $stIP=CheckIPWithProxy($oLWP,$stProxy);
               
                print "Now IP=>".$stIP."\n";
               
                if (!exists($hDB_IP_Time{$stIP})) {
                        print "New IP.\n";
                        last;
                }

                $iIpAge=$nTime_-$hDB_IP_Time{$stIP};
                print "IP Age=$iIpAge\n";
                if ($iIpAge>$nOldEnough_) {
                        last;
                }
                       
                if (++$nLoopCnt>10) {
                        print "Giveup\n";
                        last;
                }
                print "Redial #$nLoopCnt...\n";
        }       
        $hDB_IP_Time{$stIP}=$nTime_;
        print "Done\n";
}

print "Checking...\n";
my $stIp_=CheckIPWithProxy($oLWP_,'');
#print "IP=>".$stIp_."\n";
ChangeIP($oLWP_,$stIp_);
exit;

換 IP 的批次檔 DoRedial.bat ====
@Echo Off
rasdial.exe seednet /DISCONNECT
rasdial.exe seednet seednet seednet

附件: Redial_NewIP_V0.1.rar (2017-10-9 06:26 PM, 1 K) / 該附件被下載次數 9
http://twed2k.org/attachment.php?aid=48601




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0