MoviePilot破解记录

最近双十二,有的PT站开注了,注册了carpt又捡起我的nas回来玩
之前只有HDVideo一个站的号,MoviePilot并不支持,所以之前也没有仔细研究MoviePilot。不过限制HDVideo在我编写这篇文档时就已经无法访问了,也不知道出现了什么情况。
捡回之前部署的MoviePilot,发现现在已经发布v2版本了,不过好在部署改动都不大。

相关连接

部署

部署其实很简单,通过官方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 了


0 | 1 | 0 | 2024-12-13 09:27:31 | 2024-12-13 09:27:31