我一直在努力让这个计划发挥作用。它是一个reddit机器人的程序,当你用“" snekpic"”这个词发表评论时,会回复带有蛇图片的评论。最初,当它回复评论时,它会将评论ID保存在列表中,这样它就不会多次回复评论。但这有一个小问题,因为每当程序重新启动时,它将以空列表重新开始,并且它将回复它已经回复的所有注释。因此,我将注释ID保存到文本文件并读取文本文件,而不是列表。它似乎能够读取文本文件,因为它不会多次回复注释,但它具有我之前遇到的相同问题。当我重新启动程序时,它会回复它已回复的所有注释。所以由于某种原因,它在启动时没有正确读取文本文件。这是代码:
import praw
import TagFinder as Tf
import re
import random
user_agent = "xxx 0.2 by /u/xxx and /u/xxx"
r = praw.Reddit(user_agent=user_agent)
r.login(username='xxx', password='xxx')
possible_tags = ['standing', 'corn', 'ball', 'burmese', 'hognose', 'clothes', 'art', 'cool', 'funny', 'gif']
comment_regex = re.compile(r'(^snekpic)(\s+(\w+))?')
messages = {1: 'hissss', 2: 'snek?', 3: 'SNEK!', 4: 'sssss', 5: 'boop',
6: 'slither slither', 7: 'Don\'t tread on me', 8: 'I am sssummoned.',
9: 'Give me a mousssse please.', 10: 'BEEP ^BOOP BOP I AM ROBOSNEK', 11: 'Snek.'}
while True:
all_comments = praw.helpers.comment_stream(r, 'test')
for comment in all_comments:
try:
comment_text = comment.body.lower()
mo = comment_regex.search(comment_text)
with open('already_done.txt', 'a+') as already_done:
already_done.seek(0)
if comment.id not in already_done.read() and mo is not None and mo.group(3) is not None:
if mo.group(3) in possible_tags:
try:
comment.reply('[' + messages[random.randint(1, 11)] + '](' + Tf.search(mo.group(3)) + ')')
already_done.write(str(comment.id) + '\n')
already_done.seek(0)
except (praw.errors.InvalidComment, praw.errors.RateLimitExceeded):
pass
else:
try:
comment.reply('Thisss category does not exissst! [Here\'s a picture of a snek anyway!](' +
Tf.search() + ')')
already_done.write(str(comment.id) + '\n')
already_done.seek(0)
except (praw.errors.InvalidComment, praw.errors.RateLimitExceeded):
pass
already_done.seek(0)
elif comment.id not in already_done.read() and mo is not None and mo.group(3) is None:
try:
comment.reply('[' + messages[random.randint(1, 11)] + '](' + Tf.search() + ')')
already_done.write(str(comment.id) + '\n')
already_done.seek(0)
except (praw.errors.InvalidComment, praw.errors.RateLimitExceeded):
pass
already_done.seek(0)
except AttributeError:
pass
TagFinder是一个返回网址的独立程序。我发现在读取文件后,它会将读取光标移动到文件的末尾,因此如果要再次读取它,则必须使用seek(0)
将光标移回到开头。所以我将seek(0)
放在with
语句的开头,每次读取或追加文件后(我不确定附加是否会移动读取光标)。
这个程序实际上是为高中编程课程,所以我请求帮助,我的老师建议编写一个更简单的程序版本,看看是否有效。所以我写了以下简短程序
import time
while True:
with open('already_done.txt', 'a+') as o:
o.seek(0)
if 'corn' in o.read():
print('FOUND')
o.write('\nFOUND')
else:
print('NOT FOUND')
o.write('\nNOT FOUND')
time.sleep(3)
一切都很完美。它发现了'"玉米"在启动时的文本文件中,每隔3秒,它也一直写入文件。由于这个工作,我真的很难过。我不知道更大的计划会出现什么问题。我愿意接受任何帮助或想法。
PS:对于缺乏评论感到抱歉。我计划在程序运行后添加它们。如果有什么不清楚,我很乐意解释。
答案 0 :(得分:0)
问题可能在于此代码:
if comment.id not in already_done.read()
如果comment.id
是一个整数,则该值始终为True,因为read()
返回一个字符串。