美文网首页
【Python实战】用代码在1024论坛实现自动回贴,快速升级,

【Python实战】用代码在1024论坛实现自动回贴,快速升级,

作者: c2aa1d94244a | 来源:发表于2018-05-23 22:03 被阅读152次

    掌握了这种技术,天下再也没有难的回复的帖子

    我相信,很多同学都在逛论坛的时候都会遇到的问题:有的帖子是标注着“回复查看更多”;或者有的论坛将回复数量和账号等级挂钩(比如草留)。个人感觉,这是个比较蛋疼的问题。第一,你回复帖子,需要打开论坛,再打开帖子,然后找到回复的位置,输入要回复的内容,再点击回复,虽然一顿骚操作,但是费时间又费精力。第二,有些回复帖子之间是有时间间隔的,这样就不能够快速的升级账号和被迫等待几秒到几十分钟。

    所以,我又想到了,Python,这个非常好用的可以让我们玩乐的工具。没错,在我眼中,Python就是一种很好用的工具。

    这里,我主要针对1024网站的回复问题做实战处理,原因有以下几点:

    1. 1024的账号是有等级之分的,处在“新手”区的账号,限制很多,若是想要升级成“侠客”,途径只有发帖,或者回复别人。
    2. 1024新手回帖是有时间间隔的。1024秒,约17分钟。而且一天只能回复10贴。
    3. 秉着升级账号的原则,同时还能赚取U,和乐而不为呢。

    那么好,我们要写一个Python程序,来实现我们几个目的:

    1. 能够自动回复帖子。
    2. 能够记录回复结果,检测回复是否成功。
    3. 最好能够有一个类似定时器的东西,在1024秒过后,能够再次运行。

    OK,我们来简单拆解一下我们的问题:一个定时执行的模块;一个自动回复的模块。在自动回复模块中,我们通过账号名密码来登录网站,同时,挑出来回复的帖子,再执行回复操作。

    那么,我们就先从第二个自动回复模块来做起。第一步,我们来做登录功能。

    登录

    Python模拟用户登录论坛。这个是一个很普遍的任务。你百度,能搜出来一大堆东西。我们这里主要用到的,就是通过抓包,分析http post的参数,然后自己通过Python来模拟一个http post请求,来实现登录。

    第一步,抓包

    抓包的工具有很多种,比较好用的比如windows的filter,Mac下面的charles,这些都只是基础功能。功能最强大的还应该是wireshark。我这里就选用charles来做处理吧。至于charles的配置和使用,参考这篇文章,这里不做多讲。

    登录,首先我们来到登录界面:

    登录界面

    看到界面和其他登录页面一样,我们输入账号密码,点击“提交”按钮,我们就会发出一个http post请求。在charles中可以抓到。这里我们主要就是关心的两点:

    • http post的Header
    • http post的Form

    因为这两个是我们需要在后面自己构造的。

    我们抓到的结果如下:

    header form

    这样,我们就照葫芦画瓢,可以构造出来登录数据了。

    第二步,构造数据

    这里,我们需要通过request.session()方法来请求,在方法传入参数中,有我们自己构建http的headers和form数据。那么我们就通过上图的参数,构造出来大概张这个样子:

    login_values = {
            "pwuser": "XXXXX",
            "pwpwd": "XXXXX",
            "hideid": "0",
            "forward": "http://dc.itbb.men/thread0806.php?fid=7",
            "jumpurl": "http://dc.itbb.men/thread0806.php?fid=7",
            "step": "2"
        }
    
        login_header = {
            "Referer": login_url,
            "User-Agent": "",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,ru;q=0.5",
            "Connection": "keep-alive"
        }
    

    第三步,请求

    有了values和header,我们就需要调用session来做请求就好。

        session = requests.session()
        login_response = session.post(login_url, data=login_values, headers=login_header)
    

    session.post()方法返回的是一个http的response。如果在开发的时候想看返回结果,是可以通过Debug的模式来看到的。

    这里要多说一下为什么要用requests的session而不是直接request.get。
    根本原因是需要保持长时间的登录状态。我们如果要回复帖子,就要保持一个账号已经登录的状态,session正好能够满足我们的需求。只要登录成功,session就会保存状态,主要就是cookie的保存。后面的一系列请求,只要调用session.get()或者session.post()方法皆可以了。我们拿到的cookie,请求服务器,服务器会判断我们为已经登录的状态的。为什么会是这样子,这个就是Cookie的作用了。

    登录完成了,我们接下来就是要找板块和挑一个回复的帖子了。

    我这里使用的还是BeautifulSoup4来做html的解析和查找,方法和原理,都在之前的Python文章中讲过了『【Python实战】手把手超详细教程教你Scrapy爬达盖尔社区,有彩蛋』『【Python实战】用Scrapy编写“1024网站种子吞噬爬虫”,送福利』,可以看手把手的实战讲解文章中的讲解,超级详细。这里为了节省时间,就不多说了。

    回帖

    我们这里就直接跳到了我们做回帖post处理。同样,我们也是需要通过charles来抓取post请求的参数。最终也得拼凑出来我们自己的value和header。过程和登录差不多。抓取分析之后,我们自己拼凑出来的header大概就是长这个样子:

        comment_header = {
            "Referer": post_url,
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,ru;q=0.5",
            "Connection": "keep-alive",
            "Content-Length": "252",
            "Cache-Control": "max-age=0"
        }
    

    至于form数据的组成,我们这里通过分析html数据发现,post请求里的form数据,是将html的form标签下,所有的input的“name”和“value”做成键值对,拼凑起来的。我们通过BeautifulSoup来抓取数据组成键值对,构造出来form数据。

    那最后我们拿到之前的session对象,发送一个post请求即可。

    comment_response = session.post(post_base_url, data=post_data, headers=comment_header)
    

    DONE。以上就是模拟登录并自动回帖的代码。

    定时器

    由于论坛的特殊性,回复间隔必须是1024秒,所以,我们还得做一个定时执行任务的模块,用来定时执行我们的回复代码。这里我则是使用了python的os.system()方法来执行模块。至于1024秒的间隔,这个只需要写一个while循环,通过计算时间,来做相应的操作即可。Python的datatime库里面还是提供了很丰富的操作,而且很方便。

    def run_Task():
        os.system("python login.py")
    
    def clock_timer(schedule_time):
        count = 0
        flag = 0
        while True:
            if count == 11:
                print("------- Count time is 11. FINISHED.")
                break
            cur_time = datetime.datetime.now()
            if cur_time == schedule_time:
                print("------- Run time: " + str(cur_time) + "\n------- CountTime: " + str(count))
                count = count + 1
                run_Task()
                flag = 1
            else:
                if flag == 1:
                    flag = 0
                    schedule_time = schedule_time + datetime.timedelta(seconds=1050)
                    print("------- Next schedule time: " + str(schedule_time))
    
    if __name__ == '__main__':
        cur_time = datetime.datetime.now()
        print("------- Start time: " + str(cur_time))
        schedule_time = cur_time + datetime.timedelta(seconds=2)
        print("------- Schedule time: " + str(cur_time))
        clock_timer(schedule_time)
    

    每天只需要执行定时任务的代码就可以了,非常的简单和方便。一天10次回贴,轻松搞定。相信用不了几天,就可以升级成“侠客”了,哈哈哈哈啊。

    代码就是这样,关注公众号『皮克啪的铲屎官』,回复『回帖』即可得到源码。还有惊喜等着你哦~

    最后扯一句,文中最关键的就是讲到的思路,网站论坛千千万,只要掌握了思路,就能够应对所有。大家有什么问题,可以给公众号留言,或者文章留言,我都会一一解答。大家一起进步。

    推荐阅读:

    【Python实战】手把手超详细教程教你Scrapy爬达盖尔社区,有彩蛋
    【Python实战】用Scrapy编写“1024网站种子吞噬爬虫”,送福利
    【Python实战】用代码来访问1024网站,送福利

    底部二维码.png

    相关文章

      网友评论

          本文标题:【Python实战】用代码在1024论坛实现自动回贴,快速升级,

          本文链接:https://www.haomeiwen.com/subject/zebdjftx.html