Zhihao's Studio.

绕开迅雷的利器:thunderPassby开发笔记

2018/06/01

thunder-Bypass for macOS 开发初衷

前天无意中看到了Thunder Real Url的限免信息,觉得这款软件有点意思,而且对于我这种非迅雷vip来说好像挺有用。不过点进去后发现是windows的客户端,于是我就萌生了做一个功能类似,但体验更好的macOS客户端。

软件开源/下载链接

开源地址

想下载直接使用的朋友请移步:
下载地址

软件用途

icon -> 软件用途

icon和迅雷icon对比

icon很有趣,是围绕着迅雷的图标展开的。迅雷的图标是一只鸟,thunder-Bypass旨在绕开(Bypass)*迅雷(thunder),因此,我用迅雷icon那只鸟飞出鸟笼的瞬间作为图标,*寓意着突破迅雷的禁锢

希望icon很好的诠释了软件的用途:

破解并获得以thunder:// 开头的迅雷下载地址背后的真实下载地址,自动复制到您的剪切板,您可以用非迅雷的第三方下载软件另行下载。 Get the real dwnload url from encrypted thunder url which starts with thunder://

为什么要突破迅雷的限制

你们也知道,迅雷非vip的下载速度越来越慢了,通过本软件获取真实的磁力链接,然后复制到良心的第三方下载软件,下载速度可以非常快。关于第三方下载软件的推荐,可以参考知乎上的帖子:除了迅雷,还有什么其他下载软件 ?

磁力链接是什么

【1】简单地说,磁力链接是一种特殊链接,但是它与传统基于文件的位置或名称的普通链接不一样,它只是通过不同文件内容的Hash结果生成一个纯文本的“数字指纹”,并用它来识别文件。它类似于生活消费品包装上常见的条码,不同的是这个“数字指纹”可以被任何人从任何文件上生成,这也就注定了“磁力链接”不需要任何“中心机构”的支持(例如:BT Tracker服务器),且识别准确度极高。因此任何人都可以生成一个Magnet链接并确保通过该链接下载的文件准确无误。更简单地说:类似【magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C】这样以“magnet:?”开头的字符串,就是一条“磁力链接”,其在网页上的图标像一块磁铁,很容易辨别。

软件使用方法

链接是百度里搜的,貌似有福利哟~

主界面很清爽,上面的textField是提供给用户输入需要破解的迅雷下载地址的。注意该url前后不要有空格、回车等特殊字符,否则可能造成无法解码。

点击中间的解锁按钮后,如果解码成功,下面的textField会显示解码后的磁力链接,并自动复制到您的剪切板,通知中心会发送通知。

当然,无论解码成功与否,通知中心均会有相应提示。

破解机制

破解机制是在网上找的,参考2,其实就是去掉thunder://后,用base64解密,解密后的url在前面加了AA,在最后加了ZZ。

核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@IBAction func decryptButtonClicked(_ sender: Any) {
let thunderURL = thunderURLFiled.stringValue
if thunderURL.hasPrefix("thunder://") {
let encryptedURL = thunderURL.substring(from: thunderURL.index(thunderURL.startIndex,offsetBy :10))
let decryptedURL0 = Base64FS.decodeString(str: encryptedURL)
if decryptedURL0.count > 0{
let decryptedURL1 = decryptedURL0.substring(from: decryptedURL0.index(decryptedURL0.startIndex,offsetBy :2))
let decryptedURL2 = decryptedURL1.substring(to: decryptedURL1.index(decryptedURL1.endIndex,offsetBy :-2))
decryptedURL.stringValue = decryptedURL2
// copy decrypted URL automaticly for users
let pasteboard = NSPasteboard.general
pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
pasteboard.setString(decryptedURL2, forType: NSPasteboard.PasteboardType.string)
let userNotification = NSUserNotification()
userNotification.title = "Message"
userNotification.subtitle = "恭喜成功破解迅雷下载地址"
userNotification.informativeText = "提示:地址已帮您复制到剪切板"
// 使用NSUserNotificationCenter发送NSUserNotification
let userNotificationCenter = NSUserNotificationCenter.default
userNotificationCenter.delegate = self
userNotificationCenter.scheduleNotification(userNotification)
}else{
let userNotification = NSUserNotification()
userNotification.title = "Message"
userNotification.subtitle = "解码失败"
userNotification.informativeText = "请输入正确的迅雷下载地址"
// 使用NSUserNotificationCenter发送NSUserNotification
let userNotificationCenter = NSUserNotificationCenter.default
userNotificationCenter.delegate = self
userNotificationCenter.scheduleNotification(userNotification)
thunderURLFiled.stringValue = ""
}
} else{
let alert = NSAlert()
alert.addButton(withTitle: "OK")
alert.messageText = "Alert"
alert.informativeText = "please input correct thunder download url which hasPrefix thunder://"
alert.alertStyle = .informational
alert.beginSheetModal(for: self.view.window!, completionHandler: nil)
thunderURLFiled.stringValue = ""
}
}

主要的坑点是有些链接是以thunder://开头的,但是并不能被正确的解码,并引起了程序的崩溃,必须对解码的过程加入错误判断。

后记

开发完成后,有网友留言说网上有很多在线的,这点我确认过了,确实有。如果提早知道有,我想我还是会做它。因为不管这事看起来有多么简单、无意义,你没有探索过,就无法体会到其中探索的乐趣。另外,这件事或许只是对于开发者来说相对简单,普通用户想理解base64就比较困难,更别说实现它了,他们更想要一个GUI的界面,给输入,得到想要的输出,实现的过程他们不想关心。

也有人留言说迅雷加密的方式有很多,这个我试了10多条下载链接,暂时没有发现不符合上面提到的加密方式的,欢迎网友提供反例帮我完善解密机制。

最后用蔡学镛老师的一段话结束本文,大家共勉:

建立一个自己的项目,很重要。它不属于公司或其他人,是你独自拥有的一种精神寄托。它有一部分研究性质,有一部分实验性质,如果还有应用潜力甚至商业潜力就更好了。这样项目的存在,会让你专注思考和动手,会激发你精益求精的态度。你不会在意别人是否理解你在干什么,因为你的自信爆棚。 ​​​ ——蔡学镛

参考

1.知乎:郭无心的回答
2.豆瓣
3.Github:Base64FS

本文总阅读量