MoviePilot破解记录
最近双十二,有的PT站开注了,注册了carpt和雨又捡起我的nas回来玩
之前只有HDVideo一个站的号,MoviePilot并不支持,所以之前也没有仔细研究MoviePilot。不过限制HDVideo在我编写这篇文档时就已经无法访问了,也不知道出现了什么情况。
捡回之前部署的MoviePilot,发现现在已经发布v2版本了,不过好在部署改动都不大。
相关连接
- MoviePilot 官方WIKI https://wiki.movie-pilot.org
- MoviePilot GitHub https://github.com/jxxghp/MoviePilot
- 核心源码 https://github.com/jxxghp/MoviePilot-Resources/
- 1.4版本资源 MoviePilot-Resources-main.zip
- 1.4版本站点数据 sites.json
部署
部署其实很简单,通过官方WIKI直接使用Docker部署就好了
但是重新部署的时候就发现,和上一次部署一样让我很迷糊的东西: AUTH_SITE
经过一番研究才知道,AUTH_SITE和PT站点有些许不同,MoviePilot似乎是和某些站点达成了某些协议,你必须要有这些站点的账号才能使用MoviePilot,美其名曰提高用户使用门槛。
没有通过这些站点的认证,你就无法使用MoviePilot搜索种子.
而且经过网络了解到,你拥有了账号还不一定能使用,不一定能认证通过,也不知道是什么原因。
这就让我很苦恼,我本来拿一个PT号就难,你MoviePilot还卡我。不行,这不能阻止我使用MoviePilot。
摸索 - 插件
部署好了之后,对系统能点的地方都点了一遍,发现系统有插件功能。心想,如果这个系统很多人用,那么可能会有一些大佬写了破解插件,翻阅插件列表后无果。
但是这是破解的一条思路。
插件列表中有一款插件叫做辅助认证插件,经过摸索,这款插件的认证是指登录MoviePilot的认证,并非MoviePilot功能授权认证。
摸索 - 源码
大致看了一下源码,发现是Python的项目,虽然对Python并不太熟,但是Python作为一款脚本语言,破解起来应该比较容易。
代码中作者将核心代码SitesHelper类抽离成另一个项目并使用CPython进行了编译,项目地址是https://github.com/jxxghp/MoviePilot-Resources/
SitesHelper类中有一个只读变量auth_level,只要判断该值大于等于2即表示认证通过。
SitesHelper类中还包含了支持的站点信息get_indexes,添加站点时会判断站点是否支持,站点信息中还会包含了每个站点的搜索方法和匹配方法,对种子进行搜索时会使用站点信息进行搜索和结果匹配。
所以只要修改了auth_level的值,就能认证通过。
auth_level是只读的,我们直接修改会导致报错。
但~是~,Python作为一款脚本语言,并没有真正的私有变量,私有变量会被加上下划线+类名前缀进行屏蔽使用。
于是尝试修改auth_level:
SitesHelper()._SitesHelper__auth_level = 2
结果失败告终,SitesHelper并没有_SitesHelper__auth_level这个属性,我向应该也没那么简单。作者既然想到了使用Cpython编译,应该也考虑到了auth_level可能会被修改这一点。
猜测他可能设置了一个getter,然后并没有设置setter
破解
翻阅代码后发现SitesHelper的内容比较简单,只要自己实现一个Sites就好了。
但是我们并没有站点信息数据,怎么办呢?
诶~故技重施,强制访问私有方法:
import json
from app.helper.rsites.sites import SitesHelper
if __name__ == '__main__':
with open("../../../bincker/blog/OperationRecord/MoviePilot/sites.json", "w") as f:
f.write(json.dumps(SitesHelper()._SitesHelper__indexers))
于是我们自己实现一个sites.py就好了:
import json
class SitesHelper:
auth_level = 2
auth_version = '1.5.5'
indexer_version = '1.4.0'
def __init__(self):
with open("sites.json", "r") as f:
self._indexers = json.load(f)
@staticmethod
def check_user():
return (True, 'bincker')
def get_indexers(self):
return list(self._indexers.values())
def get_indexer(self, domain):
return self._indexers.get(domain)
def get_authsites(self):
return self._indexers
OK 现在可以愉快的使用 MoviePilot 了