Python应用 | 开发微博语音助手:随时听,随时新

想一想在繁忙的工作学习之余,如果能够定时收听到感兴趣的实时微博,实乃打工人的福音,提升工作效率之必备摸鱼神器。

为此,本文将介绍如何开发微博语音播报器,当前已实现的功能:在微博实时查询中查询某个关键字主题,并对搜索结果进行语音播报。

让我们git clone项目到本地,运行,戴上耳机,释放你的双手,开始微博沉浸之旅吧!做一只欢快的牛马,肆意驰骋,You deserve better.

关注公众号:仰望天空的蜗牛

欢迎关注作者公众号,追踪更多更新更有价值的内容。

一、前言

1.1 项目存放仓库

项目已经存放在gitee仓库,

项目gitee地址:https://gitee.com/shawn_chen_rtz/weibo_speaker.git

1.2 项目依赖的Python模块

clone项目到本地后,安装依赖模块,详见项目下的requirements.txt文件。

pip install -r requirements.txt

1.3 项目实现思路

项目实现的主要思路如下,

  1. 对微博实时搜索结果页面进行解析,提取出不同用户所发布博文的必要信息——用户名、微博内容、微博博文id、发布时间等;
  2. 使用python pyttsx3模块结合语音引擎对提取出的文本信息进行语音合成、语音播放。

二、获取微博实时查询结果

2.1 获取微博实时查询结果

定义一个方法get_weibo_search用于获取微博实时查询结果,代码如下,

def get_weibo_search(keyword):
    """
    根据查询关键字获取微博查询结果
    :param keyword: 查询关键字
    :return:
    """
    # 进行url编码操作
    # 等同于浏览器开发者工具-控制台中的函数encodeURIComponent()
    encode_keyword = urllib.parse.quote(keyword)

    base_url = "https://s.weibo.com/realtime"

    result_set = []
    headers = {"X-Requested-With": "XMLHttpRequest",
               "Cookie": "SUB=_2A25US9d-8PUJbkNANLVTzkW1NUXc-K26MuvErP6RvR4Xwst93I6FC3l0N; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFmpDoV36wskXrwCOfoDO7o5JpX5KMhUgL.Fo2ReoM0SK50SoB2dJLoIERLxK.LBK-L1K-LxK.LBKBLB--LxKqLBo-LBoUki--4i-iFiK.pi--fiKLsiKLs;",
               "Referer": f"https://s.weibo.com/realtime?q={encode_keyword}&rd=realtime&tw=realtime&Refer=pic_realtime"}

    # 只获取分页 1页的搜索结果
    for page in range(1, 2):
        target_url = f"{base_url}?q={encode_keyword}&rd=realtime&tw=realtime&page={page}"
        # print(f"请求的地址是 {target_url}")
        logger.info(f"请求的地址是 {target_url}")
        r = requests.get(target_url, headers=headers)
        soup = BeautifulSoup(r.text, "html.parser")

        results = soup.find_all('div', class_="content")
        for result in results:
            user_name = result.find('a', class_="name").get_text()
            user_url = result.find('a', class_="name").get('href')
            created_at = result.find('div', class_='from').get_text().strip().replace(' ', '').replace('\n', '')
            mblog_id = result.find('div', class_='from').find_all('a')[0].get('href').split('?')[0].split('/')[-1]
            title = result.find('p', class_='txt').get_text().strip()
            if title.endswith('展开c'):
                logger.info(f"开始获取{user_name}发布博文{mblog_id}的长文本")
                title = get_mblog_long_text(mblog_id)
                logger.info(f"成功获取{user_name}发布博文{mblog_id}的长文本")
            temp = {
                'title': title,
                'mblog_id': mblog_id,
                'created_at': created_at,
                'user_name': user_name,
                'user_url': user_url
            }
            result_set.append(temp)

    # print(f"爬取的数据条数{len(result_set)}~")
    logger.info(f"爬取的数据条数{len(result_set)}~")
    return result_set

通过请求拼接接口获取网页源代码,使用BeautifulSoup解析网页源代码,提取出微博博文的title、id、发布时间created_at、微博用户名user_name和用户地址user_url等信息。

