2022-10-03 12:39:49 +00:00
const tabIDs = { } ;
const textDecoder = new TextDecoder ( ) ;
function requestToClipboard ( tabId ) {
chrome . tabs . get ( tabId , ( details ) => {
const lic _headers = tabIDs [ details . id ] . license _request [ 0 ] ? . license _headers ;
const lic _url = tabIDs [ details . id ] . license _url ;
const lic _data _json = tabIDs [ details . id ] . license _data ;
const mpd _link = tabIDs [ details . id ] . mpd _url ;
if ( ! lic _headers )
return ;
// Fetching the user's ip for setting the header X-Forwarded-For.
// This might help to bypass regional restrictions when performing the license request in some cases.
const ip _retrieve _link = "https://ipinfo.io/ip" ;
var get _ip = new XMLHttpRequest ( ) ;
get _ip . open ( 'GET' , ip _retrieve _link , true ) ;
get _ip . onload = function ( ) {
var ip _resposnse = this . responseText ;
console . log ( ip _resposnse ) ;
var i = 0 ;
let curl _license _data = "curl " ;
curl _license _data += ` ' ${ lic _url } ' \\ ` ;
for ( ; i < lic _headers . length ; ++ i )
curl _license _data += ` \n -H ' ${ lic _headers [ i ] . name . toLowerCase ( ) } : ${ lic _headers [ i ] . value } ' \\ ` ;
curl _license _data += ` \n -H 'x-forwarded-for: ${ ip _resposnse } ' \\ ` ;
curl _license _data += "\n --data-raw " ;
if ( lic _data _json . includes ( "u0008" ) ) {
curl _license _data += ` ${ lic _data _json } \\ ` ;
} else {
curl _license _data += ` ' ${ lic _data _json } ' \\ ` ; /* It is not the same as above line. Note the additional ' symbol at the start and end! */
}
curl _license _data += "\n --compressed" ;
// Generating the curl license text link for https://t.me/drm_downloader_robot
const license _gen _link = "https://drm-bot.herokuapp.com/learnyst.php" ;
var data = new FormData ( ) ;
data . append ( 'playlist' , curl _license _data ) ;
data . append ( 'api' , 'api' ) ;
var gen _link = new XMLHttpRequest ( ) ;
gen _link . open ( 'POST' , license _gen _link , true ) ;
gen _link . onload = function ( ) {
var gen _link _resposnse = this . responseText ;
let json _resp = JSON . parse ( gen _link _resposnse ) ;
console . log ( json _resp ) ;
let generated _license _link = json _resp . data ;
const final = ` ${ mpd _link } * ${ generated _license _link } ` ;
console . log ( final ) ;
const copyText = document . createElement ( "textarea" ) ;
copyText . style . position = "absolute" ;
copyText . style . left = "-5454px" ;
copyText . style . top = "-5454px" ;
copyText . style . opacity = 0 ;
document . body . appendChild ( copyText ) ;
copyText . value = final ;
copyText . select ( ) ;
document . execCommand ( "copy" ) ;
document . body . removeChild ( copyText ) ;
chrome . browserAction . setBadgeBackgroundColor ( { color : "#FF0000" , tabId : details . id } ) ;
chrome . browserAction . setBadgeText ( { text : "📋" , tabId : details . id } ) ;
2022-10-03 12:48:04 +00:00
console . log ( "The mpd link and the generated link of widevine license curl data has been copied to your clipboard successfully!\n\nNow go to https://t.me/drm_downloader_robot and paste it and send it to the bot." ) ;
2022-10-03 12:39:49 +00:00
}
gen _link . send ( data ) ;
}
get _ip . send ( ) ;
} ) ;
}
function getLicenseRequestData ( details ) {
tabIDs [ details . tabId ] = tabIDs [ details . tabId ] || { } ;
if ( details . url . includes ( ".mpd" ) && details . url . includes ( "sdrm" ) ) {
console . log ( details . url ) ;
tabIDs [ details . tabId ] . mpd _url = details . url ;
} else if ( details . url . includes ( "sessions.bugsnag.com" ) ) {
chrome . tabs . executeScript ( details . tabId , { file : 'clear_storage.js' } ) ;
console . log ( "Cleared storage" ) ;
} else if ( details . requestBody && details . requestBody . raw && details . method == "POST" ) {
for ( var j = 0 ; j < details . requestBody . raw . length ; ++ j ) {
try {
const decodedString = textDecoder . decode ( details . requestBody . raw [ j ] . bytes ) ;
if ( decodedString . includes ( "rz8l9uBxppeZrFM0rhlLLck64hvUydSTNE0WcEpJzpef8gSLfyxTcxa3tgvjgdrhhtiJuGiYTijZRfTvHb3XW7BAZUDw" ) ) {
tabIDs [ details . tabId ] = { license _data : decodedString , license _request : [ ] , license _url : details . url , req _id : details . requestId , mpd _url : tabIDs [ details . tabId ] . mpd _url ? ? "" } ;
} else {
return ;
}
} catch ( e ) {
console . error ( e ) ;
}
}
}
}
chrome . webRequest . onBeforeRequest . addListener (
getLicenseRequestData ,
{ urls : [ "https://drmv4-ax.learnyst.com/drmlicense/widevine" , "https://streaming-cdn.learnyst.com/*" , "https://sessions.bugsnag.com/" ] , types : [ "xmlhttprequest" ] } ,
[ "requestBody" ]
) ;
function getLicenseRequestHeaders ( details ) {
if ( details . method == "POST" && tabIDs [ details . tabId ] && tabIDs [ details . tabId ] . license _url === details . url && tabIDs [ details . tabId ] . req _id === details . requestId ) {
console . log ( details . url ) ;
tabIDs [ details . tabId ] . license _request . push ( { license _headers : details . requestHeaders } ) ;
requestToClipboard ( details . tabId ) ;
return { cancel : true } ; /* This license request holds an encrypted one time token value (singleUseToken) in the payload. Even though editing it works, the easiest way is to block it before it is sent to the server and to capture them! */
}
}
chrome . webRequest . onBeforeSendHeaders . addListener (
getLicenseRequestHeaders ,
{ urls : [ "https://drmv4-ax.learnyst.com/drmlicense/widevine" ] , types : [ "xmlhttprequest" ] } ,
[ "requestHeaders" , "blocking" ]
) ;