Получить список заказов из Google Кошелька

1

Я продаю приложения Android в Google Play, и все заказы проходят через Google Кошелек, как обычно. Google Кошелек не позволяет группировать и фильтровать список заказов, поэтому я хотел создать небольшую утилиту (С#, WinForms), чтобы показать этот список заказов более удобным способом. Мне удалось найти следующий URL-адрес, который позволяет загружать CSV файл с информацией о заказе, и этот файл полностью соответствует моим требованиям " https://wallet.google.com/merchant/pages/u/0/bcid-XXX/oid-YYY/cid-ZZZ/buyorderdownload? startTime =... & endTime =... ". Однако я не могу разрешить Google, и я не могу использовать этот URL-адрес, не перенаправляясь на страницу входа. Поскольку я собираюсь создать инструмент WinForms, я не могу использовать эту страницу входа. Итак, вопрос в том, как разрешить Google в каком-то автоматическом режиме, чтобы я мог использовать этот URL-адрес и загружать файлы CSV для дальнейшей обработки в моем инструменте?

  • 0
    Вам необходимо использовать Google Authenticator. Есть вопрос, который говорит о том, как использовать его в .Net здесь: stackoverflow.com/questions/6421950/…
  • 0
    @ Ted8119 - Тебе так повезло. Я недавно задал этот вопрос и даже опубликовал открытую награду за него. К сожалению, кажется, нет способа сделать это. Итак, я пошел дальше и создал программу, чтобы программно делать то, что вы пытаетесь сделать. Я сейчас на работе, поэтому я не могу получить доступ к своему компьютеру, но когда вечером я вернусь домой, я опубликую код для этого. Я написал его на C # как консольное приложение, но вы сможете легко перенести его на WinForms, если это то, что вам нужно.
Показать ещё 1 комментарий
Теги:
winforms
android-pay

1 ответ

0
Лучший ответ

Тед, вот мой код:

private const string LoginUrl = "https://accounts.google.com/ServiceLoginAuth";
private const string WalletUrl = "https://wallet.google.com/merchant/pages";
private readonly DateTime _unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

private const string Username = "[email protected]";
private const string Password = "YourPassword";
private readonly DateTime _startDate = new DateTime(2014, 9, 1);
private readonly DateTime _endDate = new DateTime(2014, 9, 30);

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    string orders = GetLoginHtml();
}

private string GetLoginHtml()
{
    var request = (HttpWebRequest)WebRequest.Create(LoginUrl);
    var cookieJar = new CookieContainer();

    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.CookieContainer = cookieJar;
    using (var requestStream = request.GetRequestStream())
    {
        string content = "Email=" + Username + "&Passwd=" + Password;
        requestStream.Write(Encoding.UTF8.GetBytes(content), 0, Encoding.UTF8.GetBytes(content).Length);
        using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
        {
            string html = sr.ReadToEnd();
            string galxValue = ParseOutValue(html, "GALX");

            return GetLoginHtml2(galxValue, cookieJar);
        }
    }
}

private string GetLoginHtml2(string galx, CookieContainer cookieJar)
{
    var request = (HttpWebRequest)WebRequest.Create(LoginUrl);

    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.CookieContainer = cookieJar;
    using (var requestStream = request.GetRequestStream())
    {
        string content = "Email=" + Username + "&Passwd=" + Password + "&GALX=" + galx;
        requestStream.Write(Encoding.UTF8.GetBytes(content), 0, Encoding.UTF8.GetBytes(content).Length);
        using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
        {
            string html = sr.ReadToEnd();

            return GetLoginHtml3(galx, cookieJar);
        }
    }
}

private string GetLoginHtml3(string galx, CookieContainer cookieJar)
{
    var request = (HttpWebRequest)WebRequest.Create(WalletUrl);

    request.Method = "GET";
    request.ContentType = "text/xml";
    request.CookieContainer = cookieJar;
    using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
    {
        string html = sr.ReadToEnd();
        string bcid = ParseOutBcid(html);
        string oid = ParseOutOid(html);
        string cid = ParseOutCid(html);

        string orders = GetOrders(cookieJar, bcid, oid, cid, _startDate, _endDate);

        return orders;
    }
}

private string GetOrders(CookieContainer cookieJar, string bcid, string oid, string cid, DateTime startDate, DateTime endDate)
{
    var st = (long)(startDate.ToUniversalTime() - _unixEpoch).TotalMilliseconds;
    var et = (long)(endDate.ToUniversalTime() - _unixEpoch).TotalMilliseconds;

    var request = (HttpWebRequest)WebRequest.Create(WalletUrl + "/u/0/bcid-" + bcid + "/oid-" + oid + "/cid-" + cid + "/purchaseorderdownload?startTime=" + st + "&endTime=" + et);

    request.Method = "GET";
    request.ContentType = "text/xml";
    request.CookieContainer = cookieJar;
    using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
    {
        string html = sr.ReadToEnd();
        return html;
    }

}

private string ParseOutValue(string html, string value)
{
    int ndx1 = html.IndexOf("<input name=\"" + value + "\"", StringComparison.Ordinal);
    int ndx2 = html.IndexOf("value=", ndx1, StringComparison.Ordinal);
    return html.Substring(ndx2 + 7, html.IndexOf("\"", ndx2 + 7, StringComparison.Ordinal) - ndx2 - 7);
}

private string ParseOutBcid(string html)
{
    int ndx1 = html.IndexOf("bcid-", StringComparison.Ordinal);
    int ndx2 = html.IndexOf("/oid", ndx1, StringComparison.Ordinal);

    return html.Substring(ndx1 + 5, ndx2 - ndx1 - 5);
}

private string ParseOutOid(string html)
{
    int ndx1 = html.IndexOf("/oid-", StringComparison.Ordinal);
    int ndx2 = html.IndexOf("/cid", ndx1, StringComparison.Ordinal);

    return html.Substring(ndx1 + 5, ndx2 - ndx1 - 5);
}

private string ParseOutCid(string html)
{
    int ndx1 = html.IndexOf("/cid-", StringComparison.Ordinal);
    string retval = "";

    ndx1 = ndx1 + 5;
    while (char.IsNumber(html[ndx1]))
    {
        retval = retval + html[ndx1];
        ndx1++;
    }

    return retval;
}

Несколько вещей. Во-первых, вам нужно изменить имя пользователя, независимо от имени пользователя gmail, и изменить пароль на любой ваш пароль. Кроме того, установите _startDate и _endDate на любой временной интервал, который вы пытаетесь вытащить. Вам не нужно ничего менять. Просто позвоните в функцию "GetLoginHtml()", и она вернет вам заказы на Кошелек!

Имейте в виду, что у меня еще не было возможности оптимизировать код. Его очень сырой и все еще могут быть ошибки. Кроме того, еще одна вещь, если вы получаете ошибку индексации при ее запуске, потому что вам нужно открыть Internet Explorer и войти в свой аккаунт Google в первый раз. После входа в систему вы можете закрыть Internet Explorer и после этого программа должна работать. Мне нужно выяснить путь, который я еще не сделал.

Дайте мне знать, что вы думаете!

  • 0
    Большое спасибо за этот код. Это очень интересный подход к авторизации в Google через application / x-www-form-urlencoded, и он работает! Мне пришлось немного побороться с паролем, но после того, как я понял, что не алфавитно-цифровые символы должны быть закодированы с помощью% HH, все работает как шарм.
  • 0
    @ Ted8119 - Да, я должен использовать oAuth. Это будет версия 2! Рад, что работает на вас!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню