ITPub博客

首页 > 应用开发 > Python > 学会这招,妈妈再也不担心我的排名上不去了

学会这招,妈妈再也不担心我的排名上不去了

Python 作者:qwer1030274531 时间:2020-12-23 13:54:04 0 删除 编辑

前言

相传,就在前几日,kimol君在网上闲逛时,刷到了一个猜歌的小程序。这个小程序通过播放歌曲部分片段,然后让用户来猜它的歌名,大概是这样的:
在这里插入图片描述

作为一个脑热的听歌爱好者,于是他越陷越深,越刷越得劲。可是,他的 排名竟一直上不去!正当他惆怅之际,一个绝妙的想法 ding的一下就出现了,学会了它,妈妈再也不用担心他的排名上不去了!

一、思路分析 http://ask.baikezh.com/

为了搞清楚猜歌的过程是什么样的,首先通过抓包来对请求和响应进行分析。在PC版微信中打开小程序,然后通过Fiddler进行抓包。我们会发现猜歌的过程由两个请求构成。
(ps.当然也可以直接抓手机端的包,但是由于各种原因,会相对复杂一些)
一个是 获取歌曲的相关信息(包括答案)。对!你没有听错,返回的数据直接包括了猜歌的答案,请求如下:
在这里插入图片描述
这是一个get请求,包括了用于登陆验证的 token、 user_id等,返回的结果为歌曲相关的信息,其中最重要的是 answer(红圈部分)。

另一个是 发送猜歌请求,如下:
在这里插入图片描述
这同样是一个get请求,也包含了token等参数,还包含了提交的答案 answer和歌曲的 sid。通过返回的 is_right字段便可以判断是否猜对。(1则猜对,否则不对)

那么,思路已经很明晰了:通过python编写程序,首先获取歌曲的答案,然后将答案提交。

二、获取答案 http://zzdxb.baikezh.com/

首先定义一个类:

class guessStar():
    def __init__(self,token,userId):
        '''
        初始化函数
        '''
        self.token = token # 用户token
        self.userId = userId # 用户ID1234567

随后,根据抓包的请求定义一个获取答案的函数:

def get_answer(self):
    '''
    获取答案函数
    '''
    url = 'https://api.zuiqiangyingyu.net/index.php/api/guess_v2/Index'
    headers = {'Connection':'keep-alive',
               'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat',
               'content-type':'application/json',
               'Accept-Encoding':'gzip, deflate, br'}
    params = (('token',self.token), # 用户token,需要换成自己的
              ('user_id',self.userId), # 用户ID,需要换成自己的
              ('wechat_type','wechat_song'))
    res = requests.get(url,headers=headers,params=params) # 发送请求
    data = res.json() # 获取返回结果(json格式)
    music = data['d']['list'][0] # 音乐数据
    sid = music['id'] # 音乐ID
    answer = music['answer'] # 对应的答案
    return (sid,answer)123456789101112131415161718

这个请求很简单,只需要将数据包对于的url、参数、请求头等模拟出来即可。

三、提交答案 http://ask.baikezh.com/question/

同样,通过抓包分析后定义一个提交答案的函数:

def guess(self,sid,answer):
    '''
    猜歌函数
    '''
    url= 'https://api.zuiqiangyingyu.net/index.php/api/guess_v2/Sub'
    headers = {'Connection':'keep-alive',
               'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat',
               'content-type':'application/json',
               'Accept-Encoding':'gzip, deflate, br'}
    params = (('token',self.token), # 用户token,需要换成自己的
              ('user_id',self.userId), # 用户ID,需要换成自己的
              ('sid',sid), # 音乐ID
              ('answer',answer), # 答案
              ('wechat_type','wechat_song'))
    res = requests.get(url,headers=headers,params=params)
    result = res.json()['d']['user']['is_right'] # 猜歌的结果
    return result1234567891011121314151617

函数返回的是is_right字段,如果是1则表示答案正确,否则则是错误的。

四、猜猜猜 http://dxb.myzx.cn/jilin/

有了get_answer()和guess()函数,我们便可愉快地开始自动化猜歌答题了,定义如下函数:

def do_guess(self,num):
    '''
    进行猜歌(通过num指定次数)
    '''
    N = 0
    while True:
        sid,answer = self.get_answer()
        result = self.guess(sid,answer)
        if result == '1': # 如果猜对 
            N += 1
            print('第%s首歌回答正确!'%sid)
        else:
            print('第%s首歌回答错误!'%sid)
        if N >= num: # 如果达到指定次数
            break123456789101112131415

其中num参数表示猜歌的次数。在主函数中调用它:

if __name__ == '__main__':
    star = guessStar('xxxx','xxx')
    star.do_guess(1001) # 开始猜歌123

xxxx分别表示账号的token和用户ID,这里需要大家换成自己的。所谓 一千零一夜,于是我也跑1001次好了,run一下:
在这里插入图片描述
在运行之前,我是这样的:
在这里插入图片描述
运行之后,我是这样的:
在这里插入图片描述
没有错,我的排名正在噌噌噌地往上升!!
舒服了~~

写在最后 http://ask.baikezh.com/

我想本篇文章的真正意义不是代码本身,而是希望为大家提供更加广泛的思路:

Python不仅是课堂上纷繁复杂的理论知识,还能为我们的生活提供便利;
Python不仅是项目中枯燥无味的日复一日,还能为我们的生活带来欢乐;
Python不仅是成长里孜孜不倦的埋头苦学,还能为我们的生活增添成就;

无论是Python、Java、C,乃至摄影、绘画。whatever,它们都是我们兴趣或是谋生的技能。我想,只有真正的热爱它们,它们也才能在我们的生活中更好地结出盛果、生根发芽!

我是kimol君,咋们下次再会~


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30239065/viewspace-2744657/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Python3的使用积累
请登录后发表评论 登录
全部评论

注册时间:2015-05-08

  • 博文量
    190
  • 访问量
    164168