#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차 최종 완성 본 스크립트 실행 결과
[ 동영상 ] - 카카오 기부 자동화 스크립트 동작 과정 및 결과 출력 영상