यैंडेक्स डीएनएस होस्टिंग बनाम डायनामिक आईपी

पिछले साल सितंबर में, यैंडेक्स ने सार्वजनिक उपयोग के लिए डोमेन के लिए मेल के लिए DNS होस्टिंग खोल दी। उपयोगकर्ताओं की खुशी कोई सीमा नहीं थी, इस विषय पर बहुत सारी सकारात्मक टिप्पणियों के साथ मुलाकात की गई थी, और अच्छे के निगम द्वारा यैंडेक्स की घोषणा की गई थी।

दुर्भाग्य से, DNS रिकॉर्ड का प्रशासन केवल वेब इंटरफ़ेस के माध्यम से प्रदान किया गया था। प्रशासन के लिए एक एपीआई प्रदान नहीं किया गया था, यह अभी तक प्रकट नहीं हुआ है, और यह लंबे समय तक प्रकट नहीं हो सकता है। इस तथ्य ने डायनेमिक आईपी डोमेन के कई मालिकों को डीडीएनएस द्वारा बाद की खरीद के संबंध में उत्कृष्ट (मुफ्त डोमेन के लिए) कस्टम भुगतान के लिए उत्कृष्ट free.editdns.net मुफ्त सेवा स्थानांतरित करने से कम नहीं किया।

यह सुनिश्चित करने के बाद कि चमत्कार नहीं हुआ था, मैंने इस अन्याय को ठीक करने के लिए पायथन से एक फ़ाइल उठाई ...

सबसे पहले, मैं Yandex सेवाओं एपीआई के बारे में कम से कम किसी तरह की जानकारी की तलाश में सभी-जानने वाले Google पर गया। पहली बात जो मुझे सामने आई वह थी डोमेन के लिए मेल एपीआई का विस्तृत विवरण। काश, 32 उपलब्ध कार्यों में से, इसमें डीएनएस होस्टिंग के प्रशासन से संबंधित कुछ भी नहीं था, और मैंने खोज जारी रखी। अनुरोध के लिए अजगर के जादू के शब्दों को जोड़ा, और फिर सी तेज, मैं अलेडी नेमिरो द्वारा एक लेख में ब्राउज़र के विस्तृत विवरण के साथ आया था जब Yandex सेवाओं और VB और C # में कोड के उदाहरणों को अधिकृत करता हूं

लेख पढ़ने और यह सुनिश्चित करने के बाद कि मुझे अभी भी एक ब्राउज़र का अनुकरण करना है, मैंने खुद को FireBug और HTTP विश्लेषक के साथ सशस्त्र किया। प्राधिकरण की पेचीदगियों का अध्ययन करने और DNS होस्टिंग के साथ काम करने में कुछ समय बिताने के बाद, मुझे पता चला कि यांडेक्स सेवाओं पर प्राधिकरण बहुत सरलता से काम करता है। प्राधिकार प्रक्रिया यैंडेक्सिड कुकी से शुरू होती है, जो आपको किसी यैंडेक्स सेवा में लॉग इन करने पर प्राप्त होती है:

Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  1. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  2. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  3. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  4. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  5. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  6. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  7. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  8. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid
  9. Copy Source | Copy HTML def initialize (self): connection = httplib .HTTPConnection( 'www.yandex.ru' ) connection.request( 'GET' , '/' ) response = connection.getresponse() cookies = response.getheader( 'set-cookie' , None) response.close() match = re .search( '(?<=yandexuid=)[^;]*' , cookies) self ._yandexuid = match.group( 0 ) print 'yandexuid =' , self ._yandexuid


कुकी यांडेक्सिड प्राप्त करने के बाद , ब्राउज़र POST अनुरोध के साथ UNIX प्रारूप में लॉगिन, पासवर्ड और टाइमस्टैम्प भेजता है। यदि अनुरोध के गठन में कोई समस्या नहीं थी, तो मैं टाइमस्टैम्प फॉर्मूला के साथ लंबे समय तक रहा:

Copy Source | Copy HTML
  1. डीफ़ लॉगिन (स्व):
  2. सामग्री = 'लॉगिन = {0} और पासवार्ड = {1} और टाइमस्टैम्प = {2} "
  3. content = content.format ( self ._login, self ._passwd, self .timestamp ())
  4. कनेक्शन = canplib .HTTPConnection ( 'passport.yandex.ru' )
  5. connection.request ( 'POST' , '/ पासपोर्ट; विधा = स्थिति' , सामग्री, { 'Cookie' : self .getcookies ()})
  6. प्रतिक्रिया = connection.getresponse ()
  7. सामग्री = response.read ()
  8. response.close ()
  9. मैच = पुनः । search ( 'idkey \ "\ s। *' , सामग्री)
  10. मैच = पुनः। search ( '(\ d \ w *)' , match.group ( 0 ))
  11. स्व ._डिज = मैच।ग्रुप ( 0 )
  12. 'idkey =' , self__idkey प्रिंट करें


