Показать сообщение отдельно
Старый 22.07.2014, 05:20  
Yukikaze
Подпольщик AA
Аватар для Yukikaze
OFFLINE
Регистрация: 15.03.2014
Возраст: 34
Сообщений: 100
Благодарностей:
30 всего
Мнения: + 65
Репутация: 91

Код:
import re
import urllib
import httplib
import os
import argparse
import xml.etree.ElementTree as Xml
from urlparse import urlparse


def request(url, param="", headers={}, method="GET"):
    if type(param) is dict:
        param = urllib.urlencode(param)

    uri = urlparse(url)
    conn = httplib.HTTPConnection(uri.netloc)
    conn.request(method, uri.path, param, headers)
    return conn.getresponse(), conn


def getCookies(responce):
    result = {}
    cookies = responce.getheader('set-cookie')
    if not cookies:  # cookies not found
        return result
    temp = re.split(",(?= \w+[\w\d]*=)", cookies)
    for cookie in temp:
        slices = re.split('=|; ', cookie)
        result.update({slices[0]: slices[1]})
    return result


def parseArgs():
    parser = argparse.ArgumentParser()
    parser.add_argument("login", help="GameCenter@Mail.ru login")
    parser.add_argument("password", help="GameCenter@Mail.ru password")
    parser.add_argument("-s", "--server", help="login server address")
    return parser.parse_args()


def main():
    args = parseArgs()
    split = args.login.split("@")
    if len(split) < 2:
        raise Exception("Bad email '{0}'".format(args.login))

    login = split[0]
    domain = split[1]
    password = args.password
    server = args.server or "178.22.90.182:1237"

    params = {"Login": login, "Domain": domain, "Password": password}

    resp, conn = request(
        "http://win.mail.ru/cgi-bin/auth", params, method="POST")
    conn.close()

    cookies = getCookies(resp)
    if 'Mpop' not in cookies:
        raise Exception("Authorization failed")

    mpop = cookies['Mpop']

    url = 'https://authdl.mail.ru/sz.php?hint=AutoLogin'
    params = '<?xml version="1.0" encoding="UTF-8"?>' + \
             '<AutoLogin ProjectId="3001" SubProjectId="0" ShardId="0" ' + \
             'Mpop="%s"/>' % mpop
    headers = {'User-Agent': 'Downloader/4050'}
    resp, conn = request(url, params, headers, "POST")
    xml = resp.read()
    conn.close()
    root = Xml.fromstring(xml)

    uid = root.attrib['PersId']
    token = root.attrib['Key']

    if not os.path.isfile('archeage.exe'):
        raise Exception("archeage.exe not found")

    commandline = ' '.join(["start", "archeage.exe", "-r",
                            "+auth_ip " + server,
                            "-uid " + uid,
                            "-token " + token])

    print "Starting client with", args.server or "default", "server"
    os.system(commandline)

if __name__ == '__main__':
    try:
        main()
    except Exception, e:
        print e
Как пользоваться:
  1. Качаем и устанавливаем питон версии 2.7 (добавляем его в переменную среды PATH, если инсталлер не сделал этого сам)
  2. Создаем текстовый документ с названием mini.py в папке /ArcheAge/Bin32
  3. Вставляем в созданный файл код скрипта
  4. Запускаем скрипт из командной строки: mini.py <email> <password>, или создаете .bat файл и запускаете из него

Обновления:
  • 11.04.2014
    • [~] Исправлены некоторые ошибки
    • [+] Добавлена возможность подключения клиента к собственному логин-серверу, для этого используем ключ -s или --server
      Пример
    • [+] Добавлена мини-справка, увидеть ее можно запустив скрипт с ключом -h или --help
      Пример
  • 22.07.2014
    • [~] Обновлен юзер-агент
    • [~] Исправлена ошибка 'no element found: line 1, column 0'

Talk is cheap. Show me the code
— Linus Torvalds
 
Ответить с цитированием