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



1 コメント:

Unknown said...

Casino king - Casino in Jordan - Airjordan21 Retro
Casino king - Casino in air jordan 18 retro racer blue from us Jordan. air jordan 18 retro racer blue to you Airjordan21 how can i get air jordan 18 retro yellow suede Retro. Find all air jordan 18 retro racer blue to us about the games, equipment, accessories jordan 18 white royal blue online site and gaming experience!

Post a Comment