HTML5 videonun indirilmesini engelle (sağ tıklama kaydedildi)?


171

İstemcilerin video indirmesini önlemek için tarayıcının sağ tıklama menüsünden "Videoyu Farklı Kaydet ..." seçeneğini nasıl devre dışı bırakabilirim?

İstemcinin bir dosya yoluna doğrudan erişmesini engelleyen daha eksiksiz çözümler var mı?


3
Bu soruya oy verdim, çünkü sadece bir HTML5 videosu için "sağ tıklamayı nasıl devre dışı bırakacağınızı" soruyor . Normal görüntüler için sağ tıklamayı devre dışı bırakmaya veya uygulanabilecek başka kaplama hileleri vb. Olup olmadığından emin değilim.

3
Sağ tıklamayı devre dışı bıraksanız bile, yine de tarayıcı menüsünden kaydedebilirler ( File→Save As). Bunu bir şekilde engelleyebilseniz bile , dosyanın URL'sini bulmak için kaynak görüntüleyebilirler . Bunu biraz gizleyebilseniz bile önbellekten sökebilirler. Bunu (örneğin akış) karmaşıklaştırabilseniz bile, ağ trafiğini bir dinleyici veya başka bir şeyle yakalayabilirler. Gerçek şu ki, bir kullanıcıya gönderirseniz, kaydedebilirler. Bunun hiçbir yolu yok. Sormanız gereken soru, onu neden bu kadar kötü bir şekilde durdurmanız gerektiğidir. Gerçekten bu kadar gerekli mi? Çabaya ve kullanıcı dostu olmaya değer mi?
Synetech

TxRegex hızlı bir temel çözüm olarak en iyi cevap gibi.
jsherk

Burada bilgiçlikle bakacağım, ancak "indirme" terimini aşırı yüklüyorsunuz. Elbette videonun indirilmesine izin vermek istiyorsunuz .
Johan Boulé

Yanıtlar:


226

Yapamazsın . Çünkü tarayıcılar bunu yapmak için tasarlandı: İçerik sunma . Ancak indirmeyi zorlaştırabilirsiniz .

İlk şey, ilk kez oluyor olabilir devre dışı contextmenuolayı , namı diğer "sağ tıklayarak". Bu, normal skiddie'nizin sağ tıklayıp Farklı Kaydet ile videonuzu açıkça kopyalamasını önler. Ancak daha sonra JS'yi devre dışı bırakıp bunun üstesinden gelebilir veya video kaynağını tarayıcının hata ayıklayıcısı aracılığıyla bulabilirler. Artı bu kötü UX. Bağlam menüsünde, Farklı Kaydet'ten çok daha fazla meşru şey vardır.

Özel video oynatıcı kitaplıklarını da kullanabilirsiniz. Çoğu, bağlam menüsünü beğeninize göre özelleştiren video oynatıcılar uygular. Böylece varsayılan tarayıcı bağlam menüsünü alamazsınız. Ve Farklı Kaydet'e benzer bir menü öğesi sunarlarsa, devre dışı bırakabilirsiniz. Ama yine de, bu bir JS geçici çözümdür. Zayıf yönler önceki seçeneğe benzer.

Bunu yapmanın başka bir yolu da videoyu HTTP Live Streaming kullanarak sunmaktır . Temel olarak yaptığı şey, videoyu parçalara ayırmak ve birbiri ardına sunmaktır. Çoğu akış sitesi videoyu böyle sunar. Farklı Kaydet'i yönetseniz bile, tüm videoyu değil, yalnızca bir yığını kaydedersiniz. Tüm parçaları toplamak ve bazı özel yazılımlar kullanarak birleştirmek biraz daha çaba gerektirir.

Başka bir teknik etmektir boya <video>üzerine<canvas> . Bu teknikte, biraz JavaScript ile, sayfada gördüğünüz, <canvas>gizli bir çerçeveden çerçeve oluşturma öğesidir <video>. Ve çünkü <canvas>, içerik menüsü bir <img>'değil, bir <video>' menü kullanır . Görüntüyü Farklı Kaydet yerine Farklı Kaydet Resmi alırsınız.

Ayrıca CSRF jetonlarını avantajınıza kullanabilirsiniz. Sunucu sayfanıza bir jeton göndermeniz gerekir. Ardından videonuzu almak için bu simgeyi kullanırsınız. Sunucunuz videoyu sunmadan önce geçerli bir belirteç olup olmadığını kontrol eder veya bir HTTP 401 alır . Fikir, bir videoyu yalnızca doğrudan video url'sini ziyaret etmek yerine sayfadan geldiğinizde alabileceğiniz bir jetonla elde edebilmenizdir.

