Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

TwistedでRedTubeのビデオをダウンロードする

次、一部でアツいRedTube。
問題はidの所なんだけど解析してるひとがいたのでそのままパクリです。

from twisted.web import client
from twisted.internet import reactor

URL = 'http://dl.redtube.com/_videos_t4vn23s9jc5498tgj49icfj4678/%s/%s.flv'

map = ["R", "1", "5", "3", "4", "2", "O", "7", "K", "9", 
        "H", "B", "C", "D", "X", "F", "G", "A", "I", "J", 
        "8", "L", "M", "Z", "6", "P", "Q", "0", "S", "T", 
        "U", "V", "W", "E", "Y", "N"]


def get_video_id(id):
    dir_id = str(int(id / 1000)).zfill(7)
    id = str(id).zfill(7)
    my_int = 0
    for x in xrange(7):
        my_int = my_int + int(id[x]) * (x + 1)

    my_char = str(my_int)
    my_int = 0
    for x in my_char:
        my_int = my_int + int(x)
    new_char = str(my_int).zfill(2)
    mapping = ''
    mapping = mapping + map[ord(id[3]) - 48 + my_int + 3]
    mapping = mapping + new_char[1]
    mapping = mapping + map[ord(id[0]) - 48 + my_int + 2]
    mapping = mapping + map[ord(id[2]) - 48 + my_int + 1]
    mapping = mapping + map[ord(id[5]) - 48 + my_int + 6]
    mapping = mapping + map[ord(id[1]) - 48 + my_int + 5]
    mapping = mapping + new_char[0]                          
    mapping = mapping + map[ord(id[4]) - 48 + my_int + 7]
    mapping = mapping + map[ord(id[6]) - 48 + my_int + 4]
    return dir_id, mapping
    
def downloadFlv(id, file):
   
    def finish(data):
        reactor.stop()
    
    def err(e):
        print e
        reactor.stop()

    url = URL % get_video_id(id)
    print url
    client.downloadPage(url, file).addCallback(finish).addErrback(err);


if __name__ == '__main__':
    downloadFlv(3707, '/tmp/temp.flv')
    reactor.run()

idをintで指定して落とすようにしたのはxrange(9000)とかで全ファイルをダウンロードできるようにしたかったから。
ってわけじゃあないよ!決して!
やりたいひとはfinishでreactor止めなければいいよ。
参考:
Welcome to IESCRIPTS.ORG

うくく。