Получаем свободное место в Dropbox

Недавно мне друг скинул массивный файл в дропбокс, и мой без того скудный объем свободного места в 4гб был полностью заполнен. Да куда уж там, полностью переполнен в 2 раза.. К сожалению, дропбокс не дал мне возможность получить доступ к файлу, и тут я задумался написать скрипт для получения свободного места.

Зачем скрипт?

На самом деле, существует более простой способ накручивания халявного места в дропбоксе. Дело в том, что дропбокс определяет новые устройства только по MAC адресу, и поэтому мы можем сначала разослать приглашения на фейковые почтовые ящики, а затем заходить под виртуальной машиной с измененным MAC адресом, пройти обычную процедуру регистрации «нового» пользователя, установить Dropbox клиент на машину. И все это повторить заново нужное количество раз. Об этом способе вы легко можете найти в сети, поэтому я не буду на нем подробно останавливаться. Недостаток этого способа состоит в том, что за каждого «приглашенного» пользователя мы получаем 500мб, а максимум мы можем получить 16гб, то есть нужно повторить всю эту процедуру 32 раза, что лично мне лень делать 🙂 Именно поэтому я решил автоматизировать все эти действия.

Сразу хочу отметить несколько пунктов, которым, по моему мнению, должен был удовлетворять скрипт:
1. Минимум моего участвия
2. Минимум GUI 🙂

Последний пункт сначала я решил включить по фану, но затем я столкнулся с одной существенной проблемой, которую не смог решить на машине с графической оболочкой (Ubuntu). Я расскажу о ней далее. Так что второй пункт получился не из-за моего стремления все делать через терминал, а просто из-за необходимости.

Итак, приступим. Для начала нам понадобится установить VMware или VirtualBox, но я лично больше предпочитаю VMware, а затем создать виртуальную машину Debian Linux. Скачать образ можно с официального сайта. Виртуальная машина понадобится нам только для одного действия. Запускать VMware нужно с root правами:

sudo vmware

Про установку и настройку Debian Linux вы можете прочитать здесь. НО важно, снять пункт с установки Debian Desktop Environment!

В итоге мы видим при загрузке следующее стандартное окно

Screenshot from 2014-09-04 18:51:58

 

После этого идет аутентификация

Screenshot from 2014-09-04 18:53:22

 

Итак, мы видем стандартную консоль

Screenshot from 2014-09-04 19:03:03

 

Желательно сразу перейти в root режим, это делается с помощью команды su (sudo здесь не работает в отличие от Ubuntu).

Теперь скачаем Dropbox:

cd \amp\amp; wget -O - https://www.dropbox.com/download?plat=lnx.x86 | tar xzf -

Убедимся, что все скачалось:

ls -la

Screenshot from 2014-09-04 19:20:04

Перед тем, как продолжать дальше, давайте научимся подключать флешку к нашей виртуальной машине. Это нам понадобится, чтобы запустить один скрипт. Вставляем флешку, у вас может вылезти такая ошибка:

 Screenshot from 2014-09-04 19:39:31

Ничего страшного нет, нам нужно смонтировать нашу флешку. Смотрим, как она называется:

fdisk -l

Screenshot from 2014-09-04 19:42:18

В моем случае она называется /dev/sdb1

Теперь создадим директорию, куда будем монтировать:

mkdir /mnt/sdb1

Screenshot from 2014-09-04 19:45:22

Монтируем флешку в созданную директорию:

mount /dev/sdb1 /mnt/sdb1

Screenshot from 2014-09-04 19:48:47

Теперь убедимся, что наше устройство находится в списке смонтированных:

df -h

Screenshot from 2014-09-04 19:51:06

Чтобы отключить флешку, выполняем:

umount /dev/sdb1

Если возвращает ошибку, то попробуйте перед этим выполнить

killall dhclient

Ну чтож, поехали делать сам фарш 🙂

Для начала на host машине установим все необходимое:

apt-get update &&

apt-get install python-pip -y &&

pip install splinter

В виртуальной машине установим macchanger:

apt-get install macchanger

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

Для этого я написал маленький скрипт generate_maillist.py:

#!/usr/bin/python
import random, string

def randomword(length):
   return ''.join(random.choice(string.lowercase) for i in range(length))

if __name__ == '__main__':
    nameList = [randomword(5) for i in range(32)]
    nameString = ';'.join(name for name in nameList)
    mailString = ';'.join(name+'@mailinator.com' for name in nameList)

    maillist_file = file('maillist_file','w')
    maillist_file.write(mailString)
    maillist_file.close()

    namelist_file = file('namelist_file','w')
    namelist_file.write(nameString)
    namelist_file.close()

    

Чтобы выполнить скрипт, нужно выполнить следующие команды:

chmod 744 generate_maillist.py
./generate_maillist.py

