HTML5 वीडियो को डाउनलोड होने से बचाएं (राइट-क्लिक सेव)?


171

मैं ग्राहकों को वीडियो डाउनलोड करने से रोकने के लिए ब्राउज़र के राइट-क्लिक मेनू से "सेव वीडियो अस ..." को कैसे निष्क्रिय कर सकता हूं?

क्या अधिक पूर्ण समाधान हैं जो क्लाइंट को सीधे फ़ाइल पथ तक पहुंचने से रोकते हैं?


3
मैंने इस प्रश्न को अप-वोट किया क्योंकि यह केवल HTML5 वीडियो के लिए "राइट-क्लिक को अक्षम कैसे करें" के लिए पूछता है । मुझे यकीन नहीं है कि अगर यह सामान्य छवियों के लिए राइट-क्लिक अक्षम करने के समान है या यदि कोई अन्य ओवरले ट्रिक्स आदि हैं, तो इसे लागू किया जा सकता है।

3
यदि आप राइट-क्लिक को अक्षम करते हैं, तब भी वे इसे ब्राउज़र मेनू ( File→Save As) से बचा सकते हैं । यहां तक ​​कि अगर आप किसी तरह से ब्लॉक कर सकते हैं, तो वे फ़ाइल के URL को देखने के लिए स्रोत देख सकते हैं। यहां तक ​​कि अगर आप इसे थोड़ा अस्पष्ट कर सकते हैं, तो वे इसे कैश से चीर सकते हैं। यहां तक ​​कि अगर आप इसे जटिल कर सकते हैं (उदाहरण के लिए, स्ट्रीम), तो वे स्निफर या कुछ के साथ नेटवर्क ट्रैफ़िक पर कब्जा कर सकते हैं। तथ्य यह है, यदि आप इसे किसी उपयोगकर्ता को भेजते हैं, तो वे इसे बचा सकते हैं। उसके आसपास कोई रास्ता नहीं। आपको जो प्रश्न पूछने की आवश्यकता है, आपको इसे इतनी बुरी तरह से रोकने की आवश्यकता क्यों है। क्या यह वास्तव में भी आवश्यक है? क्या यह प्रयास और उपयोगकर्ता-अमित्र-नेस के लायक है?
सिनिटेक

मुझे लगता है कि TxRegex एक त्वरित मूल समाधान के रूप में सबसे अच्छा जवाब देता है।
jsherk

मैं यहां पांडित्य देखने जा रहा हूं, लेकिन आप "डाउनलोड" शब्द को ओवरलोड कर रहे हैं। आप निश्चित रूप से वीडियो को डाउनलोड करने की अनुमति देना चाहते हैं
जोहान बोले

जवाबों:


226

आप नहीं कर सकते । ऐसा इसलिए है क्योंकि ब्राउज़र को ऐसा करने के लिए डिज़ाइन किया गया था: सामग्री परोसें । लेकिन आप इसे डाउनलोड करने के लिए कठिन बना सकते हैं

पहली बात सबसे पहले, आप घटना को निष्क्रिय कर सकते हैं , उर्फ ​​"राइट क्लिक"। यह आपके नियमित स्किडी को आपके वीडियो को राइट क्लिक करके और इस रूप में सेव करके ब्लीड करने से रोकेगा। लेकिन तब वे जेएस को अक्षम कर सकते हैं और इसके आसपास हो सकते हैं या ब्राउज़र के डिबगर के माध्यम से वीडियो स्रोत ढूंढ सकते हैं। इसके अलावा यह बुरा है UX। सिर्फ संदर्भ के रूप में संदर्भ मेनू में बहुत सारी वैध चीजें हैं।contextmenu

आप कस्टम वीडियो प्लेयर लाइब्रेरी का भी उपयोग कर सकते हैं। उनमें से ज्यादातर वीडियो खिलाड़ियों को लागू करते हैं जो संदर्भ मेनू को आपकी पसंद के अनुसार अनुकूलित करते हैं। इसलिए आपको डिफ़ॉल्ट ब्राउज़र संदर्भ मेनू नहीं मिलता है। और अगर कभी वे सेव अस के समान एक मेनू आइटम की सेवा करते हैं, तो आप इसे अक्षम कर सकते हैं। लेकिन फिर, यह एक जेएस समाधान है। कमजोरियां पिछले विकल्प के समान हैं।

इसका एक और तरीका है HTTP लाइव स्ट्रीमिंग का उपयोग करके वीडियो की सेवा करना । यह अनिवार्य रूप से वीडियो को विखंडू में काटता है और एक के बाद एक इसे परोसता है। यह है कि अधिकांश स्ट्रीमिंग साइटें वीडियो कैसे परोसती हैं। इसलिए भले ही आप Save As को प्रबंधित करते हों, आप केवल एक चंक को बचाते हैं, पूरे वीडियो को नहीं। यह सभी चांस को इकट्ठा करने और कुछ समर्पित सॉफ्टवेयर का उपयोग करके उन्हें सिलाई करने के लिए थोड़ा और प्रयास करेगा।

एक और तकनीक पर पेंट <video>करना है<canvas> । इस तकनीक में, जावास्क्रिप्ट के एक बिट के साथ, जो आप पृष्ठ पर देखते हैं वह एक <canvas>तत्व है जो एक छिपे हुए से फ्रेम प्रदान करता है <video>। और क्योंकि यह एक है <canvas>, संदर्भ मेनू एक <img>'s मेनू का उपयोग करेगा , न कि <video>' s '। आपको सेव वीडियो के बजाय सेव इमेज मिल जाएगी।

