1x1 पिक्सेल GIF (वेब ​​बग) डेटा क्यों सर्व करें?


81

कई विश्लेषणात्मक और ट्रैकिंग टूल क्रॉस-डोमेन इवेंट के भंडारण या प्रसंस्करण के लिए 1x1 जीआईएफ छवि (उपयोगकर्ता के लिए अदृश्य वेब) के लिए अनुरोध कर रहे हैं।

क्यों इस GIF छवि की सेवा करने के लिए? क्या केवल 503 सेवा अस्थाई अनुपलब्ध या खाली फ़ाइल जैसे कुछ त्रुटि कोड वापस करना अधिक कुशल नहीं होगा ?

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

जवाबों:


70

डौग का जवाब बहुत व्यापक है; मुझे लगा कि मैं एक अतिरिक्त नोट में जोड़ूंगा (ओपी के अनुरोध पर, मेरी टिप्पणी के बाद)

डग का उत्तर बताता है कि 1x1 पिक्सेल बीकन का उपयोग उस उद्देश्य के लिए क्यों किया जाता है जिसका वे उपयोग करते हैं; मैंने सोचा था कि मैं एक संभावित वैकल्पिक दृष्टिकोण को रेखांकित करूंगा, जो एक प्रतिक्रिया के लिए HTTP स्टेटस कोड 204, नो कंटेंट का उपयोग करना है, और एक इमेज बॉडी नहीं भेजना है।

204 कोई सामग्री नहीं

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

मूल रूप से, सर्वर अनुरोध प्राप्त करता है, और एक निकाय नहीं भेजने का फैसला करता है (इस मामले में, छवि नहीं भेजने के लिए)। लेकिन यह एजेंट को सूचित करने के लिए एक कोड के साथ जवाब देता है कि यह एक सचेत निर्णय था; मूल रूप से, इसका सकारात्मक प्रतिक्रिया देने का एक छोटा तरीका है।

से गूगल के पृष्ठ गति दस्तावेज़ :

एक अतुल्यकालिक फैशन में पृष्ठ दृश्य रिकॉर्ड करने का एक लोकप्रिय तरीका लक्ष्य पृष्ठ के निचले भाग में (या एक ऑनलोड ईवेंट हैंडलर) में जावास्क्रिप्ट स्निपेट को शामिल करना है, जो उपयोगकर्ता द्वारा पेज लोड करने पर लॉगिंग सर्वर को सूचित करता है। ऐसा करने का सबसे आम तरीका सर्वर के लिए एक "बीकन" के लिए अनुरोध करना है, और बीकन संसाधन के लिए URL में पैरामीटर के रूप में ब्याज के सभी डेटा को एनकोड करना है। HTTP प्रतिक्रिया को बहुत छोटा रखने के लिए, एक पारदर्शी 1x1-पिक्सेल छवि बीकन अनुरोध के लिए एक अच्छा उम्मीदवार है। थोड़ा अधिक इष्टतम बीकन एक HTTP 204 प्रतिक्रिया ("कोई सामग्री नहीं") का उपयोग करेगा जो कि 1x1 जीआईएफ से थोड़ा छोटा है।

मैंने इसे कभी भी आज़माया नहीं है, लेकिन सिद्धांत रूप में इसे उसी उद्देश्य की सेवा करनी चाहिए, जिसमें स्वयं को स्थानांतरित करने की आवश्यकता न हो, Google Analytics के मामले में आपको 35 बाइट्स की बचत होगी। (चीजों की योजना में, जब तक आप Google Analytics प्रति दिन कई ट्रिलियन हिट की सेवा नहीं देते, 35 बाइट्स वास्तव में कुछ भी नहीं है)

आप इस कोड के साथ इसका परीक्षण कर सकते हैं:

var i = new Image(); 
i.src = "http://httpstat.us/204";

12
ये कम ज्ञात HTTP स्थिति कोड (203, 204, 205) वास्तव में सोने के हैं। वर्तमान में वे जितना उपयोग करते हैं उससे अधिक उन्हें देखना चाहिए।
आप

