Discord机器人-托管后保存文本文件的问题

时间:2018-11-20 15:18:50

标签: python heroku discord

好的,我已经尝试了很长时间了,但我自己尝试了一个解决方案,但是我尝试的一切最终都变成了一个解决方案,或者太复杂了,以至于我不知道它是否会起作用。

我有一个使用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)

1 个答案:

答案 0 :(得分:0)

我正在发布此内容,以便我可以用“答案”关闭线程-请参阅帖子编辑。