Авторизация в самодельном клиенте

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Devilwhore
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 3 месяца

Авторизация в самодельном клиенте

Сообщение Devilwhore »

Добрый день всем!

Имеется форум на сервисе MyBB, подающий большие надежды. Однако, стабильность сей платформы оставляет желать лучшего, ибо нормальная работа форума отмечается только в период с 20 до 13 часов GMT... Поэтому было принято решение запустить собственный форум на платном хостинге. Задача - перенести порядка 2.5 тыс. постов со старого форума но новый, осуществить это по-человечески невозможно постольку, поскольку владельцы MyBB отказываются делать дамп базы даже за деньги. Очевидно, единственный способ сделать копию - сохранить старый форум в HTML, разместить посты на новом от имени соответствующих пользователей, после чего выслать пользователям пароли к новому форуму.

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

Для начала: форум довольно снисходительно отнёсся к небольшому хирургическому вмешательству, если более точно - к смене кодировки данных из формы с multipart-formdata на form-urlencoded. При размещении постов из обозревателя всё работает, однако обращения собственного клиента безрезультатны...

Как я понимаю, авторизация происходит путём создания cookie файла с идентификатором сессии и номером пользователя. И то, и другое можно получить в ответе сервера на запрос из формы авторизации.

Запрос:

Код: Выделить всё

POST /forum/ucp.php?mode=login HTTP/1.1
User-Agent: telnet
Host: localhost
Accept: text/html
Connection: Close
Content-Length: 44
Content-Type: application/x-www-form-urlencoded

username=Admin&password=adminpsw&login=Login
Ответ:

Код: Выделить всё

HTTP/1.1 200 OK
Date: Mon, 13 Jun 2011 09:30:36 GMT
Server: Apache/2.0.59 (Win32) PHP/5.1.6
X-Powered-By: PHP/5.1.6
Set-Cookie: phpbb3_j72jd_u=1; expires=Tue, 12-Jun-2012 09:30:36 GMT; path=/; HttpOnly
Set-Cookie: phpbb3_j72jd_k=; expires=Tue, 12-Jun-2012 09:30:36 GMT; path=/; HttpOnly
Set-Cookie: phpbb3_j72jd_sid=f7a681d1c27ed6db069d8d3069474564; expires=Tue, 12-Jun-2012 09:30:36 GMT; path=/; HttpOnly
Set-Cookie: phpbb3_j72jd_u=[b]2[/b]; expires=Tue, 12-Jun-2012 09:30:36 GMT; path=/; HttpOnly
Set-Cookie: phpbb3_j72jd_k=; expires=Tue, 12-Jun-2012 09:30:36 GMT; path=/; HttpOnly
Set-Cookie: phpbb3_j72jd_sid=[b]7b548605a8aae6f57c198e3a28ec3eed[/b]; expires=Tue, 12-Jun-2012 09:30:36 GMT; path=/; HttpOnly
Cache-Control: private, no-cache="set-cookie"
Expires: 0
Pragma: no-cache
Остальные заголовки, думаю, не важны. Непонятны несколькие моменты:
- идентификаторы сессии всё время разные;
- почему их два? (вставляю в запрос на отправку поста второй, ибо он совпадает с идентификаторами в теле документа)
- разумеется, главная проблема: после запроса на размещение поста ничего не просходит...

Вот этот запрос:

Код: Выделить всё

POST /forum/posting.php?mode=reply&f=3&sid=[b]7b548605a8aae6f57c198e3a28ec3eed[/b]&t=2 HTTP/1.1
User-Agent: telnet
Host: localhost
Accept: text/html
Referer: http://localhost/forum/posting.php?mode=reply&f=3&t=2
Cookie: phpbb3_j72jd_u=2; phpbb3_j72jd_k=; phpbb3_j72jd_sid=[b]7b548605a8aae6f57c198e3a28ec3eed[/b]; style_cookie=A++
Connection: Close
Content-Length: 117
Content-Type: application/x-www-form-urlencoded

