上篇我們說到了如何實現登陸,但是騰訊對某一個IP在某一段時間的登陸行為存在檢測,對於存在異常的IP會出現驗證碼
但是騰訊的驗證碼比較難識別,或許是我對圖形識別(匹配)的技術還認識的不夠深刻
噪線,傾斜,字符連接,鏤空,噪線字符同色.這些都是識別的難點,具體的算法我試過,識別成功率很低,技術不夠沒辦法,好了偏題了,還是說ADSL撥號的實現
ADSL撥號需要調用windows api來實現
調用RASAPI32.DLL
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 群組廣告的源代碼,不是我不放出來,主要由於一些代碼涉及到公司版權,我不可能不做任何改變就放出來,有保密協議,我需要整理和修改一些代碼的實現,以避免這些沖突,望大家理解