Günün sonunda videomu YouTube veya Vimeo gibi üçüncü taraf bir video sitesine yükleyeceğim. İyi video yönetim araçlarına sahipler, cihaza oynatmayı optimize ediyorlar ve videolarının sonunda sıfır çaba ile kopyalanmasını önlemeye çalışıyorlar.


1
detay yanıtı için teşekkür ederim, en azından sağ tıklama menüsünden farklı kaydet seçeneğini devre dışı bırakmak mümkün mü? en temel bilgi vakalarını kapsayacaktır
python

2
tarayıcıya bağlıdır. i video tamamen yüklüyse, "kaydet" tuşuna bastığınızda sadece yeniden indirmek yerine önbellekten videoyu seçtikleri (video zaten önbellekte indirildiğini (neden zaten indirdiğini) gördüm (özellikle firefox ve krom) tekrar?), bu nedenle ikinci bir istek yoktur. yukarıdaki yöntem yalnızca bağlantı yeniden kullanıldığında geçerlidir.
Joseph

1
iyi, bir div ile video etiketi yer paylaşımı hakkında konuşan bir makale buldum. Cevabımı güncelledi
Joseph

2
Teşekkürler. Ben sadece craftymind.com/factory/html5video/CanvasVideo.html adresini okudum . Fikir neredeyse cevabınızla aynı.
Trung

1
@Cupidvogel "onetime use url", sunucu tarafından oluşturulan bir simgeyi kabul eden bir sunucu bitiş noktasıdır. Simge sayfa oluşturulduktan sonra oluşturulur ve db'ye kaydedilir. Aynı zamanda gibi sayfanın ile dağıtılmaktadır srcarasında <video>. Sayfanız yüklendiğinde, db belirteci, sayfada belirteci vardır. Yüklemeye <video>başladıktan sonra (bitiş noktasına erişir), sunucu belirtecin db'de olup olmadığını kontrol eder, siler ve dosyayı aktarır. Simge ikinci erişimin bir sonucu olarak orada değilse, dosyayı akışla göndermeyin.
Joseph

118

Bu, sağ tıklama "kaydet" seçeneğini html5 videolarından kaldırmak isteyenler için basit bir çözümdür

$(document).ready(function(){
   $('#videoElementID').bind('contextmenu',function() { return false; });
});

Bu mükemmel ! Sıradan insanların videoyu indirmesini önlemek harika bir iş çıkarıyor!
Etienne Noël

2
Ancak tarayıcıda JavaScript devre dışı bırakılmışsa bu yardımcı olmaz.
mvark

2
Teşekkürler, bu çözüm tüm ziyaretçilerimizin% 90'ı için yeterlidir.
Kai Noack

2
Bleh. Firebug'daki öğeyi inceleyin, srcözelliği görün ve başka bir sekmede açın veya wgetindirmek için kullanın !
SexyBeast

11
Bunun ana amacı videoyu indirmek için "normal" kullanıcıların kaçınmak olduğunu düşünüyorum. Bu, bu durumu çözmek için iyi bir çözümdür.
Unapedra

37

Basit cevap,

Yapamazsın

Videonuzu izliyorlarsa videonuz zaten var

Onları yavaşlatabilirsin ama durduramazsın.


Bu arada, bu cevap HTML5 videoları, flash videoları veya gelecekte hayal edebileceğiniz herhangi bir teknoloji için geçerlidir. Çok basit: nasıl çalışıyor.
Gustavo Rodrigues

Peki ya youtube ?, youtube'da video dosyasını kolayca keşfedemezsiniz. Yani, doğru, biz yapabiliriz, ama kolayca sunucumuzda basit bir mp4 barındırmak ve html5 oynatıcı kullanmak daha youtube veya benzer video barındırma mp4 kaynağı gizlemek için.
dlopezgonzalez

2
Bu her iki soruya da bir cevap değil.
Tzshand

1
İnsanlar tüm ekranlarını ve seslerini kaydedebilir ve tüm geçici çözümleri kandırabilirler, bu yüzden sadece yavaşlatılabilirler.
kintsukuroi

1
@IlanSchemoul İlginç.
Paylaştığınız

33

Evet, bunu üç adımda yapabilirsiniz:


  1. Korumak istediğiniz dosyaları, kodunuzun çalıştığı dizinin bir alt dizinine yerleştirin.

    www.foo.com/player.html
    www.foo.com/videos/video.mp4

  2. ".Htaccess" adlı alt dizine bir dosya kaydedin ve aşağıdaki satırları ekleyin.

    www.foo.com/videos/.htaccess

    #Contents of .htaccess
    
    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^http://foo.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.foo.com/.*$ [NC]
    RewriteRule .(mp4|mp3|avi)$ - [F]
    