आप अपने लाभ के लिए CSRF टोकन का उपयोग भी कर सकते हैं । आपको पृष्ठ पर एक टोकन भेजना होगा। फिर आप अपने वीडियो लाने के लिए उस टोकन का उपयोग करें। आपका सर्वर यह देखने के लिए जाँच करता है कि क्या यह वीडियो परोसने से पहले एक वैध टोकन है या HTTP 401 प्राप्त करता है । विचार यह है कि आप कभी भी टोकन लेकर केवल एक वीडियो प्राप्त कर सकते हैं, जिसे आप केवल तभी प्राप्त कर सकते हैं जब आप पृष्ठ से आए हों, न कि सीधे वीडियो url पर जाकर।

दिन के अंत में, मैं अपने वीडियो को YouTube या Vimeo जैसी तृतीय-पक्ष वीडियो साइट पर अपलोड करूंगा। उनके पास अच्छे वीडियो प्रबंधन उपकरण हैं, डिवाइस पर प्लेबैक का अनुकूलन करते हैं, और वे आपके वीडियो को आपके अंत तक शून्य प्रयास से फटने से बचाने के प्रयास करते हैं।


1
विस्तार से उत्तर के लिए धन्यवाद, क्या यह संभव है कि राइट क्लिक मेनू से कम से कम विकल्प को अक्षम करें? यह सबसे बुनियादी ज्ञान के मामलों को कवर करेगा
अजगर

2
जो ब्राउज़र पर निर्भर करता है। मैंने कई बार (विशेष रूप से फ़ायरफ़ॉक्स और क्रोम) देखा है कि अगर वीडियो पूरी तरह से भरा हुआ है, जब आप "सेव" को हिट करते हैं, तो वे वीडियो को फिर से डाउनलोड करने के बजाय कैश से उठाते हैं (वीडियो पहले से ही कैश में डाउनलोड किया गया है, इसे डाउनलोड क्यों करें फिर से?), इस प्रकार कोई दूसरा अनुरोध नहीं है। उपरोक्त विधि केवल तभी लागू होती है जब लिंक का पुन: उपयोग किया जाता है।
जोसेफ

1
ठीक है, मैं एक लेख एक div के साथ वीडियो टैग overlaying के बारे में बात कर पाया। मेरे जवाब को अपडेट किया
जोसेफ

2
धन्यवाद। मैंने अभी craftymind.com/factory/html5video/CanvasVideo.html पढ़ा है । विचार आपके उत्तर के लगभग समान है।
तुंग

1
@Cupidvogel "onetime उपयोग url" एक सर्वर समापन बिंदु है जो टोकन से उत्पन्न सर्वर को स्वीकार करता है। टोकन पेज जनरेशन पर जेनरेट होता है, और db में सेव होता है। इसे पेज के साथ भी भेज दिया जाता srcहै <video>। जब तक आपका पेज लोड होता है, तब तक db का टोकन होता है, पेज का टोकन होता है। एक बार <video>लोड होना शुरू हो जाता है (एंडपॉइंट तक पहुंच जाता है), सर्वर चेक करता है कि टोकन डीबी में है, इसे डिलीट करता है और फाइल को स्ट्रीम करता है। यदि टोकन दूसरी पहुंच के परिणामस्वरूप नहीं है, तो फ़ाइल को स्ट्रीम न करें।
जोसेफ

118

यह उन लोगों के लिए एक सरल उपाय है, जो HTML5 वीडियो से केवल राइट-क्लिक "सेव" विकल्प को हटाना चाहते हैं

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

यह शानदार है ! यह आम लोगों को वीडियो डाउनलोड करने से रोकने से बढ़िया काम करता है!
एटिएन नोएल

2
हालांकि यह मदद नहीं करता है यदि जावास्क्रिप्ट ब्राउज़र में अक्षम है।
मेवार्क

2
धन्यवाद, यह समाधान हमारे सभी आगंतुकों के 90% के लिए पर्याप्त है।
काई नैक

2
Bleh। बस फायरबग में तत्व का निरीक्षण करें, srcविशेषता देखें , और wgetइसे दूसरे टैब में खोलें या इसे डाउनलोड करने के लिए उपयोग करें!
सेक्सीबीस्ट

11
मुझे लगता है कि इसका मुख्य उद्देश्य "सामान्य" उपयोगकर्ताओं को वीडियो डाउनलोड करने से बचना है। इस स्थिति को हल करने के लिए यह एक अच्छा उपाय है।
अनपेडरा

37

सरल उत्तर,

आप नहीं कर सकते

यदि वे आपका वीडियो देख रहे हैं, तो उनके पास पहले से ही है

आप उन्हें धीमा कर सकते हैं लेकिन उन्हें रोक नहीं सकते।


वैसे, यह उत्तर HTML5 वीडियो, फ्लैश वीडियो या किसी भी तकनीक के साथ लागू होता है जिसकी आप भविष्य में कल्पना कर सकते हैं। यह सरल है: यह है कि यह कैसे काम करता है।
गुस्तावो रॉड्रिग्ज

और youtube के बारे में क्या है ?, youtube पर आप वीडियो फ़ाइल को आसानी से बंद नहीं कर सकते। मेरा मतलब है कि ठीक है, आप सही हैं, हम कर सकते हैं, लेकिन आसानी से हमारे स्रोत में एक साधारण mp4 होस्ट करने की तुलना में youtube पर mp4 स्रोत या इसी तरह की वीडियो होस्टिंग को छिपाने के लिए और html5 खिलाड़ी का उपयोग करना है।
dlopezgonzalez

2
यह किसी भी प्रश्न का उत्तर नहीं है।
तज़शंद

1
लोग अपनी पूरी स्क्रीन और ऑडियो रिकॉर्ड कर सकते हैं और सभी वर्कअराउंड को बेवकूफ बना सकते हैं, यही कारण है कि उन्हें केवल धीमा किया जा सकता है।
कुत्सुकुरोई