После этого заходим под своим аккаунтом на сайте Dropbox, переходим по этой ссылке https://www.dropbox.com/getspace и выбираем вкладку Refer friends

Screenshot from 2014-09-06 17:55:17

В поле Add names or emails копируем из файла сгенерированные ящики, разделенные точкой с запятой и отсылаем.

Если вам лень это делать, как мне :), то я написал по фану для этого скрипт invite.py:

#!/usr/bin/python
from splinter import Browser
import time
import sys

#login operation in dropbox site
def login(login, password):
    browser.visit('https://www.dropbox.com/login')
    login_form_container = browser.find_by_css('div.login-form-container')

    email_field = login_form_container.find_by_css('div.text-input-wrapper input[type="email"]')
    password_field = login_form_container.find_by_css('div.text-input-wrapper input[type="password"]')

    email_field.fill(login)
    password_field.fill(password)      

    #here we uncheck "remember me" button
    checkbox = browser.find_by_css('div.clearfix input[type="checkbox"]')
    checkbox.uncheck()

    #here we find sign in button
    sign_in = browser.find_by_css('div.clearfix button[type="submit"]')
    sign_in.click()
    time.sleep(3)

def go_refer_page():
    browser.visit('https://www.dropbox.com/getspace')
    refer_list_item = browser.find_by_id('refer')
    refer_list_item.click()
    time.sleep(2)

def send_invites(mail_list):
    referrals_form_container = browser.find_by_id('referrals-email-direct')
    autocompleter_container = referrals_form_container.find_by_css('div.tokenized_autocompleter_container')
    autocompleter_container.find_by_id('referrals-page-new-collab-input').fill(mail_list)

    send_button = browser.find_by_id('retrieve-contacts-button')
    send_button.click()

if __name__ == '__main__':

    my_login = 'your_dropbox_email_here'
    my_password = 'your_dropbox_password_here'

    maillist_file = file('maillist_file', 'r')
    mail_list = maillist_file.read()
    maillist_file.close()
    print('read maillist: '+mail_list)

    browser = Browser()
    print('logining in my account...')
    login(my_login,my_password)
    print('logined succesfully.')
    print('going to reffering page...')
    go_refer_page()
    print('sending invites...')
    send_invites(mail_list)
    print('sended succesfully.')
    time.sleep(1)
    browser.quit()

Все, что вам нужно, это изменить значения my_login, my_password и просто запустить его:

chmod 744 invite.py
./invite.py

Итак, вы разослали приглашения. Теперь нужно сгенерировать ссылки для регистрации устройств в Dropbox. Дополнительное место Dropbox дает не просто за регистрацию реферала, но и если он зарегистрирует свое устройство. В этом нам как раз и поможет наша виртуальная машина без GUI.

Если бы мы запустили Dropbox клиент на машине с GUI, то открылось бы окно:Screenshot from 2014-09-06 18:28:52что нас естественно не устраивает. Именно поэтому мы используем виртуальную машину без GUI. На ней вместо окна выводится сообщение:

"This computer isn't linked to any Dropbox account...
Please visit https://www.dropbox.com/cli_link?host_id=(some code)" to link this device.

 

Dropbox определяет новое устройство только по его MAC адресу. Ну чтож, будем тогда спуфить MAC адрес, забирать device link , затем удалять настройки дропбокса, снова спуфить MAC адрес и так далее…

В общем, вам нужно только запустить на виртуальной машине скрипт generate_macaddresslist.py:

#!/usr/bin/python
import subprocess
from register_device import get_device_link
import os

if __name__ == '__main__':

    namelist_file = file('namelist_file','r')
    nameString = namelist_file.read()
    nameList = nameString.split(';')
    namelist_file.close()
    macaddress_list_file = open('macaddresslist_file', 'w')
    try:
        for name in nameList:
            #spoofing MAC address
            subprocess.call("ifconfig eth0 down",shell=True)
            subprocess.call("macchanger -r eth0",shell=True)
            subprocess.call("ifconfig eth0 up",shell=True)
            subprocess.call("dhclient eth0",shell=True)

            #getting dropbox link for generated MAC address
            print('generating dropbox link...')
            final_link = get_device_link()
            print('generated succesfully.')

            #write final_link in file
            print('writing link in file...')
            macaddress_list_file.write(final_link+os.linesep)

            print('delete dropbox settings...')
            subprocess.call('mv ~/.dropbox ~/.dropbox-'+name,shell=True)
            print('deleted succesfully')

    finally:
        macaddress_list_file.close()    

После этого в директории, где находился скрипт, появится файл macaddresslist_file.

Посмотрим его содержимое:

nano macaddresslist_file

Если все прошло успешно, то в нем будет находиться что-то похожее:

Screenshot from 2014-09-06 16:01:35

