# -*- coding:utf-8 -*-
from bs4 import *
from selenium import webdriver
import xlsxwriter as xlsx
import time

'''
Author : Crody
Date : 2018-07-27 04:06 (UTC + 09:00)
Nationality : Republic of Korea
Purpose : Automative Give
'''

# 엑셀 파일 생성
wb=xlsx.Workbook("C:/result.xlsx")
ws=wb.add_worksheet()

# 엑셀 셀 속성 설정
format0=wb.add_format({'border':2,'bold':True,'align':'center','fg_color':'white','font_color':'black'})
format1=wb.add_format({'border':1,'bold':True,'align':'center','fg_color':'white','font_color':'black'})

# 엑셀 셀 너비 설정
ws.set_column('A:A',10)
ws.set_column('B:B',100)
ws.set_column('C:C',10)

# (x+1,y+1)의 위치에 데이터 입력 및 셀 속성 설정
ws.write(0,0,u'번호',format0)
ws.write(0,1,u'제목',format0)
ws.write(0,2,u'금액',format0)

# 엑셀 행을 바꾸기 위한 변수 init 할당
global init
init = 1

def write(count):
ws.write(init,0,count-1,format1)
ws.write(init,1,name[count-2],format1)
ws.write(init,2,don[count-2],format1)

# 기부 컨텐츠 제목 및 기부 금액을 담을 리스트 할당
name = list()
don = list()

# 기부 컨텐츠 제목 및 기부 금액 추출
def extract_title_and_money():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
name.append(title)
print u"[+] 기부 완료 : {}".format(title)
item = soup.find('dl', {'class': 'detail_fund fund_belong'})

for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons = int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
don.append(totals/persons)
print u"\t[-] 기부 금액은 {}원 입니다".format(totals/persons)

# 크롬 웹 드라이버를 이용한 다함께 카카오 페이지 오픈
driver = webdriver.Chrome('C:/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# 다함께 카카오 로그인 기능
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="loginEmail"]').send_keys('Your Email')
driver.find_element_by_xpath('//*[@id="loginPw"]').send_keys('Your Password')
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/button').click()

# 한 번에 볼 수 있는 게시물이 20개 이므로, 전체 게시물 보기 클릭.
for i in range(7):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# 실제 기부 과정을 작동시키는 중심 코드
for loop in range(2,135):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(loop)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
extract_title_and_money()
write(loop)
init+=1
driver.back()
try:
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
except:
pass
except Exception as e:
print (e)
pass
wb.close()

print "[+] 총 기부 횟수 = {}회".format(len(name))
print "[+] 총 기부 금액 = {}원".format(sum(don))

temporary post


#About


1. 와이어샤크에서의 Layer 4까지의 필드 정보 파싱




import socket
import dpkt

path = "C:/test.pcap"

def display():
print "\t[-] TYPE : {}".format(protocol)
print "\t[-] MAC : {} ---> {}".format(smac, dmac)
print "\t[-] LEN : {}".format(int(total_len, 16))
print "\t[-] TTL : {}".format(int(ttl, 16))
print "\t[-] IP : {} ---> {}".format(sip, dip)
print "\t[-] PORT : {} ---> {}".format(int(sport, 16), int(dport, 16))

with open(path,'rb') as p:
magic = p.read(4).encode('hex')
flag = (False, True)[magic == "d4c3b2a1"]
p.seek(36,1)
dmac = p.read(6).encode('hex')
smac = p.read(6).encode('hex')
type = p.read(2).encode('hex')
type = ("IPv6","IPv4")[type=="0800"]


if flag==True:
print "[+] Start parsing : {}".format(path)

if type=="IPv4":
p.seek(2,1) ; total_len = p.read(2).encode('hex')
p.seek(4,1) ; ttl = p.read(1).encode('hex')
protocol = p.read(1).encode('hex')
protocol = ("","TCP")[protocol=="06"]

p.seek(2,1)
sip = p.read(4).encode('hex')
dip = p.read(4).encode('hex')
sport = p.read(2).encode('hex')
dport = p.read(2).encode('hex')

