Я продаю приложения 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 для дальнейшей обработки в моем инструменте?
Тед, вот мой код:
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 и после этого программа должна работать. Мне нужно выяснить путь, который я еще не сделал.
Дайте мне знать, что вы думаете!