Хорошо, я довольно долго пытался придумать решение / найти решение, но все, что я пытаюсь, либо оказывается не решением, либо слишком сложным для меня, чтобы попытаться, не зная, что оно будет работать.
У меня бот-дискорд, сделанный на 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)