Я пытаюсь использовать 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, и один из пользователей посоветовал мне зайти сюда. Спасибо за любую помощь, которую вы можете предоставить.