Discord bot - проблема сохранения текстового файла после хостинга - PullRequest
0 голосов
/ 20 ноября 2018

Хорошо, я довольно долго пытался придумать решение / найти решение, но все, что я пытаюсь, либо оказывается не решением, либо слишком сложным для меня, чтобы попытаться, не зная, что оно будет работать.

У меня бот-дискорд, сделанный на python.Цель ботов состоит в том, чтобы проанализировать блог на наличие HTML-ссылок. Когда публикуется новая HTML-ссылка, она публикует ссылку в разногласия.

Я использую текстовый файл для сохранения последней ссылки, а затем анализируювеб-сайт каждые 30 секунд, чтобы проверить, была ли опубликована новая ссылка, сравнив ссылку в позиции 0 в массиве со ссылкой в ​​текстовом файле.

Теперь мне удалось разместить своего бота на Heroku с некоторым успехом, однакоС тех пор я узнал, что Heroku не может изменить мой текстовый файл, так как он извлекает код из github, любые изменения отменяются через ~ 24 часа.

После изучения этого я попытался разместить текстовый файл в корзине AWS S3, однако яТеперь я узнал, что он может добавлять и удалять файлы, но не изменять существующие, и может записывать только новые файлы из существующих файлов в моей системе. Это означает, что если бы я мог это сделать, мне не нужно было бы делать это, поскольку я мог бычтобы изменить файл на самом деле в моей системе и не нужно размещать его где-либо.

Я надеюсь найтипростые решения / предложения.

Я открыт для смены хостинга / что угодно, однако я не могу заплатить за хостинг.

Заранее спасибо.

РЕДАКТИРОВАТЬ

Итак, я редактирую это, потому что у меня есть работающее решение благодаря предложению, которое прокомментировано ниже.

Решение состоит в том, чтобы заставить моего питонского бота зафиксировать новый файл в 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', который проверяет формат RAW моего репозитория github и анализирует этот 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 голосов
/ 22 ноября 2018

Я отправляю сообщение, чтобы я мог закрыть ветку "Ответить" - пожалуйста, обратитесь к редактированию сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...