Twitter转Reddit机器人改评论逻辑时出现变量报错与返回值异常
问题根因
- 第一版代码没有连通取值逻辑:
REPLY_TEMPLATE直接被赋值为固定字符串tweet,全程没有调用过get_last_tweet()方法获取实际拉取的推文数据;函数内写的print('tweet')也是打印固定字符串,和真实推文内容无关,最终发布的评论自然只会返回"tweet"文本。 - 第二版代码存在作用域和执行顺序错误:
- 虽然在函数内声明了
global tweet,但代码从未调用过get_last_tweet()函数,全局作用域下根本不存在tweet变量,直接执行REPLY_TEMPLATE = tweet必然触发NameError。 - 取值逻辑错误:就算成功调用函数拿到返回值,得到的也是整个接口响应的结构体,不是直接的推文文本——开启
tweet_mode="extended"参数时,完整推文正文存储在tweet.full_text字段中,直接把整个响应对象当评论内容提交也会报错。 - 缩进错误:
print('tweet')没有缩进在get_last_tweet函数块内,函数定义完成就会直接执行这行打印,和拉取推文的逻辑完全脱节。
- 虽然在函数内声明了
- 模板逻辑和需求不匹配:原代码中
REPLY_TEMPLATE.format(url_title)是用来把帖子标题拼接到新帖内容里的逻辑,和“发布推文内容为评论”的需求完全不匹配。
修正方案
不需要用全局变量存储推文内容(全局变量很容易触发时序问题),调整逻辑为:每次触发评论流程前先拉取最新推文,提取正文后套入评论模板再提交即可。
修正后的可运行代码如下:
# 自定义评论模板,{}为推文内容的占位符,不需要额外格式可以直接写为"{}" REPLY_TEMPLATE = "最新同步推文:\n{}" def get_last_tweet(self): tweet = self.user_timeline(user_id="XXXXXXXX", count=1, tweet_mode="extended")[0] # 调试用,打印实际拉取到的推文正文 print(f"拉取到最新推文:{tweet.full_text}") return tweet def process_submission(submission): # 非置顶帖直接跳过 if not submission.stickied: return normalized_title = submission.title.lower() for active_daily in POST: if active_daily in normalized_title: # 执行拉取最新推文的逻辑 latest_tweet = get_last_tweet() # 提取推文正文,套入评论模板 reply_content = REPLY_TEMPLATE.format(latest_tweet.full_text) print(f"正在回复帖子:{submission.title}") submission.reply(body=reply_content)
补充提示:如果需要避免重复回复同一个帖子,可以加简单的去重逻辑(比如把已回复的submission id存在内存集合或者本地txt文件里),每次处理帖子前先校验是否已经回复过,防止程序重复运行时多次发送相同评论。
内容的提问来源于stack exchange,提问作者Fanny Pack
相关产品推荐
相关产品推荐

