好的,我已经尝试了很长时间了,但我自己尝试了一个解决方案,但是我尝试的一切最终都变成了一个解决方案,或者太复杂了,以至于我不知道它是否会起作用。
我有一个使用python制作的discord机器人。僵尸程序的目的是解析博客中的HTML链接,当发布新的HTML链接时,它将把链接发布为不和谐。
我正在使用文本文件保存最新链接,然后每30秒分析一次网站,方法是将数组中位置0的链接与文本文件中的链接进行比较,以检查是否发布了新链接。
现在,我已经成功地将我的机器人托管在Heroku上,但是后来我了解到Heroku无法修改我的文本文件,因为它从github中提取了代码,所有更改都会在约24小时后恢复。
通过学习此方法,我尝试将文本文件托管在AWS S3存储桶中,但是现在我了解到它可以添加和删除文件,但不能修改现有文件,并且只能从系统中现有文件中写入新文件。 ,这意味着,如果我可以执行此操作,则无需这样做,因为我可以在系统上实际修改文件,而无需在任何地方托管它。
我正在寻找简单的解决方案/建议。
我愿意更改托管服务/需要做的一切,但是我不能为托管服务付费。
谢谢。
编辑
因此,我正在编辑此文件,因为由于下面的建议,我有了一个可行的解决方案。
解决方案是让我的python机器人将新文件提交到github,然后使用该提交文件的内容作为参考。
import base64
import os
from github import Github
from github import InputGitTreeElement
user = os.environ.get("GITHUB_USER")
password = os.environ.get("GITHUB_PASSWORD")
g = Github(user,password)
repo = g.get_user().get_repo('YOUR REPO NAME HERE')
file_list = [
'last_update.txt'
]
file_names = [
'last_update.txt',
]
def git_commit():
commit_message = 'News link update'
master_ref = repo.get_git_ref('heads/master')
master_sha = master_ref.object.sha
base_tree = repo.get_git_tree(master_sha)
element_list = list()
for i, entry in enumerate(file_list):
with open(entry) as input_file:
data = input_file.read()
if entry.endswith('.png'):
data = base64.b64encode(data)
element = InputGitTreeElement(file_names[i], '100644', 'blob', data)
element_list.append(element)
tree = repo.create_git_tree(element_list, base_tree)
parent = repo.get_git_commit(master_sha)
commit = repo.create_git_commit(commit_message, tree, [parent])
master_ref.edit(commit.sha)
然后,我有一个名为“ check_latest_link”的方法,该方法检查我的github存储库的RAW格式,并解析该HTML以获取内容,然后将该内容作为字符串分配给我的变量“ last_saved_link”
import requests
def check_latest_link():
res = requests.get('[YOUR GITHUB PAGE LINK - RAW FORMAT]')
content = res.text
return(content)
然后在我的主要方法中,我有以下内容:
@client.event
async def task():
await client.wait_until_ready()
print('Running')
while True:
channel = discord.Object(id=channel_id)
#parse_links() is a method to parse HTML links from a website
news_links = parse_links()
last_saved_link = check_latest_link()
print('Running')
await asyncio.sleep(5)
#below compares the parsed HTML, to the saved reference,
#if they are not the same then there is a new link to post.
if last_saved_link != news_links[0]:
#the 3 methods below (read_file, delete_contents and save_to_file)
#are methods that simply do what they suggest to a text file specified elsewhere
read_file()
delete_contents()
save_to_file(news_links[0])
#then we have the git_commit previously shown.
git_commit()
#after git_commit, I was having an issue with the github reference
#not updating for a few minutes, so the bot posts the message and
#then goes to sleep for 500 seconds, this stops the bot from
#posting duplicate messages. because this is an async function,
#it will not stop other async functions from executing.
await client.send_message(channel, news_links[0])
await asyncio.sleep(500)
答案 0 :(得分:0)
我正在发布此内容,以便我可以用“答案”关闭线程-请参阅帖子编辑。