Update ofdl dl.go

This commit is contained in:
User24kld 2025-05-21 14:23:41 +00:00
parent a8ee5e9648
commit 376dde3665
1 changed files with 225 additions and 77 deletions

View File

@ -1,77 +1,225 @@
package main private static async Task<string?> GetDRMMPDPSSH(string mpdUrl, string policy, string signature, string kvp)
{
try
{
HttpClient client = new HttpClient();
var request = new HttpRequestMessage
{
RequestUri = new Uri(mpdUrl),
Method = HttpMethod.Get,
};
request.Headers.Add("Accept", "application/dash+xml,video/vnd.mpeg.dash.mpd");
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
request.Headers.Add("Cookie", $"CloudFront-Policy={policy}; CloudFront-Signature={signature}; CloudFront-Key-Pair-Id={kvp}");
import ( var response = await client.SendAsync(request);
"fmt" response.EnsureSuccessStatusCode();
"os"
"strings"
)
func fileExists(path string) bool { string mpdContent = await response.Content.ReadAsStringAsync();
_, err := os.Stat(path) XDocument mpdDoc = XDocument.Parse(mpdContent);
return err == nil XNamespace ns = "urn:mpeg:dash:schema:mpd:2011";
var psshElement = mpdDoc.Descendants(ns + "PSSH").FirstOrDefault();
return psshElement?.Value;
}
catch (Exception ex)
{
Log.Error("Error getting PSSH: {0}", ex.Message);
return null;
}
} }
func main() { private static async Task<DateTime> GetDRMMPDLastModified(string mpdUrl, string policy, string signature, string kvp)
//needs changing to actual {
paidMessageValue := "https://cdn3.onlyfans.com/dash/files,..." try
paidMessageKey := "mediaId123" {
path := "/path/to/download" HttpClient client = new HttpClient();
task := "download-task" var request = new HttpRequestMessage
deviceFolder := "/path/to/device" {
deviceName := "default" RequestUri = new Uri(mpdUrl),
hasSelectedUsers := true Method = HttpMethod.Head,
};
request.Headers.Add("Accept", "application/dash+xml,video/vnd.mpeg.dash.mpd");
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
request.Headers.Add("Cookie", $"CloudFront-Policy={policy}; CloudFront-Signature={signature}; CloudFront-Key-Pair-Id={kvp}");
clientIdBlobMissing := !fileExists(fmt.Sprintf("%s/%s/device_client_id_blob", deviceFolder, deviceName)) var response = await client.SendAsync(request);
devicePrivateKeyMissing := !fileExists(fmt.Sprintf("%s/%s/device_private_key", deviceFolder, deviceName)) response.EnsureSuccessStatusCode();
if strings.Contains(paidMessageValue, "cdn3.onlyfans.com/dash/files") { return response.Content.Headers.LastModified?.DateTime ?? DateTime.Now;
parts := strings.Split(paidMessageValue, ",") }
if len(parts) < 6 { catch (Exception ex)
fmt.Println("Invalid media info string.") {
return Log.Error("Error getting MPD last modified date: {0}", ex.Message);
} return DateTime.Now;
}
mpdURL := parts[0] }
policy := parts[1]
signature := parts[2] private static Dictionary<string, string> GetDynamicHeaders(string url, string queryParams)
kvp := parts[3] {
mediaId := parts[4] var headers = new Dictionary<string, string>();
messageId := parts[5] try
{
pssh, err := GetDRMMPDPSSH(mpdURL, policy, signature, kvp) headers = auth.GetDynamicHeaders(url, queryParams);
if err != nil || pssh == "" { }
fmt.Println("Failed to get PSSH") catch (Exception ex)
return {
} Log.Error("Error getting dynamic headers: {0}", ex.Message);
}
lastModified, _ := GetDRMMPDLastModified(mpdURL, policy, signature, kvp) return headers;
}
drmHeaders := GetDynamicHeaders(fmt.Sprintf("/api2/v2/users/media/%s/drm/message/%s", mediaId, messageId), "?type=widevine")
private static async Task<string> GetDecryptionKeyOFDL(Dictionary<string, string> drmHeaders, string licenseUrl, string pssh)
var decryptionKey string {
if clientIdBlobMissing || devicePrivateKeyMissing { try
decryptionKey, err = GetDecryptionKeyOFDL(drmHeaders, fmt.Sprintf("https://onlyfans.com/api2/v2/users/media/%s/drm/message/%s?type=widevine", mediaId, messageId), pssh) {
} else { var client = new HttpClient();
decryptionKey, err = GetDecryptionKeyCDM(drmHeaders, fmt.Sprintf("https://onlyfans.com/api2/v2/users/media/%s/drm/message/%s?type=widevine", mediaId, messageId), pssh) var request = new HttpRequestMessage(HttpMethod.Post, "https://ofdl.tools/wv")
} {
Content = new FormUrlEncodedContent(new Dictionary<string, string>
if err != nil { {
fmt.Println("Failed to get decryption key:", err) { "license_url", licenseUrl },
return { "headers", JsonConvert.SerializeObject(drmHeaders) },
} { "pssh", pssh },
{ "build_identifier", "windows_software_widevinecdm_win_x86_64" },
err = DownloadPurchasedMessageDRMVideo(mpdURL, decryptionKey, path) { { "proxy", "" }
if err != nil { })
fmt.Println("Failed to download DRM video:", err) };
}
} else { var response = await client.SendAsync(request);
// Simulated. needs changing for our needs response.EnsureSuccessStatusCode();
mediaInfo := "media-metadata"
messageInfo := "message-metadata" var responseContent = await response.Content.ReadAsStringAsync();
var jsonResponse = JObject.Parse(responseContent);
err := DownloadPurchasedMedia(paidMessageValue, path, paidMessageKey, "Messages", task, "filenameFormat", messageInfo, mediaInfo, hasSelectedUsers) return jsonResponse["keys"][0]["key"].ToString();
if err != nil { }
fmt.Println("Failed to download regular media:", err) catch (Exception ex)
} {
} Log.Error("Error getting decryption key from OFDL: {0}", ex.Message);
throw;
}
}
private static async Task<string> GetDecryptionKeyCDM(Dictionary<string, string> drmHeaders, string licenseUrl, string pssh)
{
try
{
var client = new WidevineClient.Widevine.CDMClient();
return await client.GetContentKey(licenseUrl, drmHeaders, pssh);
}
catch (Exception ex)
{
Log.Error("Error getting decryption key from CDM: {0}", ex.Message);
throw;
}
}
private static async Task<bool> DownloadPurchasedMessageDRMVideo(
string policy,
string signature,
string kvp,
string url,
string decryptionKey,
string folder,
DateTime lastModified,
long media_id,
string api_type,
ProgressTask task,
string filenameFormat,
Purchased.List? messageInfo,
Medium? messageMedia,
User? fromUser,
Dictionary<string, int> users)
{
try
{
string filename = string.Empty;
string customFileName = string.Empty;
string path = string.Empty;
if (messageInfo != null && messageMedia != null && fromUser != null)
{
filename = await DownloadHelper.GenerateFilename(filenameFormat, "Messages", messageInfo, messageMedia, fromUser, users, api_type);
customFileName = filename.Split('.')[0];
path = Path.Combine(folder, filename);
}
else
{
filename = $"{media_id}.mp4";
path = Path.Combine(folder, filename);
}
if (File.Exists(path) && new FileInfo(path).Length > 0)
{
return false;
}
var downloader = new DownloadHelper.DRMVideoDownloader();
await downloader.DownloadDRMVideo(
url: url,
decryptionKey: decryptionKey,
folder: folder,
lastModified: lastModified,
policy: policy,
signature: signature,
kvp: kvp,
customFileName: customFileName,
task: task);
return true;
}
catch (Exception ex)
{
Log.Error("Error downloading DRM video: {0}", ex.Message);
return false;
}
}
private static async Task<bool> DownloadPurchasedMedia(
string url,
string folder,
long media_id,
string api_type,
ProgressTask task,
string filenameFormat,
Purchased.List? messageInfo,
Medium? messageMedia,
User? fromUser,
Dictionary<string, int> users)
{
try
{
string filename = string.Empty;
string path = string.Empty;
if (messageInfo != null && messageMedia != null && fromUser != null)
{
filename = await DownloadHelper.GenerateFilename(filenameFormat, "Messages", messageInfo, messageMedia, fromUser, users, api_type);
path = Path.Combine(folder, filename);
}
else
{
filename = $"{media_id}.mp4";
path = Path.Combine(folder, filename);
}
if (File.Exists(path) && new FileInfo(path).Length > 0)
{
return false;
}
var downloader = new DownloadHelper.MediaDownloader();
await downloader.DownloadMedia(
url: url,
folder: folder,
filename: filename,
task: task);
return true;
}
catch (Exception ex)
{
Log.Error("Error downloading media: {0}", ex.Message);
return false;
}
} }