Şimdi kaynak bağlantısı işe yaramaz , ancak dosyayı indirmeye çalışan herhangi bir kullanıcının doğrudan dosyaya sunulamayacağından emin olmamız gerekir.

  1. Daha eksiksiz bir çözüm için , şimdi videoyu bir flash oynatıcıyla (veya html tuvaliyle) sunun ve asla doğrudan videoya bağlanmayın. Yalnızca sağ tıklama menüsünü kaldırmak için HTML'nize ekleyin:

    <body oncontextmenu="return false;">


Sonuç:

www.foo.com/player.html doğru video oynatır , ancak www.foo.com/videos/video.mp4 adresini ziyaret ederseniz:

Hata Kodu 403: YASAK


Bu doğrudan indirme, cURL, hotlinking için çalışacak, siz adlandırın.

Bu, sorulan iki soruya tam bir cevaptır ve şu soruya bir cevap değildir: "Bir kullanıcının önceden indirmiş olduğu bir videoyu indirmesini durdurabilir miyim?"


1
Güzel cevap, bununla birlikte ne kadar bir `Eğer çıkarın gerektiği .htaccessiçerik
MAZux

2
Yine de, bir kişinin indirmesine izin verecek olan HTTP Yönlendireni'ni taklit edebilirsiniz. Ancak, bu çok akıllı bir çözümdür. Bunu dosyada bir defalık kodla kullandıysanız, gitmeye hazırsınız!
Shiroy

Hala IDM indirebilirsiniz!
PersianMan

@PersianMan Correct - İlk cevapları okumanızı tavsiye ederim
Tzshand

1
Javascript'i tarayıcıdan devre dışı bırakırsanız, bu hile çalışmaz, çünkü sağ tıklama etkinleştirilir. Bunu önlemek için, video öğesini jquery kullanarak dinamik olarak getirmeli ve yüklemelisiniz.
Anindya Sankar Dasgupta

23

Genellikle kullandığım en iyi yol çok basit, tüm sayfada bağlam menüsünü tamamen devre dışı bırakıyorum, saf html + javascript:

 <body oncontextmenu="return false;">

Bu kadar! Bunu yapıyorum çünkü kaynağı her zaman sağ tıklamayla görebilirsiniz.
"Ben doğrudan tarayıcı görünümü kaynağını kullanabilir" ve bu doğru ama biz olmasından başlatın: Tamam, demek CAN NOT indirmeyi durdurmak html5videoları.


Bence çözümün "normal" kullanıcıları rahatsız etmeyen, sağ tıklamayı devre dışı bırakan kullanıcıların bazı metinleri kopyalayıp yapıştırmalarını önleyeceği veya örneğin videonun başlığı gibi, ilgi duydukları bir kelimeyi arayacakları tüm kullanıcılar muhtemelen bunu yapacak, ancak bazıları için anoying olabilir
John Balvin Arias

14

Bir istemci tarafı geliştirici olarak blob URL'sini kullanmanızı öneririm, blob URL'si, ikili bir nesneye atıfta bulunan istemci tarafı bir URL'dir

<video id="id" width="320" height="240"  type='video/mp4' controls  > </video>

HTML'de videonuzu srcboş bırakın ve JS'de AJAX kullanarak video dosyasını getirin, yanıt türünün blob olduğundan emin olun

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'mov_bbb.mp4', true);
    xhr.responseType = 'blob'; //important
    xhr.onload = function(e) {
        if (this.status == 200) {
            console.log("loaded");
            var blob = this.response;
            var video = document.getElementById('id');
            video.oncanplaythrough = function() {
                console.log("Can play through video without stopping");
                URL.revokeObjectURL(this.src);
            };
            video.src = URL.createObjectURL(blob);
            video.load();
        }
    };
    xhr.send();
}

Not: Bu yöntem büyük dosya için önerilmez

DÜZENLE

  • Doğrudan indirmeyi önlemek için çapraz kaynak engelleme kullanın

  • video bir API ile yayınlanıyorsa 'GET' yerine farklı bir yöntem kullanın (PUT / POST)


3
YouTube Blob'u şimdi de kullanıyor :) sanırım :)?
C0nw0nk

1
Burada neler olup bittiğini ve bunun için sunucuyu nasıl kuracağınızı açıklayabilir misiniz?
Anthony

1
@nerdofcode Kullanıcılar videoyu yönlendirmeye çalıştıklarında bu nasıl davranır? Tüm video indirilene kadar beklemeleri gerekecek mi?
John Balvin Arias

1
@JohnBalvinArias! Bu% 100 test etmedim, ama sadece hızlı bir arabellek ihtiyacı olduğunu söyleyeceğim ... Bu konuda bana teklif etmeyin ...
NerdOfCode

1
Sayfayı incelersem Ağ sekmesinde video için yeni bir sekmede açabileceğim bir istek alırım.
Simone

10

PHP html5 video etiketini anahtarın rastgele bir dize ve değerin dosya adı olduğu bir oturumla birlikte gönderir.

ini_set('session.use_cookies',1);
session_start();
$ogv=uniqid(); 
$_SESSION[$ogv]='myVideo.ogv';
$webm=uniqid(); 
$_SESSION[$webm]='myVideo.webm';
echo '<video autoplay="autoplay">'
    .'<source src="video.php?video='.$ogv.' type="video/ogg">'
    .'<source src="video.php?video='.$webm.' type="video/webm">'
    .'</video>'; 

Şimdi PHP'den video göndermesi isteniyor. PHP dosya adını kurtarır; oturumu siler ve videoyu anında gönderir. Ayrıca, tüm 'önbellek yok' ve mime tipi üstbilgiler bulunmalıdır.

ini_set('session.use_cookies',1);
session_start();
$file='myhiddenvideos/'.$_SESSION[$_GET['video']];
$_SESSION=array();
$params = session_get_cookie_params();
setcookie(session_name(),'', time()-42000,$params["path"],$params["domain"],
                                         $params["secure"], $params["httponly"]);
if(!file_exists($file) or $file==='' or !is_readable($file)){
  header('HTTP/1.1 404 File not found',true);
  exit;
  }
readfile($file);
exit:

Şimdi kullanıcı URL'yi yeni bir sekmeye kopyalarsa veya bağlam menüsünü kullanırsa, şansı kalmaz.


Çözümü seviyorum- OP sorusunu çözüyor. Talihsiz bir şey, Chrome'daki kaynak kodunu kontrol ettiğinde ve bağlantıyı sağ tıkladığında. Kullanıcı aslında video dosyası olacak bir html dosyası indirecektir.
user1252280

5

En azından teknoloji meraklısı olmayan kişilerin videonuzu indirmek için sağ tıklama bağlam menüsünü kullanmasını durdurabilirsiniz. Oncontextmenu özniteliğini kullanarak herhangi bir öğe için bağlam menüsünü devre dışı bırakabilirsiniz.

oncontextmenu="return false;"

Bu, gövde öğesi (tüm sayfa) veya video etiketi içinde kullanan tek bir video için çalışır.

<video oncontextmenu="return false;" controls>...</video>

5

Sona eren URL'lerle AWS CloudFront'u kullandık. Video yüklenir, ancak kullanıcı sağ tıklayıp kaydettikten sonra başlangıçta aldıkları video URL'si sona erdiğinde. CloudFront Origin Access Identity için bir arama yapın.

Video URL'sinin oluşturulması için AWS CLI'de oluşturulabilecek bir anahtar çifti gerekir. FYI bu benim kodum değil ama harika çalışıyor!

$resource = 'http://cdn.yourwebsite.com/videos/yourvideourl.mp4';
$timeout = 4;

//This comes from key pair you generated for cloudfront
$keyPairId = "AKAJSDHFKASWERASDF";

$expires = time() + $timeout; //Time out in seconds
$json = '{"Statement":[{"Resource":"'.$resource.'","Condition" {"DateLessThan":{"AWS:EpochTime":'.$expires.'}}}]}';     

//Read Cloudfront Private Key Pair
$fp=fopen("/absolute/path/to/your/cloudfront_privatekey.pem","r"); 
$priv_key=fread($fp,8192); 
fclose($fp); 

//Create the private key
$key = openssl_get_privatekey($priv_key);
if(!$key)
{
    echo "<p>Failed to load private key!</p>";
    return;
}

//Sign the policy with the private key
if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
{
    echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
    return;
}

//Create url safe signed policy
$base64_signed_policy = base64_encode($signed_policy);
$signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);

//Construct the URL
$url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;

return '<div class="videowrapper" ><video autoplay controls style="width:100%!important;height:auto!important;"><source src="'.$url.'" type="video/mp4">Your browser does not support the video tag.</video></div>';

1
Çok önemsiz yorum. Ancak bugünlerde docs.aws.amazon.com/sdk-for-php/v3/developer-guide/… kullanmanızı öneririm .
Zmart

Simgenin süresi dolarsa, bu videoda da dolaşamayacakları anlamına mı gelir? Bu, video URL'siyle tekrar iletişim kuruyor gibi görünüyor.
Chud37

4

Bağlam menüsünü gizleyerek bunu bu kadar kolay yapamazdık, şöyle:

<video oncontextmenu="return false;"  controls>
  <source src="https://yoursite.com/yourvideo.mp4" >
</video>

3

+1 basit ve çapraz tarayıcı yolu: Ayrıca css z-endeksi ve opaklıkla videonun üzerine saydam resim koyabilirsiniz. Böylece kullanıcılar içerik menüsünde "videoyu kaydet" yerine "resmi farklı kaydet" i görürler.


2
neden pic yüklemek için zaman alacak bu yüzden sadece div etiketi koymak ve geri yeniden yükleme gibi krom büyük bir menü alacaksınız
Waqas Tahir

Emin değilim ama yine de video Dosya> SaveAs
Arun Kumar

3

The

<body oncontextmenu="return false;"> 

Artık çalışmıyor. Haziran 2018'den itibaren Chrome ve Opera'da, doğrudan indirmeye izin vermek için zaman çizelgesinde bir alt menü var, bu nedenle kullanıcının bu videoyu indirmek için sağ tıklaması gerekmiyor. İlginçtir ki Firefox ve Edge'de bu yok ...


2

Vimeo gibi bir servis kullanarak: Oturum açın Vimeo > Goto Video > Settings > Privacy > Mark as Securedve ayrıca gömme alan adlarını seçin. Yerleştirme alanları ayarlandıktan sonra, belirtilen alan adlarından bağlanmadıkça kimsenin videoyu gömmesine veya tarayıcıdan görüntülemesine izin vermez. Yani, sunucunuzda iframe içinde Vimeo oynatıcıyı yükleyen bir sayfanız varsa, bu, etrafta dolaşmayı oldukça zorlaştırır.


2

Her şeyden önce , bir videonun indirilmesini tamamen önlemek imkansızdır, yapabileceğiniz tek şey daha zor hale getirmek . Yani videonun kaynağını gizliyorsunuz.

Bir web tarayıcısı videoyu geçici olarak ara belleğe indirir, bu yüzden indirmeyi engelleyebiliyorsanız videonun da görüntülenmesini önlersiniz.

Ayrıca, dünyadaki toplam nüfusun <% 1'inin kaynak kodunu anlayabileceğini de bilmelisiniz. Bu, onu kaynakta da gizlememeniz gerektiği anlamına gelmez - yapmalısınız .

You should not devre dışı sağ tıklayın ve hatta daha az bir haber söz göstermesi gerekir "You cannot save this video for copyright reasons. Sorry about that.". Bu cevapta önerildiği gibi .

Bu kullanıcı için çok can sıkıcı ve kafa karıştırıcı olabilir . Onun dışında; onların tarayıcısında JavaScript devre dışı bırakırsanız onlar olacak sağ tıklayıp edebilmek ve de kaydedebilir.

İşte kullanabileceğiniz bir CSS hilesi:

video {
    pointer-events: none;
}

CSS tarayıcıda kapatılamaz, sağ tıklamayı devre dışı bırakmadan videonuzu korur. Ancak bir sorun controlsda etkinleştirilememesi, diğer bir deyişle ayarlanmaları gerektiğidir false. Kendi Oynat / Duraklat işlevinizi patlatacaksanız veya videoetikete ayrı düğmeler içeren bir API kullanacaksanız , bu uygun bir seçenektir.

controls Ayrıca bir indirme düğmesi var, bu yüzden kullanmak da iyi bir fikir değil.

İşte bir JSFiddle örneği.


JavaScript kullanarak sağ tıklamayı devre dışı bırakacaksanız, videonun kaynağını da JavaScript'te saklayın. Bu şekilde kullanıcı JavaScript'i devre dışı bırakırsa (sağ tıklamaya izin verirse) video yüklenmez (ayrıca video kaynağını biraz daha iyi gizler).

Gönderen TxRegex cevap :

<video oncontextmenu="return false;" controls>
    <source type="video/mp4" id="video">
</video>

Şimdi videoyu JavaScript ile ekleyin:

document.getElementById("video").src = "https://www.w3schools.com/html/mov_bbb.mp4";

Fonksiyonel JSFiddle


Sağ tıklamayı önlemenin başka bir yolu da embedetiketi kullanmaktır . Ancak bu, videonun çalıştırılması için kontroller sağlamaz, bu nedenle JavaScript'te patlamalıdırlar:

<embed src="https://www.w3schools.com/html/mov_bbb.mp4"></embed>

1
Src URL'sini JavaScript ile eklemek pek kullanışlı değildir. DOM incelendiğinde, komut dosyası ayarlandıktan sonra URL görünür.
Simone

@Simone katılıyorum, ancak doğrudan html kaynağında göstermekten daha iyidir, sağ tıklayan herkes onu hemen görebilir. URL'yi her zaman bölebilir veya şifreleyebilirsiniz. Ancak bunun ek bir işlem olduğunu unutmayın
Simon

"Tarayıcıda CSS kapatılamaz" - Teknik olarak, belirli CSS kurallarını devre dışı bırakmak için web tarayıcısı geliştirici araçlarındaki CSS'yi değiştirebilirsiniz, böylece daha teknoloji meraklısı bir kişi kaldırabilirpointer-events: none;
Phil Gibbins

2

% 100 koruyamazsınız ama daha da zorlaştırabilirsiniz. açıkladığım bu yöntemler, PluralSight ve BestDotNetTraining'deki koruma yöntemlerini incelerken bunlarla karşılaştım . Bununla birlikte, bu yöntemlerin hiçbiri istediğimi indirmemi engellemedi, ancak indiriciyi korumalarını geçmek için seçmekte zorlandım.

Bağlam menüsünü devre dışı bırakmak için bahsedilen diğer yöntemlere ek olarak. kullanıcı hala videoları indirmek için InternetDownload yöneticisi veya benzer bir yazılım gibi üçüncü taraf araçları kullanabilir. Burada açıkladığım koruma yöntemi bu üçüncü taraf yazılımlarını azaltmaktır.

bu yöntemlerin hepsinin şartı, birisinin videolarınızı indirdiğini belirlediğinizde kullanıcıyı engellemektir. bu şekilde yalnızca bir veya iki videoyu web sitenize erişmelerini yasaklamadan önce indirebilirler.

feragat

Birisi bu yöntemleri kötüye kullanırsa veya başkalarına veya örnek olarak bahsettiğim web sitelerine zarar vermek için kullanırsa hiçbir sorumluluk kabul etmeyeceğim. sadece entelektüel ürününüzü korumanıza yardımcı olacak bilgileri paylaşmak içindir.

süre sonu ile bağlantı oluşturmak

bunun için kullanıcı başına bir indirme bağlantısı oluşturmak gerekir. azure blob depolama veya amazon s3 ile kolayca ele alınabilir. video uzunluğu sona erme zaman damgasının iki katına sahip bir indirme bağlantısı oluşturabilirsiniz. o video bağlantısını ve istenen zamanı yakalamanız gerekir. bu bir sonraki yöntem için gereklidir. bu yöntemin yakalamak, kullanıcı oynat düğmesini tıkladığında indirme bağlantısını oluşturuyor olmanızdır.

oynatma düğmesi olayında sunucuya bir istek gönderecek ve bağlantıyı alıp kaynağı güncelleyeceksiniz.

video istek oranını azaltın

daha sonra kullanıcının ikinci video için ne kadar hızlı istekte bulunduğunu izlersiniz. kullanıcı bir indirme bağlantısı için çok hızlı istekte bulunursa, hemen engellersiniz. bu eşiği çok büyük koyamazsınız çünkü videolara sadece göz atan veya gözden geçiren kullanıcıları yanlışlıkla engelleyebilirsiniz.

HTTP Aralığını Etkinleştir

videonuzu oynatmak için videojs gibi bazı js kütüphanelerini kullanın , ayrıca başlığınızda bir AcceptRange döndürmeniz gerekir. Azure blob depolama, bunu kutudan çıkarır. bu şekilde tarayıcı video yığınını yığın tarafından indirmeye başlar. genellikle 32byte 32byte. videojs timeupdatedeğişikliğini dinlemeniz ve sunucunuzu videonun izlenme yüzdesi hakkında güncellemeniz gerekir. videonun izlenme yüzdesi videonun yayınlanma yüzdesinden fazla olamaz. video içeriği yüzde değişikliği almadan yayınlıyorsanız kullanıcıyı engelleyebilirsiniz. çünkü kesinlikle indiriyorlar.

bunu uygulamak zordur çünkü kullanıcı videoyu ileri veya geri atlayabilir, bu yüzden bunu uygularken bu konuda dikkatli olun.

BestDotnetTraining bu şekilde timeupdate

myPlayer.ready(function () {
    //var player = this;
    this.src({
        type: "video/mp4",
        src: videoURL
    });
    if (videoId) {
        myPlayer.play();
        this.on('timeupdate', function () {
            var currentPercent = parseInt(100 * myPlayer.currentTime() / myPlayer.duration());//calcualte as percentage
            if (currentPercent % 5 == 0) {
                //send percentage to server 
                SaveVideoDurationWatched(currentPercent, videoId);
            }
        });
    }

});

Her neyse, kullanıcı akış yoluyla bir dosyayı indiren bazı indirme yöntemini kullanarak bu sorunu çözebilir. neredeyse c # kutunun dışında yapmak ve nodejs için requestmodül kullanabilirsiniz . bir stopWatch başlatmanız, alınan bir paketi dinlemeniz ve alınan toplam baytı toplam boyuta göre karşılaştırmanız gerekir. bu şekilde bir yüzdeyi ve bu yüzdeyi elde etmek için harcanan zamanı hesaplayabilirsiniz. Thread.Sleep()videoyu normal şekilde izlerseniz beklemeniz gereken miktarı iş parçacığını geciktirmek için veya benzeri bir şey kullanın . ayrıca uykudan önce kullanıcı sunucuyu arayabilir ve alınan yüzdeyi güncelleyebilir. böylece sunucu kullanıcının gerçekten bir video izlediğini düşünür.

hesaplama böyle bir şey olacaktır, örneğin, şimdiye kadar yüzde 1 aldığınızı hesaplarsanız, indirme iş parçacığının uykuya dalması için beklemeniz gereken miktarı hesaplayabilirsiniz. bu şekilde bir videoyu gerçek uzunluğundan daha hızlı indiremezsiniz. bir video 24 dk ise. indirmek için 24 dakika sürer. (artı ilk yönteme koyduğumuz eşik değer)

original video length 24 minute
24 min *60000 = 1,440,000 miliseconds 
1,440,000 % 100 = 14,400 milisecond is needed to download one percent

tarayıcı aracısını kontrol et

bir web sayfasını sunarken ve video bağlantısını sunarken veya ilerleme güncelleme isteğini kabul ederken tarayıcı aracısına bakabilirsiniz. farklıysa kullanıcıyı yasaklayın.

bazı eski tarayıcıların bu bilgileri iletmediğini unutmayın. bu nedenle hem video isteğinde hem de web sayfası isteğinde tarayıcı aracısı olmadığında bunu yok saymalısınız. ancak bir istek varsa ve başka bir istek yoksa kullanıcıyı yasaklamalısınız.

bu sorunu çözmek için kullanıcı, tarayıcı aracı üstbilgisini, indirme bağlantısını yakalamak için kullandıkları başsız tarayıcıyla aynı şekilde manuel olarak ayarlayabilir.

referans başlığını kontrol et

yönlendiren, ana makine URL'nizden veya videoyu sunduğunuz sayfa URL'sinden başka bir şeyse, indirme bağlantısını başka bir sekmeye veya başka bir uygulamaya yerleştirdikleri için kullanıcıyı yasaklayabilirsiniz. bunu ilerleme güncelleme isteği için de yapabilirsiniz.

bunun için bir video eşlemesi ve o videoyu gösteren sayfa olması gerekir. URL'nin ne olması gerektiğini anlamak için bir kural veya desen oluşturabilirsiniz, bu sizin tasarımınıza bağlıdır.

kullanıcı bu sorunu çözmek için videoları indirirken yönlendirme başlığını manuel olarak indirme sayfası URL'sine eşit olarak ayarlayabilir.

İstek arasındaki süreyi hesapla

aralarındaki zaman aynı olacak kadar çok istek alırsanız, kullanıcıyı engellemelisiniz. video bağlantısı oluşturma isteği arasındaki sürenin ne kadar olduğunu yakalamak için bunu koymalısınız. bunlar aynıysa (artı / eksi bir eşik) ve birkaç kezden fazla olursa, kullanıcıyı yasaklayabilirsiniz. çünkü web sitenizi veya videolarınızı tarayacak bir bot varsa, genellikle istekleri arasında aynı uyku süresine sahip olurlar. yani her isteği alırsanız, örneğin her 1,3 (artı / dakika biraz sapma) dakikada bir. sonra bir alarm verirsiniz. Bunun için, istekler arasındaki sapmayı bilmek için bazı istatistik hesaplamaları kullanabilirsiniz.

bu sorunu çözmek için kullanıcı istekler arasına rastgele bir uyku süresi koyabilir.

basit kod

Yarısını yapan bir repo PluralSight-Downloader var. Bu repoyu neredeyse 5 yıl önce yarattım. çünkü sadece çalışma amacıyla ve kendi kişisel kullanımım için yazdım, repo şu ana kadar herhangi bir güncelleme almamış ve güncellenmeyecek ya da çalışmayı kolaylaştıramayacağım. bu sadece nasıl yapılabileceğinin bir örneğidir.



1

Kısa Yanıt: Bağlantıyı youtube gibi şifreleyin, youtube / google'a nasıl yaptıklarını nasıl sormaktan daha iyi bilmiyorum. (Tam olarak konuya girmek istemeniz durumunda.)

Bunun mümkün olduğunu herkese işaret etmek istiyorum çünkü youtube bunu yapıyor ve eğer başka bir web sitesi yapabilirse ve tarayıcıdan değil ya da microsoft edge ve internet explorer gibi birkaç tarayıcıda test ettim ve bu yüzden devre dışı bırakmanın bir yolu var ve insanların hala söylediklerini gördüm ... Bir cevap aramaya çalışıyorum çünkü youtube'dan daha fazla şey varsa, birisinin içine bakması için nasıl bir yol olduğunu ve bunu yapmanın tek yolu Şu anda yaptığım youtube komut dosyaları. Ayrıca özel bir bağlam menüsü olup olmadığını görmek için kontrol ettim ve bağlam menüsü denetim öğesinin üzerinde aktığı için değil ve bitti gibi ve baktım ve asla yeni bir sınıf ve ayrıca yaratmıyor javascript ile gerçekten teftiş elemanına erişmek imkansızdır. Bir youtube videosunu çift tıkladığında krom içerik menüsünü açtığını söyleyebilirsiniz. Ayrıca ... youtube bu işlevi eklemez. Ben araştırma yapıyorum ve youtube kaynağına bakıyorum, bu yüzden cevabı bulursam geri döneceğim ... eğer biri yapamayacağınızı söylüyorsa, onlar da Benim gibi araştırma yapmam. Youtube videolarını indirmenin tek yolu video indirmektir.

Tamam ... Araştırma yaptım ve araştırmam, javascript olmadığı sürece devre dışı bırakabileceğinizi gösteriyor ... devre dışı bırakabilmeniz için video bağlantılarını şifrelemeniz gerekiyor çünkü tarayıcı bulamazsa göstermez ve bir youtube video bağlantısı açtığımda bu "blob: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"Tırnaklar olmadan şifrelemek böylece böylece kaydedilemez ... bunun için php bilmeniz gerekir ama zorlaştırmak için seçtiğiniz cevap gibi, youtube onu ağır şifreleme zorlaştırır, ilerlemek php programcı ama eğer bunu bilmek zor yapmak için en iyi cevap olarak seçtiğiniz kişi almak daha bilmiyorsanız ... ama php ağır biliyorsanız video bağlantısını şifrelemek böylece sadece okumak mümkün seninkini ... nasıl yaptıklarını nasıl açıklayacağımı bilmiyorum ama yaptılar ve bir yolu var youtube videolarını şifreleme yolu oldukça akıllıdır bu yüzden nasıl youtube / google onlar bunu yapıyorlar ... Umarım zaten en iyi cevabı seçmiş olsan da bu sana yardımcı olur.Bu yüzden bağlantıyı şifrelemek kısa vadede en iyisidir.


0

Videonun websocket üzerinden akışının sağlanması, çerçevelerde akışta ve bunları bir tür tuval üzerine çizmede olduğu gibi uygun bir seçenektir.

JavaScript kullanarak web soketleri üzerinden video akışı

Bu, müşterinin videoyu almasını ve elbette "Videoyu farklı kaydet ..." ile sağ tıklama bağlam menüsü seçeneği (aşırı doldurma?!) İle sorununuzu çözmesini sağlayan başka bir koruma düzeyi sağlayacağını düşünüyorum.


0

İşte yaptım:

function noRightClick() {
      alert("You cannot save this video for copyright reasons. Sorry about that.");
}
    <body oncontextmenu="noRightClick();">
    <video>
    <source src="http://calumchilds.com/videos/big_buck_bunny.mp4" type="video/mp4">
    </video>
    </body>
Bu aynı zamanda resimler, metin ve hemen hemen her şey için de geçerlidir. Ancak yine de klavye kısayollarıyla "İnceleme" ve "Kaynağı görüntüle" aracına erişebilirsiniz. (Üstteki cevabın dediği gibi, tamamen durduramazsınız.) Ama onları durdurmak için engeller koymayı deneyebilirsiniz.


-1

@ Clayton-Graul aradığım şey vardı, ancak AngularJS kullanan bir site için CoffeeScript sürümüne ihtiyacım vardı. Buna ihtiyacınız olması durumunda, söz konusu AngularJS denetleyicisine koyduğunuz şey:

    # This is how to we do JQuery ready() dom stuff
    $ ->
        # let's hide those annoying download video options.
        # of course anyone who knows how can still download
        # the video, but hey... more power to 'em.
        $('#my-video').bind 'contextmenu', -> 
            false

"k dairesinde garip şeyler var" (bu doğru)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.