ip_divide = range(0, 8, 2) ; mac_divide = range(0,12,2)
sip = '.'.join([str(int(sip[a:a+2],16)) for a in ip_divide])
dip = '.'.join([str(int(dip[b:b+2],16)) for b in ip_divide])
smac = ':'.join([str((smac[c:c+2])) for c in mac_divide]).upper()
dmac = ':'.join([str((dmac[d:d+2])) for d in mac_divide]).upper()

display()

elif type=="IPv6":
print("\t[-] It is IPv6 Packet")

elif flag==False:
print "[-] {} is not pcap file".format(path)

[코드 1] - test



[그림 1] - result


#To Do


1. 하나의 패킷이 아닌 모든 패킷 파싱을 위한 루프와 로직 만들기

2. 인터페이스 스니핑





#About


기부를 하고 싶은 마음은 있으나 금전적으로 여유가 되지 못해 기부를 못하는 사람들을 위해서 카카오라는 기업에서는 

도움이 필요한 사람들을 대상으로 카카오 사용자의 "응원"과 "공유" 1건당 사용자 대신 100~200원 가량의 기부금을 내준다.


오랜 친구로부터 이 사실을 알게 된 후, 나 또한 기부를 하고 싶은 마음은 있었으나 금전적 여유가 되질 못해 하지 못했기에,

이 기회를 통해 파이썬 자동화 스크립트 제작을 통해  게시물 마다 "응원합니다"라는 작은 댓글을 다는 프로그램을 만들기로 마음 먹었다.




#Scripts interpretation




# -*- coding:utf-8 -*-
import urllib2
from bs4 import *
from selenium import webdriver

# Open Chrome Driver
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# Auto Login Function
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="email"]').send_keys('카카오톡 이메일 주소를 입력하세요')
driver.find_element_by_xpath('//*[@id="password"]').send_keys('카카오톡 이메일 주소의 비밀번호를 입력하세요')
driver.find_element_by_xpath('//*[@id="btn_login"]').click()

# See More Details
for i in range(5):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

for j in range(1,115):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원합니다')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
driver.back()

# Full URL (containing href)
# give = list()

# Find Href Value
# html = driver.page_source
# soup = BeautifulSoup(html,'html.parser')
# item = soup.find('ul',{'class':'list_fund fund_raising'})
# for li in item.findAll('li',{'class':'listcard'}):
# for href in li.findAll('a',href=True):
# give.append("http://together.kakao.com"+href['href'])


1차 미완성 본이며 댓글을 작성하는 동작만 가능하다


# -*- coding:utf-8 -*-
import time
import urllib2
from bs4 import *
from selenium import webdriver

'''
Author : Loddy
Date : 2018-02-21 (UTC + 09 : 00)
Nationality : Republic Of Korea
Purpose : Auto Give Program
'''

# Extract Title
def title_extract():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
print u"[+] 기부 완료 : {}".format(title)

def give_money():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
money = soup.select('#mArticle > div.my_cover > div > div.info_append > dl > dd:nth-child(4)')
for don in money:
print don.text

# Open Chrome Driver
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# Kakao Login
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="email"]').send_keys('카카오 이메일을 입력하세요')
driver.find_element_by_xpath('//*[@id="password"]').send_keys('카카오 이메일의 비밀번호를 입력하세요')
driver.find_element_by_xpath('//*[@id="btn_login"]').click()

# See More Details ( 게시물 더보기 )
for i in range(5):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# For Counting How many I gived
for j in range(1,3):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
title_extract()
driver.back()
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
except : pass

driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/button[1]').click()
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/div/a[2]').click()
give_money()

2차 수정본


만들당시는 됐는데 현재 2018-03-24는 스크립트가 돌아가질 않아서 다시 수정해서 업로드할 예정




# -*- coding:utf-8 -*-
import urllib2
from bs4 import *
from selenium import webdriver

'''
Author : Loddy
Date : 2018-02-21 (UTC + 09 : 00)
Nationality : Republic Of Korea
Purpose : Auto Give Program
'''

# Extract Title
def title():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
print u"[+] 기부 완료 : {}".format(title)
item = soup.find('dl', {'class': 'detail_fund fund_belong'})
for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons = int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
print u"\t[-] 기부 금액은 {}원 입니다".format(totals / persons)

