Nano Hash - криптовалюты, майнинг, программирование

Discord bot - проблема с сохранением текстового файла после хостинга

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

У меня есть дискорд-бот, сделанный на питоне. Целью ботов является анализ блога на наличие 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», который проверяет формат 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)
20.11.2018

  • Просто любопытно, а зачем вам сохранять его в текстовом файле? 20.11.2018
  • Это было единственное решение, которое я мог придумать, его не нужно сохранять в текстовом файле, но если мой бот когда-нибудь выйдет из строя, ему все равно нужно помнить самое последнее обновление, чтобы он не публиковал ту же ссылку на чье-либо разногласие 20.11.2018
  • Что, если вы время от времени синхронизируете текстовый файл html с github, чтобы он не перезаписывался? 20.11.2018
  • Могу ли я сделать это из своего бота? Итак, мой бот берет свой последний файл и загружает его на github, чтобы Heroku мог затем ссылаться на этот файл, который должен меняться нечасто? 20.11.2018
  • Да, я думаю, это сработает. Вы можете запускать консольные команды, выполняя import os и os.system("command") 20.11.2018
  • Вам нужно будет добавить изменения в git, а затем зафиксировать и нажать 20.11.2018
  • Я думаю, что следующие команды будут работать: git add filename git commit -m "update html" git push -u origin master Хотя для этого вам понадобится ваш git-логин, и если вы можете поместить только код github в эту службу, это большой риск для безопасности. 20.11.2018
  • Вы также можете использовать базу данных для хранения и извлечения данных. Я использую MongoDB и mLab для его размещения. Взгляните на api.mongodb.com/python/current/tutorial.html если это может показаться достойным решением 21.11.2018
  • Здравствуйте, у меня есть рабочее решение, вдохновленное @Aeolus, и я отредактировал свой вопрос выше, чтобы продемонстрировать, что БД была еще одним решением, на которое я собирался взглянуть, но чувствовал, что на моем нынешнем уровне это слишком много. 22.11.2018

Ответы:


1

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

22.11.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..