#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

+ Recent posts