1
अच्छा एक - जानकारी मैं वास्तव में उपयोग करने के लिए रख सकते हैं। मुझ से +1।
डौग

1
मुझे देखने दें कि क्या मैं संक्षेप में बता सकता हूं - HTTP प्रतिक्रिया कोड दृष्टिकोण में समान क्लाइंट अनुरोध शामिल है; एकमात्र अंतर यह है कि सर्वर, बजाय 1x1 gif (और एक 200, मुझे लगता है) को वापस करने के बजाय, ग्राहक को 204 वापस लौटाता है?
doug

2
यद्यपि आप उस चीज़ के लिए कैसे अनुरोध करेंगे जो 204 प्रतिक्रिया कोड देता है?
जुरगेन पॉल

3
मुझे समझ नहीं आता कि छवि क्यों है। खाली स्ट्रिंग क्यों नहीं लौटाते?
वीशी ज़ेंग

65

सबसे पहले, मैं दो पिछले उत्तरों से असहमत हूं - न तो सवाल उठाता है।

HTTP प्रोटोकॉल में काम करने पर वेब-आधारित एनालिटिक्स ऐप्स (जैसे Google Analytics) के लिए एक-पिक्सेल छवि एक आंतरिक समस्या को हल करती है - क्लाइंट से सर्वर में डेटा को कैसे स्थानांतरित करना है

प्रोटोकॉल द्वारा बताए गए तरीकों में से सबसे सरल, (सबसे सरल तरीका है जिसमें एक अनुरोध निकाय शामिल है) जीईटी अनुरोध है । इस प्रोटोकॉल विधि के अनुसार, ग्राहक संसाधनों के लिए सर्वर से अनुरोध करते हैं; सर्वर उन अनुरोधों को संसाधित करते हैं और उचित प्रतिक्रियाएं देते हैं।

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

तो क्लाइंट से सर्वर पर डेटा प्राप्त करने की समस्या का समाधान क्या है? HTTP संदर्भ में GET (उदाहरण के लिए, POST) के अलावा अन्य प्रोटोकॉल विधियां हैं, लेकिन यह कई कारणों के लिए एक सीमित विकल्प है (जैसा कि इसके निराकरण और विशेष उपयोग जैसे कि फ़ॉर्म डेटा सबमिट करना)।

यदि आप किसी ब्राउज़र से GET अनुरोध को देखते हैं, तो आप देखेंगे कि यह एक अनुरोध URL और अनुरोध हेडर (जैसे, संदर्भकर्ता और उपयोगकर्ता-एजेंट हेडर) से बना है, बाद वाले में क्लाइंट के बारे में जानकारी शामिल है - जैसे, ब्राउज़र प्रकार और संस्करण, ब्राउज़र लैन्गॉउग, ऑपरेटिंग सिस्टम, आदि।

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

लेकिन फिर क्लाइंट को एक संसाधन का अनुरोध करने के लिए कैसे प्राप्त करें ताकि इसे मेट्रिक्स डेटा भेजने में "छल" किया जा सके? और सर्वर को वास्तविक डेटा भेजने के लिए क्लाइंट कैसे प्राप्त करें?

Google Analytics एक अच्छा उदाहरण है: ga.js फ़ाइल (क्लाइंट के लिए एक बड़ी फ़ाइल जिसका डाउनलोड वेब पेज में एक छोटी स्क्रिप्ट द्वारा ट्रिगर किया गया है) में कोड की कुछ पंक्तियाँ शामिल हैं जो क्लाइंट को किसी विशेष संसाधन से किसी विशेष संसाधन का अनुरोध करने के लिए निर्देशित करती हैं सर्वर (GA सर्वर) और अनुरोध हैडर में लिपटे हुए कुछ डेटा भेजने के लिए।

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