# Open Chrome Driver
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# Kakao Login
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="loginEmail"]').send_keys('카카오 이메일을 입력하세요')
driver.find_element_by_xpath('//*[@id="loginPw"]').send_keys('카카오 이메일의 비밀번호를 입력하세요')
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/button').click()

# See More Details ( 게시물 더보기 )
for i in range(5):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# For Counting How many I gived
for j in range(1,3):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
title()
driver.back()
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
except :
pass

# driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/button[1]').click()
# driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/div/a[2]').click()

3차 수정본

2018-04-29 21:42


# -*- coding:utf-8 -*-
import urllib2
from bs4 import *
from selenium import webdriver
import pymysql

'''
Author : Loddy
Date : 2018-02-21 (UTC + 09 : 00)
Nationality : Republic Of Korea
Purpose : Auto Give Program
'''

conn = pymysql.connect(host='localhost',user='root',password='apmsetup', db='give',charset='utf8mb4')
curs = conn.cursor()
table = '''
CREATE TABLE information(
idx int(5) not null auto_increment,
title varchar(64) not null,
money varchar(16) not null,
primary key(idx));
'''
curs.execute(table)

data = tuple()

# Extract Title
def extract_title_and_money():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
print u"[+] 기부 완료 : {}".format(title)
item = soup.find('dl', {'class': 'detail_fund fund_belong'})
for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons = int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
print u"\t[-] 기부 금액은 {}원 입니다".format(totals/persons)

# Open Chrome Driver
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# Kakao Login
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="loginEmail"]').send_keys('카카오 이메일을 입력해주세요')
driver.find_element_by_xpath('//*[@id="loginPw"]').send_keys('카카오 이메일의 비밀번호를 입력해주세요')
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/button').click()

# See More Details ( 게시물 더보기 )
for i in range(5):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# For Counting How many I gived
for j in range(1,4):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
extract_title_and_money()
# sql = "INSERT INTO information(idx,title,money) values({},{},{})".format(j)
driver.back()
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
except :
pass

driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/button[1]/img').click()
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/div/a[2]/span').click()

4차 수정본 ( 데이터베이스 연계과정을 시도 )


# -*- coding:utf-8 -*-
import urllib2
from bs4 import *
from selenium import webdriver
import pymysql
import xlsxwriter as xlsx
'''
Author : Loddy
Date : 2018-02-21 (UTC + 09 : 00)
Nationality : Republic Of Korea
Purpose : Auto Give Program
'''

# conn = pymysql.connect(host='localhost',user='root',password='apmsetup', db='give',charset='utf8mb4')
# curs = conn.cursor()
# table = '''
# CREATE TABLE give_list(
# idx int(5) not null auto_increment,
# title varchar(256) not null,
# money varchar(10) not null,
# primary key(idx));
# '''
# curs.execute(table)

# Extract Title
def extract_title_and_money():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
print u"[+] 기부 완료 : {}".format(title)
item = soup.find('dl', {'class': 'detail_fund fund_belong'})
for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons = int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
print u"\t[-] 기부 금액은 {}원 입니다".format(totals/persons)

# Open Chrome Driver
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# Kakao Login
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="loginEmail"]').send_keys('')
driver.find_element_by_xpath('//*[@id="loginPw"]').send_keys('')
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/button').click()

# See More Details ( 게시물 더보기 )
for i in range(5):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# For Counting How many I gived
for j in range(1,4):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
extract_title_and_money()
driver.back()
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
except :
pass
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/button[1]/img').click()
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/div/a[2]/span').click()ㅇ

5차 수정본 ( 데이터베이스 연계 과정에 실패 )


# -*- coding:utf-8 -*-
from bs4 import *
from selenium import webdriver
import xlsxwriter as xlsx

'''
Author : Loddy
Date : 2018-04-29 23:36 (UTC + 09:00)
Nationality : Republic of Korea
Purpose : Automative Give
'''

# 엑셀 파일 생성
wb=xlsx.Workbook("C:/Users/HighTech/Desktop/result.xlsx")
ws=wb.add_worksheet()

