【Ruby】コマンドラインからMediaWikiにファイルをアップロード
参加しているプロジェクトのwikiでMediaWikiを利用しています。会議のプレゼンテーションをまとめたりするときに頻繁にファイルをアップロードする必要があるのですが、毎回ブラウザ経由で手動でアップロードするのが面倒になってきました。
最近はRubyからSeleniumを使って色々なwebサービスの操作を自動化するのがマイブームになってきましたが、ブラウザのウインドウを開かずにコマンドラインだけで動作が完結するという点でMechanizeも便利です。なので、Mechanizeを使ってMediaWikiにファイルをアップロードするスクリプトを作成してgistに公開しました。
→ upload_file_to_mediawiki - gist
このページの下の方にもソースコードを掲載しておきます。
Mechanizeについて勉強・入門したいときの参考情報
このスクリプトの使い方
1
2
3
4
5
6
7
8
#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認証用のユーザ名/パスワードの設定を修正してください。
1
2
3
4
5
#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のソースコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/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."
}