पायथन के अनुरोध मॉड्यूल का उपयोग कर एक वेबसाइट पर "लॉग इन" कैसे करें?


95

मैं पायथन में अनुरोध मॉड्यूल का उपयोग करके वेबसाइट पर लॉग इन करने के लिए एक अनुरोध पोस्ट करने की कोशिश कर रहा हूं, लेकिन वास्तव में काम नहीं कर रहा है। मैं इसके लिए नया हूं ... इसलिए मुझे यह पता नहीं चल सकता है कि मुझे अपना यूजरनेम और पासवर्ड कुकीज या किसी प्रकार की HTTP प्राधिकरण चीज से मिलनी चाहिए या नहीं (??)।

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'

तो अब, मुझे लगता है कि मैं "पोस्ट" और कुकीज़ का उपयोग करने वाला हूं।

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}

r = requests.post(url, cookies=ck)

content = r.text

q = PyQuery(content)

title = q("title").text()

print title

मुझे लग रहा है कि मैं कुकीज़ को गलत कर रहा हूं ... मुझे नहीं पता।

यदि यह सही तरीके से लॉग इन नहीं करता है, तो होम पेज का शीर्षक "Locationary.com" पर आ जाना चाहिए और यदि ऐसा होता है, तो इसे "होम पेज" होना चाहिए।

अगर आप मुझसे अनुरोधों और कुकीज़ के बारे में कुछ बातें समझा सकते हैं और मुझे इस बारे में मदद कर सकते हैं, तो मैं इसकी बहुत सराहना करूंगा। : डी

धन्यवाद।

... यह अभी भी वास्तव में अभी तक काम नहीं किया था। ठीक है ... तो इससे पहले कि आप लॉग इन करें, होम पेज HTML क्या कहता है:

</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>

इसलिए मुझे लगता है कि मैं इसे सही कर रहा हूं, लेकिन आउटपुट अभी भी "Locationary.com" है

दूसरा संस्करण:

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

जवाबों:


44

यदि आप जो जानकारी चाहते हैं वह उस पृष्ठ पर है जिसे आप लॉगिन के तुरंत बाद निर्देशित कर रहे हैं ...

इसके बजाय अपने ckवैरिएबल को कॉल करें payload, जैसे अजगर-अनुरोध डॉक्स में:

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

अन्यथा...

देखें https://stackoverflow.com/a/17633072/111362 नीचे।


मुझे urllib, urrlib2, और cookielib और कुछ HTTP हेडर का उपयोग करके इसे अलग तरीके से काम करने के लिए मिला।
मार्कस जॉनसन

23
अफसोस की बात है कि मैं इसे हटा नहीं सकता क्योंकि यह स्वीकृत उत्तर है। मुझे नहीं लगता कि मैंने इस प्रश्न को समझा था जब मैंने इसे पोस्ट किया था (इसे बाद में स्पष्ट किया गया था), इसलिए सुनिश्चित नहीं है कि इसे क्यों स्वीकार किया गया है। मेरा उत्तर केवल तभी काम करता है जब आपको जिस डेटा की आवश्यकता होती है वह उस पृष्ठ पर होता है जिसे आप लॉगिन के बाद रीडायरेक्ट करते हैं। @tigerFinch का बेहतर जवाब है।
काटी लवलेले

228

मुझे पता है कि आपको एक और समाधान मिल गया है, लेकिन मेरे जैसे लोगों के लिए जो इस सवाल को ढूंढते हैं, एक ही चीज़ की तलाश में हैं, यह अनुरोधों के साथ प्राप्त किया जा सकता है:

सबसे पहले, जैसा कि मार्कस ने किया था, जानकारी के तीन टुकड़े प्राप्त करने के लिए लॉगिन फॉर्म के स्रोत की जांच करें - url जो कि फॉर्म पोस्ट करता है, और उपयोगकर्ता नाम और पासवर्ड फ़ील्ड के नाम विशेषताएँ। अपने उदाहरण में, वे inUserName और inUserPass हैं।

एक बार जब आप मिल जाते हैं, तो आप requests.Session()एक पेलोड के रूप में अपने लॉगिन विवरण के साथ लॉगिन यूआरएल पर पोस्ट अनुरोध करने के लिए एक उदाहरण का उपयोग कर सकते हैं । सत्र के उदाहरण से अनुरोध करना अनिवार्य रूप से अनुरोधों का उपयोग करने के समान है, यह बस दृढ़ता जोड़ता है, जिससे आप कुकीज़ आदि को स्टोर और उपयोग कर सकते हैं।

अपने लॉगिन प्रयास को सफल मानते हुए, आप साइट पर आगे अनुरोध करने के लिए सत्र उदाहरण का उपयोग कर सकते हैं। कुकी जो आपको पहचानती है उसका उपयोग अनुरोधों को अधिकृत करने के लिए किया जाएगा।

उदाहरण

import requests

# Fill in your details here to be posted to the login form.
payload = {
    'inUserName': 'username',
    'inUserPass': 'password'
}

# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
    p = s.post('LOGIN_URL', data=payload)
    # print the html returned or something more intelligent to see if it's a successful login page.
    print p.text

    # An authorised request.
    r = s.get('A protected web page url')
    print r.text
        # etc...

12
हालांकि सवाल यह है कि POST लॉगिन फॉर्म कैसे प्राप्त करें? मुझे यह कैसे पता चलेगा कि इसे उपयोगकर्ता नाम, USERNAME आदि के बजाय inUserName कहा जाता है?
lsheng