# 엑셀 셀 속성 설정
format0=wb.add_format({'border':2,'bold':True,'align':'center','fg_color':'white','font_color':'black'})
format1=wb.add_format({'border':1,'bold':True,'align':'center','fg_color':'white','font_color':'black'})

# 엑셀 셀 너비 설정
ws.set_column('A:A',10)
ws.set_column('B:B',100)
ws.set_column('C:C',10)

# (x+1,y+1)의 위치에 데이터 입력 및 셀 속성 설정
ws.write(0,0,u'번호',format0)
ws.write(0,1,u'제목',format0)
ws.write(0,2,u'금액',format0)

# 엑셀 행을 바꾸기 위한 변수 init 할당
global init
init = 1

def write(count):
ws.write(init,6,count)
ws.write(init,7,name)
ws.write(init,8,don)
init +=1

# 기부 컨텐츠 제목 및 기부 금액을 담을 리스트 할당
name = list()
don = list()

# 기부 컨텐츠 제목 및 기부 금액 추출
def extract_title_and_money():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
name.append(title)
print u"[+] 기부 완료 : {}".format(title)
item = soup.find('dl', {'class': 'detail_fund fund_belong'})
for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons = int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
don.append(totals/persons)
print u"\t[-] 기부 금액은 {}원 입니다".format(totals/persons)

# 크롬 웹 드라이버를 이용한 다함께 카카오 페이지 오픈
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# 다함께 카카오 로그인 기능
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="loginEmail"]').send_keys('카카오 이메일을 입력하세요')
driver.find_element_by_xpath('//*[@id="loginPw"]').send_keys('카카오 이메일의 비밀번호를 입력하세요')
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/button').click()

# 한 번에 볼 수 있는 게시물이 20개 이므로, 전체 게시물 보기 클릭.
# for i in range(7):
# driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# 실제 기부 과정을 작동시키는 중심 코드
for j in range(1,141):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
extract_title_and_money()
ws.write(init,0,j,format1)
ws.write(init,1,name[j-1],format1)
ws.write(init,2,don[j-1],format1)
init+=1
driver.back()
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
if j%20==0:
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()
except :
pass
wb.close()

print "[+] 총 기부 횟수 = {}회".format(len(name))
print "[+] 총 기부 금액 = {}원".format(sum(don))

6차 최종 완성


데이터베이스 아닌 엑셀 연계를 통한 결과 값 추출 스크립트.


for j in range(1,141)에서 141(141-1)은 최대 게시물 수를 의미하며 해당 사이트에서 유동적으로 변하므로 유의 바랍니다


# -*- coding:utf-8 -*-
from bs4 import *
from selenium import webdriver
import xlsxwriter as xlsx

'''
Author : Loddy
Date : 2018-04-30 22:17 (UTC + 09:00)
Nationality : Republic of Korea
Purpose : Automative Give
'''

# 엑셀 파일 생성
wb=xlsx.Workbook("C:/Users/HighTech/Desktop/result.xlsx")
ws=wb.add_worksheet()

# 엑셀 셀 속성 설정
format0=wb.add_format({'border':2,'bold':True,'align':'center','fg_color':'white','font_color':'black'})
format1=wb.add_format({
'border':1,'bold':True,'align':'center','fg_color':'white','font_color':'black'})

# 엑셀 셀 너비 설정
ws.set_column('A:A',10)
ws.set_column(
'B:B',100)
ws.set_column(
'C:C',10)

# (x+1,y+1)의 위치에 데이터 입력 및 셀 속성 설정
ws.write(0,0,u'번호',format0)
ws.write(
0,1,u'제목',format0)
ws.write(
0,2,u'금액',format0)

# 엑셀 행을 바꾸기 위한 변수 init 할당
global init
init =
1

def write(count):
ws.write(init
,0,count,format1)
ws.write(init
,1,name[count-1],format1)
ws.write(init
,2,don[count-1],format1)
init +=
1

# 기부 컨텐츠 제목 및 기부 금액을 담을 리스트 할당
name = list()
don =
list()

