AndroidでASE(Android Scriptiing Environment)

本日のお題2つ目

AndroidでWeb画像クローラアプリを発見してちょっと感動したので僕も作ってみようと思った。
しかし、Eclipseを起動するのもだるいし… と思っていたらAndroid上でPythonが動くなんて話を思い出したのでやってみた

作ってみたけどくだらないですはい。 あとDLしすぎてBANされても僕は知りません

このスクリプトのターゲットは「2ch画像まとめ」( http://pic2ch.giox.org/ )です

起動するとindexを読みに行きます しばらくすると どの画像を集めるかを聞いてきます。
選ぶと後は延々DLし続けます SDカードがあふれても僕は知りません(一応100枚くらいでとまるはず)

ASEに関しては

を参考にしました ありがとうございます

ソース

ダイアログの出し方とかはAndroid特有 ほかは普通のPythonプログラム

#!-*- coding:utf-8 -*-
import htmlentitydefs
import re
import urllib
import json
import os

import android

# http://snipplr.com/view.php?codeview&id=11344
# 実体参照 & 文字参照を通常の文字に戻す
def htmlentity2unicode(text):
    # 正規表現のコンパイル
    reference_regex = re.compile(u'&(#x?[0-9a-f]+|[a-z]+);', re.IGNORECASE)
    num16_regex = re.compile(u'#x\d+', re.IGNORECASE)
    num10_regex = re.compile(u'#\d+', re.IGNORECASE)
    
    result = u''
    i = 0
    while True:
        # 実体参照 or 文字参照を見つける
        match = reference_regex.search(text, i)
        if match is None:
            result += text[i:]
            break
        
        result += text[i:match.start()]
        i = match.end()
        name = match.group(1)
        
        # 実体参照
        if name in htmlentitydefs.name2codepoint.keys():
            result += unichr(htmlentitydefs.name2codepoint[name])
        # 文字参照
        elif num16_regex.match(name):
            # 16進数
            result += unichr(int(u'0'+name[1:], 16))
        elif num10_regex.match(name):
            # 10進数
            result += unichr(int(name[1:]))
        
    return result

droid = android.Android();
droid.makeToast("Start index searcher")

rs = '<a href="([^"]*)">([^<>]*)</a>\s(\d+)\spieces'
rrs = re.compile(rs);
f = urllib.urlopen("http://pic2ch.giox.org/feed");
s = f.read();
#print s
f.close()
l = rrs.findall(htmlentity2unicode(s));
l2 = [];
for x in l:
	l2.append((x[0],x[1],int(x[2])))
ll = reversed(sorted(l2,key=lambda x:x[2]));
lll = [];
lls = [];
for i,x in enumerate(ll):
	#print i,x[0],x[1].encode("mbcs"),x[2];
	lll.append((x[0],x[1],x[2]))
	lls.append(x[1]+":"+str(x[2]))
	if i>100:
		break;
droid.dialogCreateAlert("select");
droid.dialogSetItems(lls);
droid.dialogShow();
i = droid.dialogGetResponse()
print i;
i = i.result
droid.makeToast("Select:"+lll[i["item"]][1] + "\n" + lll[i["item"]][0]);

if not(os.path.exists("/sdcard/ina-img")):
	os.mkdir("/sdcard/ina-img");

url = lll[i["item"]][0]
droid.makeToast("running test web crawler");

f = urllib.urlopen(url);
s = f.read();
rs = r"urls:'([^'])*'";
rrs = re.compile(rs);
jstr = rrs.search(s).group(0);
#print jstr[6:-1];
l = jstr[6:-1].split(":");
for i,x in enumerate(l):
	print i,"download...",x;
	droid.makeToast(str(i)+":download... "+ x);
	nf =urllib.urlopen("http://strage.giox.info/pics3/"+x);
	f = open("/sdcard/ina-img/p%03d.jpg" % (i),"wb");
	f.write(nf.read());
	nf.close();
	f.close();
	if i>100:
		droid.makeToast("over 100pics!");
		break;
print len(l)
droid.makeToast("complete!");