अधिक सटीक रूप से, सभी GA डेटा - प्रत्येक एकल आइटम - को इकट्ठा किया जाता है और अनुरोध URL के क्वेरी स्ट्रिंग ('?' के बाद सब कुछ) में पैक किया जाता है । लेकिन उस डेटा के लिए ग्राहक से (जहाँ यह बनाया गया है) जीए सर्वर (जहाँ यह लॉग इन है और एकत्र होता है) से जाने के लिए एक HTTP रिक्वेस्ट होनी चाहिए, इसलिए ga.js (Google एनालिटिक्स स्क्रिप्ट जो डाउनलोड की जाती है, जब तक कि यह न हो। क्लाइंट द्वारा कैश्ड, जब पृष्ठ लोड होने पर फंक्शन नामक एक फ़ंक्शन के परिणामस्वरूप) क्लाइंट को सभी एनालिटिक्स डेटा को इकट्ठा करने के लिए निर्देशित करता है - जैसे, कुकीज़, लोकेशन बार, रिक्वेस्ट हेडर इत्यादि ।-- इसे एक ही स्ट्रिंग में समेटें। और इसे एक क्वेरी स्ट्रिंग के रूप में एक URL ( * http: //www.google-analytics.com/__utm .gif* ?) पर जोड़ें और वह अनुरोध URL बन जाता है ।

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

उदाहरण के लिए, मैंने अपने ब्राउज़र के लोकेशन बार में एक कॉर्पोरेट होम पेज पर मान्य url टाइप किया, जिसने उस होम पेज को लौटा दिया और इसे अपने ब्राउज़र में प्रदर्शित किया (मैं किसी भी वेब साइट / पेज को चुन सकता था जो प्रमुख एनालिटिक्स ऐप्स में से एक का उपयोग करता है, GA , Omniture, Coremetrics, आदि)

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

Request URL:http://www.google-analytics.com/__utm.gif?
           utmwv=1&utmn=1520570865&
           utmcs=UTF-8&
           utmsr=1280x800&
           utmsc=24-bit&
           utmul=enus&
           utmje=1&
           utmfl=10.3%20r181&

Request Method:GET
Status Code:200 OK

Request Headers
    User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/533.21.1 
                 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

Response Headers
    Cache-Control:private, no-cache, no-cache=Set-Cookie, proxy-revalidate
    Content-Length:35
    Content-Type:image/gif
    Date:Wed, 06 Jul 2011 21:31:28 GMT

नोटिस करने के लिए महत्वपूर्ण बिंदु हैं:

  1. अनुरोध वास्तव में utm.gif के लिए एक अनुरोध था, जैसा कि ऊपर की पहली पंक्ति द्वारा दर्शाया गया है: * अनुरोध URL: http: //www.google-analytics.com/__utm.gif*।

  2. Google Analytics पैरामीटर अनुरोध URL से जुड़े क्वेरी स्ट्रिंग में स्पष्ट रूप से दिखाई देते हैं : उदाहरण के लिए, utmsr ग्राहक स्क्रीन रिज़ॉल्यूशन को संदर्भित करने के लिए GA का चर नाम है, मेरे लिए, 1280x800 का मान दिखाता है; utmfl फ़्लैश संस्करण का चर नाम है, जिसका मूल्य 10.3 है, आदि।

  3. प्रतिक्रिया हैडर कहा जाता है सामग्री प्रकार (ग्राहक के लिए सर्वर वापस द्वारा भेजे गए) भी पुष्टि करता है कि संसाधन का अनुरोध किया और लौट आए एक 1x1 पिक्सेल gif था: सामग्री-प्रकार: image / gif

क्लाइंट और सर्वर के बीच डेटा ट्रांसफर करने की यह सामान्य योजना हमेशा के लिए रही है; ऐसा करने का एक बहुत अच्छा तरीका हो सकता है, लेकिन यह एकमात्र तरीका है जिसके बारे में मुझे पता है (जो एक होस्टेड एनालिटिक्स सेवा द्वारा लगाए गए अवरोधों को संतुष्ट करता है)।


3
@doug शानदार जवाब। काश मैंने इसे लिखा होता :) यह HTTP Status Code 204एक प्रतिक्रिया के लिए उपयोग करने में सक्षम होने के बारे में एक नोट में फेंकने लायक हो सकता है । इसे देखें: code.google.com/speed/page-speed/docs/rtt.html मैंने इसे कभी नहीं आज़माया है, लेकिन सिद्धांत रूप में इसे उसी उद्देश्य की सेवा करनी चाहिए, जिसमें बिना जीआईएफ को प्रसारित किए जाने की आवश्यकता होती है। var i=new Image(); i.src = "http://sharedcount.com/test/beacon.gif";एक उदाहरण है, लेकिन मुझे यकीन नहीं है कि यह किसी भी ब्राउज़र मुद्दों को प्रस्तुत करेगा।
येलहुल

