用户
搜索
  • TA的每日心情

    2018-3-22 11:42
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]经常看看I

    i春秋-脚本小子

    Rank: 2

    0

    主题

    12

    帖子

    133

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2017-1-13
    发表于 2018-3-7 13:02:34 820410
    本帖最后由 青衫磊落 于 2018-3-7 13:54 编辑

    最近看到个特别全面源码分享网站,刚好有个项目是一直想做但是没有头绪的,就想下载学习一下。注册账号后,发现还需要若干金币。后来发现可以通过每隔一定时间发心情状态来获得金币,就打算写一个自动发心情状态的python脚本来收割金币。

    思路分析

    使用burp抓取一下提交的包,如下图所示:
    心情状态包.png

    因此我们的目的是写一个自动提交心情的python脚本,提交包中需要包含必要的cookie信息,隐藏的radom字符串,心情文本内容,和文件,经测试发现文件可为空。表单中只包含前两项就可以成功增加金币,这就更加省事了。
    文末附有完整python代码,接下来我们看一下是怎么一步步写出来的。

    具体实现

    第一步

    首先先写读取页面的功能!这个之前也写过很多,都是搜索出一段代码来直接使用。然而这次找了几段代码代码应为python及库的版本问题都不太好调试。
    就直接看requests库官方文档,官方文档才是最好的资料。
    版本1代码

    #coding:utf-8  
    import requests
    url_home = "http://www.home.com/"
    r = requests.get(url_home)
    print(r.text)

    执行结果如下图所示,我们能够获得网站
    1.png

    此时获得的页面是未曾登陆的无法发表心情状态。

    第二步

    接下来我们先将cookie信息硬编码到代码中,来测试一下。
    cookie信息可如下图所示从浏览器中获取.
    cookie.png

    版本2代码:

    #coding:utf-8  
    import requests
    cookies = dict(zdmid="93EB84AE485E7B7E365C4F87691F8A9D")
    url_home = "http://www.home.com/"
    r = requests.get(url_home,cookies=cookies)
    print(r.text)

    此时返回页面正常登陆home.png

    第三步

    接下来我们提取需要提交表单的隐藏input随机字符串,同时选择当前首页的其他人的心情状态作为我们的文本内容。
    解析html,当然是神库beautifulSoup4了,别无他想。分析需要提取的值在html页面的具体位置,查看官方文档选择合适的api方法,然后编写代码实现。

    random.png
    同样方法获得心情内容所在位置,进一步完善代码。
    版本3代码

    #coding:utf-8  
    import requests
    from bs4 import BeautifulSoup
    
    cookies = dict(zdmid="451178ECCF2145D24F94DE0A1DF7D658")
    url_home = "http://www.home.com/"
    r = requests.get(url_home, cookies=cookies)
    soup = BeautifulSoup(r.text, 'html.parser')
    random = soup.form.input.attrs["value"] 
    content = soup.select_one(".content").contents[0]
    
    print(random)
    print(content)

    提取内容.png

    第四步骤

    接下来我们来实现提交心情状态功能。
    只需要将上一步骤提取的内容构造post提交就可以了。

    版本4代码

    #coding:utf-8  
    import requests
    from bs4 import BeautifulSoup
    
    cookies = dict(zdmid="451178ECCF2145D24F94DE0A1DF7D658")
    url_home = "http://www.home.com/"
    r = requests.get(url_home, cookies=cookies)
    soup = BeautifulSoup(r.text, 'html.parser')
    random = soup.form.input.attrs["value"] 
    content = soup.select_one(".content").contents[0]
    
    mood_create = 'http://www.mood/create.htm'
    payload = {'radom': radom, 'content': content}
    requests.post(mood_create, cookies=cookies, data=payload)

    第五步

    上面的代码因为cookie的值是硬编码在脚本中,这样一旦session过期,后面将会跳转到未登录装填。这就需要我们重新去更新cookie对应的值,那么有没有方法可以解决这个问题呢?
    当然是有的。看一下requests提供的session解决方案,如下图
    session.png

    因此可以使用session来改造代码,requests中的session将会自动保存相关的cookie信息,如此每次运行就可以自动使用账号及密码登陆。
    版本5代码

        #coding:utf-8  
        import requests
        from bs4 import BeautifulSoup
    
        s = requests.Session()
        url_home = "http://www.home.com/"
        s.get(url_home)
    
        url_login = "http://www.login.htm"
        data_login = {'account':'username','password':'passwd','rememberme':'on'}
        text = s.post(url_login,data=data_login)
    
        r = s.get(url_home)
        soup = BeautifulSoup(r.text, 'html.parser')
        random = soup.form.input.attrs["value"] 
        content = soup.select_one(".content").contents[0]
    
        mood_create = 'http://www.moodcreate.htm'
        payload = {'radom': radom, 'content': content}
        s.post(mood_create, cookies=cookies, data=payload)

    第六步

    上面的步骤完成后,我们可以执行一次自动提交心情状态的代码。我们想要做的每隔一定的时间间隔提交一条状态。因此还要添加上一个定时器,来自动执行这个过程。
    最终完整代码如下,justForFun。

        #coding:utf-8
        import threading
        import requests
        import random
        from bs4 import BeautifulSoup
        url_login = "http://www.login.htm"
        url_home = "http://www.home.com/"
        mood_create = "http://www.mood/create.htm"
    
        s = requests.Session()
    
        def create():
            global timer
            global s
            s.get(url_home)
            data_login = {'account':'username','password':'passwd','rememberme':'on'}
            text = s.post(url_login,data=data_login)
            res = s.get(url_home)
            soup = BeautifulSoup(r.text, 'html.parser')
            random = soup.form.input.attrs["value"] 
            content = soup.select_one(".content").contents[0]
            payload = {'radom': random, 'content': content}
            s.post(mood_create, cookies=cookies, data=payload)
    
            timer = threading.Timer(5*60*60, create) 
            timer.start()
    
        timer = threading.Timer(1, create)    
        timer.start()
    66666666666
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2018-3-7 20:31:08
    不错,学以致用,感谢分享!
    使用道具 举报 回复
    6666666666666
    使用道具 举报 回复
    发表于 2018-3-8 10:18:34
    打码没打好,哈哈哈
    使用道具 举报 回复
    66666666666666666666666
    使用道具 举报 回复
    标题很无语,你居然没说是哪个网站!你应该说刷哪个网站的金币的呀
    使用道具 举报 回复
    发表于 2018-3-18 22:16:20
    学到了!
    http://nico.lolimoe.cn/blog/
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册