Проблема с воссозданием XMLHttpRequest через Python Requests и Postman - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь сократить ссылки на bit.do, используя Python или Postman. bit.do url shortener form В Chrome все отлично работает. Но не с Python / Почтальон. Я получаю страницу, но есть только ошибка, однако запрос от Chrome и запрос, который я пытаюсь сделать, выглядит одинаково. При использовании Chrome Dev Tools были получены два POST-запроса, оба с именем url-shortener.pl. Вот эти запросы (ТАК заставил меня не использовать ссылки с сокращителями URL, поэтому мне пришлось их избегать.):

General:
Request URL: https://bit\.do/mod_perl/url-shortener.pl
Request Method: POST
Status Code: 200 
Remote Address: 54.83.52.76:443
Referrer Policy: no-referrer-when-downgrade

Response Headers:
content-type: application/json
date: Sat, 20 Apr 2019 20:12:06 GMT
server: nginx/1.14.1
status: 200

Request Headers:
:authority: bit\.do
:method: POST
:path: /mod_perl/url-shortener.pl
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7
content-length: 112
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: permasession=1554914974|phkaoymp1b; __utmc=60667454; __utma=60667454.372171702.1554914974.1555785612.1555789898.5; __utmz=60667454.1555789898.5.4.utmcsr=dynomapper.com|utmccn=(referral)|utmcmd=referral|utmcct=/blog/21-sitemaps-and-seo/495-top-14-url-shorteners; __utmt=1; __utmb=60667454.3.10.1555789898
origin: https://bit\.do
referer: https://bit\.do/
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
x-requested-with: XMLHttpRequest

Form Data:
action: shorten
url: google.com
url2:  site2 
url_hash: 
url_stats_is_private: 0
permasession: 1554914974|phkaoymp1b


General:
Request URL: https://bit\.do/mod_perl/url-shortener.pl
Request Method: POST
Status Code: 200

Response Headers: 
Remote Address: 54.83.52.76:443
Referrer Policy: no-referrer-when-downgrade
content-type: application/json
date: Sat, 20 Apr 2019 20:12:06 GMT
server: nginx/1.14.1
status: 200

Request Headers:
:authority: bit\.do
:method: POST
:path: /mod_perl/url-shortener.pl
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7
content-length: 32
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: permasession=1554914974|phkaoymp1b; __utmc=60667454; __utma=60667454.372171702.1554914974.1555785612.1555789898.5; __utmz=60667454.1555789898.5.4.utmcsr=dynomapper.com|utmccn=(referral)|utmcmd=referral|utmcct=/blog/21-sitemaps-and-seo/495-top-14-url-shorteners; __utmt=1; __utmb=60667454.3.10.1555789898
origin: https://bit\.do
referer: https://bit\.do/
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
x-requested-with: XMLHttpRequest

Form Data:
action: get_title
url_id: 49444432

Сначала я попробовал с Почтальоном. Params: postman post request parameters Заголовки: postman post request headers Предварительный просмотр ответа: postman response preview В результате: ОШИБКА: Неверный URL. Пожалуйста, введите действительный адрес URL. Затем я переключился на Python и попробовал с запросами.

