446 lines
16 KiB
C#
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);
|
|
}
|
|
}
|
|
|
|
}
|