"इस कंप्यूटर पर स्थायी प्राधिकरण स्थापित करें" अनुरोध के जवाब में, जादू की मूर्ति प्राप्त करने के बाद, "नहीं" बटन के एक क्लिक का अनुकरण करने के लिए अनुरोध करना आवश्यक था:

Copy Source | Copy HTML
  1. डीफ़ सर्टिफ़िकेट (स्व):
  2. सामग्री = 'भरा = हाँ और टाइमस्टैम्प = {0} & idkey = {1} & no =% D0% 9D% D0% B5% D1% 82'
  3. सामग्री = content.format ( स्वयं .timestamp) (, स्व।
  4. कनेक्शन = canplib .HTTPConnection ( 'passport.yandex.ru' )
  5. connection.request ( 'POST' , '/ पासपोर्ट; विधा = स्थिति' , सामग्री, { 'Cookie' : self .getcookies ()})
  6. प्रतिक्रिया = connection.getresponse ()
  7. कुकीज़ = प्रतिक्रिया.गेटील्डर ( 'सेट-कुकी' , कोई नहीं)
  8. ... पार्सिंग कुक रेगेक्सप ...
  9. response.close ()


अब आपके पास हाथ में सभी आवश्यक कुकीज़ हैं, मेल के लिए डोमेन के साथ काम करने के लिए, आंतरिक AJAX एपीआई के माध्यम से DNS रिकॉर्ड संपादक में "सहेजें" बटन पर क्लिक करने के लिए पर्याप्त है:

Copy Source | Copy HTML
  1. डीईएफ़ अपडेटोमैन (स्वयं, ns_record_id):
  2. सामग्री = 'डोमेन = {0} & ns_record_id = {1} & ns_rec_type = A & ns_subdomain =% 40 & ns_weight = & ns_port = और ns_content = {2} & ns_priority = 1'।
  3. content = content.format ( self ._domain, ns_record_id, self.exexipip)।
  4. कनेक्शन = canplib .HTTPSConnection ( 'pdd.yandex.ru' )
  5. कनेक्शन .request ( 'POST' , '/ajax/ns_simple_record_edit.ajax.xml' , सामग्री, \
  6. { "स्वीकार" : 'आवेदन / json, पाठ / जावास्क्रिप्ट, * / *' , \
  7. 'कुकी' : स्वयं .getcookies ()})
  8. प्रतिक्रिया = connection.getresponse ()
  9. response.close ()


पिछले मामले की तरह, इस बिंदु पर स्वीकार शीर्ष लेख की आवश्यकता थी। हालांकि, यह सबसे महत्वपूर्ण नहीं है। Ns_record_id प्राप्त करने के लिए , मुझे DNS रिकॉर्ड की सूची के साथ पृष्ठ का HTML कोड पार्स करना था:

Copy Source | Copy HTML
  1. डीओ डोमेन सूची (स्व):
  2. कनेक्शन = canplib .HTTPSConnection ( 'pdd.yandex.ru' )
  3. connection.request ( 'GET' , '/ domain_ns / {0} /' .format ( self ._domain), कोई नहीं, \
  4. { 'स्वीकार' : 'पाठ / html, अनुप्रयोग / xhtml + xml, अनुप्रयोग / xml; q = 0.9, * / *; q = 0.8' , \;
  5. 'कुकी' : स्वयं .getcookies (), \
  6. 'रेफर' : 'https://pdd.yandex.ru' })
  7. प्रतिक्रिया = connection.getresponse ()
  8. सामग्री = response.read ()
  9. ब्लॉक = re .findall ( 'आइटम: \ s \' [\ d] + \ '(। +) मान = "= \ _ \ _ ।] +"' , सामग्री)।
  10. ब्लॉक में आइटम के लिए :
  11. मैच = पुनः। search ( '(? <= item: \ s \') [\ d] * ' , आइटम)
  12. ns_record_id = match.group ( 0 )
  13. मैच = पुनः .search ( 'ns_subdomain (। +?) मान = \ "(? +?) \" " , आइटम)।
  14. मैच = पुनः। search ( '(? <? value =) \ "। +? \"' , match.group ( 0 ))
  15. ns_subdomain = match.group ( 0 )
  16. मैच = पुनः । search ( 'ns_rec_type (??) value = \ "(।? +?) \" " , आइटम)
  17. मैच = पुनः। search ( '(? <? value =) \ "। +? \"' , match.group ( 0 ))
  18. ns_rec_type = match.group ( 0 )
  19. मैच = पुनः .search ( 'ns_content (।?) value = \ "(। +?) \" , आइटम)
  20. मैच = पुनः। search ( '(? <? value =) \ "। +? \"' , match.group ( 0 ))
  21. ns_content = match.group ( 0 )
  22. रिकॉर्ड = 'ns_record_id = {0} | ns_subdomain = {1} | ns_rec_type = {2} | ns_content = {3} '
  23. Print record.format (ns_record_id, ns_subdomain, ns_rec_type, ns_content)
  24. response.close ()


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

स्रोत कोड डाउनलोड करें और कॉन्फ़िगर करें

Source: https://habr.com/ru/post/In122877/


All Articles