2.2 获取长博文完整内容

在微博实时搜索结果页面中,当用户发布的博文内容超出一定长度时,会叠起展示,为了后续语音播报完整,我们需要获取长微博的完整内容。

即如果获取到的title以“展开c”为结尾,我们需要多操作一步,获取其完整内容。

if title.endswith('展开c'):
  title = get_mblog_long_text(mblog_id)

获取微博完整内容方法get_mblog_long_text的代码实现,如下,

def get_mblog_long_text(mblog_id):
    """
    通过微博id获取微博完整文本
    :param mblog_id:
    :return:
    """
    logger.info(f"传入的微博id:{mblog_id}")
    url = f"https://weibo.com/ajax/statuses/longtext?id={mblog_id}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
        "Cookie": "SUB=_2AkMRBb7odcPxrAJmv8WyWvolH-jyi0NceAn7uJhMyOhh87mYkqSdutBF-XAHavRIYgFDYmUOPezr3SUzDg2yl"}
    resp = requests.get(url, headers=headers).json()
    mblog_longtext = resp.get("data").get("longTextContent")
    logger.info(f"微博完整文本:{mblog_longtext}")
    return mblog_longtext

该方法最终返回长微博的完整内容。

对于以上两个方法的实现,都需要设置接口请求头headers中的Cookie信息,尤其SUB的值,需要保证其有效可用。可以登录微博状态下,在浏览器F12开发者工具对应接口请求中查找。

有任何问题请留言~

三、语音合成与播放

3.1 创建语音引擎对象

首先需要使用pyttsx3模块创建语音引擎对象,并对引擎对象的参数,比如语速、声量进行初始设置。

import pyttsx3

# 初始化引擎对象
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for voice in voices:
    # 选择中文语音包
    if 'Chinese' in voice.name:
        engine.setProperty('voice', voice.id)
        break
# 设置语速
engine.setProperty('rate', 160)
# 设置音量
engine.setProperty('volume', 2.0)

以上代码成功生成设置语音引擎对象。

3.2 语音合成和播放

创建一个方法speaker用于语音合成播放文本,

def speaker(text):
    engine.say(text)
    engine.runAndWait()

简单的两行代码即可实现方法功能。该方法会把传入的文本text转换成语音并进行播放。

四、项目主程序入口

4.1 主程序

项目主程序,

import time

from get_live_weibo_search import get_weibo_search
from speaker import speaker


def main():
    search_keyword = 'python'
    mblogs = get_weibo_search(search_keyword)
    for mblog in mblogs:
        time.sleep(3)
        speaker(f"以下内容来自微博用户{mblog.get('user_name')},关于{search_keyword}的最新微博")
        time.sleep(1)
        speaker(mblog.get('title'))


if __name__ == '__main__':
    while True:
        main()
        waiting_time = 10*60
        speaker(f"等待{int(waiting_time/60)}分钟后,再进行微博实时查询结果的播报。")
        time.sleep(waiting_time)

创建main方法,设置待查询的关键字search_keyword = 'python',这里设置的是python,你可以替换成你感兴趣、待查询的任何关键字;

遍历所有的搜索结果,并使用方法进行语音的合成与播放;

if __name__ == '__main__':中循环调用main方法,设置等待时间,可以定时搜索获取搜索结果,及时进行语音的播放,确保你不错过任何信息。

五、功能扩展

5.1 功能扩展

可扩展的功能场景:

  • 假如你是某微博账号(或明星或购物网站or anything)的粉丝,可以编写对应的方法实时追踪该用户的微博,一旦用户发布最新微博,会第一时间为你语音播放。释放你的双眼与双手,在工作中,从容不迫地摸鱼,放松心情,提高工作效率;

  • 除了微博,范围可以再扩散到其他平台,任何可获得文本的地方,你都可以使用Python编写方法获取文本信息,语音合成并播放。

可扩展或需完善的项目功能还有很多,感兴趣的可以发散思考一下并尝试代码实现,欢迎留言交流~

图片

 关注作者微信公众号,追踪更多有价值的内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值