一:认证服务器搭建
你需要将自建域名(如 sub.66.al,可以直接使用此域名,不需要再次搭建)解析到你的服务器,并在服务器上配置 Nginx 或 Caddy。由于 Emby 验证请求使用了特定的 API 路由,我们直接让 Web 服务器拦截 these 路由并返回固定合法的 JSON 会员状态。
方案 A:Caddy (v2) 配置
sub.66.al {
# 开启自动 HTTPS 证书申请与续签
tls [email protected]
# 1. 定义命名匹配器:统一拦截三个核心认证路由
@emby_auth_routes path /admin/service/registration/validateDevice /admin/service/registration/validate /admin/service/registration/getStatus
# 2. 统一处理跨域请求头(CORS)与响应内容类型
header @emby_auth_routes {
Access-Control-Allow-Origin "*"
Access-Control-Allow-Headers "*"
Access-Control-Allow-Methods "*"
Access-Control-Allow-Credentials "true"
Content-Type "application/json"
}
# 3. 使用顶层 respond 直接精简返回(无需在内部嵌套 header 块)
# 核心验证接口 1:设备状态验证
respond /admin/service/registration/validateDevice `{"cacheExpirationDays":3650,"isLicensed":true,"licenceStatus":"Licensed","message":"Device Valid","resultCode":"GOOD"}` 200
# 核心验证接口 2:高级特权、金徽章状态验证
respond /admin/service/registration/validate `{"featId":"","isLicensed":true,"licenceStatus":"Licensed","registered":true,"expDate":"2099-01-01","key":""}` 200
# 核心验证接口 3:查询整体订阅状态
respond /admin/service/registration/getStatus `{"deviceRecordCount":9999,"registeredUsersCount":9999,"isLicensed":true,"licenceStatus":"Licensed","isTrial":false,"deviceStatus":"","planType":"Lifetime","subscriptions":{}}` 200
# 4. 兜底默认响应
fallback {
respond `{"error":"Emby Auth Server Running"}` 404 {
header Content-Type "application/json"
}
}
}
方案 B:Nginx 配置
如果你更倾向于使用 Nginx,可以使用以下配置。同样在顶层配置了完善的跨域及数据类型响应头:
server {
listen 80;
server_name sub.66.al;
# 强制跳转 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name sub.66.al;
# SSL 证书路径(请替换为你的实际路径)
ssl_certificate /etc/nginx/certs/sub.66.al.crt;
ssl_certificate_key /etc/nginx/certs/sub.66.al.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 统一提取公共响应头配置
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Headers "*" always;
add_header Access-Control-Allow-Methods "*" always;
add_header Access-Control-Allow-Credentials "true" always;
default_type application/json;
# 核心验证接口 1:设备状态验证
location /admin/service/registration/validateDevice {
return 200 '{"cacheExpirationDays":3650,"isLicensed":true,"licenceStatus":"Licensed","message":"Device Valid","resultCode":"GOOD"}';
}
# 核心验证接口 2:高级特权、金徽章状态验证
location /admin/service/registration/validate {
return 200 '{"featId":"","isLicensed":true,"licenceStatus":"Licensed","registered":true,"expDate":"2099-01-01","key":""}';
}
# 核心验证接口 3:查询整体订阅状态
location /admin/service/registration/getStatus {
return 200 '{"deviceRecordCount":9999,"registeredUsersCount":9999,"isLicensed":true,"licenceStatus":"Licensed","isTrial":false,"deviceStatus":"","planType":"Lifetime","subscriptions":{}}';
}
# 其他默认请求返回 404
location / {
return 404 '{"error":"Emby Auth Server Running"}';
}
}
二:Android 客户端重打包
当认证服务器准备就绪后,我们需要对官方的 Android 或 Android TV 客户端进行修改,将其代码内请求的域名 mb3admin.com 替换为我们刚才搭建好的 sub.66.al。
准备工具环境
在执行以下命令前,请确保你的 Linux / 终端环境中安装了以下依赖工具:
wget:用于下载官方客户端。apktool:用于反编译和回编译 APK。openjdk(包含keytool):用于生成数字签名证书。zipalign&apksigner:Android SDK 自带工具,用于字节对齐和 APK 签名。
apt-get update
sudo apt install -y zipalign apksigner apktool
详细操作
请按顺序在终端中执行以下步骤:
# 1. 下载官方最新版 Emby Android 客户端,此处以arm64-v7a举例(32位)
wget https://github.com/MediaBrowser/Emby.Releases/raw/master/android/emby-android-google-arm64-v7a-release.apk
# 2. 查看下载的文件和当前目录状态
ls -al
# 3. 使用 apktool 反编译 APK(-r 参数表示不反编译资源文件,能大幅加快处理速度并减少报错)
apktool d -r emby-android-google-armeabi-v7a-release.apk
# 4. 进入反编译出来的源码目录
cd emby-android-google-armeabi-v7a-release/
# 5. 全局搜索并替换官方验证域名为你的自建域名
find . -type f -exec sed -i 's/mb3admin\.com/sub\.66\.al/g' {} +
# 6. 返回上一级目录
cd ..
# 7. 将修改后的源码文件夹回编译,输出为未对齐的临时包 tv.apk
apktool b emby-android-google-armeabi-v7a-release
# 8. (可选) 备份或复制一份生成的原始未对齐包
cp emby-android-google-armeabi-v7a-release/dist/emby-android-google-armeabi-v7a-release.apk tv.apk
# 9. 创建你专属的自签名证书(生成的 key.jks 有效期为 100 年,密码自定义,流水线示例默认为后面输入的签名密码),其他信息直接回车,最后no的一步填yes回车即可
keytool -genkey -v -keyalg RSA -keysize 2048 -validity 36500 -keystore key.jks -alias key
# 10. 使用 zipalign 工具对 APK 进行 4 字节对齐优化(这是 Android 发布的硬性要求,能大幅优化运行内存占用)
zipalign -v -p 4 tv.apk tv-aligned.apk
# 11. 使用 apksigner 进行 V2/V3 签名,输出最终的安装包 tv-final.apk
# 这里假设你在第 9 步设置的 keystore 密码为 123456
apksigner sign --ks key.jks --ks-pass pass:123456 --out tv-final.apk tv-aligned.apk
技术贴,绑定。
但是为啥不用柴柴
https://github.com/dh374374/ChaiChaiEmbyTV
@J1ang #1 柴柴的ui怎么样
@J1ang #1 手机版不能用了柴柴,按钮都按不了
@regbat #3 安卓端免费的有yamby
EMBY 验证会员居然没有加密
@Agonie0v0 #4 我是115直链emby自建服,官方客户端用视频自带特效字幕,直链可以播放,浏览器和三方的不行,需要服务器转码导致播放很卡,服务器cpu直接满载。为了解决这个问题,甚至搭建了jellyfin,也不行。最后是用官方安卓端解决的,后面有些视频没字幕,需要破解官方客户端,就自己搞了下
所以为什么不用DNS来实现?
@沃悳佱匼 #7 dns要绕证书认证啊
@czy #2 可以试试,感觉tv就他最完善
@regbat #8 我的意思是将通过DNS官方的验证域名解析指向你本地服务器响应json,这样不也可以吗?不过验证域名和更新域名是同一个,这样以后便不能更新了,官方的联网功能也都不能用了,但是这是部署在自己服务器的更新也没啥用,官方也没什么特别的服务