4
@Twink एचटीएमएल स्रोत को देखने के लिए फॉर्म के लिए देखें कि उन्हें वहां क्या कहा जाता है।
आरोन शूमाकर 13

3
s.text काम करने के लिए प्रतीत नहीं होता है, लेकिन मैं अभी भी आपको अनुरोधों के साथ मुझे यह प्यारा दिखाने के लिए कुछ वोटिंग प्यार दे रहा हूं ... वाक्यविन्यास
सॉफ्टवेयर पैगंबर

s.text काम नहीं करता है क्योंकि यह कुछ इस तरह होना चाहिए: p = s.post('LOGIN_URL.....और फिरp.text
सेबस्टियन

2
@ हेलसीऑनअब्राहाम रायरेज मुझे नहीं लगता कि मदद लेने के लिए यह सही जगह है। मेरा सुझाव है कि आप के बारे में विशेष रूप से चुनौती जैसे: stackoverflow.com/questions/21928368/… और यदि आप इसे हल नहीं कर सकते हैं तो आप अपना प्रश्न खोल सकते हैं।
सेबेस्टियन

36

मुझे इसे सरल बनाने का प्रयास करें, मान लीजिए कि साइट का URL http://example.com/ है और मान लीजिए कि आपको उपयोगकर्ता नाम और पासवर्ड भरकर साइन अप करना होगा, इसलिए हम लॉगिन पृष्ठ http: // उदाहरण पर जाते हैं। com / login.php अभी देखिए और यह सोर्स कोड है और एक्शन URL के लिए सर्च करें यह फॉर्म टैग में कुछ इस तरह होगा

 <form name="loginform" method="post" action="userinfo.php">

अब निरपेक्ष URL बनाने के लिए userinfo.php लें, जो ' http://example.com/userinfo.php ' होगा, अब एक साधारण अजगर स्क्रिप्ट चलाएँ

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

मुझे आशा है कि यह किसी दिन कहीं मदद करता है।


1
अच्छा एक - ध्यान दें कि कभी-कभी नाम / पास फ़ील्ड के तत्व का निरीक्षण करने से बटन के बजाय फ़ाइल नामक फ़ाइल का पता चल सकता है (मेरा बटन निरीक्षण पर 'कार्रवाई' कहा गया था, यूआरएल usr / पास फ़ील्ड का निरीक्षण करने से दिखाया गया था)
bxx

2
यदि आप क्रोम का उपयोग कर रहे हैं, तो नेटवर्क टैब पर devtools खोलें और अनुरोध करने के बाद आप वास्तविक मानों का निरीक्षण कर सकते हैं, उन्हें किस कुंजी के साथ और कहां भेजा गया था, यह उन रूपों के लिए उपयोगी है जो पारंपरिक यांत्रिकी का उपयोग नहीं करते हैं और इसके बजाय प्रपत्र को संसाधित करने के लिए जावास्क्रिप्ट / ajax का उपयोग करें।
रॉबर्टो अरोसेमना

1
इस मामले में वेब पेज को पेज कंटेंट प्रिंट करने के बजाय डायरेक्ट पॉप अप करने के बारे में कोई विचार?

आपको webbrowserमॉड्यूल का उपयोग करने की आवश्यकता होगी
आर। बैरेट

इसके अलावा उसके ऊपर print r.contentगलत है वह का उपयोग करना चाहिएprint(r.content)
आर। बैरेट

6

वेबसाइटों के उपयोगकर्ता नाम <...name=username.../>और पासवर्ड के लिए उपयोग किए गए इनपुट के नाम का पता लगाएं <...name=password../>और उन्हें नीचे दी गई स्क्रिप्ट में बदलें। लॉग इन करने के लिए वांछित साइट पर इंगित करने के लिए URL भी बदलें।

login.py

#!/usr/bin/env python

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)

के उपयोग disable_warnings(InsecureRequestWarning)जब असत्यापित SSL प्रमाणपत्र के साथ साइटों में प्रवेश करने की कोशिश कर रहा है स्क्रिप्ट से किसी भी उत्पादन चुप्पी जाएगा।

अतिरिक्त:

UNIX आधारित सिस्टम पर कमांड लाइन से इस स्क्रिप्ट को चलाने के लिए, इसे निर्देशिका में रखें, home/scriptsऔर इस निर्देशिका को अपने पथ में ~/.bash_profileया टर्मिनल द्वारा उपयोग की गई समान फ़ाइल में जोड़ें ।

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH

फिर अंदर इस अजगर लिपि का लिंक बनाएं home/scripts/login.py

ln -s ~/home/scripts/login.py ~/home/scripts/login

अपना टर्मिनल बंद करें, एक नया शुरू करें, चलाएं login


4

requests.Session()समाधान CSRF संरक्षण के साथ एक फार्म (के रूप में कुप्पी के WTF रूपों में किया जाता) में लॉग इन करना सहायता प्रदान की। जाँच करें कि क्या किसी csrf_tokenछिपे हुए क्षेत्र के रूप में आवश्यक है और उपयोगकर्ता नाम और पासवर्ड के साथ पेलोड में जोड़ें:

import requests
from bs4 import BeautifulSoup

payload = {
    'email': 'email@example.com',
    'password': 'passw0rd'
}     

with requests.Session() as sess:
    res = sess.get(server_name + '/signin')
    signin = BeautifulSoup(res._content, 'html.parser')
    payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
    res = sess.post(server_name + '/auth/login', data=payload)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.