前言

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

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

一、思路分析

为了搞清楚猜歌的过程是什么样的,首先通过抓包来对请求和响应进行分析。在PC版微信中打开小程序,然后通过Fiddler进行抓包。我们会发现猜歌的过程由两个请求构成。 (ps.当然也可以直接抓手机端的包,但是由于各种原因,会相对复杂一些)一个是 「获取歌曲的相关信息」(包括答案)。对!你没有听错,返回的数据直接包括了猜歌的答案,请求如下:

这是一个get请求,包括了用于登陆验证的 「token」、 「user_id」等,返回的结果为歌曲相关的信息,其中最重要的是 「answer」(红圈部分)。

另一个是 「发送猜歌请求」,如下:

这同样是一个get请求,也包含了token等参数,还包含了提交的答案 「answer」和歌曲的 「sid」。通过返回的 「is_right」字段便可以判断是否猜对。(1则猜对,否则不对)

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

二、获取答案

首先定义一个类:

classguessStar:

def__init__(self,token,userId):

'''

初始化函数

'''

self.token = token # 用户token

self.userId = userId # 用户ID

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

defget_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)

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

三、提交答案

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

defguess(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'] # 猜歌的结果

returnresult

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

四、猜猜猜

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

defdo_guess(self,num):

'''

进行猜歌(通过num指定次数)

'''

N = 0

whileTrue:

sid,answer = self.get_answer

result = self.guess(sid,answer)

ifresult == '1': # 如果猜对

N += 1

print( '第%s首歌回答正确!'%sid)

else:

print( '第%s首歌回答错误!'%sid)

ifN >= num: # 如果达到指定次数

break

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

if__name__ == '__main__':

star = guessStar( 'xxxx', 'xxx')

star.do_guess( 1001) # 开始猜歌

xxxx分别表示账号的token和用户ID,这里需要大家换成自己的。所谓 「一千零一夜」,于是我也跑1001次好了,run一下:

在运行之前,我是这样的:

运行之后,我是这样的:

没有错,我的排名正在噌噌噌地往上升!!舒服了~~

写在最后

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

Python不仅是课堂上纷繁复杂的理论知识,还能为我们的生活提供便利;

Python不仅是项目中枯燥无味的日复一日,还能为我们的生活带来欢;

Python不仅是成长里孜孜不倦的埋头苦学,还能为我们的生活增添成就;

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

python中不论类的名字是什么歌_Python自动猜歌名,还愁排名上不去嘛?相关推荐

  1. python中不论类的名字是什么意思_Python中的名实关系——名字、命名空间、作用域...

    对象(object) 一切皆对象. 在Python中,包括数据和处理数据的函数,一切实体都是对象.在一个程序的运行过程中,不断地动态创建对象,然后通过对象之间的相互作用修改.销毁已存在的对象或生成新的 ...

  2. python中不论类的名字是什么、构造方法的名字都是,在Python中,不论类的名字是什么,构造方法的名字都是________________。...

    在Python中,不论类的名字是什么,构造方法的名字都是________________. 更多相关问题 传导性失语最大特点为 六维作战空间是陆.海.空.天.电磁和_____ 三极管放大电路静态分析就 ...

  3. python定义一个dog类 类属性有名字毛色体重_全面了解python中的类,对象,方法,属性...

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  4. python中定义类

    3.2. 定义类 Python是完全面向对象的:可以定义自已的类,从自已的或内置类进行继承,然后对生成的类进行实例化. 在Python中定义类很简单:就象定义函数,没有独立的定义接口.只要定义类,然后 ...

  5. Python中的类、实例以及方法,MRO继承解析顺序以及Mixin类

    Contents 1. 什么是类和实例 2. 类的实例方法.类方法和静态方法 3. MRO是什么,描述其查找顺序 4. Mixin是什么,描述其应用场景 5. References 1. 什么是类和实 ...

  6. Python 中的类与继承

    类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object):pass Python 的编程习惯,类名以大写字母开 ...

  7. Python基础之:Python中的类

    文章目录 简介 作用域和命名空间 class 类对象 类的实例 实例对象的属性 方法对象 类变量和实例变量 继承 私有变量 迭代器 生成器 简介 class是面向对象编程的一个非常重要的概念,pyth ...

  8. Python中的类、模块和包究竟是什么?

    Python培训教程:Python中的类.模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象.类.模块.包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在, ...

  9. python中的类属性和类方法_python面向对象之类属性和类方法的使用和实例

    类属性和类方法 目标 类的结构类属性和实例属性类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 1. 使用面相对象开发,第 1 步 是设计 类 2. 使用 类名() 创建对象,创建对象 的 ...

最新文章

  1. usaco Prime Cryptarithm
  2. SpringMVC基础及应用-李守红
  3. GEB:南土所梁玉婷组-大陆尺度下稻田土壤微生物β多样性的纬度分布特征
  4. Android开发二 什么是Android
  5. 记一次批量处理数据库中的敏感信息
  6. 利用反射和xml配置文件手写一个小型的框架
  7. 济宁市机器人科技乐园_人工智能的“游乐场”,邀你免费畅玩!
  8. python怎么提交作业_python分析作业提交情况
  9. 拿签证威胁外籍博士后,实验室导师真的可以为所欲为?
  10. matlab怎么将程序加密,对于MATLAB M文件怎么加密
  11. java ts文件 播放_前端如何播放m3u8格式的视频
  12. SQL达梦数据库迁移
  13. css单行文本和多行文本溢出显示省略号...
  14. 转 我奋斗了18年,不是为了和你一起喝咖啡!
  15. 数据库入口和密码:维普、万方和cnki(转)
  16. Cannot use import statement outside /npm WARN saveError ENOENT: no such file or directory
  17. ubuntu20.04安装matlab2018b
  18. java中怎么输入中文_MultiMC下载-MultiMC中文实用版 v1.0
  19. selenium web录制(selenium_ide-2.9.1-fx.xpi和老版本火狐浏览器在最下方)
  20. javascript 百度地图定位标点,定位详情

热门文章

  1. 看似简单的搜索引擎,原来背后的数据结构和算法这么复杂?
  2. 看完这篇还不了解Nginx,那我就哭了!
  3. BDTC 2019 | 七个开发者能干多大的事?​
  4. 44年前的今天,改变世界的TA诞生了! | 极客头条
  5. 使用Vant完成DatetimePicker 日期的选择器
  6. Centos/Red Hat6.8 安装、配置、启动Gitlab (内网环境)
  7. SpringBoot2.x 整合 Ueditor
  8. pom.xml中添加阿里云Maven中央仓库配置
  9. Docker启动容器时出现错误
  10. JS之前台参数提交到后台,双引号转义为解决办法