2015-08-24 2 views
2

Я новичок в python и пытаюсь переписать скрипт php, который у меня есть на Python, используя библиотеку запросов. Тем не менее, мне тяжело.Попытка конвертировать скрипт php curl в python с использованием запросов

Сценарий в основном регистрируется на определенном веб-сайте, используя завиток, для которого требуется пользователь/пропуск. PHP код ниже:

$username = 'user'; 
$password = 'pass'; 
$cookie_file_path = "cookie.txt"; 

$loginurl = "http://www.example.com/login"; 
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12)  Gecko/20050915 Firefox/1.0.7"; 

$ch = curl_init(); 

// extra headers 
$headers[] = "Accept: */*"; 
$headers[] = "Connection: Keep-Alive"; 

// curl options 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 

// set first URL 
curl_setopt($ch, CURLOPT_URL, $loginurl); 

// start session and get cookies 
$content = curl_exec($ch); 

//set params 
$fields = array(); 
$fields['p'] = ""; 
$fields['dest'] = ""; 
$fields['username'] = $username; 
$fields['password'] = $password; 

$loginurl = "https://www.example.com/login"; 

// set postfields 
$POSTFIELDS = http_build_query($fields); 

// set to login url 
curl_setopt($ch, CURLOPT_URL, $loginurl); 

// set post options 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS); 

// perform login 
$result = curl_exec($ch); 

И это мой питон код:

import requests 

class Login(): 

def Login(): 
    username = "user" 
    password = "pass" 

    with requests.Session() as s: 
     cookiePath = "cookie.txt" 
     loginUrl = "http://www.example.com/login" 
     headers = {"Accept": "*/*", "Connection": "Keep-Alive"} 

     resp = s.get(loginUrl) 

     params = {"p": "", "dest": "", "username": username, "password": password} 
     loginUrl = "https://www.example.com/login" 

     resp = s.post(loginUrl, params) 

if __name__ == '__main__': 
    Login() 

Я не совсем уверен, что это происходит не так. Во время отладки я печатаю заголовок и код состояния, и он выглядит нормально. Я где-то читал, что библиотека запросов обрабатывает файлы cookie для вас, поэтому я предполагаю, что мне не нужно ничего с ними делать, но я но уверен, что у меня такое чувство, что все идет не так.

+0

Вы определяете 'dict' заголовков, но не используете его. Вы также пропустили заголовок User Agent из версии python. Вы можете проверить 'resp.history', чтобы узнать, были ли выпущены какие-либо переадресации. Кроме этого, вы можете проверить журналы в целевом приложении входа, если у вас есть к ним доступ. –

+0

Также вы имели в виду 'if __name__ == '__main__': Login(). Login()'? Класс 'Login' имеет метод' Login', который выполняет фактическую работу. –

ответ

1

Я не уверен, что это будет точная проблема, но вы, кажется, не отправляете headers на запрос , и ни вы настройки агента пользователя в заголовках Попробуйте сделать это -..

headers = {"Accept": "*/*", "Connection": "Keep-Alive", "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12)  Gecko/20050915 Firefox/1.0.7"} 

resp = s.post(loginUrl, params, headers=headers) 
+0

Я включил это, все еще не в состоянии войти в систему. – ygetarts

+0

попробуйте распечатать, вы получите от этого, это статус '200'? –

1

в файле PHP, вы передаете печенье в запросе, которые хранятся в файле Но в вашей реализации питона вы не передавали файлы cookie (и заголовки). Я думаю, что самый простой способ для вашего дела - поместить файлы cookie непосредственно в ваш код в качестве словаря, например:

cookies = {'key': 'value'} 

resp = s.post(loginUrl, params=params, headers=headers, cookies=cookies) 
+0

Имеет ли это какое-либо отношение к curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, 1); ? Это необходимо для работы скрипта php. Я просто попробовал что-то подобное с запросами, используя resp = s.get (loginUrl, allow_redirects = True), но это, похоже, не работает. – ygetarts

+0

И я попытался сохранить файлы cookie, но cookie устанавливается как гость, что неверно и означает, что я не вошел в систему. – ygetarts

+0

Запросы следует за перенаправлениями по умолчанию http://docs.python-requests.org/ ан/последние/пользователь/Быстрый старт/# перенаправление-и-истории –

Смежные вопросы