Добрый день. Может есть специалисты в Питоне - уже неделю не могу подружиться с одним сервисом: они не знают php, а не врубаюсь в нюансы python. Суть такая: проходим POST-авторизацию логин/пароль, получаем в ответ ОК и куки. Дальше делаем GET-запрос по получению инфы из базы с парой куков. Делал с помощью curl - авторизация ОК, куки получаю, пишу в файл, делаю запрос, а в ответ: "methodStatus":"AccessDenied"..." Поддержка говорит, что дело в куках и присылает такой пример рабочего кода: Код (Text): # -*- coding: utf-8 -*- import requests import logging import sys import ujson class Logger(object, ): def __init__(self, level): self.levels = {'debug': logging.DEBUG, 'warning': logging.WARNING, 'info': logging.INFO, 'error': logging.ERROR} self.log_format = '[%(asctime)s] # %(levelname)-8s %(message)s' logging.basicConfig(format=self.log_format, level=self.levels[level] if level in self.levels else None) @staticmethod def format_msg(func_name, msg): return '[method: {}] {}'.format(func_name, str(msg)) def debug(self, msg): logging.debug(msg=self.format_msg(sys._getframe(1).f_code.co_name, msg)) def warning(self, msg): logging.warning(msg=self.format_msg(sys._getframe(1).f_code.co_name, msg)) def error(self, msg): 38 logging.error(msg=self.format_msg(sys._getframe(1).f_code.co_name, msg)) def info(self, msg): logging.info(msg=self.format_msg(sys._getframe(1).f_code.co_name, msg)) class SeldonApi(object): def __init__(self, user, password, log_level): self._user = user self._password = password self._cookies = None self._restApiAddres = u'- https://basis.myseldon.com/api/rest/' self._log = Logger(level=log_level) def _get_url_request(self, method): return self._restApiAddres + method # + paramsInString if params else u'' @staticmethod def _get_params(**kwargs): params_in_string = '&'.join([i + '=' + str(kwargs[i]) for i in kwargs]) return params_in_string @staticmethod def _post_params(**kwargs): return dict(kwargs) def _get_request(self, method, inline_data_string): if inline_data_string: url = '{}/?{}'.format(self._get_url_request(method), inline_data_string) else: url = self._get_url_request(method) request = requests.get(url=url, cookies=self._cookies) 39 return request def _post_request(self, method, data): url = self._get_url_request(method) request = requests.post(url=url, data=data, cookies=self._cookies) return request def login(self): result = self._post_request(method='login', data=self._post_params(UserName=self._user, Password=self._password)) self._cookies = result.cookies self._log.debug('response code {}'.format(result.status_code)) return result.content def check_balance(self): result = self._get_request(method='check_balance', inline_data_string=None) return result.content def get_company_card(self, ogrn): inline_params = self._get_params(ogrn=ogrn) result = self._get_request(method='get_company_card', inline_data_string=inline_params) self._log.debug('response code {}'.format(result.status_code)) return result.content def find_company_by_inn(self, inn): inline_params = self._get_params(inn=inn) result = self._get_request(method='find_company', inline_data_string=inline_params) 40 self._log.debug('response code {}'.format(result.status_code)) return result.content api = SeldonApi(user='user', password='password', log_level='debug') api.login() finded = ujson.loads(api.find_company_by_inn('7701904600')) for company in finded['companies_list']: ogrn = company['basic']['ogrn'] api._log.debug('Finded: {}'.format(ogrn)) company_card = ujson.loads(api.get_company_card(ogrn=ogrn)) api._log.debug('Card Status: {}'.format(company_card['status']['methodStatus']))
В описании все стандартно: Название метода в соответствии с документацией, например, «find_company». Название не чувствительно к регистру. Список параметров, например, «?Name=имя®ionCode=77». o Список параметров отделяется от названия метода с помощью знака «?». o Наименования параметров должны соответствовать указанным в описании соответствующего метода (без учета регистра). o Значения параметров отделяются знаком «=». Пары параметр-значение соединяются с помощью знака «&» Для авторизации используется метод POST, для вызова остальных методов GET. При авторизации сервис возвращает куки, при дальнейших вызовах в заголовках необходимо указывать полученные UserConnect, .NAUTH.
Это ты делаешь? Вот это уже странно, так как cookie обычно они сами и присылают и их отправляют обратно без изменений Можешь у них попросить http запросы с заголовками в качестве примера, может по ним тебе будет проще
Да если бы - я б уже все сделал. Потому и ищу Питоновцев - чтобы помогли разгадать сею загадку. --- Добавлено --- Вот, только что получил ответ (3 дня писали))): Надо передавать авторизационные куки (2 обязательных параметра) отдельным заголовком в запросе GET, на С примерно так GET .../api/rest/get_event_list?listNo=2&shift=0 HTTP/1.1 Host: base.mysite.com Cookie: .NAUTH = 082C1523ACBED05A... UserConnect = c6490665-53da-48...) Connection: Keep-Alive Я отправляю им так и ни чего: curl_setopt ($ch, CURLOPT_COOKIE, "UserConnect=63f8121a-...; .NAUTH=E52E535120D420..."); --- Добавлено --- И так тоже пробовал: curl_setopt ($ch, CURLOPT_COOKIEJAR, 'coockie.txt'); curl_setopt ($ch, CURLOPT_COOKIEFILE, 'coockie.txt');
Автор, ты цитируя код ещё и отступы сломал. Без них питон не питон. Не торопись и не косячь, наверняка всё дело в простой невнимательности. Не надо усложнять.
@BigHawkPro, верни отступы в питоне, скинь ссылку на их api/сайт/или_что_там_у_них_есть и покаж свой код на php
Я их не удалял - они здесь при вставке ушли. Мой код такой: PHP: function Request_Seldon ($inn) { $url_construct = ".../api/rest/find_company?inn=".$inn; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url_construct); curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_HTTPGET, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_COOKIE, "UserConnect=63f8121a-74; .NAUTH=E52E53512FF7EF054A207E90514036EB183A4C57EAB629F7D889"); $result1 = curl_exec ($ch); curl_close($ch); return $result1; }
@BigHawkPro, ну так расставь их, как они должны быть. Как по-твоему люди должны читать питон-код без пробелов? Угадывать?
@BigHawkPro странно, так как в code все отступы у других работает, можешь файл в архив zip и прикрепить к сообщению
Не увидел, где прикладывать фалы --- Добавлено --- видимо из-за того, что код копировался из pdf - там наверное отступы не копируются
Был в отъезде. Мне прислали файл в pdf: пример на Питоне Может кто поможет - очень надо подружиться с сервисом.
Я этот тред буду совать прям в лицо теперь каждому, кто при мне будет говорить о том, что фигурные скобки не нужны, отступы в качестве регуляторов вложенности кода рулят, минимализм вперде и тд.
С удовольствием, но есть только в таком виде - отступы не копируются, а то в Питоне оказывается важно. А сидеть и вручную переставлять отступы не совсем понимая кода - думаю не самая лучшая затея. Потому так - если кто-то вызовется помочь, кто разбирается в теме и нужно будет отступы проставить "руками", то конечно же я это сделаю... Но пока все не по существу, к сожалению - один коллега с форума попробовал помочь (за что ОГРОМНЫЙ респект), но тоже не справился, как и я.