Python 实现Nao机器人点歌和听新闻(爬取音乐和新闻)

  寒假放假,被留在实验室玩机器人(其实是偷懒hah),Nao机器人可以用Python写,刚好学了点Python,来来来,搞事,于是想弄个点歌和点新闻的功能(其实是看到别人的小精灵 (*^▽^*)  )。首先把思路弄清楚,这两个功能不就是两个爬虫嘛。

  在线点歌,先把音乐爬下来,然后再播放。点新闻,就是爬新闻然后处理成文本,让Nao读出来。

   Nao点歌

  其实重要的是找到音乐的API接口,楼主想加这两个功能的时候只有两天了,只能用别人找到的API(偷懒了,没自己去分析,该打!)。QQ音乐API分析过程,大家看这个分析吧。这是用的QQ音乐的API。

   代码如下:

import requests
import os
import re
def play_music(song):
    URL1 ='https://api.bzqll.com/music/tencent/search?key=579621905&s='+song+'&limit=1&offset=0&type=song'
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
    }
    url = str(requests.get(URL1,headers=header).text)
    url = str(re.findall(r'\"url\":\".*?"',url)).replace("['\"url\":\"", '').replace("\"\']", '')    # 处理获得真实的URL
    t = requests.get(url, headers=header).content
    file = "music.wav"  # 这里最好绝对路径,Nao机器人的路径可不好弄
    with open(file, "wb+") as f:
        f.write(t)
        f.close()
    os.system(flie)     # 开始尝试用系统的播放,但是没有声音,后面会给出解决方法



if __name__ == '__main__':
    play_music("我好想你")

有两个需要注意的地方:

      一是文件的路径,Nao机器人不怎么好看路径,不能print, 只能让它读出来。(好多都是让它读出来,所以最好预先写个让Nao说话的函数)

     二是音乐文件保存为wav格式,我用的是Nao 的ALAudioPlayer模块,这个必须是.ogg or .wav。不熟悉的可以看Nao alaudioplayer 文档 。

 

下面这行就是文件的当前路径,建议file改成这个,最好不要变,后面播放歌曲还需要这个路径,

os.path.realpath(__file__)

  我们现在已经成功了一半了,把歌曲下载到了Nao机器人内部了,只剩下播放了、

然而,我最后是用指令盒实现的,有点尴尬(这个文档,看的有点累。。)  在好长时间,Nao没有半点发声后,我决定修改指令盒,来实现(本来就有个播放音乐的指令盒,为何不利用呢!)。

  因为现在在家,电脑没Nao的那个软件,只能码字说明了,后期有时间会加上来的。

  打开Play Sound 这个指令盒,你会发现里面还有两个指令盒,一个是利用图形化界面获取文件的路径,还有一个是播放音乐,所以我们只要偷梁换柱,把路径换掉就行了,直接利用第二个指令盒。我们前面把音乐保存的file 传过去(其实不用传,你每次都用一个路径就好了,还可以覆盖前面的文件)。然后点击开始运行,通过语音控制,说明你想要听的歌,先下载歌曲,然后再播放,达到在线点歌的功能(QQ音乐有的才能点)。

 Nao播放新闻

 同理和上面一样,一个爬虫。这个我们需要新闻的API,我选择的是网易新闻的API(楼主又偷了别人了API,自己没分析,23333).网易新闻API,大家可去看看这个人的

  新闻分为几类,我们就实现听不同的类的新闻,新闻的个数看自己。这里有坑!!!!

 我先把代码放出来吧:

import requests
import os
import re
def find_news(mes):
    url = "https://3g.163.com/touch/reconstruct/article/list/BA10TA81wangning/3-5.html"
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
    }
    All = {
        '娱乐' : 'BA10TA81wangning',
        '电视':'BD2A86BEwangning',
        '电影':'BD2A9LEIwangning',
        '明星':' BD2AB5L9wangning',
        '音乐':'BD2AC4LMwangning',
        '体育':'BA8E6OEOwangning',
        '财经':'BA8EE5GMwangning',
        '军事':'BAI67OGGwangning',
        '军情':'DE0CGUSJwangning',
    }
    url = "https://3g.163.com/touch/reconstruct/article/list/"+All[mes]+"/0-10.html"
    # print(url)
    text = str(requests.get(url,headers=header).text)
    title = re.findall(r"\"title\":\".*?\"",text) # 找到所有的内容
    URL = re.findall(r"\"url\":\".*?\"",text)  # 找到所有的URL
    for i in URL:
        try:
            i = str(i).replace("\"url\":", '').replace("\"", '')           # 如果网址错误,或者没有相应 则下一个新闻
            code = requests.get(i,headers=header,timeout=3000).status_code #
            if str(code) != "200":
                continue
            else:
                content = str(requests.get(i,header,timeout=3000).text)
                title  = str(re.findall(r"<title>.*</title>",content)).replace('[\'<title>','').replace\
                    ('</title>\']','')  # 对标题处理
                content = str(re.findall(r"<meta name=\"description\" content=\".*?\"",content)).replace\
                    ('[\'<meta name=\"description\" content=\"','').replace('\"\']','')   # 对内容处理
                print(title)
                print(content)
                break
        except:
            continue


if __name__ == '__main__':
    find_news("音乐")

 你会发现,用Python3跑出来一点问题都没有,但是机器人一读,就出问题! 

Nao机器人是Python2.7的版本,而我用的是Python3的版本。然后弄下来的新闻乱码,乱成这样。

\xe6\x9d\xa8\xe8\xb6\x85\xe8\xb6\x8a\xe5\x81\xb6\xe9\x81\x87\xe8\x87\xaa\xe5\xb7\xb1\xe7\x9a\x84\xe4\xba\xba\xe5\xbd\xa2\xe7\xab\x8b\xe7\x89\x8c \xe6\xbf\x80\xe5\x8a\xa8\xe5\x90\x88\xe5\xbd\xb1\xe8\xa1\xa8\xe6\x83\x85\xe8\xb6\x85\xe8\x90\x8c_\xe6\x89\x8b\xe6\x9c\xba\xe7\xbd\x91\xe6\x98\x93\xe7\xbd\x91

 开始我以为是编码的问题,改了几种编码,然后准备放弃(其实中途我看到过解决办法,但是感觉不是我这种情况,就退出了,气死),原因就是Python2.7的列表转字符串有问题,Python3可以正常使用!我用了正则表达式,把信息变成了列表,然后再转字符串就出问题。(大家可以试下一步一步的让机器人读出来你需要的信息,大家最后可以把标题和内容连接在一起让Nao读出来)

 只需要修改一点点,原本是把列表变成字符串,现在我们用第0个,例如:str(title[0]),正则表达式也稍微修改下就好了,因为源代码没带回来,所以修改后的不能发,下回补上。

总结:

  在线点歌貌似还需要完善,因为我是先缓存下来,然后播放,如果可以边接收数据边播放就更好了(悄咪咪的说句,音乐播放完了,我好像不记得删除了,占了内存(*^▽^*) ),总的来说我是利用了爬虫。

  播放新闻,其实也需要改善,对众多新闻的处理,要是能实现对某个人或者某件事特定新闻的播放就好了,还需要完善。

  另外我们Nao机器人舞蹈也太low了,被别人嘲笑的(我们也是用了一点心呢,好歹有几个节拍对上了),加油!!!

 最后我不会忘记要学算法的, 加油ヾ(◍°∇°◍)ノ゙!!!

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值