1
@IlanSchemoul दिलचस्प। साझा करने के लिए धन्यवाद :)
स्टार 15

33

हां, आप इसे तीन चरणों में कर सकते हैं:


  1. उन फ़ाइलों को रखें जिन्हें आप उस निर्देशिका की उपनिर्देशिका में सुरक्षित रखना चाहते हैं जहाँ आपका कोड चल रहा है।

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

  2. ".Htaccess" नाम के उस उपनिर्देशिका में एक फ़ाइल सहेजें और नीचे दी गई लाइनें जोड़ें।

    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]

अब स्रोत लिंक बेकार है , लेकिन हमें अभी भी यह सुनिश्चित करने की आवश्यकता है कि फ़ाइल डाउनलोड करने का प्रयास करने वाले किसी भी उपयोगकर्ता को सीधे फ़ाइल की सेवा नहीं दी जा सकती है।

  1. के लिए एक और अधिक पूर्ण समाधान , अब एक फ्लैश प्लेयर (या html कैनवास) और कभी नहीं वीडियो सीधे के लिए लिंक के साथ वीडियो सेवा करते हैं। केवल राइट क्लिक मेनू को हटाने के लिए, अपने HTML में जोड़ें:

    <body oncontextmenu="return false;">


परिणाम:

www.foo.com/player.html वीडियो को सही ढंग से चलाएगा , लेकिन अगर आप www.foo.com/videos/video.mp4 पर जाएँ:

त्रुटि कोड 403: FORBIDDEN


यह डायरेक्ट डाउनलोड, cURL, हॉटलिंकिंग के लिए काम करेगा, आप इसे नाम दें।

यह पूछे गए दो प्रश्नों का पूर्ण उत्तर है और प्रश्न का उत्तर नहीं है: "क्या मैं किसी उपयोगकर्ता को पहले से डाउनलोड किए गए वीडियो को डाउनलोड करने से रोक सकता हूं।"


