SH DevelopersSquareからIS01等のAndroid向けソースをDLするスクリプト作ったよ!
SH
DevelopersSquareがgitとかsvnとか用意してくれていないのでソースのDLがまんどくさいことこの上ないのでPythonでスクリプトを作成しました。
このスクリプトを利用することにより、is01,
sh-10b, jn-dk01のソースを取得・展開してくれます。
使い方(Ubuntu環境)は以下の通りです。
まず、easy_install等で必要なモジュールをインストールします。
#sudo apt-get install
setup_tools ←インストールしていない場合
#sudo
easy_install -U MultipartPostHandler
#sudo
easy_install -U BeautifulSoup
スクリプトの実行例は以下の通りです。
#python ./sdasg.py
is01 ←is01のソースを取得・展開したい場合
#python
./sdasg.py sh-10b ←sh-10bのソースを取得・展開したい場合
#python
./sdasg.py jn-dk01 ←jn-dk01のソースを取得・展開したい場合
以下がスクリプトです。
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# Name: SH Dev Android Source Getter(特に名前決めてない)
# Purpose: (https://sh-dev.sharp.co.jp/android/modules/oss/)がsvnやgitでの
# ソース公開してなかったので自動でダウンロードしてきて展開するスク
# リプト作った。
# 使用する際は、GPL(http://www.gnu.org/licenses/)と各々のソフトウェ
# ア使用許諾契約書に同意すること。
#
# Usage: 引数にis01, sh-10b, jn-dk01のどれかを与えてください。
# スクリプト直下にディレクトリを作られ保存されます。
# 例)is01のソースを取得・展開します。
# #python ./sdasg.py is01
#
# Require MultipartPostHandler, BeautifulSoupをeasy_installなどでインストー
# ルしてください。
#
# Author: renax64.blogspot.com
#
# Created: 02/12/2010, ver. 0.3
# Copyright: (c) renax64.blogspot.com 2010
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import os
import sys
from BeautifulSoup import BeautifulSoup
#import datetime
import urllib2
import MultipartPostHandler
import cookielib
import tarfile
#初期値: 対策されたときここを書き換える
init_vals ={
"main_url":"https://sh-dev.sharp.co.jp/android/modules/oss/index.php?/",
"is01":"is01",
"sh-10b":"sh10b",
"jn-dk01":"jndk01",
"dl_form_class":"dl2_center",
"dl_tr_class":"dl2_data",
"td_date_class":"dl2_center",
"td_filename_style":"padding-left:1em",
"form_post_class":"dl2_center",
"input_name":"ticket",
"accept":"同意する ( ダウンロード )",
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12",
"Content-Type":"multipart/form-data"
}
#ファイルの取得・展開
def getFile(link, filename, device):
try:
html = urllib2.urlopen(link)
soup = BeautifulSoup(html)
form = soup.find("form", {"class":init_vals["form_post_class"]})
ticket = form.find("input", {"name":init_vals["input_name"]}).get("value")
params = {"ticket":ticket, "accept":init_vals["accept"]}
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),MultipartPostHandler.MultipartPostHandler)
opener.addheaders = [("User-agent",init_vals["User-Agent"]),
("Content-Type",init_vals["Content-Type"]),
("Referer",link)]
f = opener.open(link, params)
#device_sourceディレクトリ作成
dir_name = device + "_sources"
os.chdir(os.path.dirname(os.path.abspath(__file__)))
current_dir = os.getcwd()
if os.path.isdir(dir_name) != True:
os.mkdir(dir_name)
#device_sourceディレクトリへ移動
os.chdir(dir_name)
#ファイル書き込み
fw = open(filename,'wb')
print u"現在 %s をダウンロード中..." % filename
fw.write(f.read())
fw.close()
#ファイル展開
ft = tarfile.open(filename,"r")
print u"現在 %s を展開中..." % filename
ft.extractall("./")
ft.close()
#元のディレクトリへ移動
os.chdir(current_dir)
except urllib2.HTTPError, e:
e.code, e.msg
pass
def getInf(device):
#オープンソースソフトウェアのファイル一覧ページの解析
curl = init_vals["main_url"] + init_vals[device]
try:
html = urllib2.urlopen(curl).read()
soup = BeautifulSoup(html)
tr_data = soup.findAll("tr", {"class":init_vals["dl_tr_class"]})
trs = []
for i in tr_data:
link = init_vals["main_url"] + i.a.get("href").replace("./index.php?/", "")
#dateは差分処理を実装しようとして取得したが、そこまでする必要もないと思い放置
dates = i.findAll("td", {"class":init_vals["td_date_class"]})
for ix in dates:
date = ix.renderContents().split("/")
files = i.findAll("td", {"style":init_vals["td_filename_style"]})
for iy in files:
filename = iy.a.renderContents()
array = dict([["link", link], ["date", date], ["filename", filename]])
trs.append(array)
#ファイルの取得
getFile(link, filename, device)
return trs
except urllib2.HTTPError, e:
e.code, e.msg
pass
def main():
#引数の取得
argvs = sys.argv
argc = len(argvs)
#実行
#現在のディレクトリパスを取得
c_dir = os.getcwd()
if argc == 2:
device = argvs[1]
if device == "is01":
getInf(device)
elif device == "sh-10b":
getInf(device)
elif device == "jn-dk01":
getInf(device)
else:
print "usage: #python ./sdasg.py (is01|sh-10b|jn-dk01)\n"
else:
print "usage: #python ./sdasg.py (is01|sh-10b|jn-dk01)\n"
print u"すべてのファイルの取得・展開が終了しました。"
if __name__ == '__main__':
main()
こちらからもスクリプトをDLすることができます。
更新履歴:
Ver. 0.3:
気づいた部分のスペルミス修正
Ver. 0.2:
UbuntuなどのLinuxで動作しないバグを修正
Ver. 0.1:
とりあえずリリース