9
यह अब तक का सबसे खराब उत्तर नहीं है क्योंकि इसका जवाब नहीं है :) मैंने पूछा कि क्यों जीआईएफ छवि की सेवा करना है, क्योंकि आवश्यक डेटा पहले ही अनुरोध के साथ भेजा गया है।
विलीम

2
मैं बहुत नकारात्मक नहीं होना चाहता, क्षमा करें। यह वेब बग का अच्छा विवरण है। लेकिन GIF डेटा को वापस सेवा क्यों दें?
विलिअम

@ प्रह्लाद: वह महान है। इसे दूसरों के लिए एक उत्तर के रूप में जोड़ने पर विचार करें। एक टिप्पणी के रूप में यह लगभग अदृश्य है।
विलिअम

@Villiam यकीन है, बस इसे जोड़ा।
येलहुल

14

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

OTOH से आपको कुछ हासिल नहीं होता है। सर्वर / फ्रेमवर्क द्वारा लौटाया गया त्रुटि संदेश आमतौर पर 1x1 छवि से बड़ा होता है। इसका मतलब है कि आप मूल रूप से कुछ भी नहीं के लिए अपने नेटवर्क ट्रैफ़िक को बढ़ाते हैं।


1
कारण यह है कि एनालिटिक्स ऐप्स (जैसे, Google Analytics, Yahoo Analytics, Omniture, et al।) वेब पेज पर 1x1 पिक्सेल की gif छवि रखते हैं, एप्लिकेशन को "डीबगिंग" से कोई लेना- देना नहीं है।
डौग

3
@doug - मुझे लगता है कि बिंदु mru वहाँ बना रहा है कि यदि आप जानबूझकर त्रुटि कोड लौटाते हैं, तो आपको "सही" त्रुटि कोड, और त्रुटि कोड के बीच अंतर करना होगा जो आप वापस करने के लिए थे। तो कहानी का नैतिक है, परिणाम के रूप में एक त्रुटि कोड कभी नहीं लौटाएं जब कि परिणाम वही होता है जो इरादा है।
मू

3
मुझे लगता है कि त्रुटि प्रतिक्रिया जीआईएफ छवि से बड़ी होगी - ध्यान दें कि 200 ओके प्रतिक्रिया है और जीआईएफ छवि के साथ भेजा गया है।
विलीम

2
@Villiam अधिकांश वातावरण केवल त्रुटि कोड नहीं देते हैं, बल्कि एक अच्छी तरह से स्टाइल किया गया html पृष्ठ भी है जिसमें त्रुटि / अधिक जानकारी प्रदान करने का वर्णन है।
उलरिच डांगेल

8

क्योंकि इस तरह के जीआईएफ की एक ब्राउज़र में एक ज्ञात प्रस्तुति है - यह एक एकल पिक्सेल, अवधि है। किसी भी चीज़ में पृष्ठ की वास्तविक सामग्री के साथ नेत्रहीन हस्तक्षेप का खतरा होता है।

HTTP त्रुटियां त्रुटि पाठ के ओवरसीज़ फ़्रेम या पॉप-अप विंडो के रूप में भी दिखाई दे सकती हैं। खाली उत्तर मिलने पर कुछ ब्राउज़र भी शिकायत कर सकते हैं।

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


