博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADSL 拨号实现
阅读量:5287 次
发布时间:2019-06-14

本文共 3164 字,大约阅读时间需要 10 分钟。

上篇我们说到了如何实现登陆,但是腾讯对某一个IP在某一段时间的登陆行为存在检测,对于存在异常的IP会出现验证码

但是腾讯的验证码比较难识别,或许是我对图形识别(匹配)的技术还认识的不够深刻

噪线,倾斜,字符连接,镂空,噪线字符同色.这些都是识别的难点,具体的算法我试过,识别成功率很低,技术不够没办法,好了偏题了,还是说ADSL拨号的实现

ADSL拨号需要调用windows api来实现

调用RASAPI32.DLL

ADSL的所有操作都要调用这个dll,详细的调用方法和参数,大家可以查询MSDN

不过对于我这种懒人,明白了原理,能使用拿来主义就拿哦

在codeplex上有个叫dotras的项目这个项目封装了rasapi dll的操作,大家可以下载下来使用,不用自己在封装了,关于操作方法可以参见实例,下载过来后有示例的

List
historyIps = new List
();
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 群组广告的源代码,不是我不放出来,主要由于一些代码涉及到公司版权,我不可能不做任何改变就放出来,有保密协议,我需要整理和修改一些代码的实现,以避免这些冲突,望大家理解

转载于:https://www.cnblogs.com/Rolends/archive/2012/04/22/2465174.html

你可能感兴趣的文章
HDU-4614-Vases and Flowers(线段树)
查看>>
eclipse——代码折叠快捷
查看>>
移动互联网广告 - 第六更 - 移动广告的作弊方法及反作弊 - 2016/12/07
查看>>
虚拟DOM,真实的JS对象,操作内存中的js对象要比操作DOM节省性能?
查看>>
拓扑排序-hihocoder1175
查看>>
encodeURIComponent与URLDecoder.decode用法
查看>>
LinkedList 和 ArraryList的区别. <java>
查看>>
大数据学习大纲,大数据应该怎么学
查看>>
HTTP协议学习笔记
查看>>
sublime 打开命令窗口监控
查看>>
ubuntu16.04降级内核版本至3.13.0-85
查看>>
Junit中的异常测试
查看>>
九度OJ 1038:Sum of Factorials(阶乘的和) (DP、递归)
查看>>
DRF之分页器组件
查看>>
JS中this的用法
查看>>
高频交易算法研发心得--MACD指标算法及应用
查看>>
python读写文件
查看>>
使用Visual Studio 2013进行单元测试--初级篇
查看>>
花式索引
查看>>
用python正则提取字符串的方法
查看>>