Теперь наступает триумфальная конечная стадия 🙂 . Уже не в виртуальной машине запускаем скрипт register_users.py. Для этого в одной директории должны находиться следующие файлы: register_users.py,  register_device.py, macaddresslist_file и файл namelist_file, который был сгенерирован вместе с maillist_file. Исходные файлы:

register_users.py

#!/usr/bin/python
from splinter import Browser
from register_device import *
import time
import sys

def register(browser,login):
    browser.visit('https://www.dropbox.com/login')
    register_link = browser.find_by_css('a.login-register-switch-link')
    register_link.click()

    register_container = browser.find_by_css('div.login-register-register-part')
    first_name_field = register_container.find_by_css('div.text-input-wrapper input[type="text"]')[0]
    first_name_field.fill(login+'1')

    second_name_field = register_container.find_by_css('div.text-input-wrapper input[type="text"]')[1]
    second_name_field.fill(login+'1')

    email_field = register_container.find_by_css('div.text-input-wrapper input[type="email"]')
    email_field.fill(login+'@mailinator.com')

    password_field = register_container.find_by_css('div.text-input-wrapper input[type="password"]')
    password_field.fill(login+'12')

    checkbox = register_container.find_by_css('div.checkbox.checkbox-inline.agree.standard input[type="checkbox"]')
    checkbox.check()

    register_button = register_container.find_by_css('button[type="submit"]')
    print(register_button)

def register_through_reffer(browser,login):
    register_container = browser.find_by_id('invite-register-container')
    first_name_field = register_container.find_by_css('div.text-input-wrapper input[type="text"]')[0]
    first_name_field.fill(login+'1')

    second_name_field = register_container.find_by_css('div.text-input-wrapper input[type="text"]')[1]
    second_name_field.fill(login+'1')

    password_field = register_container.find_by_css('div.text-input-wrapper input[type="password"]')
    password_field.fill(login+'12')

    checkbox = register_container.find_by_css('div.checkbox.checkbox-inline.agree.standard input[type="checkbox"]')
    checkbox.check()

    register_button = register_container.find_by_css('button[type="submit"]')
    register_button.click()

def open_mailbox(browser,login):
    browser.visit('http://mailinator.com/inbox.jsp?to='+login)
    mail_list = browser.find_by_css('li.row-fluid.message.ng-scope')
    for mail in mail_list:
        if 'Dropbox' in mail.find_by_css('div.from.ng-binding').text:
            mail.find_by_tag('a').click()
            break
    time.sleep(1)
    with browser.get_iframe(1) as frame:
        link = frame.find_by_tag('a')['href']

    #here we delete mail
    btn_group = browser.find_by_css('div.btn-group')
    delete_button = btn_group.find_by_tag('button')[2]
    #delete_button.click()

    return link    

def register_user(browser, login):

    print('open mailbox with name: '+login+'...')
    link = open_mailbox(browser,login)
    print('visit reffer link...')
    browser.visit(link)
    print('register through reffer...')
    register_through_reffer(browser,login)
    time.sleep(3)
    print('registered succesfully.')

def login_device(browser, login):
    login_container = browser.find_by_css('div.login-register-login-part')

    email_field = login_container.find_by_css('div.text-input-wrapper input[type="email"]')
    email_field.fill(login+'@mailinator.com')

    password_field = login_container.find_by_css('div.text-input-wrapper input[type="password"]')
    password_field.fill(login+'12') 

    login_button = login_container.find_by_css('button[type="submit"]')
    login_button.click()

if __name__ == '__main__':
    macaddress_list_file = open('macaddresslist_file', 'r')
    namelist_file = open('namelist_file', 'r')
    try:
        nameList = namelist_file.read().split(';')

        for name in nameList:
            browser = Browser()
            register_user(browser, name)

            device_link = macaddress_list_file.readline()
            browser.visit(device_link)
            time.sleep(2)
            login_device(browser,name)
            time.sleep(2)
            browser.quit()

    finally:
        macaddress_list_file.close()
        namelist_file.close()

register_device.py

#!usr/bin/python
from splinter import Browser
import time
import sys
import subprocess

def get_device_link():
    #clear dropboxd_output file
    open('dropboxd_output','w').close()

    subprocess.call('timeout 3s ~/.dropbox-dist/dropboxd >> dropboxd_output',shell=True)
    final_link = ''
    dropboxd_output_file = file('dropboxd_output','r')
    dropboxd_output = dropboxd_output_file.read()
    dropboxd_output_file.close()

    words = dropboxd_output.split(' ')
    device_link = [word for word in words if 'dropbox' in word]
    if device_link:
        final_link = device_link[0]

    return final_link

После этого наблюдаем как работает наш бот и делает всю работу за нас 😉

Всем удачи и до скорых встреч на нашем блоге!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s