1
आपके उत्तर में संसाधन की सेवा के उद्देश्य के बारे में कुछ भी नहीं कहा गया है - यानी, संसाधन की आवश्यकता क्यों है? आपका उत्तर प्रश्न के लिए निर्देशित है "एक अन्य प्रकार के छवि प्रारूप के बजाय 1x1 gif की सेवा क्यों करें? यह एक तुच्छ प्रश्न है जिसका एक तुच्छ उत्तर है (अर्थात, gif प्रारूप में jpeg, png की तुलना में पिक्सेल-बाय-पिक्सेल आधार पर एक छोटा आकार है" , झगड़ा, आदि)
doug

आप जावास्क्रिप्ट इमेज ऑब्जेक्ट के साथ GIF लोडिंग कर सकते हैं। यह उपयोगकर्ता को किसी भी त्रुटि की रिपोर्ट नहीं करेगा।
विलीम

@Villiam वास्तव में छवि को वापस करके आप बिना किसी जावास्क्रिप्ट सक्षम किए ब्राउज़रों को भी ट्रैक कर सकते हैं, बस छवि टैग को <noscript>इसमें डाल सकते हैं और यह काम करेगा। और आपको js के माध्यम से अनुरोधों के बीच अंतर करने के लिए सर्वर साइड पर कुछ भी करने की आवश्यकता नहीं होगी (एक त्रुटि लौटाते हुए) और DOM में तत्वों के माध्यम से सीधे अनुरोध (एक छवि लौटाते हुए)
उलरिच डांगेल

4

यह ओपी के प्रश्न का उत्तर देना है - "GIF छवि डेटा की सेवा क्यों करें ..."

कुछ उपयोगकर्ताओं को एक सरल img डाल देंगे आपकी ईवेंट लॉगिंग सेवा को कॉल करने के लिए टैग -

<img src="http://www.example.com/logger?event_id=1234">

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

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

Accept: image/gif, image/*
Accept-Encoding:gzip,deflate
...

जब वहाँ है "छवि / " * में स्ट्रिंग स्वीकार हेडर फ़ील्ड, मैं छवि की आपूर्ति, अन्यथा मैं सिर्फ 204 के साथ जवाब।


2

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


0

यदि आप बीकन एपीआई ( https://w3c.github.io/beacon/) का उपयोग कर रहे हैं तो आपको एक छवि परोसने की जरूरत नहीं है ) कार्यान्वयन विधि ।

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


0

@ मैसीज पेरलीस्की मूल रूप से सही है, लेकिन मुझे लगता है कि एक विस्तृत जवाब फायदेमंद होगा।

1x1 GIF और 204 No-Contentस्थिति कोड क्यों नहीं ?

204 No-Content सर्वर को सभी प्रतिक्रिया हेडर (सामग्री-प्रकार, सामग्री-लंबाई, सामग्री-एन्कोडिंग, कैश-कंट्रोल आदि ...) को छोड़ने में सक्षम करता है और 0 बाइट्स के साथ एक खाली प्रतिक्रिया निकाय देता है (और बहुत सी अनावश्यक बैंडविड्थ की बचत करता है)।

ब्राउज़रों को 204 No-Contentप्रतिक्रियाओं का सम्मान करना पता है , और प्रतिक्रिया हेडर और प्रतिक्रिया निकाय की अपेक्षा / प्रतीक्षा नहीं करना है।

सर्वर कोई प्रतिक्रिया हेडर (जैसे स्थापित करने के लिए आवश्यक है या नहीं cache-controlया cookie), वह उपयोग नहीं कर सकते 204 No-Contentक्योंकि ब्राउज़र (HTTP प्रोटोकॉल कल्पना के अनुसार) डिजाइन द्वारा कोई प्रतिक्रिया हेडर अनदेखी करेंगे।

1x1 GIF और स्टेटस कोड वाले Content-Length: 0हेडर क्यों नहीं 200 OK?

संभवतः कई मुद्दों का मिश्रण, बस कुछ का नाम देने के लिए:

  • विरासत ब्राउज़र संगतता
  • ब्राउज़रों पर MIME प्रकार की जाँच, 0 बाइट्स एक वैध छवि नहीं है।
  • 200 OK 0 बाइट के साथ मध्यवर्ती प्रॉक्सी सर्वर और वीपीएन द्वारा पूरी तरह से समर्थन नहीं किया जा सकता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.