# 기부 컨텐츠 제목 및 기부 금액 추출
def extract_title_and_money():
html = driver.page_source
soup = BeautifulSoup(html
, 'html.parser')
for title in soup.find('title'):
name.append(title)
print u"[+] 기부 완료 : {}".format(title)
item = soup.find(
'dl', {'class': 'detail_fund fund_belong'})
for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons =
int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
don.append(totals/persons)
print u"\t[-] 기부 금액은 {}원 입니다".format(totals/persons)

# 크롬 웹 드라이버를 이용한 다함께 카카오 페이지 오픈
driver = webdriver.Chrome('C:/Users/HighTech/Downloads/web/chromedriver')
driver.implicitly_wait(
1)
driver.get(
"https://together.kakao.com/fundraisings/now")

# 다함께 카카오 로그인 기능
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath(
'//*[@id="loginEmail"]').send_keys('카카오 이메일을 입력하세요')
driver.find_element_by_xpath(
'//*[@id="loginPw"]').send_keys('카카오 이메일의 비밀번호를 입력하세요')
driver.find_element_by_xpath(
'//*[@id="login-form"]/fieldset/button').click()

# 한 번에 볼 수 있는 게시물이 20개 이므로, 전체 게시물 보기 클릭.
# for i in range(7):
# driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# 실제 기부 과정을 작동시키는 중심 코드
for j in range(1,141):
try :
driver.find_element_by_xpath(
'//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(j)+']/fundraising-card/a').click()
driver.find_element_by_xpath(
'//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath(
'//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
extract_title_and_money()

write(j)
driver.back()
driver.find_element_by_xpath(
'//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
if j%20==0:
driver.find_element_by_xpath(
'//*[@id="mArticle"]/div[3]/div[3]/button').click()
except :
pass
wb.close()

print "[+] 총 기부 횟수 = {}회".format(len(name))
print "[+] 총 기부 금액 = {}원".format(sum(don))


사용자 정의 함수 write를 사용하게 끔 다시 수정함 리얼 최종 완성.



[그림 1] - 6차 최종 완성 본 스크립트 실행 결과



[ 동영상 ] - 카카오 기부 자동화 스크립트 동작 과정 및 결과 출력 영상



'Coding' 카테고리의 다른 글

Crawling  (0) 2018.07.27
[Pcap Parser]  (0) 2018.07.22
원탁의 기사  (0) 2018.01.05
100 계단 오르기  (0) 2018.01.04
[ Parser ] Portable Executable Structure Parsing (PE 구조 분석)  (0) 2017.10.23

#About



아서왕(king Arthur)은 자기 딸과 결혼시킬 기사(knight) 한 사람만 남기고 모두 죽이기로 하였습니다.


자기가 빠진 12명의 기사를 원탁에 둘러앉히고, 1번 기사를 지나 2번 기사를 죽였습니다.


3번 기사를 지나 4번 기사를 죽였습니다. 이렇게 원탁을 돌면서 하나 건너 하나씩 죽였습니다.


결국 마지막 9번 기사만이 살아남아서 공주와 결혼하고 아서왕의 뒤를 이어 왕이 되었습니다.


 n명의 기사가 있다면 몇 번째 기사가 살아남아서 공주와 결혼하고 왕이 될까요?




문제의 배경


이 문제의 원형은 요셉의 문제(Josephus problem)이다. 요셉의 문제를 간추리면 다음과 같다.


'1세기 경, 40명의 이스라엘 독립군이 로마군에 쫓겨 동굴에 갇히자, 한 사람씩 건너뛰는 방법으로 모두 자살하기로 한다.


허나 마지막 한 사람은 자살하지 않고 로마군에 항복하여 살아난다. 그가 요셉이다. 


그는 계산된 위치에 서 있었기 때문이다. 사람 수에 따른 요셉의 위치는 어디 이겠는가?'





#Solution


일단 수작업으로 조사를 해보면 아래와 같이 기사의 수에 따른 생존자 위치를 확인할 수 있다


기사의 수  

1

3

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

 생존자 위치

1

11

13 

15 


규칙을 확인해보면 기사의 수 보다 작은 동시에 가장 가까운 2의 n제곱 만큼이 생존자 위치임을 확인할 수 있다


ex) 기사의 수가 4명이라면 2의 2제곱이므로 1,3이 생존자 위치가 된다

ex) 기사의 수가 8명이라면 2의 3제곱이므로 1,3,5가 생존자 위치가 된다

