Создание сообщений на форумах Викии с использованием HTTParty и Ruby

Я пытаюсь использовать Ruby вместе с HTTParty, чтобы опубликовать сообщение на форуме Wikia. Доступной документации нет, так как процесс, похоже, задействует внутренний API Wikia, поэтому я пытался использовать Chrome Dev Tools, чтобы увидеть сделанные запросы.

Насколько я могу судить, когда пользователь пытается оставить комментарий в ветке форума, на адрес .wikia.com/wikia.php отправляется POST-запрос со следующими параметрами:

  • контроллер = WallExternal
  • метод = ответить на сообщение
  • parent=(идентификатор родительского потока, например 1036301)
  • body="отправляемое сообщение"
  • токен=изменить токен*

Для этого процесса требуется токен редактирования, который я получаю с помощью обычного API Mediawiki. Проблема, с которой я столкнулся, заключается в том, что я получаю ответ

«Похоже, возникла проблема с сеансом входа в систему; это действие было отменено в качестве меры предосторожности против перехвата сеанса. Вернитесь на предыдущую страницу, перезагрузите эту страницу и повторите попытку».

Поиск в Google с использованием сообщения об ошибке выдает только тех, у кого это появилось при попытке входа в систему в обычном режиме, что не является проблемой в этой ситуации.

Я подумал, что проблема может быть в том, что заголовки для пользователя не были установлены в запросе, поскольку я не думаю, что анонимным редакторам разрешено публиковать ответы; поскольку в документации Mediawiki говорится, что пользователи, которые не вошли в систему, получают токен редактирования «+\», похоже, это не так.

Код, который я пытаюсь использовать:

    @api = MediaWiki::Gateway.new 'http://example.wikia.com/api.php'
    @api.login('username', 'password')
    @headers = {
      'User-Agent' => 'example',
      'Cookie' => @api.cookies.map { |k, v| "#{k}=#{v};" }.join(' ')
    }

    query = HTTParty.post('http://example.wikia.com/api.php',
      :body => {
        'action' => 'query',
        'prop' => 'info|revisions',
        'intoken' => 'edit',
        'titles' => 'Thread:2219',
        'format' => 'json'
      },
      :headers => @headers
    )

    token = JSON.parse(query.body)
    token = token["query"]["pages"]["-1"]["edittoken"]

    query = HTTParty.post('http://example.wikia.com/wikia.php',
      :body => {
        'controller' => 'WallExternal',
        'method' => 'changeThreadStatus',
        'format' => 'json',
        'msgid' => '2219',
        'newState' => 'close'
      },
      :headers => @headers
    )

Викия в настоящее время использует Mediawiki 1.19.24, поэтому метод получения маркера редактирования является более старой версией.

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


person Matt    schedule 05.05.2016    source источник


Ответы (1)


Вы видите ошибку, связанную с CSRF (подделка межсайтового запроса), потому что вы не можете правильно использовать «токен».

Вероятно, это сделано намеренно от имени создателя сайта MediaWiki. Вы не сможете выполнить POST, если не передадите правильный токен, который показывает, что форма отправляется из правильного источника HTML-страницы. Этот токен создается сервером, и вам может быть сложно извлечь его для использования с вашими HTTParty-запросами. Однако вы можете просмотреть DOM, чтобы найти какое-то значение.

Я бы, вероятно, рекомендовал использовать Selenium в качестве альтернативы. Поскольку для этого используется правильный экземпляр браузера, вам не придется иметь дело с анализом ответов HTML и созданием пользовательских сообщений. Вместо этого вы можете написать код, чтобы посетить сайт вики, войти в систему и отправить форму «нового сообщения».

Имейте в виду, что иногда веб-сайты имеют средства защиты, чтобы избежать такой автоматизации. Если вы обнаружите, что это происходит (например, вы не можете использовать Selenium для входа в систему), может быть полезно разместить точки останова в коде selenium, щелкнуть в браузере, а затем пройти мимо точки останова, чтобы запустить дополнительный код.

При всем при этом, поскольку существует MediaWiki API, лучше использовать этот интерфейс как можно чаще. т.е. возможно, нет необходимости использовать HTTP-клиент или безголовый браузер, если гем может удовлетворить ваши потребности.

person max pleaner    schedule 05.05.2016
comment
Спасибо за ваш ответ. Я постараюсь взглянуть на Selenium, когда у меня будет возможность. Что касается вашего последнего пункта, я почти уверен, что это невозможно сделать с помощью API MediaWiki, поскольку расширение форумов было сделано Wikia (я должен был сделать это яснее). - person Matt; 05.05.2016