今年の春にSFCで動かしていたMovableType3.2が調子悪くなって、さくらに置いたWordPressに移行したわけだけど(さくらレンタルサーバ+wordpressにしてみた
その時に過去ページのいくつかが見えなくなる不具合があった。んで今朝からそれを解消するスクリプトを動かしている。今1000件目あたり。昼過ぎには完了するはず。

どういう不具合かというと、wordpressにログインしていない人がアクセスしたページは404ステータスになる。apacheが吐く404ではなくwordpressが吐く404で、「エラー 404 – 見つかりませんでした」と出る。ログインしていると普通に記事を見る事が出来る。
このせいで、俺は見れているのにURLを送ると「記事がないですよ」とみんなに言われて、原因を特定するのに時間がかかった。

そしてその修正方法だが、単に個別記事編集画面で「保存」を押すだけでその記事は復活した。なぜだかわからない。
さくらのコントロールパネルからMySQLのテーブルを見ても、どのテーブルが悪さしているのかよく分からなかったのでRubyのWWW::Mechanizeを使って全ページ「保存」ボタンを押しなおす事にした。

WWW::Mechanizeはログインフォームにパスワードを入れたり、UserAgentを偽装してwebページにアクセスしたりできる非常に有用なモジュール。Perlでは使った事あったけどRubyでは今回が初。

参考




必要なものをインストール

sudo gem install mechanize hpricot



普通にwp-login.phpからログインしてdashboardへ行き、cookieを持った状態で各記事個別ページへ移動して保存ボタンを押していく。記事個別ページが連番で助かった。あと自分のサーバをいじめたくないのでsleepは長めにしてある

shokai-blogfix.rb として保存

#!/usr/bin/env ruby
require ‘rubygems’
require ‘kconv’
require ‘mechanize’
require ‘pp’
user = “username”
pass = “password”

puts ‘start’

agent = WWW::Mechanize.new
page = agent.get(“http://shokai.org/blog/wp-login.php”)
login_form = page.forms_with(“loginform”).first
login_form.log = user
login_form.pwd = pass
dashboard = agent.submit(login_form)

puts “login: ” + dashboard.title

# 各ページ処理
for i in 1..1558
  sleep 10
  begin
    page = agent.get(“http://shokai.org/blog/wp-admin/post.php?action=edit&post=#{i}”)
    post_form = page.forms_with(“post”).first
    page = agent.submit(post_form)

    puts i.to_s+”success!” if page.body =~ /投稿が更新されました/
  rescue
    puts i.to_s+”error”
  end
end

puts ‘–finished–‘

パスワードなどは適宜変更。
URLもハードコーディングしている。1回しか使わないスクリプトだし