পাইথনের অনুরোধগুলির মডিউলটি ব্যবহার করে কোনও ওয়েবসাইটে কীভাবে "লগ ইন" করবেন?


99

আমি পাইথনের অনুরোধগুলির মডিউলটি ব্যবহার করে কোনও ওয়েবসাইটে লগ ইন করার জন্য একটি অনুরোধ পোস্ট করার চেষ্টা করছি তবে এটি সত্যিই কাজ করছে না। আমি এটিতে নতুন ... তাই আমি বুঝতে পারি না যে আমার নিজের ব্যবহারকারীর নাম এবং পাসওয়ার্ড কুকিজ বা কোনও ধরণের 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

আমার অনুভূতি আছে যে আমি কুকিগুলি ভুল করছি ... জানি না।

যদি এটি সঠিকভাবে লগ ইন না করে তবে হোম পৃষ্ঠার শিরোনামটি "লোকেশনারি ডটকম" এ উপস্থিত হওয়া উচিত এবং যদি এটি হয় তবে এটি "হোম পৃষ্ঠা" হওয়া উচিত।

আপনি যদি আমাকে অনুরোধ এবং কুকিজ সম্পর্কে কয়েকটি বিষয় ব্যাখ্যা করতে পারেন এবং এটির জন্য আমাকে সহায়তা করতে পারেন তবে আমি এটির প্রশংসা করব। : ডি

ধন্যবাদ

... এটি এখনও সত্যিই কাজ করে না। ঠিক আছে ... তাই আপনি লগ ইন করার আগে হোম পেজ এইচটিএমএল এটি বলে:

</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>

সুতরাং আমি মনে করি আমি এটি সঠিকভাবে করছি তবে আউটপুটটি এখনও "লোকেশন ডট কম" রয়েছে

২ য় সম্পাদনা:

আমি দীর্ঘ সময়ের জন্য লগইন থাকতে সক্ষম হতে চাই এবং যখনই আমি সেই ডোমেনের অধীনে কোনও পৃষ্ঠার জন্য অনুরোধ করি তখন আমি সামগ্রীটি এমনভাবে দেখাতে চাই যাতে আমি লগইন করেছি।

উত্তর:


45

আপনি যে তথ্যটি চান তা যদি সেই পৃষ্ঠায় থাকে তবে আপনাকে লগইন করার সাথে সাথেই নির্দেশ দেওয়া হবে ...

এর পরিবর্তে অজগর-অনুরোধ ডক্সের মতো আপনার 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, urlib2, এবং কুকেলিব এবং কিছু HTTP শিরোনাম ব্যবহার করে এটি অন্যভাবে কাজ করতে পেরেছি।
মার্কাস জনসন

24
দুঃখের সাথে আমি এটিকে মুছতে পারি না কারণ এটি গ্রহণযোগ্য উত্তর। আমি এটি পোস্ট করার সময় আমি প্রশ্নটি বুঝতে পেরেছি বলে মনে হয় না (এটি পরে স্পষ্ট করা হয়েছিল), তবে এটি কেন গৃহীত হয়েছে তা নিশ্চিত হন না। লগইন করার পরে আপনার প্রয়োজনীয় ডেটা সেই পৃষ্ঠায় থাকলে আপনার উত্তরটি কেবল কার্যকর হয়। @tigerFinch এর আরও ভাল উত্তর রয়েছে।
কেটি লাভাল্লি

238

আমি জানি আপনি অন্য একটি সমাধান খুঁজে পেয়েছেন, তবে আমার মতো যারা এই প্রশ্নটি খুঁজে পান, একই জিনিসটি সন্ধান করে, অনুরোধগুলি নিম্নলিখিতভাবে অর্জন করা যায়:

প্রথমত, মার্কাস যেমন করেছিলেন, তিনটি টুকরো তথ্য পেতে লগইন ফর্মের উত্সটি পরীক্ষা করুন - যে ফর্মটি যে ফর্মটি পোস্ট করে এবং ইউজারনেম এবং পাসওয়ার্ড ক্ষেত্রের নামের বৈশিষ্ট্যগুলি তা জানতে। তার উদাহরণে, তারা inUserName এবং inUserPass।

এটি একবার পেয়ে গেলে, আপনি requests.Session()পেললোড হিসাবে আপনার লগইন বিশদ সহ লগইন ইউআরএলটিতে একটি অনুরোধ পোস্ট করার জন্য একটি উদাহরণ ব্যবহার করতে পারেন । একটি সেশন উদাহরণ থেকে অনুরোধ করা মূলত অনুরোধগুলি সাধারণভাবে ব্যবহারের অনুরূপ, এটি কেবল অধ্যবসায় যোগ করে, আপনাকে কুকিজ ইত্যাদি সংরক্ষণ এবং ব্যবহার করতে দেয় etc.

আপনার লগইন প্রচেষ্টা সফল হয়েছে বলে ধরে নেওয়া, আপনি কেবল সাইটের জন্য আরও অনুরোধ করতে সেশন উদাহরণটি ব্যবহার করতে পারেন। আপনাকে চিহ্নিত করা কুকি অনুরোধগুলি অনুমোদনের জন্য ব্যবহৃত হবে।

