Pages

December 03, 2010

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: とりあえずリリース



0 コメント:

Post a Comment