Files
TICKET_MACRO1/InterParkMacro/MainForm.cs
2020-03-09 12:00:48 +09:00

446 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.IO;
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing.Imaging;
using System.Threading;
using System.Runtime.InteropServices;
namespace InterParkMacro
{
public partial class MainForm : Form
{
public ChromiumWebBrowser chromeBrowse_login;
public ChromiumWebBrowser chromeBrowse_Interpark;
public ChromiumWebBrowser chromeBrowse_Seat;
// 저장 파일 위치
private const string SeatURL_Path= @".\SaveFile\SeatURL.txt";
private const string BookingInfo_Path = @".\SaveFile\BookingInfo.txt";
private const string Seat_Path = @".\SaveFile\Seat.txt";
string[] seatList = null;
List<string> okSeatList = new List<string>();
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_MOVE = 0x0001;
public MainForm()
{
InitializeComponent();
initForm();
}
private void initForm()
{
// 크롬 생성하기
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
chromeBrowse_login = new ChromiumWebBrowser("https://m.interpark.com/auth/login.html")
{
Dock = DockStyle.Fill
};
chromeBrowse_Interpark = new ChromiumWebBrowser()
{
Dock = DockStyle.Fill,
};
chromeBrowse_Seat = new ChromiumWebBrowser()
{
Dock = DockStyle.Fill
};
// 이벤트 등록
chromeBrowse_Interpark.FrameLoadEnd += new EventHandler<FrameLoadEndEventArgs>(BrowserFrameLoadEnd);
panel_Login.Controls.Add(chromeBrowse_login);
panel_Booking.Controls.Add(chromeBrowse_Interpark);
panel_Seat.Controls.Add(chromeBrowse_Seat);
// 초기 URL 설정
textBox_LoginURL.Text = "https://m.interpark.com/auth/login.html";
StreamReader sr = new StreamReader(SeatURL_Path);
textBox_SeatURL.Text = sr.ReadLine();
sr.Close();
sr = new StreamReader(Seat_Path);
richTextBox_SeatInfo.Text = sr.ReadToEnd();
sr.Close();
sr = new StreamReader(BookingInfo_Path);
textBox_gooCode.Text = sr.ReadLine();
textBox_day.Text = sr.ReadLine();
textBox_PlaySeq.Text = sr.ReadLine();
sr.Close();
textBox_BookingURL.Text = string.Format("https://moticket.interpark.com/OneStop/Session?GoodsCode={0}&PlayDate={1}",
textBox_gooCode.Text,textBox_day.Text);
//timer_test.Interval = 100;
//timer_test.Start();
}
public void getSeatList()
{
seatList = richTextBox_SeatInfo.Text.Split('\n');
}
private void button_login_Click(object sender, EventArgs e)
{
panel_Booking.Focus();
chromeBrowse_login.Load(textBox_LoginURL.Text);
}
private void button_urlMove_Click(object sender, EventArgs e)
{
getSeatList();
chromeBrowse_Interpark.Load(textBox_BookingURL.Text);
//chromeBrowse_Interpark = new ChromiumWebBrowser(textBox_BookingURL.Text);
panel_Booking.Focus();
}
private void button_Seat_Click(object sender, EventArgs e)
{
chromeBrowse_Seat.Load(textBox_SeatURL.Text);
// URL 저장
StreamWriter sr = new StreamWriter(SeatURL_Path, false);
sr.WriteLine(textBox_SeatURL.Text);
sr.Close();
}
private void button1_Click(object sender, EventArgs e)
{
StreamWriter sr = new StreamWriter(BookingInfo_Path, false);
sr.WriteLine(textBox_gooCode.Text);
sr.WriteLine(textBox_day.Text);
sr.WriteLine(textBox_PlaySeq.Text);
sr.Close();
textBox_BookingURL.Text = string.Format("https://moticket.interpark.com/OneStop/Session?GoodsCode={0}&PlayDate={1}",
textBox_gooCode.Text, textBox_day.Text);
}
public async void BrowserFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
ChromiumWebBrowser browser = sender as ChromiumWebBrowser;
IFrame frame = null;
var identifiers = browser.GetBrowser().GetFrameIdentifiers();
string sendMsg = null;
string playdate = textBox_day.Text;
string playdateSource = string.Format("playdate=\"{0}", textBox_day.Text);
if(e.Frame.IsMain)
{
frame = e.Frame;
var html = await frame.GetSourceAsync();
// 날짜 선택
if(html.Contains(playdateSource))
{
string source = string.Format("jQuery('a[playDate=\"{0}\"]').click();", playdate);
browser.ExecuteScriptAsync(source);
}
}
IFrame arFrame = null;
foreach (var i in identifiers)
{
frame = browser.GetBrowser().GetFrame(i);
if (frame != null)
{
var html = await frame.GetSourceAsync();
bool isStanding = checkBox_standing.Checked;
// 스탠딩 구역 선택
if (isStanding)
{
if (html.Contains("GetBlockSeatList('"))
{
string block = null;
block = textBox_block.Text.Trim();
string source = string.Format("javascript:GetBlockSeatList('', '', '{0}')", block);
if (html.Contains(source))
{
frame.ExecuteJavaScriptAsync(source);
}
}
}
// 좌석 선택 페이지로 이동
if (html.Contains("javascript:goSeat('"))
{
this.Invoke(new MethodInvoker(
delegate ()
{
timer_auto.Stop();
button_auto.Text = "자동실행";
}));
string subStr = html;
for (int j = 0; j < Convert.ToInt32(textBox_PlaySeq.Text); j++)
{
subStr = subStr.Remove(0, 10);
int idx = subStr.IndexOf("javascript:goSeat(");
if (idx < 0)
{
MessageBox.Show("회차를 잘못 설정했습니다.");
return;
}
subStr = subStr.Remove(0, idx);
}
int dix = subStr.IndexOf(";");
subStr = subStr.Remove(dix);
//subStr = string.Format("jQuery('a[playDate='{0}']').click();{1}", playdate, subStr);
browser.ExecuteScriptAsync(subStr);
}
// 안심예매
if (html != null && html.Contains("id=\"txtCaptcha\""))
{
arFrame = frame;
}
// 결제 페이지 선택한 좌석 알람
/*
if (html != null && html.Contains("<input type=\"hidden\" id=\"TOPING_Err_MSG\""))
{
browser.ExecuteScriptAsync("alert(oSeatInfo.Floor+oSeatInfo.RowNo+oSeatInfo.SeatNo);");
}*/
// 좌석 선택
if (html != null && (html.Contains("SelectSeat('") || html.Contains("SelectSeat(this")))
{
int limitCount = Convert.ToInt32(textBox_SeatCount.Text);
int cnt = 0;
string selectSeat = null;
// 스탠딩일 경우
if (isStanding)
{
frame.ExecuteJavaScriptAsync(
"var selectedSeat = new Array(); var seatList = document.getElementsByClassName('SeatN');var limitCount = "+ limitCount +"; for(var i=0; i<seatList.length; i++) { if(selectedSeat.length != limitCount) selectedSeat.push(seatList[i]);else{for(var j=0; j<limitCount; j++){var a = seatList[i].title.split('-'); var b = selectedSeat[j].title.split('-'); if(parseInt(a[a.length-1]) < parseInt(b[b.length-1])){selectedSeat[j].push(seatList[i]); break;}}}} for(var k=0; k<selectedSeat.length; k++) selectedSeat[k].click();");
if (selectSeat == null)
selectSeat = sendMsg;
else
selectSeat += string.Format(",\n{0}", sendMsg);
cnt++;
}
else
{
foreach (string search in seatList)
{
string searchStr = search + '"';
if (search != "" && html.Contains(searchStr))
{
int idx = html.IndexOf(search);
string subStr = html.Remove(0, idx - 1);
int endidx = subStr.IndexOf("javascript");
subStr = subStr.Remove(0, endidx);
idx = subStr.IndexOf(')');
subStr = subStr.Remove(idx + 1);
idx = subStr.IndexOf("SID");
subStr = subStr.Remove(0, idx);
endidx = subStr.IndexOf(',');
subStr = subStr.Remove(endidx);
subStr = subStr.Replace("'", "");
sendMsg += string.Format("$('iframe[id=SeatDetailView]').contents().find('#{0}').click();", subStr);
cnt++;
if (selectSeat == null)
selectSeat = search;
else
selectSeat += string.Format("\n{0}", search);
if (limitCount == cnt)
break;
}
}
}
if (cnt > 0)
{
sendMsg += "Seat.NextStep();";
browser.ExecuteScriptAsync(sendMsg);
if(selectSeat != null)
{
this.Invoke(new MethodInvoker(
delegate ()
{
textBox_selectedSeat.Text = selectSeat;
}));
}
}
}
}
}
if (arFrame != null)
{
this.Invoke(new MethodInvoker(
delegate ()
{
Point p = new Point(270, 520);
Point screenXY = PointToScreen(p);
Cursor.Position = screenXY;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,
(uint)0, (uint)0, 0, 0);
}));
string smg = "$('iframe[id=SeatDetailView]').contents().find('#txtCaptcha').focus();";
arFrame.ExecuteJavaScriptAsync(smg);
}
// 안심예매
/*
if (arFrame != null)
{
var api = OcrApi.Create();
arFrame.ExecuteJavaScriptAsync(smg);
api.Init(Languages.English);
// 이미지 캡쳐
Size size = new Size(340, 195);
Bitmap bitmap = new Bitmap(size.Width, size.Height);
Graphics g = Graphics.FromImage(bitmap);
//client 좌표
this.Invoke(new MethodInvoker(
delegate ()
{
Point clientPoint_s = PointToScreen(new Point(162, 287));
g.CopyFromScreen(clientPoint_s.X, clientPoint_s.Y,0,0,size);
}));
bitmap.Save(@".\test.png", ImageFormat.Png);
string text = api.GetTextFromImage(bitmap);
g.Dispose();
bitmap.Dispose();
}*/
}
private void button_auto_Click(object sender, EventArgs e)
{
getSeatList();
changeAuto();
panel_Booking.Focus();
}
private void changeAuto()
{
if (button_auto.Text.Contains("자동실행"))
{
timer_auto.Start();
button_auto.Text = "중지";
}
else
{
timer_auto.Stop();
button_auto.Text = "자동실행";
}
}
private void timer_auto_Tick(object sender, EventArgs e)
{
chromeBrowse_Interpark.Load(textBox_BookingURL.Text);
}
private void button_SaveSeat_Click(object sender, EventArgs e)
{
StreamWriter sr = new StreamWriter(Seat_Path, false);
sr.WriteLine(richTextBox_SeatInfo.Text);
sr.Close();
}
private void button_Clear_Click(object sender, EventArgs e)
{
richTextBox_SeatInfo.Text = "";
}
private void timer_test_Tick(object sender, EventArgs e)
{
Point client = this.PointToClient(Cursor.Position);
label_xPoint.Text = client.X.ToString();
label_yPoint.Text = client.Y.ToString();
//label_xPoint.Text = Cursor.Position.X.ToString();
//label_yPoint.Text = Cursor.Position.Y.ToString();
Point p = new Point(250, 507);
Point screenXY = PointToScreen(p);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,
(uint)screenXY.X, (uint)screenXY.Y, 0, 0);
//250, 507
}
private void button1_Click_1(object sender, EventArgs e)
{
using (var api = OcrApi.Create())
{
api.Init(Languages.Korean);
string plainText = api.GetTextFromImage(@".\sampe.png");
}
}
private void button1_Click_2(object sender, EventArgs e)
{
Point p = new Point(250, 507);
Point screenXY = PointToScreen(p);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,
(uint)screenXY.X, (uint)screenXY.Y, 0, 0);
}
}
}