इस उत्तर का सार क्या दूसरों नीचे कहा है, विशेष रूप से RedBaron के अलावा एक विधि मैं Google खाते का प्रयोग StackOverflow इनबॉक्स में प्राप्त करने के लिए इस्तेमाल किया गया।
Firefox के छेड़छाड़ डाटा डेवलपर टूल का उपयोग करके और Stackoverflow पर लॉग ऑन, एक देख सकते हैं कि OpenID इस तरह से काम करता है:
- StackOverflow किसी दिए गए सेवा (यहाँ गूगल), पोस्ट में परिभाषित से प्रमाणीकरण का अनुरोध करता है डेटा;
- Google खाते प्रमाणीकरण के सबूत के रूप में पहले से मौजूद कुकी के लिए लेता है और जांचता है;
- यदि कोई कुकी नहीं मिलती है, तो Google प्रमाणीकरण का अनुरोध करता है और कुकी सेट करता है;
- कुकी सेट होने के बाद, StackOverflow उपयोगकर्ता के प्रमाणीकरण को स्वीकार करता है।
उपरोक्त प्रक्रिया को सारांशित करता है, जो वास्तव में अधिक जटिल है, क्योंकि कई रीडायरेक्ट और कुकी एक्सचेंज वास्तव में होते हैं।
क्योंकि एक ही प्रक्रिया को पुन: उत्पन्न करना प्रोग्रामेटिक रूप से किसी भी तरह से कठिन साबित हुआ (और यह मेरी निरक्षरता हो सकती है), विशेष रूप से सभी लोकेल विनिर्देशों के साथ कॉल करने के लिए यूआरएल का शिकार करने की कोशिश कर रहा है। मैंने पहले Google खाते पर लॉग ऑन करने का विकल्प चुना, अच्छी तरह से योग्य कुकी और फिर Stackoverflow पर लॉगिन करें, जो प्रमाणीकरण के लिए कुकी का उपयोग करेगा।
यह केवल निम्नलिखित पायथन मॉड्यूल का उपयोग करके किया जाता है: urllib, urllib2, cookielib और BeautifulSoup।
यहां (सरलीकृत) कोड है, यह सही नहीं है, लेकिन यह चाल है। विस्तारित संस्करण Github पर पाया जा सकता है।
#!/usr/bin/env python
import urllib
import urllib2
import cookielib
from BeautifulSoup import BeautifulSoup
from getpass import getpass
# Define URLs
google_accounts_url = 'http://accounts.google.com'
authentication_url = 'https://accounts.google.com/ServiceLoginAuth'
stack_overflow_url = 'https://stackoverflow.com/users/authenticate'
genuwine_url = 'https://stackoverflow.com/inbox/genuwine'
# Build opener
jar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
def request_url(request):
'''
Requests given URL.
'''
try:
response = opener.open(request)
except:
raise
return response
def authenticate(username='', password=''):
'''
Authenticates to Google Accounts using user-provided username and password,
then authenticates to StackOverflow.
'''
# Build up headers
user_agent = 'Mozilla/5.0 (Ubuntu; X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'
headers = {'User-Agent' : user_agent}
# Set Data to None
data = None
# Build up URL request with headers and data
request = urllib2.Request(google_accounts_url, data, headers)
response = request_url(request)
# Build up POST data for authentication
html = response.read()
dsh = BeautifulSoup(html).findAll(attrs={'name' : 'dsh'})[0].get('value').encode()
auto = response.headers.getheader('X-Auto-Login')
follow_up = urllib.unquote(urllib.unquote(auto)).split('continue=')[-1]
galx = jar._cookies['accounts.google.com']['/']['GALX'].value
values = {'continue' : follow_up,
'followup' : follow_up,
'dsh' : dsh,
'GALX' : galx,
'pstMsg' : 1,
'dnConn' : 'https://accounts.youtube.com',
'checkConnection' : '',
'checkedDomains' : '',
'timeStmp' : '',
'secTok' : '',
'Email' : username,
'Passwd' : password,
'signIn' : 'Sign in',
'PersistentCookie' : 'yes',
'rmShown' : 1}
data = urllib.urlencode(values)
# Build up URL for authentication
request = urllib2.Request(authentication_url, data, headers)
response = request_url(request)
# Check if logged in
if response.url != request._Request__original:
print '\n Logged in :)\n'
else:
print '\n Log in failed :(\n'
# Build OpenID Data
values = {'oauth_version' : '',
'oauth_server' : '',
'openid_username' : '',
'openid_identifier' : 'https://www.google.com/accounts/o8/id'}
data = urllib.urlencode(values)
# Build up URL for OpenID authetication
request = urllib2.Request(stack_overflow_url, data, headers)
response = request_url(request)
# Retrieve Genuwine
data = None
request = urllib2.Request(genuwine_url, data, headers)
response = request_url(request)
print response.read()
if __name__ == '__main__':
username = raw_input('Enter your Gmail address: ')
password = getpass('Enter your password: ')
authenticate(username, password)
के रूप में भी उपलब्ध है पीएस: मैंने जानबूझकर डुप्लिकेटिंग के संबंध में इस पोस्ट को पहले ही मॉडरेटर ध्यान के लिए ध्वजांकित किया था। – Benjamin