这篇文章更新过后,我就准备回家过年了,你们好好的在整个春节慢慢研究。
我说过,技术的人总要有一些特例独行的思维产生,比如脑袋开始想起了一个技巧,爬虫。
爬啊爬啊,东西很多,有些地址我不好意思放出来,这个心里想想就好,但有人就是手痒,想把它Down下来当成犯罪证据。
下载工具Internet Download Manager(简称IDM)可以说是强大无比,当然你要拿BT种子,它是没辙就是了。
我们得做好公民应尽的职责,不要用BT去乱搞,人人影视网都被抓了,你还不老实,就因为BT太好用。
所以爬虫与IDM与春节的绵绵细雨更配哦。
爬虫我就不讲了高深的东西,去了解下,我们今天就来Down东西就行了。
下载很简单,迅雷,IDM算是比较主流能够开发对应接口调用的两个工具,但迅雷自从我会员过期后就没在考虑充值了。所以我理所当然的选择IDM作为我喜欢的下载工具。
添加批量任务了解下,虽然我们的实际跟它半毛关系都没有。
作为一名NET程序猿你这么Low,批量还得打开IDM来操作,我不想,你就在后台跑就行了,我告诉你要下载什么,你自己运行,自己下载,下载不了我就把你给卸载了。
想要作为资深影视专家或者艺术照专家你得先准备一些工具。
NET IDE VS03~VS2019随便选,反正我是用VS2017
艹还没开始就一堆七七八八,这么多就为了能让你向艺术之巅再出发,所以忍一下,忍一下就过去了。
首先你会遇到第一个难点,一串神秘代码,VB啊,天,怎么搞,我都快10年没碰了,但为了艺术,盘它。
Private Sub Command1_Click()
Dim idm1 As CIDMLinkTransmitter
Dim referer As String
Dim cookie As String
Dim postData As String
Dim user As String
Dim password As String
Set idm1 = CreateObject("IDMan.CIDMLinkTransmitter")
idm1.SendLinkToIDM "http://www.internetdownloadmanager.com/idman401.exe",
referrer, cookie, postData, user, password, "C:\", "idman401.exe", 0
End Sub
虽然我把VB语法都忘光了也难不倒我看懂它:CIDMLinkTransmitter 这个是定义的东西哪里来? Set 语法哪里来?CreateObject 又是哪里来?我再次从新问了三次这些东西哪里来的啊。
其实很简单,你谷歌翻墙就知道了。
CIDMLinkTransmitter 是一个接口,也就说你需要它,但它哪里来呢。
作为一名不合格的程序猿你一定要刨根问底找到原有,有个奇怪的字眼混在里面,IDManLib说的是个Lib文件,进去之后发现根本没有用,我们换个方式,不同的眼光能够了解不同的艺术的角度。
然后我就用 IDM结果还真有那么多东西出来
告诉我们你必须得(You should)初中英语应该学过,可能现在小学课本就有了
而且还是你Run 那个什么Type Library Importer 呱噪~
好吧跟着走就是了。三个文件
但语句中混入了奇怪的软件(TlbImp.exe),我得想办法,Everything 它总是来得这么及时,如果你搜索不到,那恭喜你,你不是一个合格的开发员,赶紧回家过年
跟谷歌那个写出来的步骤结果一模一样就像孪生兄弟,一点都不含糊。但问题是生成的文件哪去了,不知道啊
还是找到了,我真是天才
唐僧取经已经走到了低九九八十难了,引用,你肯定会把,引用它,它等下会给你找事情做的。
如此简单就完成了,剩下的就爬虫就好了,哈哈哈哈哈哈哈哈哈,大笑三声后就可以成为艺术家了。
//VB源码
//http://www.internetdownloadmanager.com/support/idm_api.html
//Dim idm1 As CIDMLinkTransmitter
//Dim referer As String
//Dim cookie As String
//Dim postData As String
//Dim user As String
//Dim password As String
//Set idm1 = CreateObject("IDMan.CIDMLinkTransmitter")
//idm1.SendLinkToIDM "http://www.internetdownloadmanager.com/idman401.exe",
//referrer, cookie, postData, user, password, "C:\", "idman401.exe", 0
//C#源码
public Type GetObject(string type,string libName)
{
if (type == "1")
{
System.Type oType = System.Type.GetTypeFromCLSID(new Guid(libName));
return oType;
}
else
{
System.Type oType = System.Type.GetTypeFromProgID(libName);
return oType;
}
}
public void Click(){
string referrer = "";
string cookie="";
string postData="";
string user="";
string password="";
Type getObj = GetObject("2", "IDMan.CIDMLinkTransmitter");
var o = Activator.CreateInstance(getObj);
object[] param = new object[9];
param[0] = txtDownLink.Text;
param[1] = referrer;
param[2] = cookie;
param[3] = postData;
param[4] = user;
param[5] = password;
param[6] = @"C:\";
param[7] = "另存名字.exe";
param[8] = 0;
getObj.InvokeMember("SendLinkToIDM",
System.Reflection.BindingFlags.InvokeMethod, null, o, param);
}
当然翻到这里你会发现篇幅似乎还没完啊。
1)Type getObj = GetObject("2", "IDMan.CIDMLinkTransmitter") 获取的 getObj 值为null?
2)var o = Activator.CreateInstance(getObj); 报错?
说好的别人代码都是这样转啊,为什么返回null。
原因可能如下,我呢是用的破解版的,注册表中根本没有 IDMan.CIDMLinkTransmitter 这玩意儿。你可以尝试重启电脑试试。
总之,我们通过COM进行调用,你得保证它是存在得,谁说都不算,只有它再注册表才算。如果没有,那么你就重启重新安装注册,重启电脑,就这么一直重复操作,五年后应该就会有了。
没错就这么简单即使我不说你也能花三天找到答案。
然后运行代码……
百分之五十的概率,这个东西你运行不起来。
我花了两个小时也没解决的问题。
提示:错误异常 COM 目标不会实现 IDispatch。
我也不知道为什么,总之两个小时候我就不再纠结这是问题了。
然后开始翻谷歌,这语句写的也没错啊。
错误提示:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS1752 无法嵌入互操作类型“CIDMLinkTransmitterClass”。请改用适用的接口。 IDMDownLoading C:\Users\temshow\source\repos\IDMDownLoading\IDMDownLoading\Form1.cs 73 活动的
然后各种巴赫猜想,最终定位再一句,互操作类型,然后试着改下,欸,还真可以了。
再次调用真的,真的就成功了。
但我就是纠结
getObj.InvokeMember("SendLinkToIDM", System.Reflection.BindingFlags.InvokeMethod, null, o, param);
为什么要给我报错,我做错了什么。
然后神奇的事情就来了
var o = Activator.CreateInstance(getObj);
=》
var o = (IDManLib.CIDMLinkTransmitter)Activator.CreateInstance(getObj);
o.SendLinkToIDM("http://www.internetdownloadmanager.com/idman401.exe", referrer, cookie, postData, user, password, @"C:\", "idman401.exe", 0);
成功了,竟然也成功了。
new IDManLib.CIDMLinkTransmitter().SendLinkToIDM("http://www.internetdownloadmanager.com/idman401.exe", referrer, cookie, postData, user, password, @"C:\", "idman401.exe", 0);
这个也成功了,也成功了!!你知道吗,它也成功了,我他妈的狗……拿耗子。
要知道怎么多调用方式我随便一个都行啊。
最终贴上完整代码,代码是编译不过去得,有问题,也说了解决的相关问题,你得自己看,否则怎么能见到真正得艺术呢。您说是吧!
using IDManLib;
using System;
using System.Windows.Forms;
namespace IDMDownLoading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDown_Click(object sender, EventArgs e)
{
//VB源码
//http://www.internetdownloadmanager.com/support/idm_api.html
//Dim idm1 As CIDMLinkTransmitter
//Dim referer As String
//Dim cookie As String
//Dim postData As String
//Dim user As String
//Dim password As String
//Set idm1 = CreateObject("IDMan.CIDMLinkTransmitter")
//idm1.SendLinkToIDM "http://www.internetdownloadmanager.com/idman401.exe",
//referrer, cookie, postData, user, password, "C:\", "idman401.exe", 0
string referrer = "";
string cookie="";
string postData="";
string user="";
string password="";
//正常方法1
Type getObj = GetObject("1", "AC746233-E9D3-49CD-862F-068F7B7CCCA4");
//正常方法2
//Type getObj = GetObject("2", "IDMan.CIDMLinkTransmitter");
var o = (IDManLib.CIDMLinkTransmitter)Activator.CreateInstance(getObj);
#region 报错代码
//错误异常 COM 目标不会实现 IDispatch。
object[] param = new object[9];
param[0] = txtDownLink.Text;
param[1] = referrer;
param[2] = cookie;
param[3] = postData;
param[4] = user;
param[5] = password;
param[6] = @"C:\";
param[7] = "另存名字.exe";
param[8] = 0;
getObj.InvokeMember("SendLinkToIDM", System.Reflection.BindingFlags.InvokeMethod, null, o, param);
#endregion
#region 正常调用1
o.SendLinkToIDM("http://www.internetdownloadmanager.com/idman401.exe", referrer, cookie, postData, user, password, @"C:\", "idman401.exe", 0);
#endregion
#region 正常调用2
new IDManLib.CIDMLinkTransmitter().SendLinkToIDM("http://www.internetdownloadmanager.com/idman401.exe", referrer, cookie, postData, user, password, @"C:\", "idman401.exe", 0);
#endregion
#region 正常调用3
new IDManLib.CIDMLinkTransmitterClass().SendLinkToIDM("http://www.internetdownloadmanager.com/idman401.exe", referrer, cookie, postData, user, password, @"C:\", "idman401.exe", 0);
#endregion
#region 正常调用4
new IDManLib.CIDMLinkTransmitterClass().SendLinkToIDM2("http://www.internetdownloadmanager.com/idman401.exe", referrer, cookie, postData, user, password, @"C:\", "idman401.exe", 0, null, null);
#endregion
}
public Type GetObject(string type,string libName)
{
if (type == "1")
{
System.Type oType = System.Type.GetTypeFromCLSID(new Guid(libName));
return oType;
}
else
{
System.Type oType = System.Type.GetTypeFromProgID(libName);
return oType;
}
}
}
}
当然调用完你会发现它会弹出下载框,而你解决掉它,你可以用 去掉第三方弹框的方式处理,当你处理不了的时候,
你就这样,设置下就行了
全套内容 (EveryThing没打包,VS2017也没打包)
度盘/s/1QAFPTwwFbzDYIB972VIVjA 密码 JEE8