def bitdo():
    headers = {
        'accept': '*/*',
        'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7',
        'content-length': '112',
        'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'cookie': 'permasession=1554914974|phkaoymp1b; __utmc=60667454; __utma=60667454.372171702.1554914974.1555785612.1555789898.5; __utmz=60667454.1555789898.5.4.utmcsr=dynomapper.com|utmccn=(referral)|utmcmd=referral|utmcct=/blog/21-sitemaps-and-seo/495-top-14-url-shorteners; __utmt=1; __utmb=60667454.3.10.1555789898',
        'origin': 'https://bit\.do',
        'referer': 'https://bit\.do/',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    params = {
        'action': 'shorten',
        'url': 'ya.ru',
        'url2': 'site2',
        'url_hash': '',
        'url_stats_is_private': 0,
        'permasessions': '1554914974|phkaoymp1b'
    }

    r = requests.post('https://bit\.do/mod_perl/url-shortener.pl', params, headers=headers)
    print(r.text)

И ответ был:

Warning

<!-- head.thtml -->





a { color: #338; text-decoration: none; }

html {
 height: 100%;
}

body {
 font-family: Arial;
 margin: 0;
 height: 100%;
 color: #404040;
}

.url {
 background-color: #f9f9f9;
 width: 100%;
 height: 16px;
 border: 1px solid #654;
 padding: 3px;
}

.round {
 background-color: white;
 border: 1px solid #bbb;
 margin-bottom: 10px;
 -moz-border-radius: 15px;
 -webkit-border-radius: 15px;
 border-radius: 15px;
 width: 100%;
 max-width: 840px;
}

.input-placeholder {
 position: absolute;
 font-style: italic;
 color: #aaa;
 margin: 0.3em 0 0 0.5em;
}

.orange_logo {
  color: #fab035;
}

.orange_text {
 color: #D04000;
}

.orange_dot {
 color: #ff8800;
 margin-left: 10px;
}


.table-striped > tbody > tr:nth-child(odd) {
  background-color: #efefef;
}

.table1 {
 border-spacing: 0;
 border-collapse: collapse;
}

.table1 th {
 text-align: center;
}

.table1 td, .table1 th {
 border: 1px solid #a0a0a0;
 padding: 5px;
}

.bitbox {
 width: 100%;
}

/* first td should have minimal width */
.bitbox td:first-child {
 width: 12px;
 padding-right: 12px;
 white-space: nowrap;
}








URL Shortener - bit.do --> bit.do - URL Shortener --> Login to manage your links -->
  Warning  

↩ Вернуться к bit.do (сокращение URL)

<! - / таблица все ->

Подписывайтесь на нас в Твиттере: & nbsp;



Сократите и персонализируйте длинные веб-адреса. Получайте статистику трафика по вашим ссылкам в реальном времени. Бесплатный сервис.
bit.do - home | почему bit.do лучше | о нас | о сокращении URL | контакт FAQ | условия | ->

Авторское право и копирование; 2019 - Insite

<! - / foot -> <! - / высота 100% -> <! - ТОДО: УЖЕ ЗАГРУЖЕН? -> var _gaq = _gaq || []; _gaq.push (['_setAccount', 'UA-756399-13']); _gaq.push ([ '_ trackPageview']); (function () { var ga = document.createElement ('script'); ga.type = 'text / javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol? 'https://ssl':' http://www') + '.google-analytics.com / ga.js'; var s = document.getElementsByTagName ('script') [0]; s.parentNode.insertBefore (ga, s); }) (); <! - КОНЕЦ erro.thtml ->

ОШИБКА site2: Невозможно создать короткую ссылку. Свяжитесь с нами для использования API.

Я ожидаю получить сокращенные ссылки внутри ответа HTML. Может кто-нибудь объяснить мне, что не так с запросами, которые я сделал?

1 Ответ

2 голосов
/ 21 апреля 2019

Кажется, минимальный рабочий код.

Требуется заголовок 'X-Requested-With', потому что это запрос AXAJ / XHR.

Требуется permasession, но сначала GET не отправляет его, поэтому, вероятно, он генерируется на странице с помощью JavaScript. Но у меня это работает с одним и тем же permasession все время.

Возможно, позже понадобится новый / свежий permasession

Есть пробелы в " site2 "

import requests

headers={
    'X-Requested-With': 'XMLHttpRequest', # need it
}

data = {
    'action': 'shorten',
    'url': 'https://onet.pl',
    'url2': ' site2 ', # need spaces 
    'url_hash': None,
    'url_stats_is_private': 0,
    'permasession': '1555801674|ole2ky65f9', # need it
}

r = requests.post('http://bit\.do/mod_perl/url-shortener.pl', headers=headers, data=data)

print(r.status_code)
print(r.json())

Это не нужно requests.Session(), ни User-Agent, ни GET запрос при запуске.


РЕДАКТИРОВАТЬ: значение 1555801674 в 'permasession': '1555801674|ole2ky65f9' является меткой времени с текущей датой и временем.

import datetime

datetime.datetime.fromtimestamp(1555801674)

datetime.datetime(2019, 4, 21, 1, 7, 54)

Может быть, ole2ky65f9 также является меткой времени, но как сокращенное значение.

...