Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 26, 2015 15:03:18

dato
Зарегистрирован: 2015-04-26
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сделать Авторизацию на сайте с последующими запросами

Изменяю скрипт одной программы (она использует Python 2.7.6)но столкнулся с проблемой
авторизации на сайте переводчика которого пробую добавить
сайт yarp-online.ru

в данный момент скрипт работает следующим обзором
я в ручную авторизируюсь на сайте смотрю через Fiddler PHPSESSID
и вставляю в скрипт, в программе все работает , но PHPSESSID устаревает через какое-то время
мне надо чтобы в скрипте можно было указать логин пароль и чтоб полученный PHPSESSID отправлялся с последующим запросам

главное ограничение надо не выходить за рамки requests,cookielib, urllib2, urllib


весь скрипт

# coding: utf-8
# worldtrans.py
# 7/5/2012 jichi
#
# URLs
if __name__ == '__main__':
  import sys
  sys.path.append('..')
import re, requests
from sakurakit.skdebug import dwarn, derror
from sakurakit.sknetdef import GZIP_HEADERS
from sakurakit.skstr import unescapehtml
import pprint
import base64
import string
import cookielib, urllib2, urllib
from sakurakit import skstr
session = requests # global session
def _LANG(lang):
  """
  @param  lang  str
  @return  str
  """
  return 'ru' if lang == '' else lang
  
 	
url = 'http://yarp-online.ru/' # сайт переводчика
yarp_TEXT_START = '<div id="result" style="height:95px" >' 
yarp_TEXT_STOP = '<'
def api(to='ru', fr=''):
  """
  @return  str
  @raise  KeyError
  """
  FR, TO = fr.upper(), to.upper()
  langs = fr, to
  if 'ru' in langs:
    return ''.join((url, "",))
#
def translate(text, to='ru', fr=''):
  """Return translated text, which is NOT in unicode format
  @param  text  unicode not None
  @param  fr  unicode not None, must be valid language code
  @param  to  unicode not None, must be valid language code
  @return  unicode or None
  """
  try:
    r = session.post(api(to, fr),
	
      headers = { 
	    'src': text,
        'Host': 'yarp-online.ru',
        'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0',
        'Accept':'Language: ru-ru,ru;q=0.8,uk;q=0.6,en-us;q=0.4,en;q=0.2',
        'Accept':'Encoding: gzip, deflate',
        'Cookie': 'PHPSESSID=', #сюда вставляю PHPSESSID из Fiddler
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0' 
		},
data = {
  'src': text
})     
    #r = requests.get(url, data=json.dumps(payload), headers=headers)	  		
 
	
    #print r.headers['Content-Type']
    ret = r.content
    if r.ok:
      ret = skstr.findbetween(ret, yarp_TEXT_START, yarp_TEXT_STOP)
      ret = ret.decode('utf8', errors='ignore')
      ret = skstr.unescapehtml(ret)
      return ret
  
  
  
  
  except socket.error, e:
    dwarn("socket error", e.args)
  except requests.ConnectionError, e:
    dwarn("connection error", e.args)
  except requests.HTTPError, e:
    dwarn("http error", e.args)
  #except UnicodeDecodeError, e:
  #  dwarn("unicode decode error", e)
  except KeyError, e:
    dwarn("language error", e)
  #except KeyError, e:
  #  dwarn("invalid response header", e.args)
  except Exception, e:
    derror(e)
  dwarn("failed")
  try: dwarn(r.url)
  except: pass
  return ""
if __name__ == '__main__':
  t = translate(u"あのね\nすもももももももものうち!", 'zht')
  import sys
  from PySide.QtGui import *
  a = QApplication(sys.argv)
  w = QLabel(t)
  w.show()
  a.exec_()
# EOF

Отредактировано dato (Апрель 29, 2015 18:34:00)

Офлайн

#2 Апрель 26, 2015 15:59:50

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Как сделать Авторизацию на сайте с последующими запросами

