ADSL 撥號實現


上篇我們說到了如何實現登陸,但是騰訊對某一個IP在某一段時間的登陸行為存在檢測,對於存在異常的IP會出現驗證碼

但是騰訊的驗證碼比較難識別,或許是我對圖形識別(匹配)的技術還認識的不夠深刻

image

噪線,傾斜,字符連接,鏤空,噪線字符同色.這些都是識別的難點,具體的算法我試過,識別成功率很低,技術不夠沒辦法,好了偏題了,還是說ADSL撥號的實現

ADSL撥號需要調用windows api來實現

調用RASAPI32.DLL

image

ADSL的所有操作都要調用這個dll,詳細的調用方法和參數,大家可以查詢MSDN

不過對於我這種懶人,明白了原理,能使用拿來主義就拿哦

在codeplex上有個叫dotras的項目http://dotras.codeplex.com/這個項目封裝了rasapi dll的操作,大家可以下載下來使用,不用自己在封裝了,關於操作方法可以參見實例,下載過來后有示例的

 List<string> historyIps = new List<string>();
        private void ChangeIP()
        {
            SysConfig.IsChangeIp = true;
            QQHelper.WriteLog("更換IP");
        HANDUPCON:
            string oldIpAddress = "";
            RasConnection oldConn = null;
            GetIPAddress(out oldIpAddress, out oldConn);
            string entryName = "";
            if (oldConn != null)
            {
                entryName = oldConn.EntryName;
                RasIPInfo ipAddresses = (RasIPInfo)oldConn.GetProjectionInfo(RasProjectionType.IP);
                string oldIp = ipAddresses.IPAddress.ToString();
                ipAddresses = null;
                QQHelper.WriteLog("現在的IP是" + oldIp);
                bool isUp = false;
                try
                {
                    Console.WriteLine("開始掛斷");
                    oldConn.HangUp(10 * 1000);
 
                    Thread.Sleep(SysConfig.RasHangUpSleepTime);
                    if (RasConnection.GetActiveConnectionById(oldConn.EntryId) != null)
                    {
                        Console.WriteLine("結束掛斷失敗,重新掛斷");
                        goto HANDUPCON;
                    }
                    oldConn = null;
                    Console.WriteLine("結束掛斷");
 
                    isUp = true;
                }
                catch (Exception ex)
                {
                    QQHelper.WriteLog("寬帶連接掛斷失敗," + ex.Message);
                }
            }
        CHANGEIP:
            try
            {
                var dt = SqliteHelper.GetDataTable("select * from sys_config");
                RasDialer rs = new RasDialer();
                if (entryName == "")
                {
                    entryName = dt.Rows[0]["SC_NetEntryName"].ToString();
                }
                rs.EntryName = entryName;
                rs.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers);
                rs.Credentials = new NetworkCredential(dt.Rows[0]["SC_NetUser"].ToString(), dt.Rows[0]["SC_NetPwd"].ToString());
                dt.Dispose();
                rs.Dial();
                rs.Dispose();
 
            }
            catch (Exception ex)
            {
                QQHelper.WriteLog("寬帶連接撥號失敗," + ex.Message);
                Thread.Sleep(SysConfig.DialFaildSleepTime);
                goto CHANGEIP;
            }
            if (oldConn != null)
            {
                string ipAddresses = "";
                GetIPAddress(out ipAddresses, out oldConn);
                oldConn = null;
 
                if (oldIpAddress == ipAddresses)
                {
                    QQHelper.WriteLog("IP和上次重復,重新撥號");
                    Thread.Sleep(SysConfig.DialFaildSleepTime);
                    goto HANDUPCON;
                }
                else
                {
                    if (historyIps.Contains(ipAddresses))
                    {
                        QQHelper.WriteLog("IP和前" + SysConfig.IPLoopCount + "次重復,重新撥號");
                        Thread.Sleep(SysConfig.DialFaildSleepTime);
                        goto HANDUPCON;
                    }
                    if (historyIps.Count >= SysConfig.IPLoopCount)
                    {
                        historyIps.RemoveAt(0);
                        historyIps.Add(ipAddresses);
                    }
                    historyIps.Add(ipAddresses);
                }
 
                QQHelper.WriteLog("現在的IP是" + ipAddresses);
            }
            SysConfig.IsChangeIp = false;
        }

切換IP操作

  private void GetIPAddress(out string ipAddress, out RasConnection oldConn)
        {
            oldConn = null;
            ipAddress = "";
            var conns = RasConnection.GetActiveConnections();
            foreach (var conn in conns)
            {
                if (conn.Device.DeviceType.ToLower() == "pppoe")
                {
                    oldConn = conn;
                    break;
                }
            }
            conns = null;
            if (oldConn != null)
            {
                try
                {
                    RasIPInfo ipAddresses = (RasIPInfo)oldConn.GetProjectionInfo(RasProjectionType.IP);
                    ipAddress = ipAddresses.IPAddress.ToString();
                    ipAddresses = null;
                }
                catch { }
 
 
            }
        }

獲取連接信息

 

 

題外話:由於最近失業了,呵呵,說大了,是離職,有很多事情需要處理交接,關於QQ 群組廣告的源代碼,不是我不放出來,主要由於一些代碼涉及到公司版權,我不可能不做任何改變就放出來,有保密協議,我需要整理和修改一些代碼的實現,以避免這些沖突,望大家理解

QQ 討論組廣告群發工具(已開發完成)索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM