This commit is contained in:
jaskaranSM 2019-09-17 06:07:19 -04:00
commit e826385571
5 changed files with 347 additions and 0 deletions

97
ariaTools.py Normal file
View File

@ -0,0 +1,97 @@
import aria2p
import os
from time import sleep
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
cmd = "aria2c --enable-rpc --rpc-listen-all=false --rpc-listen-port 6800 --max-connection-per-server=10 --rpc-max-request-size=1024M --seed-time=0.01 --min-split-size=10M --follow-torrent=mem --split=10 --daemon=true --allow-overwrite=true"
EDIT_SLEEP_TIME_OUT = 5
aria2_is_running = os.system(cmd)
aria2 = aria2p.API(
aria2p.Client(
host="http://localhost",
port=6800,
secret=""
)
)
allDls = {}
def check_metadata(gid):
file = aria2.get_download(gid)
if file.followed_by_ids[0] != None:
new_gid = file.followed_by_ids[0]
logging.info("Changing GID "+gid+" to "+new_gid)
return new_gid
else:
return False
def add_download(link,message):
if "magnet" in link:
download = aria2.add_magnet(link)
allDls[message[0]] = [download,message[1]]
logging.info("Adding: "+link)
return download
else:
download = aria2.add_uris([link])
allDls[message[0]] = [download,message[1]]
logging.info("Adding: "+link)
return download
def remove_download(message):
del allDls[message]
aria2.remove_download(allDls[message].gid)
return True
def get_download_by_message(message):
if allDls[message] == None:
return None
else:
download = allDls[message]
return download[0]
def progress_status(context,update,previous):
download = get_download_by_message(update)
file = aria2.get_download(download.gid)
if not file.is_complete:
if not file.error_message:
msg = "<i>"+str(file.name) +"</i>:- " +str(file.progress_string())+" of "+str(file.total_length_string())+" at "+str(file.download_speed_string())+" ,ETA: "+str(file.eta_string())
if previous != msg:
print("editing message")
try:
context.bot.edit_message_text(text=msg,message_id=update.message_id,chat_id=update.chat.id,parse_mode='HTMl')
except:
pass
previous = msg
sleep(5)
progress_status(context,update,previous)
else:
logging.error(file.error_message)
return
else:
try:
new_gid = check_metadata(file.gid)
except:
new_gid = None
pass
if new_gid:
download = aria2.get_download(new_gid)
allDls[update][0] = download
progress_status(context,update,previous=None)
else:
logging.info(file.name+" Completed.")
msg = "<i>"+str(file.name) +"</i>:- Uploading."
context.bot.edit_message_text(text=msg,message_id=update.message_id,chat_id=update.chat.id,parse_mode='HTMl')
with open('data','w') as f:
f.write(file.name)

50
bot.py Normal file
View File

@ -0,0 +1,50 @@
from telegram.ext import Updater,CommandHandler,run_async
import ariaTools
import logging
import gdriveTools
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
@run_async
def start(update, context):
print(update)
context.bot.send_message(chat_id=update.message.chat_id, text="I'm a bot, please talk to me!")
@run_async
def mirror(update,context):
message = update.message.text
link = message.replace('/mirror','')[1:]
reply_msg = context.bot.send_message(chat_id=update.message.chat_id, text="Starting Download")
download = ariaTools.add_download(link,[reply_msg,update])
ariaTools.progress_status(context,reply_msg,previous=None)
with open('data','r') as f:
file_name = f.read()
print("File-Name: "+file_name)
link = gdriveTools.upload(file_name)
# with open('data','r') as f:
# link = f.read()
msg = "<i>"+str(file_name) +"</i>\n"+link
context.bot.edit_message_text(text=msg,message_id=reply_msg.message_id,chat_id=reply_msg.chat.id,parse_mode='HTMl')
def main():
BOT_TOKEN = "976868081:AAEO--j0dqomyy0ZOYD0sSIGim4UHTYQg5E"
updater = Updater(token=BOT_TOKEN, use_context=True)
start_handler = CommandHandler('start', start)
mirror_handler = CommandHandler('mirror',mirror)
dispatcher = updater.dispatcher
dispatcher.add_handler(start_handler)
dispatcher.add_handler(mirror_handler)
logging.info("Bot Started")
updater.start_polling()
main()

5
config.py Normal file
View File

@ -0,0 +1,5 @@
class Config(object):
"""docstring for Config"""
G_DRIVE_CLIENT_ID = ""
G_DRIVE_CLIENT_SECRET = ""
GDRIVE_FOLDER_ID = ""

182
gdriveTools.py Normal file
View File

@ -0,0 +1,182 @@
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
from apiclient.errors import ResumableUploadError
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.file import Storage
from oauth2client import file, client, tools
from mimetypes import guess_type
import httplib2
import os
from config import Config
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
G_DRIVE_TOKEN_FILE = "auth_token.txt"
# Copy your credentials from the APIs Console
CLIENT_ID = Config.G_DRIVE_CLIENT_ID
CLIENT_SECRET = Config.G_DRIVE_CLIENT_SECRET
# Check https://developers.google.com/drive/scopes for all available scopes
OAUTH_SCOPE = "https://www.googleapis.com/auth/drive.file"
# Redirect URI for installed apps, can be left as is
REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"
parent_id = Config.GDRIVE_FOLDER_ID
G_DRIVE_DIR_MIME_TYPE = "application/vnd.google-apps.folder"
if CLIENT_ID is None or CLIENT_SECRET is None or parent_id is None:
logging.error("Please Setup Config Properly.")
def upload(fileName):
try:
with open(G_DRIVE_TOKEN_FILE) as f:
pass
except IOError:
storage = create_token_file(G_DRIVE_TOKEN_FILE)
http = authorize(G_DRIVE_TOKEN_FILE, storage)
print("Uploading File: "+fileName)
if os.path.isfile(fileName):
http = authorize(G_DRIVE_TOKEN_FILE, None)
file_name, mime_type = file_ops(fileName)
try:
g_drive_link = upload_file(http, file_name,file_name, mime_type,parent_id)
logging.info("Uploaded To G-Drive: "+fileName)
link = g_drive_link
except Exception as e:
logging.error(str(e))
pass
else:
http = authorize(G_DRIVE_TOKEN_FILE, None)
file_name, mime_type = file_ops(fileName)
try:
dir_id = create_directory(http, os.path.basename(os.path.abspath(fileName)), parent_id)
DoTeskWithDir(http,fileName, dir_id)
logging.info("Uploaded To G-Drive: "+fileName)
dir_link = "https://drive.google.com/folderview?id={}".format(dir_id)
link = dir_link
except Exception as e:
logging.error(str(e))
pass
return link
# with open('data','w') as f:
# f.write(link)
def create_directory(http, directory_name, parent_id):
drive_service = build("drive", "v2", http=http, cache_discovery=False)
permissions = {
"role": "reader",
"type": "anyone",
"value": None,
"withLink": True
}
file_metadata = {
"title": directory_name,
"mimeType": G_DRIVE_DIR_MIME_TYPE
}
if parent_id is not None:
file_metadata["parents"] = [{"id": parent_id}]
file = drive_service.files().insert(body=file_metadata).execute()
file_id = file.get("id")
drive_service.permissions().insert(fileId=file_id, body=permissions).execute()
logging.info("Created Gdrive Folder:\nName: {}\nID: {} ".format(file.get("title"), file_id))
return file_id
def DoTeskWithDir(http, input_directory, parent_id):
list_dirs = os.listdir(input_directory)
if len(list_dirs) == 0:
return parent_id
r_p_id = None
for a_c_f_name in list_dirs:
current_file_name = os.path.join(input_directory, a_c_f_name)
if os.path.isdir(current_file_name):
current_dir_id = create_directory(http, a_c_f_name, parent_id)
r_p_id = DoTeskWithDir(http, current_file_name,current_dir_id)
else:
file_name, mime_type = file_ops(current_file_name)
# current_file_name will have the full path
g_drive_link = upload_file(http, current_file_name, file_name, mime_type, parent_id)
r_p_id = parent_id
# TODO: there is a #bug here :(
return r_p_id
def file_ops(file_path):
mime_type = guess_type(file_path)[0]
mime_type = mime_type if mime_type else "text/plain"
file_name = file_path.split("/")[-1]
return file_name, mime_type
def create_token_file(token_file):
# Run through the OAuth flow and retrieve credentials
flow = OAuth2WebServerFlow(
CLIENT_ID,
CLIENT_SECRET,
OAUTH_SCOPE,
redirect_uri=REDIRECT_URI
)
authorize_url = flow.step1_get_authorize_url()
print('Go to the following link in your browser: ' + authorize_url)
code = input('Enter verification code: ').strip()
credentials = flow.step2_exchange(code)
storage = Storage(token_file)
storage.put(credentials)
return storage
def authorize(token_file, storage):
# Get credentials
if storage is None:
storage = Storage(token_file)
credentials = storage.get()
# Create an httplib2.Http object and authorize it with our credentials
http = httplib2.Http()
credentials.refresh(http)
http = credentials.authorize(http)
return http
def upload_file(http, file_path,file_name, mime_type, parent_id):
# Create Google Drive service instance
drive_service = build('drive', 'v2', http=http, cache_discovery=False)
# File body description
media_body = MediaFileUpload(file_path,
mimetype=mime_type,
resumable=True)
body = {
'title': file_name,
'description': 'backup',
'mimeType': mime_type,
}
if parent_id is not None:
body["parents"] = [{"id": parent_id}]
# Permissions body description: anyone who has link can upload
# Other permissions can be found at https://developers.google.com/drive/v2/reference/permissions
permissions = {
'role': 'reader',
'type': 'anyone',
'value': None,
'withLink': True
}
# Insert a file
file = drive_service.files().insert(body=body, media_body=media_body).execute()
# Insert new permissions
drive_service.permissions().insert(fileId=file['id'], body=permissions).execute()
# Define file instance and get url for download
file = drive_service.files().get(fileId=file['id']).execute()
download_url = file.get('webContentLink')
return download_url

13
requirements.txt Normal file
View File

@ -0,0 +1,13 @@
google-api-python-client>=1.7.3
google-auth>=1.5.0
google-auth-httplib2<=0.0.3
httplib2>=0.11.3
more-itertools>=4.2.0
ndg-httpsclient>=0.4.0
oauth>=1.0.1
pyasn1>=0.4.3
pyasn1-modules>=0.2.1
pycurl>=7.43.0
uritemplate>=3.0.0
urllib3>=1.23