а зачем вы вот это делаете?

dato
session = requests # global session

Session Objects

Офлайн

#3 Апрель 29, 2015 12:54:14

dato
Зарегистрирован: 2015-04-26
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сделать Авторизацию на сайте с последующими запросами

увы я сам не знаю, код изначально не мой, я оставил старую часть с которой мои изменения работали,

знаю только что если эту строку удалить работать не будет.

мои изменения только в этих частях

url = 'http://yarp-online.ru/' # сайт переводчика
yarp_TEXT_START = '<div id="result" style="height:95px" >' 
yarp_TEXT_STOP = '<'

  try:
    r = session.post(api(to, fr),
	
      headers = { 
	    'src': text,
        'Host': 'yarp-online.ru',
        'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0',
        'Accept':'Language: ru-ru,ru;q=0.8,uk;q=0.6,en-us;q=0.4,en;q=0.2',
        'Accept':'Encoding: gzip, deflate',
        'Cookie': 'PHPSESSID=', #сюда вставляю PHPSESSID из Fiddler
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0' 
		},
data = {
  'src': text
})     
    ret = r.content
    if r.ok:
      ret = skstr.findbetween(ret, yarp_TEXT_START, yarp_TEXT_STOP)
      ret = ret.decode('utf8', errors='ignore')
      ret = skstr.unescapehtml(ret)
      return ret

английский слишком плохо знаю чтобы сверятся с сайтом с понять что именно не так.

попробовал еще разобраться и вот что выяснилось

есть подозрение что у меня проблема с авторизацией из-за пароля
так как в форме нету у него value
форма
<form id="lfo" action="logon.php" method="POST" autocomplete="off">
<input name="Response" type="hidden">
<table cellspacing="0">
<tbody>
<tr><th>Адрес эл. почты:</th><td><input name="Email" type="text" maxlength="250" value=""></td></tr>
<tr class="odd"><th>Пароль:</th><td><input name="Password" type="password" maxlength="500"></td></tr>
<tr><th>&nbsp;</th><td><input name="Persistent" class="cr" type="checkbox" value="Y">Запомнить меня</td></tr>
</tbody>
<tfoot>
<tr><td></td><td><input onclick="OnLogon();" type="submit" value="Вперед"></td></tr>
<tr><td></td><td><a href="forgotpwd.php">Восстановить забытый пароль</a><br>
</td></tr>
</tfoot>
</table>
</form>

еще понял что там используется js
<script language="javascript" src="static/logon.js?v=1" type="text/javascript"></script>

код этого js
function trim(s)
{
    var c;
    while(s.length && ((c = s.substr(0, 1)) == ' ' || c == '\t' || c == '\n' || c == '\r'))
        s = s.substr(1);
    var n;
    while((n = s.length) && ((c = s.substr(n-1, 1)) == ' ' || c == '\t' || c == '\n' || c == '\r'))
        s = s.substr(0, n-1);
    return s;
}
function OnLogon()
{
	var f = document.getElementById("lfo");
	var username = f.Email.value;
	var password = f.Password.value;
	f.Password.value = "";
	try
	{
		var InnerHash = hex_sha512("Tsubomi" + trim(username).toLowerCase() + password);
		f.Response.value = hex_sha512(Challenge + InnerHash);
	}
	catch(e)
	{
		f.Password.value = password;
	}
}
function OnLoad()
{
    //var f = document.forms[0];
    //(f.Email.value.length ? f.Password : f.Email).focus();
    if(typeof(UKey) == "string")
        document.getElementById("oidf").UKey.value = UKey;
    if(window.name != null && window.name.substr(0, 2) == "UI")
        document.getElementById("oidf").WNUKey.value = window.name.substr(2);
}


как в таком случае ввести пароль в форму не представляю.

Если это все таки нельзя сделать использую тока requests,cookielib, urllib2, urllib
буду рад увидеть решения используя что-нибудь другое.

Отредактировано dato (Апрель 29, 2015 13:00:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version