/* code block */
반응형
1
2
3
4
5
6
from selenium import webdriver
from datetime import datetime
from PIL import Image
import time
import configparser
import urllib

이전 글에서 설치했던 모듈을 포함해 이번 프로젝트에 필요한 모듈들을 임포트한다.

1
2
3
4
myCity = '광주 광산구 첨단1동'
AlertTime = 8 #매일 날씨를 알려줄 시간 (오전 여덟시)

myCity에 날씨정보가 필요한 동네 이름을 쓰자. myCity를 이용해 네이버 날씨에 검색할 것이다.

AlertTime은 매일 한 번 메시지를 보낼 시간이다. 아침 여덟시에 알림을 받도록 하겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
while True:
    
    if (datetime.now().hour == AlertTime) and (datetime.now().minute == 0):
 
        #알리기
        Config = configparser.ConfigParser()
 
        #카카오 아이디, 비밀번호 불러옴
        Config.read('./info.conf')
        Config = Config['MAIN']
 
        id = Config['kakaoid']
        pw = Config['kakaopw']
 
 
        ChatRoom = '채팅방 주소'
        options = webdriver.ChromeOptions()
 
 
        #user-agent 변경
        options.add_argument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
 
        #크롬 드라이버 로드
        driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver', options=options)
        driver.implicitly_wait(3)
 
 
        #날씨 페이지 로드
        driver.get(WeatherURL)
 
 
        #스크린샷 저장
        screenshot_name = "/home/pi/robot/weather.png"
        driver.save_screenshot(screenshot_name)
 
        #스크린샷 불러오기
        img = Image.open('/home/pi/robot/weather.png')
        cutted_img = img.crop((39,210,622,677))
        cutted_img.save('/home/pi/robot/weather.png')
 
 
        #카카오 메인 페이지 로드
        driver.get(KaKaoURL)
        time.sleep(3)
 
        #로그인 
        driver.find_element_by_id('loginEmail').send_keys(id)
        driver.find_element_by_id('loginPw').send_keys(pw)
        driver.find_element_by_id('countryCodeRequired').find_element_by_xpath("//button[@type='submit']").click()
        time.sleep(3)
 
 
 
        #채팅방 로드
        driver.get(ChatRoom)
        time.sleep(3)
 
        #글 작성
        driver.find_element_by_id('chatWrite').send_keys('라즈베리로봇 테스트 메시지입니다')  #메시지 작성
        driver.find_element_by_xpath("//input[@class='custom uploadInput']").send_keys('/home/pi/robot/weather.png'#날씨 사진 전송
        time.sleep(1)
        driver.find_element_by_xpath("//div[@class='wrap_inp']//button[@type='button']").click()  #전송버튼
   
        driver.quit()
        time.sleep(60)
 

매일 반복시키기 위해 While True:로 무한 루프를 돌려주었다.

라즈베리가 카카오톡에 로그인하기 위해 사용할 자신의 카카오 아이디와 비밀번호를 불러오기 위해

info.conf 파일을 만들어 파이썬 파일과 같은 경로에 위치시키자.

필자는 /home/pi/robot/rasprobot.py 경로에 스크립트를 저장해뒀기때문에 

info.conf 파일 경로는 /home/pi/robot/info.conf 이다.

 

터미널에서 vi 명령어로 info.conf 파일을 생성한다.

아래는 안에 넣을 내용이다.

1
2
3
[MAIN]
kakoid = 내 카카오 아이디
kakopw = 내 카카오 비밀번호

 

그다음 필요한 것은 라즈베리가 메시지를 보낼 채팅방의 주소이다.

카카오톡은 각 채팅방마다 고유한 주소를 가진다.

 

카카오톡에 등록된 자신의 플러스친구에게 메시지를 보낸다.

(메시지를 보내기 위해서는 플러스친구 관리자 화면에서 설정에 들어가 홈 공개를 해야한다.)

그러면 관리자 화면에서도 이렇게 1:1채팅이 생긴 것을 확인할 수 있다.

이 채팅방에 들어가보자

채팅방 화면 상단에 있는 채팅방의 주소를 복사해 ChatRoom 변수에 넣어주자.

(ChatRoom = 'https://xxxxxxxxxxx')

 

user-agent 변경 파트는 경우에 따라 필요 없는 경우도 많지만

이 파트의 유무에 따라 접속이 막히는 홈페이지가 있을 수 있으니 넣어뒀다.

 

네이버에 날씨를 검색한 후 화면을 캡쳐해 저장하고, 날씨 파트만 crop 함수로 잘라내어

다시 저장한 파일을 카카오톡으로 보내준다.

 

이후 60초를 기다림으로써 8시 01분이 되어 if (datetime.now().hour == AlertTime) and (datetime.now().minute == 0): 조건의 결과가 False가 되므로 다음날 8시 정각이 될 때까지 기다린다.

 

이제 이 스크립트를 자동실행하게 해 날씨 알리미 라즈베리로봇을 완성시켜보자.

 

터미널에서 /etc/profile.d 폴더로 이동한다.

cd /etc/profile.d

이 폴더 안에 스크립트를 만들면 부팅시 자동실행된다.

sudo vi run.sh

run.sh 파일을 만들어주자. 스크립트 이름은 다르게 해도 상관 없다.

1
2
#!/bin/bash
python3 /home/pi/robot/rasprobot.py

위 두줄을 입력한다. 파이썬 파일의 이름과 경로가 다르다면 그 경로에 맞게 써주도록 하자.

bash에서 파이썬 파일을 실행할 수 있어야 하므로 파이썬 파일이 있는 폴더로 이동해 권한설정을 바꿔준다.

cd /home/pi/robot
chmod 777 rasprobot.py

 

마지막으로 파이썬 파일 맨 윗줄(모듈을 임포트하는 줄보다도 더 위)에

1
#!/usr/bin/env python

이렇게 적어주자. 

터미널에서 reboot 명령어로 재부팅 시켜주면 자동실행 스크립트와 함께 로봇이 일하기 시작한다.

reboot

 

이제 라즈베리파이를 집안 구석 (와이파이가 닿는 곳이라면 어디든) 신경쓰이지 않는곳에 두고 전원을 연결시켜두자.

 

내일 아침, 라즈베리가 당신의 두피를 산성비로부터 지키기 위해 날씨를 알려줄 것이다.

 

[결과]

나만을 위한 라즈베리로봇 탄생

사진은 테스트를 위해 메시지를 보낸 후 찍은거라 오전 8시가 아니지만, 위 코드대로 동작한다면 오전 8시에 알려준다.

 

 

 

 

반응형

+ Recent posts