ex) 기사의 수가 16명이라면 2의 4제곱이므로 1,3,5,7가 생존자 위치가 된다


① 기사의 수  

3

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

② 2**n 

16 

16 

16 

16 

16 

(①- )

생존자 위치 

11 

13 

15 



(①- ②)와 생존자 위치에 대한 규칙을 확인해보면 () * 2 + 1이 생존자 위치임을 알 수 있다.


즉, 기사의 수를 n이라하면, n에서 n이하의 가장 큰 2의 제곱수를 빼고, 그 수에 2를 곱한 다음, 1을 더하면 생존 위치이다.


예를 들어 n=12이면, 12이하인 가장 큰 2의 제곱수는 8이므로 생존위치 = (12-8)*2+1=9가 되며 알고리즘으로 표현한 것은 다음과 같다


knight = int(input('기사의 수를 입력하시오 : '))
i,j = 2,0

while (i**j<=knight): #기사의 수보다 작거나 같은 동시에 가장 가까운 i의 j제곱일때 까지 루프 반복
square = i**j #i의 j제곱을 square 변수에 할당
j+=1 #loop를 위한 +1 카운트

life_location = (knight-square)*i+1 #생존자 위치가 결정되는 규칙

print ("생존자 위치는 {}번째 입니다".format(life_location))

[코드 1] - 원탁의 기사 코드


위와 같은 방법으로도 결과 값인 생존자 위치를 얻을 수 있지만 또 다른 방법으로도 가능하다.

 

n이하인 가장 큰 2의 제곱수는 2진수로 바꾸었을 때 가장 왼쪽(MSB)의 비트에 해당한다


그러므로 생존자 위치는 n을 2진수로 바꾸어 가장 왼쪽의 1을 떼어내어 오른쪽 끝에 더하면 된다.


ex) 12(10진수) ---> 1100(2진수), MSB를 떼어내면 100, 오른쪽 끝(LSB 위치)에 1을 더하면 1001(2진수) 즉, 9이다.


이러한 작업을 left rotate라고 하며 정리하면, n명의 기사가 있을 때의 생존자 위치는 n을 2진수로 바꾸어 1회 left rotate한 위치이다.


knight = int(input('기사의 수를 입력하시오 : '))

binary = bin(knight) #a='0b1100'
rotation=int(binary[3:]+binary[2],base=2)

print("생존자 위치는 {}번째 입니다".format(rotation))

[코드 2] - 다른 방법의 원탁의 기사 코드



[그림 1] - 코드 결과


#About



100개의 계단이 있으며 나는 한 번에 10개의 계단을 오를 수 있는 능력을 가지고 있다. 


이 때, 100개의 계단을 올라갈 수 있는 경우의 수는 몇 개인가





#Solution


1. 문제를 보고 생각할 수 있는 가장 초기의 코드를 작성한 것이다

stairs = 100
skill = 10
table = [0 for i in range(stairs+1)]
table[0] = 1

for i in range(1, stairs+1):
s=0
for j in range(1,skill+1):
if i-j<0:
t=0
else:
t= table[i-j]
s = s+t
table[i] = s
print (table[stairs])

[코드 1] - 초기 코드



2. 초기 코드를 확인 후 줄일 수 있는 부분을 확인 후, 파이썬의 강점을 살려 개선 코드를 작성한 것이다

stairs = 100
skill = 10
table = [0 for i in range(stairs+1)]
table[0] = 1

for i in range(1, stairs+1):
s=0
for j in range(1,skill+1):
t=(table[i-j],0)[i-j<0]
s = s+t
table[i] = s
print (table[stairs])

[코드 2] - 개선 코드 1



3. 개선 코드를 작성 후 하나의 함수로 만듦으로써 n 계단 오르기를 구현한 것이다

def climbing(staris, skill):
table = [0 for i in range(stairs + 1)]
table[0] = 1
for i in range(1, stairs+1):
s=0
for j in range(1,skill+1):
t=(table[i-j],0)[i-j<0]
s = s+t
table[i] = s
return table[stairs]
r = (climbing(100,10))
print (r)