subject=Re%3A+Hello&message=Hello+again+people&topic_cur_post_id=7&post=Submit&attach_sig=on&creation_time=1307955615
Ошибок в коде клиента нет, ибо при копировании запроса обозревателя (после успешной авторизации) и отправке этого запроса из собственного клиента пост успешно размещается. В чём ошибка? Буду очень благодарна за помощь.
Последний раз редактировалось Devilwhore 13.06.2011 15:43, всего редактировалось 2 раза.
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Авторизация в самодельном клиенте

Сообщение nissin »

Включите в своём клиенте поддержку cookies и не мучайтесь.
А вообще подход не совсем верный. Правильней было было-бы сообщения сразу в БД phpBB закидывать.
Devilwhore
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 3 месяца

Re: Авторизация в самодельном клиенте

Сообщение Devilwhore »

Чтобы можно было включать поддержку cookies, я её должна сначала реализовать... Клиентская программа пишется на Free Pascal с нуля.

Вообще, это будет обычное консольное приложение без особых изысков. Увы, не знаю, как иначе можно сделать копию форума с бесплатного сервиса. Базу не дают. Так что придётся набивать уже существующие посты в новый форум заново. Хотелось бы хоть слегка автоматизаровать этот процесс...

Только представьте: нажать Ctrl+C, Alt+Tab, Ctrl+V, пару раз щёлкнуть мышкой (это мы вошли на форум под неким именем), потом снова Alt+Tab, Ctrl+C, Alt+Tab, Ctrl+V, щёлкнуть мышкой (добавили пост), и ещё три раза щёлкнуть (вышли с форума и вернулись в тему как гость)... И всё это надо повторить примерно 2400 раз. Это же каторга!

Попробую поменять заголовок соединения на Keep-Alive и отсылать запрос на размещение поста сразу после авторизации, о результатах напишу.
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Авторизация в самодельном клиенте

Сообщение nissin »

Реализация сURL для FreePascal тоже имеется.
Devilwhore
phpBB 1.0.0
Сообщения: 3
Стаж: 15 лет 3 месяца

Re: Авторизация в самодельном клиенте

Сообщение Devilwhore »

nissin
Не вижу разницы между отправкой сообщения при помощи cURL и отправкой путем передачи составленного вручную HTTP-запроса через TCP/IP сокет. Результат тот же: удаётся войти на форум (при входе на форум через обозреватель под именем Admin отображается, что в данный момент на форуме Admin и пользователь, имя которого было указано при вызове cURL), однако не удаётся разместить сообщение. Не могу понять, почему это не работает...

Команда на авторизацию:

Код: Выделить всё

curl.exe -v -d "username=user&password=userpsw&login=Login" --no-keepalive -o authcmd.out http://localhost/forum/ucp.php?mode=login
Команда на отправку:

Код: Выделить всё

curl.exe -v -d "subject=Re:+hello&message=sent+by+curl" -b "phpbb3_j72jd_u=54; phpbb3_j72jd_k=; phpbb3_j72jd_sid=3c70c2b64dff69b0221e043edac45325" --no-keepalive -o sendcmd.out "http://localhost/forum/posting.php?mode=reply&f=3&t=2"
Информация cookie берётся из ответа сервера на первый запрос. Если вместо ключа -d указать -F, то сервер сначала отвечает 100 (Continue), затем 200 (OK) и продолжает отправку ответа. С ключом -d ответ сервера сразу 200. Однако, ни в том, ни в другом случае, размещения поста не происходит...
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Авторизация в самодельном клиенте

Сообщение nissin »

Копайте в сторону: -c, --cookie-jar <file name>
Самой собой, cookies должны быть правильно настроены на сервере. Если это не так, то придётся отслеживать редиректы для вычисления SID.

Вернуться в «Поддержка phpBB 3.0.х»