我一直在努力让这个程序正常工作。这是一个用于 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 是一个单独的程序,它返回一个 url。我发现当你读取一个文件后,它会将读取的光标移动到文件的末尾,所以如果你想再次读取它,你必须使用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)
一切都很完美。它在启动时在文本文件中找到单词“corn”,并且每 3 秒一次,并且它还不断写入文件。既然这行得通,我真的很难过。我不知道在更大的程序中会出现什么问题。我愿意接受任何帮助或想法。
PS:很抱歉没有评论。我计划在程序正常运行后添加它们。如果有什么不清楚的地方,我很乐意解释。