[코드 3] - 개선 코드 2



4. 함수의 최적화와 코드의 최적화를 구현한 것이며 아래의 코드는 계단 오르기 문제에 있어 가장 최적화 된 코드이다

def climbing(n,m):
table=[0 for i in range(n+1)]
table[0]=1
for i in range(1,n+1):
s=(i-m,0)[(i-m)<0]
table[i]=sum(table[s:i])
return table[n]
a=climbing(100,10)
print (a)

[코드 4] - 최적화 코드



# -*- coding:utf-8 -*-

'''
Date - 2017.10.23
'''

import struct

#Check Bit
def checkBit(value):
if value == "e000":
print "\tSize Of Optional Header = 32bit"
elif value == "f000":
print "\tSize Of Optional Header = 64bit"
else:
print "\tI Don't know what is this"


#Check Machine
def mCheck(hex):
if hex == "6486":
print "\tMachine = " + "AMD64"
elif hex == "4c01":
print "\tMachine = " + "Intel386"

#Print Section Infomation
def secinfo(f):
print "\tName = ", f.read(8).encode('ascii')
print "\tVirtualSize = " + "0x" + f.read(4)[::-1].encode('hex').upper()
print "\tVirtualAddress = " + "0x" + f.read(4)[::-1].encode('hex').upper()
f.seek(24, 1)
space()


#Line Feed
def space():
print "\n",


def parser(filepath):
with open(filepath, 'rb') as f:
space()
print "[+] Only 32Bit Program Can Parse"
print "[+] Parsing Start = ", filepath
space()

#[IMAGE_DOS_HEADER]
print "[IMAGE_DOS_HEADER]"
e_magic = f.read(2)
print "\tHeader Signature = " + e_magic
f.seek(60)
e_lfanew = f.read(4)
print "\tOffset PE = " + "0x" + e_lfanew[::-1].encode('hex')
space()

#[IMAGE_FILE_HEADER]
print "[IMAGE_FILE_HEADER]"
startpe = struct.unpack("<L", e_lfanew)[0]
f.seek(startpe)
print "\tSignature = " + f.read(4)
machine = f.read(2).encode('hex')
mCheck(machine)
nSection = f.read(2)[::-1].encode("hex")
if nSection == "000a":
nSection = 10
else:
print "\tNumber Of Sections = ", int(nSection)
f.seek(12, 1)
bit = f.read(2).encode('hex')
checkBit(bit) # 32 | 64 bit
space()

#[IMAGE_OPTIONAL_HEADER]
print "[IMAGE_OPTIONAL_HEADER]"
f.seek(18, 1)
oep = f.read(4)[::-1].encode('hex')
print "\tAddress Of Entry Point = ", "0x" + oep.upper()
f.seek(8, 1)
imgbase = f.read(4)[::-1].encode('hex')
print "\tImageBase = " + "0x" + imgbase
space()

#[SectionTable]
print "[SectionTable]"
f.seek(192, 1)
for i in range(int(nSection)):
secinfo(f)

print "PATH :",
path = raw_input('')
parser(path)



[그림 1] - 경로 입력


위 코드를 실행하게 되면 위와 같이 PE 구조의 분석을 원하는 프로그램의 경로를 입력을 받으며, 입력 시 아래와 같이 파싱 결과를 출력한다


[그림 2] - PE 구조 파싱




리버싱에 필요한 PE 구조를 분석에 필요한 부분만 파싱하는 도구를 만들어 봄으로써 PE 구조에 대한 이해도를 높일 수 있었고, 


완벽하게 만들진 않았기에 위 코드가 혹.시. 필요하다면 참조를 통해 더 필요한 부분의 추가나 수정을 통해 사용하길 바랍니다



참조

http://blog.eairship.kr/270

'Coding' 카테고리의 다른 글

Crawling  (0) 2018.07.27
[Pcap Parser]  (0) 2018.07.22
[ Crawler ] Kakao Donation Automation Scripts (카카오 기부 자동화 스크립트)  (1) 2018.02.21
원탁의 기사  (0) 2018.01.05
100 계단 오르기  (0) 2018.01.04

+ Recent posts