confirm working
This commit is contained in:
parent
9277e85b2c
commit
f4dd7e8703
8 changed files with 164 additions and 12 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,4 +1,6 @@
|
|||
.venv/*
|
||||
.env
|
||||
config.yaml
|
||||
__pycache__/
|
||||
__pycache__/
|
||||
*.md
|
||||
!READEME.md
|
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"terminal.integrated.enablePersistentSessions": true,
|
||||
"python.terminal.activateEnvInCurrentTerminal": true,
|
||||
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python"
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
# Capture Bot San
|
|
@ -1,13 +1,122 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import discord
|
||||
import dropbox
|
||||
import pytz
|
||||
import datetime
|
||||
import os
|
||||
from posixpath import normpath
|
||||
from tzlocal import get_localzone
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from . import token
|
||||
from . import config
|
||||
from . import token_reader
|
||||
from . import config_reader
|
||||
|
||||
def main():
|
||||
config.read_config()
|
||||
token.read_tokens()
|
||||
config = config_reader.read_config()
|
||||
tokens = token_reader.read_tokens()
|
||||
discordClient = discord.Client(intents=discord.Intents.all())
|
||||
dbx = dropbox.Dropbox(
|
||||
app_key=tokens.DROPBOX_APP_KEY,
|
||||
app_secret=tokens.DROPBOX_APP_SECRET,
|
||||
oauth2_refresh_token=tokens.DROPBOX_REFRESH_TOKEN)
|
||||
|
||||
def get_timestamp():
|
||||
timezone = get_localzone()
|
||||
here = ZoneInfo(str(timezone))
|
||||
timestamp = datetime.datetime.now(here).strftime('%Y%m%d%H%M%S')
|
||||
return timestamp
|
||||
|
||||
@discordClient.event
|
||||
async def on_ready():
|
||||
print("Discord Client Logged in as {} (id {}) ...".format(discordClient.user.name, discordClient.user.id))
|
||||
print("Waiting for message..")
|
||||
|
||||
@discordClient.event
|
||||
async def on_message(message):
|
||||
timestamp = get_timestamp()
|
||||
print('Incoming Message: timestamp {}'.format(timestamp))
|
||||
output_string = '# ' + timestamp + '\n' #1st level header
|
||||
|
||||
channel = '#' + message.channel.name # channel -> tag
|
||||
output_string += channel + "\n\n"
|
||||
|
||||
# text content
|
||||
output_string += message.content + "\n\n"
|
||||
|
||||
# attached media image/video
|
||||
num_attachments = len(message.attachments)
|
||||
|
||||
if num_attachments > 0:
|
||||
for index, attachment in enumerate(message.attachments):
|
||||
|
||||
# image/video
|
||||
if attachment.content_type.startswith('image'):
|
||||
file_name = 'image{}_{}.png'.format(timestamp, index)
|
||||
elif attachment.content_type.startswith('video'):
|
||||
file_name = 'video{}_{}.mp4'.format(timestamp, index)
|
||||
else:
|
||||
continue # not supported
|
||||
|
||||
|
||||
image_data = await attachment.read()
|
||||
|
||||
|
||||
# create temporal file
|
||||
try:
|
||||
with open(file_name, 'wb') as f:
|
||||
f.write(image_data)
|
||||
except Exception as e:
|
||||
print('Error:', e)
|
||||
exit(1)
|
||||
|
||||
# upload
|
||||
dropbox_path = normpath(config.DROPBOX_MEDIA_FOLDER) + '/' + file_name
|
||||
dbx.files_upload(open(file_name, 'rb').read(),
|
||||
dropbox_path,
|
||||
mode=dropbox.files.WriteMode.overwrite)
|
||||
os.remove(file_name)
|
||||
output_string += '![[' + file_name + ']]\n'
|
||||
|
||||
# download markdown file to append
|
||||
tmp_markdown_file = './' + config.MARKDOWN_FILENAME
|
||||
markdown_file = normpath(config.DROPBOX_TEXTFILE_FOLDER) + '/' + config.MARKDOWN_FILENAME
|
||||
|
||||
try:
|
||||
dbx.files_download_to_file(tmp_markdown_file, markdown_file)
|
||||
except Exception as e:
|
||||
print('Error:', e)
|
||||
exit(1)
|
||||
|
||||
orig_text = ''
|
||||
try:
|
||||
with open(tmp_markdown_file, encoding='utf-8') as f:
|
||||
orig_text = f.read()
|
||||
except Exception as e:
|
||||
print('Error:', e)
|
||||
exit(1)
|
||||
|
||||
new_text = output_string + orig_text
|
||||
|
||||
try:
|
||||
with open(tmp_markdown_file, 'w', encoding='utf-8') as f:
|
||||
f.write(new_text)
|
||||
except Exception as e:
|
||||
print('Error:', e)
|
||||
exit(1)
|
||||
|
||||
# upload
|
||||
try:
|
||||
dbx.files_upload(open(tmp_markdown_file, 'rb').read(),
|
||||
markdown_file,
|
||||
mode=dropbox.files.WriteMode.overwrite)
|
||||
except Exception as e:
|
||||
print('Error:', e)
|
||||
exit(1)
|
||||
|
||||
|
||||
def main():
|
||||
print("Connecting to discord...")
|
||||
discordClient.run(tokens.DISCORD_TOKEN)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
|
@ -47,6 +47,8 @@ def read_config():
|
|||
print('Config file not found. Creating...')
|
||||
create_config()
|
||||
read_config()
|
||||
|
||||
return config
|
||||
|
||||
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
import dotenv
|
||||
dotenv.load_dotenv()
|
||||
import os
|
||||
import dropbox
|
||||
from dropbox import DropboxOAuth2FlowNoRedirect
|
||||
from . import constants
|
||||
|
||||
|
@ -27,7 +28,7 @@ def read_tokens():
|
|||
write_back = True
|
||||
print('Discord token not set')
|
||||
print('Go to https://discord.com/developers/applications/ and create it.')
|
||||
print('New Application -> Bot -> Token -> Copy!')
|
||||
print('New Application -> Bot -> Token-> Copy! or Reset Token if you have already created it.')
|
||||
token.DISCORD_TOKEN = input('Discord Token: ').strip()
|
||||
if token.DROPBOX_APP_KEY == '' or token.DROPBOX_APP_SECRET == '':
|
||||
write_back = True
|
||||
|
@ -39,21 +40,24 @@ def read_tokens():
|
|||
token.DROPBOX_APP_SECRET = input('App secret: ').strip()
|
||||
if token.DROPBOX_REFRESH_TOKEN == '':
|
||||
write_back = True
|
||||
print('Dropbox refresh token not set. Try to get it...')
|
||||
print('Dropbox refresh token is not set. Try to get it...')
|
||||
if token.DROPBOX_APP_KEY == '' or token.DROPBOX_APP_SECRET == '':
|
||||
print('Requries Dropbox app key and secret. Give up.')
|
||||
exit(1)
|
||||
|
||||
auth_flow = DropboxOAuth2FlowNoRedirect(token.DROPBOX_APP_KEY, consumer_secret=token.DROPBOX_APP_SECRET, use_pkce=False, token_access_type='offline')
|
||||
auth_flow = DropboxOAuth2FlowNoRedirect(token.DROPBOX_APP_KEY, consumer_secret=token.DROPBOX_APP_SECRET, use_pkce=False, token_access_type='offline')
|
||||
authorize_url = auth_flow.start()
|
||||
print('1. Go to:', authorize_url)
|
||||
print('2. Click "Allow" (you might have to log in first)')
|
||||
print('3. Copy the authorization code.')
|
||||
auth_code = input('Enter the authorization code here: ').strip()
|
||||
try:
|
||||
oauth_result = auth_flow.finish(auth_code)
|
||||
oauth_result = auth_flow.finish(auth_code)
|
||||
print("Refresh token:", oauth_result.refresh_token)
|
||||
token.DROPBOX_REFRESH_TOKEN = oauth_result.refresh_token
|
||||
token.DROPBOX_REFRESH_TOKEN = oauth_result.refresh_token
|
||||
with dropbox.Dropbox(app_key=token.DROPBOX_APP_KEY, app_secret=token.DROPBOX_APP_SECRET, oauth2_refresh_token=token.DROPBOX_REFRESH_TOKEN) as dbx:
|
||||
dbx.users_get_current_account()
|
||||
print("Refresh token test Successful")
|
||||
except Exception as e:
|
||||
print('Error:', e)
|
||||
exit(1)
|
30
poetry.lock
generated
30
poetry.lock
generated
|
@ -629,6 +629,34 @@ files = [
|
|||
ply = ">=3.4"
|
||||
six = ">=1.12.0"
|
||||
|
||||
[[package]]
|
||||
name = "tzdata"
|
||||
version = "2024.1"
|
||||
description = "Provider of IANA time zone data"
|
||||
optional = false
|
||||
python-versions = ">=2"
|
||||
files = [
|
||||
{file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"},
|
||||
{file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tzlocal"
|
||||
version = "5.2"
|
||||
description = "tzinfo object for the local timezone"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"},
|
||||
{file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
tzdata = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
|
||||
[package.extras]
|
||||
devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "2.2.1"
|
||||
|
@ -752,4 +780,4 @@ multidict = ">=4.0"
|
|||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.11"
|
||||
content-hash = "f94df9517f6942e31a03c96b92a1eb0851ea71c7a61e4443c4590c1a9cdf18a5"
|
||||
content-hash = "00db07a343e8b8bce60fc60239cafdc0e1efa0cd9411e20dccf52b844506b83e"
|
||||
|
|
|
@ -16,6 +16,7 @@ dropbox = "^11.36.2"
|
|||
pytz = "^2024.1"
|
||||
pyyaml = "^6.0.1"
|
||||
python-dotenv = "^1.0.1"
|
||||
tzlocal = "^5.2"
|
||||
|
||||
|
||||
[build-system]
|
||||
|
|
Loading…
Reference in a new issue