【Ruby】コマンドラインからMediaWikiにファイルをアップロード

Pocket

mediawiki logo

参加しているプロジェクトのwikiでMediaWikiを利用しています。会議のプレゼンテーションをまとめたりするときに頻繁にファイルをアップロードする必要があるのですが、毎回ブラウザ経由で手動でアップロードするのが面倒になってきました。

最近はRubyからSeleniumを使って色々なwebサービスの操作を自動化するのがマイブームになってきましたが、ブラウザのウインドウを開かずにコマンドラインだけで動作が完結するという点でMechanizeも便利です。なので、Mechanizeを使ってMediaWikiにファイルをアップロードするスクリプトを作成してgistに公開しました。

→ upload_file_to_mediawiki – gist

このページの下の方にもソースコードを掲載しておきます。

Mechanizeについて勉強・入門したいときの参考情報

このスクリプトの使い方

#mechanizeが必要なので、gemコマンドでインストール
gem install mechanize
#もしくは
sudo gem install mechanize
#としてから、以下のようにして実行。
upload_file_to_mediawiki (アップロードするファイル名)

例: upload_file_to_mediawiki Presentation_20150307_Smith.pdf

MediaWikiへのログインの省略について

なお、今回作成した対象のwikiでは、LocalSettings.phpで以下の設定をすることで、ユーザごとのログインなしでファイルがアップロードできるようになっています。そのため、このスクリプトの中でもMediaWikiそのものにログインする処理は省略しています。

$wgEnableUploads       = true;
$wgGroupPermissions['*']['edit'] = true;
$wgGroupPermissions['*']['upload'] = true;
$wgGroupPermissions['*']['reupload'] = true;

環境依存の設定の変更

実際に使用するときは、途中のところにあるURLおよDigest認証用のユーザ名/パスワードの設定を修正してください。

#destination url and access password
url="http://wiki_url/index.php/Special:Upload"
hostPort="http://wiki_url"
http_user="username"
http_password="password"

upload_file_to_mediawikiのソースコード

#!/usr/bin/env ruby

# Takayuki Yuasa 20150304

if(ARGV.length<1)then
	puts "Provide file to be uploaded."
	exit
end

require "mechanize"

#check file
filePath=ARGV[0]
if(!File.exist?(filePath))then
	STDERR.puts "Error: file not found #{filePath}"
	exit
end

#prepare destination file name
fileName=File.basename(filePath)
fileName=fileName[0].capitalize+fileName[1...(fileName.length)]
extname=File.extname(filePath)
if(extname=="")then
	extname=fileName
end

#destination url and access password
url="http://wiki_url/index.php/Special:Upload"
hostPort="http://wiki_url"
http_user="username"
http_password="password"

#show message
puts "---------------------------------------------"
puts "Source file: #{filePath}"
puts "Destination name: #{fileName}"
puts "Paste the following command to the MediaWiki."
puts ""
puts "[[Media:#{fileName}|#{extname}]]"
puts "---------------------------------------------"

puts "#{Time.now} Loading the Upload page..."

#instantiate mechanize agent
agent = Mechanize.new

#add authentication info
agent.add_auth(hostPort,http_user,http_password)

#open the upload page
begin
	page = agent.get(url)
rescue
	STDERR.puts "Error: Connection failed"
	exit
end

#select file, then upload
puts "#{Time.now} Upload page loaded."
page.form_with(:id=>"mw-upload-form"){|form|
	form.file_upload_with(:name=>"wpUploadFile"){|file|
		file.file_name=filePath
	}
	form.field_with(:name=>"wpDestFile"){|field|
		field.value = fileName
	}
	form.checkbox_with(:name=>"wpIgnoreWarning").check

	puts "#{Time.now} Uploading file..."
	form.click_button

	puts "#{Time.now} Receiving result..."
	resultPage=agent.page

	puts "#{Time.now} Upload completed."
}