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

4,148 阅读7分钟

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

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

所以,我又想到了,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网站,送福利

)