You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环调用函数生成随机歌词并发布至Twitter的问题求助

解决你的Twitter歌词自动发布问题 + 代码优化建议

嘿,很高兴能帮到你!作为刚接触Python的新手,你已经完成了获取歌词和推特授权的核心部分,很棒啦~现在咱们来解决每次发相同歌词的问题,顺便给你一些实用的代码改进建议。

问题根源分析

你遇到的重复发布同一歌词的问题,主要有几个原因:

  1. 歌词只获取了一次:你读取文件并选择随机行的代码是在全局作用域执行的,程序启动时只跑一次,之后循环里一直用这个旧值,根本没更新。
  2. 循环逻辑出错:原来的tweet()函数里,for line in file_lines其实是在遍历单一行字符串的每个字符(因为file_lines是你选的那一行),这完全不是你想要的“每次发新歌词”的逻辑。
  3. lyricsimport()函数没被调用:你定义了这个函数但从来没执行过,而且就算在循环里调用,写文件再读的方式也很冗余,还容易出问题。

优化后的完整代码

我帮你重构了代码,去掉了不必要的文件操作,让逻辑更清晰,每次循环都会获取新的随机歌词:

import random
from tswift import Artist
import tweepy
from time import sleep
from credentials import *

# 初始化Twitter API授权
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

def get_random_lyric_line():
    """获取Frank Ocean随机歌曲中的随机非空歌词行"""
    # 初始化艺术家对象
    frank_ocean = Artist('Frank Ocean')
    # 随机选一首歌
    random_song = random.choice(frank_ocean.songs)
    # 把歌词按行分割,过滤掉空行和纯空白行
    lyric_lines = [
        line.strip() 
        for line in random_song.format().split('\n') 
        if line.strip()  # 只保留非空的行
    ]
    # 返回随机一行歌词
    return random.choice(lyric_lines)

def tweet_random_lyrics(interval=10, total_tweets=5):
    """按指定间隔发布随机歌词,默认发5条,间隔10秒"""
    for _ in range(total_tweets):
        try:
            # 每次循环都获取新的随机歌词
            lyric_line = get_random_lyric_line()
            print(f"准备发布: {lyric_line}")
            # 发布推特
            api.update_status(lyric_line)
            print("发布成功!")
            sleep(interval)
        except tweepy.TweepError as e:
            print(f"发布失败: {e.reason}")
            # 出错后多等一会儿再重试
            sleep(interval * 2)

# 启动发布任务
if __name__ == "__main__":
    tweet_random_lyrics()

关键改进点说明

  1. 移除不必要的文件IO:直接从tswift的歌曲对象中提取歌词,不用写入文件再读取,既高效又避免了文件操作带来的bug。
  2. 函数职责单一化:get_random_lyric_line()只负责获取随机歌词,tweet_random_lyrics()只负责发布,代码逻辑更清晰,容易维护。
  3. 每次循环都获取新歌词:在tweet_random_lyrics()的循环内部调用get_random_lyric_line(),确保每次发布都是全新的内容。
  4. 提前过滤空行:在获取歌词时就过滤掉空行,不用在发布时再判断,简化逻辑。
  5. 添加调试打印:方便你看到程序的运行状态,调试更轻松。
  6. 参数化配置:把发布间隔和总条数做成函数参数,方便你调整,不用改核心代码。

给Python新手的额外建议

  • 用if __name__ == "__main__":包裹执行代码:这样当你把这个文件作为模块导入时,不会自动执行发布任务,更符合Python的规范。
  • 避免全局变量滥用:尽量把变量放在函数内部或者用参数传递,让代码更模块化。
  • 异常处理可以更细致:比如推特的重复内容限制,你可以考虑在歌词后面加个随机表情或者小尾巴,避免被判定为重复内容。
  • 测试时减少循环次数:比如先设置total_tweets=2测试功能,没问题再调整成更多次数。

内容的提问来源于stack exchange,提问作者Lewis Wrightson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:35:43