HTTP-запрос для получения страницы с помощью Special:Export

Как я могу использовать Special:Export для своих целей. Я отправляю следующий заголовок из своего приложения:

string request = "POST en.wikipedia.org/w/index.php?title=Special:Export&action=submit HTTP/1.1\r\n"
                 "Host: en.wikipedia.org\r\n"
                 "Content-Length: 32\r\n"
                 "Content-Type: application/x-www-form-urlencoded\r\n"
                 "Connection: close\r\n\r\n"
                 "catname=&pages=ukraine&curonly=1";

но он отображает мне страницу об ошибке:

HTTP/1.0 400 Bad Request Server: squid/2.7.STABLE9 Дата: понедельник, 23 апреля 2012 г. 14:45:12 GMT Тип содержимого: text/html Длина содержимого: 3111 X-Squid-Error: ERR_INVALID_URL 0 X-Cache: MISS из amssq46.esams.wikimedia.org X-Cache-Lookup: NONE из amssq46.esams.wikimedia.org:80 Соединение: близко

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

EDITED: я использую С++ и сокеты.

EDITED: новый запрос:

string request = "POST https://en.wikipedia.org/w/index.php?title=Special:Export&action=submit HTTP/1.1\r\n"
//string request = "GET https://en.wikipedia.org/w/index.php?title=Special:Export&pages=ukraine&curonly=1\r\n"
                 "Host: en.wikipedia.org\r\n"
                 "User-Agent: MyCoolTool\r\n"
                 "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
                 "Accept-Language: en-us,en;q=0.5\r\n"
                 "Accept-Encoding: gzip, deflate\r\n"
                 "Content-Length: 32\r\n"
                 "Content-Type: application/x-www-form-urlencoded\r\n"
                 "Connection: close\r\n\r\n"
                 "catname=&pages=Ukraine&curonly=1";

Когда я пытаюсь получить только страницу

string request = "GET http://en.wikipedia.org/wiki/Ukraine\r\n" ...
                 "User-Agent: YolaTool/0.1\r\n" ...

я имею

Скрипты должны использовать информативную строку User-Agent с контактной информацией, иначе они могут быть заблокированы по IP-адресу без предварительного уведомления.


person Yola    schedule 23.04.2012    source источник
comment
Какой язык вы используете? Возможно, уже есть какая-то библиотека для этого. И почему вы пишете сырые HTTP-запросы? Разве в вашей среде нет лучшего способа делать HTTP-запросы?   -  person svick    schedule 23.04.2012
comment
@svick, заголовок есть заголовок, язык не имеет значения.   -  person Yola    schedule 23.04.2012


Ответы (1)


Есть причина, по которой я предложил вам использовать сетевую библиотеку более высокого уровня, которая напрямую поддерживает HTTP: таким образом, вам не придется иметь дело с низкоуровневыми деталями, и вы можете быть уверены, что они верны.

В вашем случае проблема в том, что после ключевого слова POST должен быть либо абсолютный URI:

POST http://en.wikipedia.org/w/index.php?title=Special:Export&action=submit HTTP/1.1

или, чаще, абсолютный путь:

POST /w/index.php?title=Special:Export&action=submit HTTP/1.1

См. RFC 2616, §5.1.2.

Если вы исправите это, вы получите ошибку 403, но на этот раз в сообщении об ошибке ясно указано, что делать, чтобы это исправить:

Скрипты должны использовать информативную строку User-Agent с контактной информацией, иначе они могут быть заблокированы по IP-адресу без предварительного уведомления.

См. политику WikiMedia User-Agent.

person svick    schedule 23.04.2012
comment
я обновил вопрос, и мне нужно где-то зарегистрировать мой бот-User-Agent? - person Yola; 30.04.2012
comment
Нет, не знаешь. Вы можете поместить туда почти что угодно, если это не соответствует ни одному из распространенных заблокированных пользовательских агентов (например, пользовательскому агенту по умолчанию для wget). - person svick; 30.04.2012
comment
это все еще не работает, но +1)) может быть проблема в IP, вы знаете правильный IP, чтобы спросить спец: экспорт, я использую 91.198.174.225 - person Yola; 02.05.2012
comment
Что бы ни возвращал DNS-поиск en.wikipedia.org, должно быть все в порядке. - person svick; 02.05.2012