1
शानदार उत्तर, लेकिन आपके पास एक `है कि आपको इसे अपनी .htaccessसामग्री से हटा देना चाहिए
MAZux

2
आप अभी भी HTTP रेफ़र को नकली कर सकते हैं, जो किसी व्यक्ति को डाउनलोड करने की अनुमति देगा। हालाँकि, यह एक बहुत ही चतुर समाधान है। यदि आप इसे फ़ाइल पर एक बार कोड के साथ क्लब करते हैं, तो आप जाने के लिए अच्छे हैं!
शिरॉय

ऐसा लगता है अभी भी IDM इसे डाउनलोड कर सकते हैं!
फ़ारसीमान

@PersianMan सही - मैं आपको पहला उत्तर पढ़ने के लिए प्रोत्साहित करता हूं
Tzshand

1
यदि आप ब्राउज़र से जावास्क्रिप्ट को अक्षम करते हैं, तो यह ट्रिक काम नहीं करेगा, तब से राइट क्लिक सक्षम हो जाता है। उस से भी बचने के लिए, आपको वीडियो तत्व को गतिशील रूप से jquery का उपयोग करके लोड करना चाहिए।
अनिंद्य शंकर दासगुप्ता 16

23

सबसे अच्छा तरीका जो मैं आमतौर पर उपयोग करता हूं वह बहुत सरल है, मैं पूरे पृष्ठ में संदर्भ मेनू को पूरी तरह से अक्षम करता हूं, शुद्ध एचटीएमएल + जावास्क्रिप्ट:

 <body oncontextmenu="return false;">

बस! मैं ऐसा इसलिए करता हूं क्योंकि आप हमेशा राइट क्लिक करके स्रोत देख सकते हैं।
ठीक है, आप कहते हैं: "मैं सीधे ब्राउज़र दृश्य स्रोत का उपयोग कर सकता हूं" और यह सच है लेकिन हम इस तथ्य से शुरू करते हैं कि आप वीडियो डाउनलोड करना बंद नहीं कर सकतेhtml5


मुझे लगता है कि सॉल्यूसिन एक होना चाहिए जो "सामान्य" उपयोगकर्ताओं को परेशान नहीं करता है, राइट क्लिक अक्षम करें उपयोगकर्ताओं को कुछ पाठ कॉपी और पेस्ट करने, या वे किसी शब्द को खोजने में रोकेंगे, उदाहरण के लिए, वीडियो का शीर्षक संयुक्त राष्ट्र के लिए, निश्चित रूप से नहीं सभी उपयोगकर्ता संभवतः ऐसा करेंगे, लेकिन उनमें से कुछ के लिए यह आशंका भरा हो सकता है
जॉन बल्विन एरियस

14

क्लाइंट-साइड डेवलपर के रूप में, मैं बूँद URL का उपयोग करने की सलाह देता हूं, बूँद URL एक क्लाइंट-साइड URL है जो एक बाइनरी ऑब्जेक्ट को संदर्भित करता है

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

HTML में अपने वीडियो को srcखाली छोड़ दें , और JS में AJAX का उपयोग करके वीडियो फ़ाइल प्राप्त करें, सुनिश्चित करें कि प्रतिक्रिया प्रकार बूँद है

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();
}

नोट: यह विधि बड़ी फ़ाइल के लिए अनुशंसित नहीं है

संपादित करें

  • डायरेक्ट डाउनलोडिंग से बचने के लिए क्रॉस-ओरिजनल ब्लॉकिंग का इस्तेमाल करें

  • यदि वीडियो 'GET' के बजाय एक API Use अलग विधि (PUT / POST) द्वारा दिया गया है


3
YouTube ब्लॉब का उपयोग करता है अब मुझे भी लगता है :)?
C0nw0nk

1
क्या आप बता सकते हैं कि यहां क्या स्पष्ट रूप से चल रहा है और इसके लिए सर्वर कैसे सेट किया जाए?
एंथनी

1
@nerdofcode उपयोगकर्ता द्वारा वीडियो को अग्रेषित करने का प्रयास करने पर यह कैसे व्यवहार करता है? क्या उन्हें सभी वीडियो डाउनलोड होने तक इंतजार करना होगा?
जॉन बल्विन एरियस

1
@JohnBalvinArias! मैंने इस 100% का परीक्षण नहीं किया है, लेकिन मैं यह कहने जा रहा हूं कि इसे केवल एक त्वरित बफर की आवश्यकता है ... मुझे इस पर उद्धरण न दें ...
NerdOfCode

1
यदि मैं पृष्ठ का निरीक्षण करता हूं, तो नेटवर्क टैब में मुझे उस वीडियो के लिए अनुरोध मिलता है जिसे मैं एक नए टैब में खोल सकता हूं।
सिमोन

10

PHP एक सत्र के साथ html5 वीडियो टैग भेजता है जहां कुंजी एक यादृच्छिक स्ट्रिंग है और मान फ़ाइल नाम है।

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>'; 

अब PHP को वीडियो भेजने के लिए कहा जाता है। PHP फ़ाइल नाम को पुनर्प्राप्त करता है; सत्र को हटाता है और तुरंत वीडियो भेजता है। इसके अतिरिक्त सभी 'नो कैश' और माइम-टाइप हेडर मौजूद होने चाहिए।

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:

अब यदि उपयोगकर्ता एक नए टैब में url की प्रतिलिपि बनाता है या संदर्भ मेनू का उपयोग करता है, तो उसके पास कोई भाग्य नहीं होगा।


मुझे समाधान पसंद है- यह ओपीएस प्रश्न हल करता है। एक दुर्भाग्यपूर्ण बात यह है, जब क्रोम में स्रोत कोड की जाँच करता है और लिंक पर राइट-क्लिक करता है। उपयोगकर्ता एक HTML फ़ाइल डाउनलोड करेगा, जो वास्तव में वीडियो फ़ाइल होगी।
user1252280

5

आप कम से कम गैर-तकनीकी जानकार लोगों को अपने वीडियो डाउनलोड करने के लिए राइट-क्लिक संदर्भ मेनू का उपयोग करने से रोक सकते हैं। आप oncontextmenu विशेषता का उपयोग करके किसी भी तत्व के लिए संदर्भ मेनू को अक्षम कर सकते हैं।

oncontextmenu="return false;"

यह बॉडी एलिमेंट (पूरे पेज) के लिए काम करता है या वीडियो टैग के अंदर केवल एक वीडियो का उपयोग करता है।

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

5

हमने URL समाप्त करने के साथ AWS CloudFront का उपयोग कर समाप्त किया। वीडियो लोड हो जाएगा, लेकिन जब तक उपयोगकर्ता सही क्लिक करता है और तब तक Save As का चयन करता है, जब तक कि आरंभ में प्राप्त वीडियो url उन्हें समाप्त नहीं कर देता। CloudFront Origin Access Identity की खोज करें।

वीडियो url का निर्माण करने के लिए एक प्रमुख जोड़ी की आवश्यकता होती है जिसे AWS CLI में बनाया जा सकता है। FYI करें यह मेरा कोड नहीं है, लेकिन यह बहुत अच्छा काम करता है!

$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
अत्यधिक कमेंट किए गए। मैं आजकल docs.aws.amazon.com/sdk-for-php/v3/developer-guide/… का उपयोग करने की सलाह दूंगा
Zmart

यदि टोकन समाप्त हो जाता है, तो क्या इसका मतलब है कि वे वीडियो के आसपास भी नेविगेट नहीं कर सकते हैं? जैसा कि यह वीडियो URL से फिर से संपर्क करने के लिए लगता है।
चुड 37

4

हम संदर्भ मेनू को छिपाकर इसे इतना आसान नहीं बना सकते हैं:

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

3

+1 सरल और क्रॉस-ब्राउज़र तरीका: आप वीडियो को css z-index और अस्पष्टता के साथ पारदर्शी चित्र भी लगा सकते हैं। इसलिए उपयोगकर्ता संदर्भ मेनू में "वीडियो सहेजें" के बजाय "चित्र के रूप में सहेजें" देखेंगे।


2
क्यों तस्वीर को लोड करने में समय लगेगा इसलिए केवल डिव टैग लगाएं और उन्हें क्रोम का एक बड़ा मेनू मिलेगा जैसे कि बैक रील आदि
वकास ताहिर

मुझे यकीन नहीं है लेकिन फिर भी वीडियो को फ़ाइल> सेविंग्स
अरुण कुमार

3

The

<body oncontextmenu="return false;"> 

अब काम नहीं करता है। जून 2018 तक क्रोम और ओपेरा को सीधे डाउनलोड की अनुमति देने के लिए समय पर सबमेनू है, इसलिए उपयोगकर्ता को उस वीडियो को डाउनलोड करने के लिए राइट क्लिक करने की आवश्यकता नहीं है। दिलचस्प है फ़ायरफ़ॉक्स और एज यह नहीं है ...


2

Vimeo जैसी सेवा का उपयोग करना: साइन इन करें Vimeo > Goto Video > Settings > Privacy > Mark as Secured, और एम्बेड डोमेन भी चुनें। एक बार एम्बेड डोमेन सेट होने के बाद, यह किसी को वीडियो को एम्बेड करने या ब्राउज़र से प्रदर्शित करने की अनुमति नहीं देगा जब तक कि निर्दिष्ट डोमेन से कनेक्ट न हो। इसलिए, यदि आपके पास एक ऐसा पृष्ठ है जो आपके सर्वर पर सुरक्षित है जो कि वीरमो को आईफ्रेम में लोड करता है, तो यह चारों ओर प्राप्त करना काफी कठिन बना देता है।


2

सबसे पहले यह महसूस करें कि किसी वीडियो को डाउनलोड होने से पूरी तरह से रोकना असंभव है, आप बस इतना कर सकते हैं कि इसे और अधिक कठिन बना दिया जाए । यानी आप वीडियो के स्रोत को छिपाते हैं।

एक वेब ब्राउज़र अस्थायी रूप से वीडियो को बफर में डाउनलोड करता है, इसलिए यदि आप डाउनलोड को रोक सकते हैं तो आप वीडियो को देखने से भी रोकेंगे।

आपको यह भी पता होना चाहिए कि दुनिया की कुल आबादी का <1% स्रोत कोड को समझने में सक्षम होगा बल्कि इसे वैसे भी सुरक्षित बना सकता है। इसका मतलब यह नहीं है कि आपको इसे स्रोत में भी नहीं छिपाना चाहिए - आपको करना चाहिए

आपको राइट क्लिक को अक्षम नहीं करना चाहिए , और इससे भी कम आपको एक संदेश प्रदर्शित करना चाहिए "You cannot save this video for copyright reasons. Sorry about that."। जैसा कि इस उत्तर में दिया गया है ।

यह उपयोगकर्ता के लिए बहुत कष्टप्रद और भ्रमित करने वाला हो सकता है । इसके अलावा; यदि वे अपने ब्राउज़र पर जावास्क्रिप्ट को अक्षम करते हैं तो वे करेंगे राइट क्लिक करने में सक्षम हो सकता है और वैसे भी बचाने के।

यहाँ एक सीएसएस ट्रिक है जिसका आप उपयोग कर सकते हैं:

video {
    pointer-events: none;
}

CSS को ब्राउज़र में बंद नहीं किया जा सकता है, वास्तव में राइट क्लिक को अक्षम किए बिना आपके वीडियो की सुरक्षा करता है। हालाँकि एक समस्या यह है कि controlsया तो सक्षम नहीं किया जा सकता है, दूसरे शब्दों में उन्हें सेट किया जाना चाहिए false। यदि आप अपने स्वयं के प्ले / पॉज़ फ़ंक्शन को इनप्लांट करने जा रहे हैं या एपीआई का उपयोग कर रहे हैं जिसमें videoटैग से अलग बटन हैं तो यह एक संभव विकल्प है।

controls एक डाउनलोड बटन भी है इसलिए इसका उपयोग करना इतना अच्छा विचार नहीं है।

यहाँ एक JSFiddle उदाहरण है।


यदि आप जावास्क्रिप्ट का उपयोग करके राइट क्लिक को अक्षम करने जा रहे हैं, तो वीडियो के स्रोत को भी जावास्क्रिप्ट में संग्रहीत करें। इस तरह अगर उपयोगकर्ता जावास्क्रिप्ट को निष्क्रिय करता है (राइट क्लिक की अनुमति देता है) तो वीडियो लोड नहीं होगा (यह वीडियो स्रोत को थोड़ा बेहतर भी छिपाता है)।

से TxRegex जवाब :

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

अब जावास्क्रिप्ट के माध्यम से वीडियो जोड़ें:

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

फ़ंक्शनल जेएसफ़िल्ड


राइट क्लिक को रोकने का एक अन्य तरीका embedटैग का उपयोग करना शामिल है । हालांकि यह वीडियो को चलाने के लिए नियंत्रण प्रदान नहीं करता है, इसलिए उन्हें जावास्क्रिप्ट में अक्षम होने की आवश्यकता होगी:

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

1
जावास्क्रिप्ट के माध्यम से src URL जोड़ना ज्यादा उपयोगी नहीं है। DOM का निरीक्षण स्क्रिप्ट सेट करने के बाद सादे दृश्य में URL दिखाएगा।
सिमोन

@ साइमन मैं सहमत हूं, हालांकि यह सीधे HTML स्रोत में दिखाने से बेहतर है, जहां कोई भी उस पर राइट क्लिक करता है वह इसे तुरंत देख सकता है। आप हमेशा url को विभाजित या एन्क्रिप्ट कर सकते हैं। लेकिन याद रखें कि अतिरिक्त प्रसंस्करण है
शमौन

"CSS को ब्राउज़र में बंद नहीं किया जा सकता" - तकनीकी रूप से आप कुछ CSS नियमों को निष्क्रिय करने के लिए वेब ब्राउज़र डेवलपर टूल में CSS को संशोधित कर सकते हैं, इसलिए अधिक तकनीकी-प्रेमी व्यक्ति को हटा सकता हैpointer-events: none;
फिल गिबिन्स

2

ठीक है, आप इसे 100% संरक्षित नहीं कर सकते, लेकिन आप इसे कठिन बना सकते हैं। ये विधियां जो मैं समझा रहा हूं, मैंने उनका सामना प्लुरलसाइट और बेस्टडॉटनेटट्रेनिंग में सुरक्षा विधियों का अध्ययन करने के दौरान किया । फिर भी, इन विधियों में से किसी ने भी मुझे डाउनलोड करने से नहीं रोका, जो मैं चाहता हूं, लेकिन मुझे डाउनलोडर को उनकी सुरक्षा से गुजरने के लिए कठिन समय था।

संदर्भ मेनू को अक्षम करने के लिए अन्य उल्लिखित विधियों के अलावा। उपयोगकर्ता अभी भी वीडियो डाउनलोड करने के लिए इंटरनेट-डाऊनलोड मैनेजर या अन्य समान सॉफ्टवेयर जैसे थर्ड-पार्टी टूल्स का उपयोग करने में सक्षम है। जो सुरक्षा विधि मैं यहां बता रहा हूं, वह उन 3 पार्टी सॉफ्टवेयर को कम करने के लिए है।

इन सभी तरीकों की आवश्यकता एक उपयोगकर्ता को ब्लॉक करने के लिए है जब आप किसी को पहचानते हैं, जो आपके वीडियो डाउनलोड कर रहा है। इस तरह से वे केवल एक या दो वीडियो डाउनलोड करने में सक्षम हैं, इससे पहले कि आप उन्हें अपनी वेबसाइट तक पहुंचने से प्रतिबंधित कर दें।

अस्वीकरण

मैं किसी भी जिम्मेदारी को स्वीकार नहीं करूंगा यदि कोई इन तरीकों का दुरुपयोग करता है या इसका उपयोग दूसरों या उन वेबसाइटों को नुकसान पहुंचाने के लिए करता है जिन्हें मैंने एक उदाहरण के रूप में उल्लेख किया है। यह सिर्फ ज्ञान साझा करने के लिए है ताकि आप अपने बौद्धिक उत्पाद की रक्षा कर सकें।

एक समाप्ति के साथ लिंक उत्पन्न करें

इसके लिए आवश्यकता प्रति उपयोगकर्ता डाउनलोड लिंक बनाने की है। कि आसानी से azure बूँद भंडारण या अमेज़न s3 द्वारा नियंत्रित किया जा सकता है। आप वीडियो की लंबाई समाप्त होने वाले टाइमस्टैम्प के साथ दो बार डाउनलोड लिंक बना सकते हैं। फिर आपको उस वीडियो लिंक और अनुरोध किए गए समय को कैप्चर करना होगा। यह अगली विधि के लिए आवश्यक है। उपयोगकर्ता द्वारा प्ले बटन पर क्लिक करने पर इस विधि के लिए कैच आप डाउनलोड लिंक उत्पन्न कर रहे हैं।

प्ले बटन ईवेंट पर आप सर्वर को एक अनुरोध भेजेंगे और लिंक प्राप्त करेंगे और स्रोत को अपडेट करेंगे।

वीडियो अनुरोध दर को थ्रॉटल करें

फिर आप मॉनिटर करते हैं कि उपयोगकर्ता दूसरे वीडियो के लिए कितनी तेज़ी से अनुरोध करता है। यदि उपयोगकर्ता डाउनलोड लिंक के लिए बहुत तेज़ी से अनुरोध करता है, तो आप उन्हें तुरंत ब्लॉक कर देते हैं। आप इस सीमा को बहुत बड़ा नहीं रख सकते क्योंकि आप उपयोगकर्ताओं को गलती से ब्लॉक कर सकते हैं जो वीडियो के माध्यम से ब्राउज़ या स्किमिंग कर रहे हैं।

HTTP रेंज सक्षम करें

अपने वीडियो को चलाने के लिए वीडियोज जैसे कुछ js लाइब्रेरी का उपयोग करें, आपको अपने हेडर में एक AcceptRange भी लौटाना होगा। Azure बूँद भंडारण बॉक्स से बाहर का समर्थन करता है। इस तरह से ब्राउजर वीडियो चंक को डाउनलोड करना शुरू कर देता है। आमतौर पर, 32byte द्वारा 32byte। तब आपको timeupdateवीडियो को देखे जाने वाले प्रतिशत के बारे में वीडियो सर्वर को बदलने और अपडेट करने के लिए सुनने की जरूरत है। वीडियो को देखा जाने वाला प्रतिशत उस वीडियो के प्रतिशत से अधिक नहीं हो सकता है। और यदि आप किसी वीडियो सामग्री को बिना किसी प्रतिशत परिवर्तन प्राप्त कर रहे हैं, तो आप उपयोगकर्ता को ब्लॉक कर सकते हैं। क्योंकि यकीन है कि वे डाउनलोड कर रहे हैं।

इसे लागू करना मुश्किल है क्योंकि उपयोगकर्ता वीडियो को आगे या पीछे छोड़ सकता है इसलिए इस बारे में सचेत रहें जब आप इसे लागू कर रहे हों।

यह कैसे BestDotnetTraining संभाल रहा है 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);
            }
        });
    }

});

वैसे भी, उपयोगकर्ता कुछ डाउनलोड विधि का उपयोग करके इसके चारों ओर काम करने में सक्षम है जो स्ट्रीमिंग के माध्यम से एक फ़ाइल डाउनलोड करता है। लगभग c # इसे बॉक्स से बाहर करें और नोडज के लिए, आप requestमॉड्यूल का उपयोग कर सकते हैं । फिर आपको स्टॉपवॉच शुरू करने, प्राप्त पैकेज को सुनने और कुल आकार की तुलना में प्राप्त कुल बाइट की तुलना करने की आवश्यकता है। इस तरह आप प्रतिशत की गणना कर सकते हैं और उस प्रतिशत की राशि प्राप्त करने में लगने वाला समय। फिर Thread.Sleep()उस थ्रेड को विलंबित करने के लिए या ऐसी किसी चीज़ का उपयोग करें जिसे आपको सामान्य रूप से वीडियो देखने के लिए प्रतीक्षा करनी पड़े। नींद से पहले भी उपयोगकर्ता सर्वर को कॉल कर सकता है और प्राप्त प्रतिशत को अपडेट कर सकता है। इसलिए सर्वर को लगता है कि उपयोगकर्ता वास्तव में एक वीडियो देख रहा है।

गणना कुछ इस तरह होगी, उदाहरण के लिए, यदि आप गणना करते हैं कि आपने अब तक 1 प्रतिशत प्राप्त किया है, तो आप उस राशि की गणना कर सकते हैं जिसे आपको डाउनलोड थ्रेड सोने के लिए इंतजार करना चाहिए। इस तरह से आप किसी वीडियो को तेजी से डाउनलोड नहीं कर सकते हैं वह वास्तविक लंबाई है। अगर एक वीडियो 24 मिनट का है। इसे डाउनलोड करने में 24 मिनट का समय लगेगा। (प्लस हम पहले विधि में डालते हैं)

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

ब्राउज़र एजेंट की जाँच करें

जब आप एक वेबपृष्ठ की सेवा कर रहे हैं और वीडियो लिंक परोस रहे हैं या प्रगति अपडेट अनुरोध को स्वीकार कर रहे हैं तो आप ब्राउज़र एजेंट को देख सकते हैं। यदि यह अलग है तो उपयोगकर्ता को प्रतिबंधित करें।

बस ध्यान रखें कि कुछ पुराने ब्राउज़र इस जानकारी को पास नहीं करते हैं। इसलिए आपको वीडियो अनुरोध और वेबपेज अनुरोध दोनों में कोई ब्राउज़र एजेंट नहीं होने पर इसे अनदेखा करना चाहिए। लेकिन अगर एक अनुरोध में यह है और दूसरा नहीं है, तो आपको उपयोगकर्ता को प्रतिबंधित करना चाहिए।

इसके चारों ओर काम करने के लिए उपयोगकर्ता ब्राउज़र एजेंट हेडर को मैन्युअल रूप से हेडलेस ब्राउज़र के रूप में सेट कर सकता है जिसे वे डाउनलोड लिंक पर कब्जा करने के लिए उपयोग कर रहे हैं।

रेफ़र हैडर की जाँच करें

जब रेफ़र आपके होस्ट URL या पेज URL के अलावा कुछ और होता है जिसे आप वीडियो परोस रहे होते हैं, तो आप उपयोगकर्ता को प्रतिबंधित कर सकते हैं, क्योंकि वे डाउनलोड लिंक को दूसरे टैब या किसी अन्य एप्लिकेशन में डालते हैं। यहां तक ​​कि आप प्रगति अद्यतन अनुरोध के लिए भी ऐसा कर सकते हैं।

इसके लिए आवश्यकता वीडियो की मैपिंग और उस वीडियो को दिखाने वाले पेज की है। आप यह समझने के लिए कुछ कन्वेंशन या पैटर्न बना सकते हैं कि URL क्या होना चाहिए, यह आपके डिज़ाइन पर निर्भर है।

इसके चारों ओर काम करने के लिए उपयोगकर्ता वीडियो डाउनलोड करते समय रेफरर हेडर को डाउनलोड पेज URL के बराबर सेट कर सकता है।

अनुरोध के बीच के समय की गणना करें

यदि आपको इतने अनुरोध मिलते हैं कि उनके बीच का समय समान है, तो आपको उपयोगकर्ता को ब्लॉक करना चाहिए। वीडियो लिंक पीढ़ी के अनुरोध के बीच कितना समय है, इसे पकड़ने के लिए आपको इसे रखना चाहिए। यदि वे समान हैं (प्लस / माइनस थ्रेसहोल्ड) और यह कई बार से अधिक होता है, तो आप उपयोगकर्ता को प्रतिबंधित कर सकते हैं। क्योंकि यदि कोई बॉट है जो आपकी वेबसाइट या वीडियो को क्रॉल करने जा रहा है, तो आमतौर पर उनके अनुरोध के बीच सोने का समय एक ही होता है। इसलिए यदि आप प्रत्येक अनुरोध प्राप्त करते हैं, उदाहरण के लिए, हर 1.3 (प्लस / मिनट कुछ विचलन) मिनट। तो आप एक अलार्म बढ़ाएं। इसके लिए, आप अनुरोधों के बीच विचलन को जानने के लिए कुछ सांख्यिकीय गणना का उपयोग कर सकते हैं।

इसे हल करने के लिए, उपयोगकर्ता अनुरोधों के बीच एक यादृच्छिक नींद का समय रख सकता है।

नमूना कोड

मेरे पास एक रेपो PluralSight-Downloader है जो इसे आधा कर रहा है। मैंने यह रेपो लगभग 5 साल पहले बनाया था। क्योंकि मैंने इसे केवल अध्ययन के उद्देश्य और स्वयं के व्यक्तिगत उपयोग के लिए लिखा था, इसलिए अब तक रेपो को कोई अपडेट नहीं मिला है और मैं अपडेट नहीं कर रहा हूं या इसके साथ काम करना आसान नहीं है। यह सिर्फ एक उदाहरण है कि यह कैसे किया जा सकता है।


2

आप उपयोग कर सकते हैं

<video src="..." ... controlsList="nodownload">

https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/controlsList

यह वीडियो को सहेजने से नहीं रोकता है, लेकिन यह संदर्भ मेनू में डाउनलोड बटन और "इस रूप में सहेजें" विकल्प को हटा देता है।


1

संक्षिप्त जवाब: यूट्यूब की तरह लिंक को एन्क्रिप्ट करें, यह नहीं जानते कि यूट्यूब / गूगल से कैसे पूछें कि वे इसे कैसे करते हैं। (यदि आप सीधे बात में उतरना चाहते हैं तो।)

मैं किसी को भी इंगित करना चाहूंगा कि यह संभव है क्योंकि यूट्यूब ऐसा करता है और यदि वे ऐसा कर सकते हैं तो कोई अन्य वेबसाइट और यह ब्राउज़र से नहीं है, क्योंकि मैंने इसे एक दो ब्राउज़रों पर परीक्षण किया जैसे कि माइक्रोसॉफ्ट एज और इंटरनेट एक्सप्लोरर और इसलिए इसे अक्षम करने का एक तरीका है और देखा गया है कि लोग अभी भी इसे कहते हैं ... मैं एक उत्तर की तलाश में कोशिश करता हूं क्योंकि अगर यूट्यूब की तुलना में एक तरीका हो सकता है और यह देखने का एकमात्र तरीका है कि वे ऐसा कैसे करते हैं अगर कोई देख लेता है youtube की स्क्रिप्ट जो अब मैं कर रहा हूँ। मैंने यह देखने के लिए भी जाँच की कि क्या यह एक कस्टम संदर्भ मेनू है और यह इसलिए नहीं है क्योंकि संदर्भ मेनू निरीक्षण तत्व को प्रवाहित कर रहा है और मेरा मतलब है कि यह इसके ऊपर है और मैंने देखा और यह कभी भी एक नया वर्ग नहीं बनाता है और इसे वास्तव में जावास्क्रिप्ट के साथ निरीक्षण तत्व का उपयोग करना असंभव है, इसलिए यह नहीं हो सकता है। आप यह बता सकते हैं कि यह यूट्यूब वीडियो पर डबल-क्लिक कब करता है कि यह क्रोम के लिए संदर्भ मेनू को पॉप अप करता है। इसके अलावा ... youtube उस फ़ंक्शन को नहीं जोड़ेगा। मैं शोध कर रहा हूं और YouTube के स्रोत के माध्यम से देख रहा हूं, इसलिए मुझे जवाब मिलने पर वापस आ जाएगा ... अगर कोई कहता है कि आप की तुलना में नहीं कर सकते हैं, तो वे अच्छी तरह से नहीं कर सकते हैं ' मेरे जैसे शोध मत करो। यूट्यूब वीडियो डाउनलोड करने का एकमात्र तरीका एक वीडियो डाउनलोड है।

ठीक है ... मैंने शोध किया और मेरा शोध यह बताता है कि आप इसे निष्क्रिय कर सकते हैं इसके अलावा कोई जावास्क्रिप्ट नहीं है ... आपको इसे अक्षम करने में सक्षम होने के लिए वीडियो के लिंक को एन्क्रिप्ट करने में सक्षम होना चाहिए क्योंकि मुझे लगता है कि कोई भी यदि यह नहीं मिल रहा है तो ब्राउज़र इसे नहीं दिखाएगा और जब मैंने एक youtube वीडियो लिंक खोला तो यह "बूँद" के रूप में दिखाई दिया। https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"बिना उद्धरण के तो यह इसे एन्क्रिप्ट कर रहा है इसलिए इसे सहेजा नहीं जा सकता ... आपको इसके लिए php जानने की आवश्यकता है, लेकिन जैसा उत्तर आपने इसे कठिन बनाने के लिए चुना है, youtube इसे भारी एन्क्रिप्ट करने में सबसे कठिन बनाता है, आपको एक होने की आवश्यकता है एडवांस php प्रोग्रामर लेकिन अगर आप यह नहीं जानते कि जिस व्यक्ति को आपने लिया है, उसे डाउनलोड करने के लिए इसे कठिन बनाने के सबसे अच्छे उत्तर के रूप में लें ... लेकिन अगर आप जानते हैं कि php को वीडियो लिंक को भारी एन्क्रिप्ट करें तो यह केवल पढ़ने में सक्षम है तुम्हारा ... मुझे नहीं पता कि वे कैसे समझाते हैं कि वे इसे कैसे करते हैं, लेकिन उन्होंने किया और एक तरीका है। जिस तरह से YouTube वीडियो को एन्क्रिप्ट करता है वह काफी स्मार्ट है, इसलिए यदि आप जानना चाहते हैं कि कैसे केवल youtube / google से पूछें वे ऐसा करते हैं ... आशा है कि यह आपके लिए मदद करता है, हालांकि आपने पहले से ही सबसे अच्छा उत्तर चुना है। इसलिए लिंक को एन्क्रिप्ट करना कम शब्दों में सबसे अच्छा है।


0

ऐसा लगता है कि वेबस्कैट के माध्यम से वीडियो को स्ट्रीम करना एक व्यवहार्य विकल्प है, जैसे कि फ्रेम को स्ट्रीम करना और उन्हें कैनवास की तरह की चीज़ पर आकर्षित करना।

जावास्क्रिप्ट का उपयोग करके वेबसोकेट पर वीडियो स्ट्रीमिंग

मुझे लगता है कि ग्राहक को वीडियो हासिल करने के लिए एक और स्तर की सुरक्षा प्रदान करना मुश्किल होगा और निश्चित रूप से "सहेजें वीडियो के रूप में ..." पर राइट-क्लिक करें संदर्भ मेनू विकल्प (ओवरकिल!) के साथ अपनी समस्या को हल करें।


0

यहाँ मैंने क्या किया है:

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>
यह भी छवियों, पाठ और बहुत कुछ के लिए काम करता है। हालाँकि, आप अभी भी कीबोर्ड शॉर्टकट के माध्यम से "निरीक्षण" और "स्रोत देखें" टूल का उपयोग कर सकते हैं। (जैसा कि शीर्ष पर उत्तर कहता है, आप इसे पूरी तरह से रोक नहीं सकते।) लेकिन आप उन्हें रोकने के लिए बाधाओं को डालने का प्रयास कर सकते हैं।


-1

@ क्लेटन-ग्राल के पास मैं क्या देख रहा था, सिवाय इसके कि मुझे AngularJS का उपयोग करने वाली साइट के लिए CoffeeScript संस्करण की आवश्यकता थी। बस अगर आपको इसकी आवश्यकता है, तो यहां पर आपने प्रश्न में AngularJS नियंत्रक को क्या रखा है:

    # 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 पर चल रही हैं" (यह सच है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.