উদাহরণ

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...

13
প্রশ্নটি তবে, পোষ্ট লগইন ফর্মটি কীভাবে পাবেন? এটিকে ব্যবহারকারীর নাম, USERNAME ইত্যাদির পরিবর্তে inUserName বলা হয় কিনা আমি কীভাবে জানতে পারি?
lshng

4
@ টিউঙ্কল এই ফর্মটির জন্য এইচটিএমএল উত্সটি দেখুন যাতে তারা সেখানে কী নামে ডাকা হয়।
অ্যারন শুমাচার 13

4
s.text কাজ করছে বলে মনে হচ্ছে না, তবে অনুরোধের সাথে আমাকে এই মনোরম দেখানোর জন্য আমি আপনাকে কিছু ভোট দেওয়ার ভালবাসা দিচ্ছি ... বাক্যবিন্যাস
সফটওয়্যার

s.text কাজ করে না কারণ এটি এমন কিছু হওয়া উচিত: p = s.post('LOGIN_URL.....এবং তারপরেp.text
সেবাস্তিয়ান

4
@ হ্যালসিওনআব্রাহাম রামিরেজ আমি মনে করি না যে এটি আপনার কাছে সহায়তা চাইতে সঠিক জায়গা। আমি আপনার বিশেষভাবে চ্যালেঞ্জগুলি সম্পর্কে প্রশ্ন পড়ার পরামর্শ দিচ্ছি: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 21928368/… এবং আপনি যদি এটি সমাধান করতে না পারেন তবে আপনার নিজের প্রশ্নটি খুলুন।
সেবাস্তিয়ান

38

আসুন আমি এটিকে সহজ করার চেষ্টা করি, ধরা যাক সাইটের ইউআরএলটি হ'ল http://example.com/ এবং ধরা যাক আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড পূরণ করে আপনাকে সাইন আপ করতে হবে, তাই আমরা লগইন পৃষ্ঠায় যাচ্ছি http: // উদাহরণ হিসাবে। এখনই com / login.php এবং এটির উত্স কোডটি দেখুন এবং ক্রিয়া URL এর জন্য অনুসন্ধান করুন এটি ফর্ম ট্যাগের মতো হবে

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

এখন নিখুঁত ইউআরএল তৈরির জন্য 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

আমি আশা করি এটি কোনও একদিন কাউকে সহায়তা করে।


4
সুন্দর একটি - নোট করুন যে কখনও কখনও নাম / পাস ক্ষেত্রের উপাদানটি পরীক্ষা করে বোতামের পরিবর্তে কল করা ফাইলটি প্রকাশ করতে পারে (বোতাম পরিদর্শনে আমার কেবল 'অ্যাকশন' বলেছিল, ইউআরএল / পাস ক্ষেত্রগুলি পরিদর্শন করা থেকে ইউআরএল দেখানো হয়েছিল)
বাক্স

4
আপনি যদি ক্রোম ব্যবহার করছেন, নেটওয়ার্ক ট্যাবে ডেভলগুলি খুলুন এবং অনুরোধ করার পরে আপনি কী কী এবং কোথায় প্রেরণ করা হয়েছিল তা দিয়ে প্রকৃত মানগুলি পরীক্ষা করতে পারেন, এটি এমন ফর্মগুলির জন্য দরকারী যা প্রথাগত যান্ত্রিকগুলি ব্যবহার করে না এবং পরিবর্তে ফর্মটি প্রক্রিয়া করতে জাভাস্ক্রিপ্ট / এজ্যাক্স ব্যবহার করুন।
রবার্তো অরোসেমেনা

4
এক্ষেত্রে কীভাবে ওয়েব পৃষ্ঠাকে পৃষ্ঠার সামগ্রী মুদ্রণের পরিবর্তে পপ আপ করবেন তা সম্পর্কে কোনও ধারণা?

আপনাকে 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 শংসাপত্র সহ সাইটগুলিতে লগ ইন করার চেষ্টা করার সময় স্ক্রিপ্ট থেকে যে কোনও আউটপুট নিঃশব্দ করা হবে of

অতিরিক্ত:

ইউএনআইএক্স ভিত্তিক সিস্টেমে কমান্ড লাইন থেকে এই স্ক্রিপ্টটি চালানোর জন্য এটিকে একটি ডিরেক্টরিতে রাখুন, 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 প্রোটেকশন দিয়ে একটি ফর্ম (যেমন বোতল-ডব্লিউটিএফ ফর্ম ব্যবহৃত) লগইন করে সহায়তা করেন। 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)

0

কিছু পৃষ্ঠাগুলিতে লগইন / পাসের চেয়ে বেশি প্রয়োজন হতে পারে। এমনকি লুকানো ক্ষেত্রও থাকতে পারে। সর্বাধিক নির্ভরযোগ্য উপায় হ'ল পরিদর্শন সরঞ্জামটি ব্যবহার করা এবং লগ ইন করার সময় নেটওয়ার্ক ট্যাবটি অনুসন্ধান করা, কোন ডেটা পাস হচ্ছে তা দেখার জন্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.