自动回帖机

来源:互联网 发布:js ajax请求代码 编辑:程序博客网 时间:2024/04/28 18:24
#--coding: GBK --import osimport sgmllib,urllib,urllib2,random,reimport getpassimport time,copyclass EFormat:    def __init__(self,num):        if num==0:            self.error='帖子提取错误'      class Post:    def __init__(self):        self.id=''        self.date=''        self.subject=''        self.url=''    def __eq__(self,data):        if self.id==data.id and self.date==data.date and self.subject==data.subject and self.url==data.url:            return True        else:            return Falseclass PostList:    def __init__(self):        self.lst=[]    def append(self,item):        self.lst.append(item)    def popfront(self):        self.lst.reverse()        rv=self.lst.pop()        self.lst.reverse()        return  rv    def printlist(self):        for i in range(0,len(self.lst)):            print '%d:%s    %s    %s'%(i,self.lst[i].id,self.lst[i].date,self.lst[i].subject)    def __delitem__(self,key):        del self.lst[key]    def __getitem__(self,key):        return self.lst[key]    def __add__(self,data):        self.lst=self.lst+data        return self            class LilyBoardParser(sgmllib.SGMLParser):    def __init__(self):        sgmllib.SGMLParser.__init__(self)        self.post=[]        self.ids=[]        self.urls=[]        self.strs=[]    def start_a(self,attr):        for an_attr in attr:            tag,value=an_attr[:2]            if tag.lower()=='href':                if value.find('userid=')!=-1:                    id=value[value.index('userid=')+len('userid='):]                    self.ids.append(id)                elif value.find('board=')!=-1:                    self.urls.append('/'+value)    def handle_data(self,data):        data=data.strip()        if data:            self.strs.append(data)##            print data    def getPost(self):        #输出的格式:        #0:置顶/文章号        #1:id        #2:date        #3:title        #下面的根据是置顶还是非置顶、主题还是非主题有不一样        #统计帖子总数        pn=[]        for i in range(len(self.strs)):            if self.strs[i].find('○')!=-1 or self.strs[i].find('Re:')!=-1:                pn.append(i)        datanum=len(pn)        urlnum=len(self.urls)        if datanum!=urlnum:            raise EFormat(0)        for i in range(urlnum):            post=Post()            post.id=self.strs[pn[i]-2]            post.url=self.urls[i]            post.date=self.strs[pn[i]-1]            post.subject=self.strs[pn[i]]            self.post.append(post)        return self.postclass Logger:    lilyurl='xxx'    logapp='xxx'    psturl='xxx'    def __init__(self):        self.id=''        self.pw=''        self.userdir=''        self.header=''    def login(self):        print '输入账号:'        self.id=raw_input()        self.pw=getpass.getpass("passwd:")        self.userdir='/vd'+"%05d"%random.randint(0,100000)        url=Logger.lilyurl+self.userdir+Logger.logapp        formvalues={'id':self.id,'pw':self.pw,'lasturl':'xxx'}        para=urllib.urlencode(formvalues)        req=urllib2.Request(url,para)        response=urllib2.urlopen(req)        the_page=response.read()        cookie="xxx=%d;xxx=%s;xxx=%d;"%(xxx,xxx[1],xxx)               self.header={"cookie":cookie,'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9'}        class Boardplorer:    def __init__(self):        self.postlist=PostList()        self.account=None    def reply(self,post,text):        if not self.account:            print '现在没有登录,不能回帖'            return -1        f=re.compile('/[a-z]+/?')        articleurl=f.sub('xxx',post.url,1)        url=Logger.lilyurl+self.account.userdir+articleurl        print url        req=urllib2.Request(url,headers=self.account.header)        response=urllib2.urlopen(req)        the_page=response.read()        print the_page        if the_page.find('name=pid value=')!=-1:            pid_start=the_page.index('name=pid value=')+len('name=pid value=')+1            pid=the_page[ pid_start: pid_start+15]            pid=pid[:pid.index("'")]            print pid        if the_page.find('name=reid value=')!=-1:            reid_start=the_page.index('name=reid value=')+len('name=reid value=')+1            reid=the_page[ reid_start: reid_start+15]            reid=reid[:reid.index("'")]            print reid        sendurl=f.sub('xxx',post.url,1)        sendurl=sendurl[:sendurl.index('&')]        url=Logger.lilyurl+self.account.userdir+sendurl        print url                title=post.subject.replace('○','Re:')        postcontest={'title':title,'pid':pid,'reid':reid,'text':text}        para=urllib.urlencode(postcontest)        req=urllib2.Request(url,para,self.account.header)        response=urllib2.urlopen(req)        the_page=response.read()        print the_page        return 0    def publish(self,title,text):        pass    def setaccount(self,account):        self.account=account    def visitboard(self,boardname,read_same_theam=1):        if read_same_theam:            f='xxx'        else:            f='xxx'        if self.account:            url=Logger.lilyurl+self.account.userdir+f+'board='+boardname            req=urllib2.Request(url,headers=self.account.header)            response=urllib2.urlopen(req)            del self.postlist[:]                        while True:                contest=response.readline()                if contest:                    if contest.find('○')!=-1 or contest.find('Re:')!=-1:                        parser=LilyBoardParser()                        parser.feed(contest)                        postlst=[]                        try:                            postlst=parser.getPost()                        except EFormat,error:                            print error.error                            return                                                     self.postlist=self.postlist+postlst                        #print contest                    else:                        continue                else:                    break            return self.postlist                    else:            print '现在是匿名访问'    def monitorboard(self,boardname):        oldpstlst=copy.deepcopy(self.visitboard(boardname,1))        print 'now old post %s'% oldpstlst[-1].subject        while True:            time.sleep(1)            curpstlst=self.visitboard(boardname,1)            if not(curpstlst[-1] == oldpstlst[-1]):                self.reply(curpstlst[-1],'飘过~')                oldpstlst=copy.deepcopy(self.visitboard(boardname,1))                  if __name__=='__main__':    login=Logger()    login.login()    plorer=Boardplorer()    plorer.setaccount(login)    plorer.monitorboard('xxx')    

原创粉丝点击