2026/02/20

오늘의 이야기

다음 회차 로또 번호 분석 결과 및 추천 조합입니다.

**최종 분석 결과**

**1. 라운드별 증가 간격**
- 1192회차: [6, 7, 13, 3, 1]
- 1193회차: [3, 7, 3, 5, 4]
- 1194회차: [10, 2, 9, 9, 4]
- 1195회차: [12, 12, 6, 1, 2]
- 1196회차: [4, 3, 14, 11, 5]
- 1197회차: [4, 2, 19, 2, 15]
- 1198회차: [4, 3, 5, 1, 2]
- 1199회차: [8, 1, 5, 1, 1]
- 1200회차: [1, 2, 12, 4, 12]
- 1201회차: [2, 15, 3, 8, 1]
- 1202회차: [7, 9, 12, 4, 3]
- 1203회차: [3, 12, 11, 6, 4]
- 1204회차: [8, 12, 2, 1, 13]
- 1205회차: [3, 12, 7, 8, 10]
- 1206회차: [2, 14, 9, 1, 15]
- 1207회차: [12, 2, 3, 11, 7]
- 1208회차: [21, 3, 6, 2, 4]
- 1209회차: [15, 3, 15, 2, 2]
- 1210회차: [6, 2, 8, 10, 11]
- 1211회차: [3, 1, 8, 3, 2]

**2. 라운드별 짝수/홀수 개수 및 비율**
- 1192회차: 4E2O
- 1193회차: 3E3O
- 1194회차: 3E3O
- 1195회차: 2E4O
- 1196회차: 3E3O
- 1197회차: 2E4O
- 1198회차: 4E2O
- 1199회차: 4E2O
- 1200회차: 4E2O
- 1201회차: 2E4O
- 1202회차: 3E3O
- 1203회차: 3E3O
- 1204회차: 4E2O
- 1205회차: 3E3O
- 1206회차: 3E3O
- 1207회차: 2E4O
- 1208회차: 4E2O
- 1209회차: 2E4O
- 1210회차: 2E4O
- 1211회차: 3E3O

**3. 라운드별 총합 및 동일 총합 출현 간격**
- 1192회차: 164, None
- 1193회차: 102, None
- 1194회차: 114, None
- 1195회차: 148, None
- 1196회차: 149, None
- 1197회차: 110, None
- 1198회차: 207, None
- 1199회차: 158, None
- 1200회차: 75, None
- 1201회차: 138, None
- 1202회차: 148, 7
- 1203회차: 130, None
- 1204회차: 157, None
- 1205회차: 116, None
- 1206회차: 116, 1
- 1207회차: 166, None
- 1208회차: 179, None
- 1209회차: 120, None
- 1210회차: 99, None
- 1211회차: 189, None

**4. 라운드별 평균 및 동일 평균 출현 간격**
- 1192회차: 27.33, None
- 1193회차: 17.00, None
- 1194회차: 19.00, None
- 1195회차: 24.67, None
- 1196회차: 24.83, None
- 1197회차: 18.33, None
- 1198회차: 34.50, None
- 1199회차: 26.33, None
- 1200회차: 12.50, None
- 1201회차: 23.00, None
- 1202회차: 24.67, 7
- 1203회차: 21.67, None
- 1204회차: 26.17, None
- 1205회차: 19.33, None
- 1206회차: 19.33, 1
- 1207회차: 27.67, None
- 1208회차: 29.83, None
- 1209회차: 20.00, None
- 1210회차: 16.50, None
- 1211회차: 31.50, None

**5. 라운드별 매칭 점수, 매칭 비율 및 동일 비율 출현 간격**
- 1192회차: None, None, None
- 1193회차: 0, 0.0%, None
- 1194회차: 1, 25.0%, None
- 1195회차: 0, 0.0%, 2
- 1196회차: 1, 25.0%, 2
- 1197회차: 0, 0.0%, 2
- 1198회차: 0, 0.0%, 2
- 1199회차: 1, 25.0%, 3
- 1200회차: 0, 0.0%, 2
- 1201회차: 0, 0.0%, 2
- 1202회차: 1, 25.0%, 3
- 1203회차: 0, 0.0%, 2
- 1204회차: 1, 25.0%, 2
- 1205회차: 1, 25.0%, 1
- 1206회차: 2, 50.0%, None
- 1207회차: 0, 0.0%, 4
- 1208회차: 0, 0.0%, 1
- 1209회차: 1, 25.0%, 4
- 1210회차: 0, 0.0%, 2
- 1211회차: 1, 25.0%, 7

---

**최종 추천 조합 및 근거**

**최근 10회차 당첨 번호 (중복 검사용):**
[5,12,21,33,37,40], [3,6,18,29,35,39], [8,16,28,30,31,44], [1,4,16,23,31,41], [1,3,17,26,27,42], [10,22,24,27,38,45], [6,27,30,36,38,42], [2,17,20,35,37,39], [1,7,9,17,27,38], [23,26,27,35,38,40]

**추천 조합:**

1. **추천[03,16,27,30,35,38]**
* **근거:** 전체 데이터에서 가장 빈번하게 출현한 숫자들을 조합하여 구성했습니다. 27(8회), 16(6회), 38(6회), 3(5회), 30(5회), 35(5회)가 포함됩니다. 높은 빈도를 바탕으로 다음 회차에도 나올 가능성이 있다고 판단했습니다.
* **조합 특징:** 짝수 3개, 홀수 3개(3E3O)로 균형 잡힌 짝홀 비율을 보이며, 총합은 149입니다.

2. **추천[03,16,24,27,30,38]**
* **근거:** 최근 5회차 중 3회에서 2E4O 비율이 나타났고, 4E2O 비율도 빈번했습니다. 짝수의 출현 가능성을 고려하여 4E2O (짝수 4개, 홀수 2개) 비율을 바탕으로 구성했습니다. 이 조합은 빈도가 높은 짝수(16, 24, 30, 38)와 홀수(3, 27)를 활용했습니다.
* **조합 특징:** 짝수 4개, 홀수 2개(4E2O)이며, 총합은 138입니다.

3. **추천[16,19,20,28,31,33]**
* **근거:** 직전 1211회차의 증가 간격 패턴 [3, 1, 8, 3, 2]을 그대로 적용하여 만든 조합입니다. 과거 패턴의 반복을 기대하는 전략입니다. 중간 범위의 숫자들을 활용하여 총합을 적절하게 유지했습니다.
* **조합 특징:** 짝수 3개, 홀수 3개(3E3O)로 균형을 이루며, 총합은 147입니다.

4. **추천[01,10,27,28,35,40]**
* **근거:** 최근 회차의 총합 범위(140-170) 내에 있으면서, 안정적인 짝홀 비율(3E3O)을 가지도록 빈번하게 출현한 숫자들로 구성했습니다. 작은 숫자, 중간 숫자, 큰 숫자가 고루 섞여있습니다.
* **조합 특징:** 짝수 3개, 홀수 3개(3E3O)이며, 총합은 141입니다.

5. **추천[05,11,18,29,34,43]**
* **근거:** 전체 데이터에서 상대적으로 출현 빈도가 낮지만, 특정 시점에 나타날 수 있는 "오래된" 숫자들을 포함하여 예측의 다양성을 높였습니다. 11과 같이 한 번만 출현한 숫자들이 포함되어 있습니다.
* **조합 특징:** 짝수 3개, 홀수 3개(3E3O)이며, 총합은 140입니다.

---

**마지막 라운드 (1211회차)와 신규 추천 조합 비교 분석**

**1211회차 당첨번호:** [23,26,27,35,38,40] (3E3O, 총합 189, 평균 31.5, 간격 [3,1,8,3,2])

**추천 1: [03,16,27,30,35,38]**
* **비교:** 1211회차와 27, 35, 38번이 겹칩니다. 짝홀 비율은 3E3O로 1211회차와 동일합니다. 총합은 149로 1211회차(189)보다 낮습니다. 간격 패턴은 [13,11,3,5,3]으로 다릅니다. 이 조합은 최근 10회차 당첨 번호와 일치하지 않습니다.

**추천 2: [03,16,24,27,30,38]**
* **비교:** 1211회차와 27, 38번이 겹칩니다. 짝홀 비율은 4E2O로 1211회차(3E3O)와 다릅니다. 총합은 138로 1211회차(189)보다 낮습니다. 간격 패턴은 [13,8,3,3,8]로 다릅니다. 이 조합은 최근 10회차 당첨 번호와 일치하지 않습니다.

**추천 3: [16,19,20,28,31,33]**
* **비교:** 1211회차와 겹치는 번호가 없습니다. 짝홀 비율은 3E3O로 1211회차와 동일합니다. 총합은 147로 1211회차(189)보다 낮습니다. **간격 패턴은 1211회차와 동일한 [3,1,8,3,2]로 강력한 패턴 유사성을 보입니다.** 이 조합은 최근 10회차 당첨 번호와 일치하지 않습니다.

**추천 4: [01,10,27,28,35,40]**
* **비교:** 1211회차와 27, 35, 40번이 겹칩니다. 짝홀 비율은 3E3O로 1211회차와 동일합니다. 총합은 141로 1211회차(189)보다 낮습니다. 간격 패턴은 [9,17,1,7,5]로 다릅니다. 이 조합은 최근 10회차 당첨 번호와 일치하지 않습니다.

**추천 5: [05,11,18,29,34,43]**
* **비교:** 1211회차와 겹치는 번호가 없습니다. 짝홀 비율은 3E3O로 1211회차와 동일합니다. 총합은 140으로 1211회차(189)보다 낮습니다. 간격 패턴은 [6,7,11,5,9]로 다릅니다. 이 조합은 최근 10회차 당첨 번호와 일치하지 않습니다.

전반적으로 추천 조합들은 1211회차와 비교하여 짝홀 비율은 유사하거나 약간의 변화를 주었으며, 총합은 최근 평균 범위에 맞추어 1211회차보다 다소 낮게 형성되었습니다. 특히 추천 3번은 1211회차와 동일한 간격 패턴을 보이며 높은 패턴 유사성을 추구했습니다. 모든 추천 조합은 최근 10회차 당첨 번호와 완벽하게 일치하지 않도록 검토되었습니다.



사용하는 예시 영상 보기
이 앱이 궁금 하다면, 아래 링크에서 설치할 수 있습니다.
로또 645






오늘의 이야기

오늘은 다음(daum.net) 의 메인 페이지의 내용중에 일부를 스크래을 해 보기로 했다. 


#coding=utf-8
#
import json
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import ssl
import requests
import datetime

def daumResult():
print('')
now = datetime.datetime.now()
rValue = '''
<div align="center">자료수집 일시 : {0}</div>
<div></div>
<table style="border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft">
<tbody>
<tr>
<td width="33%" bgcolor="yellow" align="center"> 뉴스 제목 </td>
<td width="33%" bgcolor="yellow" align="center"> 관련 링크 </td>
<td width="33%" bgcolor="yellow" align="center"> 참고 이미지 </td>
</tr>
'''.format(now)

context = ssl._create_unverified_context()
url = 'https://www.daum.net/'
html = urllib.request.urlopen(url, context=context).read()
soup = BeautifulSoup(html, 'html.parser')

tr_add = "";
items = soup.find_all(class_="link_item")
for item in items:
try:
img = item.find_all(class_="img_thumb")
titles = item.find_all(class_="tit_item")
tr_add += '''
<tr>
<td >{0}</td>
<td ><a href="{1}">{2}</a></td>
<td ><img src="{3}">{4}</td>
</tr>'''.format(titles[0].get_text(), item['href'], item['href'], img[0]['src'].split('=')[1], img[0]['src'].split('=')[1])
except:
break

items = soup.find_all(class_="link_txt")
for item in items:
tr_add += '''
<tr>
<td >{0}</td>
<td colspan="2"><a href="{1}">{2}</a></td>
</tr>'''.format(item.get_text(), item['href'], item['href'])

end_tag = '''
<tr><td colspan='3' align="center"> 이 글은 python script 을 이용하여 다음(www.daum.net) 메인 내용을 수집한 자료 입니다.
<font color="red"><b>게시되는 내용은 python script 의 동작을 확인하는 용도 이외에는 아무 관련이 없습니다.</b></font>
</td></tr>
</tbody>
</table>
'''
return rValue + tr_add + end_tag


blog_name = "autoposting"
client_id = "be............................286e"
seckey = "be43b5c.........................................8983c7915"
callback_url = "http://autoposting.tistory.com"
getUrl = 'https://www.tistory.com/oauth/authorize?client_id={0}&redirect_uri={1}&response_type=code&state=someValue'
getUrl = getUrl.format(client_id, callback_url)
#res = requests.get(getUrl, verify=False)
#print(getUrl)

def sendPost(category):
url_post = "https://www.tistory.com/apis/post/write"

visibility = 3; # 0 미발행 3 발행
#category = 1;
tag = '자동글쓰기, python, 다음_메인뉴스'
acceptComment = 1
title = '이시간 뉴스 (다음) (feat Python 자동 글쓰기) '
content = daumResult()

headers = {'Content-Type': 'application/json; charset=utf-8'}
params = {
'access_token': access_token,
'output': 'json',
'blogName': blog_name,
'title': title,
'content': content,
'visibility': visibility,
'category': category,
'published':'',
'slogan':'',
'tag': tag,
'acceptComment': acceptComment,
'password':''
}
data = json.dumps(params)

rw = requests.post(url_post, headers=headers, data=data)
if rw.status_code == 200:
print('ok')
else:
print('fail')

# 등록시 입력
# 그때 마다 token 을 변경하면 다시 받아야 함.
def getToken():
code = "421872a45...........................................5b71908"
token_url="https://www.tistory.com/oauth/access_token?client_id={0}&client_secret={1}&redirect_uri={2}&code={3}&grant_type=authorization_code".format(client_id, seckey, callback_url, code)
#res = requests.get(token_url, verify=False)
#access_token = res.text.split("=")[1]
#print(access_token)

access_token = 'be7ca2....................................a0ee119d'

url_getCategory = "https://www.tistory.com/apis/category/list?access_token={0}&output={1}&blogName={2}".format(access_token, 'json', blog_name)
res = requests.get(url_getCategory)
for r in res.json()['tistory']['item']['categories']:
print(r['id'] + " " + r['name'] + " 갯수=" + r['entries'])

sendPost('504263') # 다음 뉴스 카테고리
print('Job END ...')

이전 글에서도 적었듯이 내용중에 .................. 으로 표기된 부분은 개인적인 정보이기 때문에 본인의 정보를 찾아서 수정해야 한다.  


 


이번에는 다음(www.daum.net) 으로 접속을 하면 나오는 처음 페이지에서 뉴스 링크만 몇개 추출해 보는 기능을 구현했다. 이것으로 매일 아침 다음을 접속하지 않아도 뉴스를 스크래 해 볼 수 있다. 매일 처럼 저장해 두면 아마도 나중에는 필요한 뭔가가 될 까 ? 


그건 알 수 없는 일이지만... 아무튼...  네이버의 최신 영화 검색에서와 다른 건 아무래도 tag을 추출하는 방법이지 않을 까 하는 생각이 든다.


 


context = ssl._create_unverified_context()
url = 'https://www.daum.net/'
html = urllib.request.urlopen(url, context=context).read()
soup = BeautifulSoup(html, 'html.parser')

tr_add = "";
items = soup.find_all(class_="link_item")
for item in items:
try:
img = item.find_all(class_="img_thumb")
titles = item.find_all(class_="tit_item")
tr_add += '''
<tr>
<td >{0}</td>
<td ><a href="{1}">{2}</a></td>
<td ><img src="{3}">{4}</td>
</tr>'''.format(titles[0].get_text(), item['href'], item['href'], img[0]['src'].split('=')[1], img[0]['src'].split('=')[1])
except:
break

items = soup.find_all(class_="link_txt")
for item in items:
tr_add += '''
<tr>
<td >{0}</td>
<td colspan="2"><a href="{1}">{2}</a></td>
</tr>'''.format(item.get_text(), item['href'], item['href'])

요부분이 daum 에서 뉴스만 뽑아오는 tag 목록인데, 개발자도구로 열어보면 알 수 있는 내용이기는 하지만, 그것 찾는 것이 스크래핑을 하는 데, 가장 중요한 부분이 아닐까 싶다.


 


아직 알지 못하는 것은 daum 의 경우는 페이지에서 frame 으로 뉴스판을 변경하는 데, 그걸 받아오는 것을 아직 찾지 못했다. 언제가는 알 수 있는 날이 올 까 싶기는 하다.


 


그럼. 오늘도 이만~


 


 





오늘의 이야기



#스치니1000프로젝트 #재미 #행운기원 #Compose #Firebase

🎯 야 너 토요일마다 로또 확인하냐?
나도 맨날 "혹시나~" 하면서 봤거든 ㅋㅋ

근데 이제는 그냥 안 해
AI한테 맡겼어 🤖✨

그것도 구글 Gemini로다가!

그래서 앱 하나 만들었지
👉 "로또 예상번호 by Gemini" 🎱

AI가 분석해서 번호 딱! 뽑아줌
그냥 보고 참고만 하면 됨

재미로 해도 좋고…
혹시 모르는 거잖아? 😏


https://play.google.com/store/apps/details?id=com.billcorea.gptlotto1127




오늘의 이야기

나의 블로그를 찾아주는 사람이 없는 관계로 다가... 다른 사람들의 글을 읽고 댓글을 달아겠다.


그전에 먼저 그들을 글을 읽고 공감(?)을 클릭해 본다. 매일 처럼...


물론 글을 다 잘 읽고 잘 달아 주면 좋겠지만, 그들에게 힘을 보태주기 위해서 난 오늘도 자동화를 해 보기로 했다.


 


스크립트 중간에 sleep 이 들어가는 것은 아무래도 페이지가 다 로드 되기 전에 다음 action 을 하게 되면 스크립트 오류가 발생하기 때문이다.  그래서 중간  중간에 그런 걸 막기 위해서...


# coding=utf-8

import ssl
from bs4 import BeautifulSoup
from selenium import webdriver
import time

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

path = "C:\\Users\\nari4\\AppData\\Local\\Programs\Python\\Python37\\chromedriver.exe"
driver = webdriver.Chrome(path)
driver.implicitly_wait(2)
# 티스토리 접속
driver.get('https://www.tistory.com/')
# 계정 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="kakaoHead"]/div/div[3]/div/a').click()
driver.find_element_by_xpath('//*[@id="cMain"]/div/div/div/a[1]/span[2]').click()
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
# 로그인
username=driver.find_element_by_xpath('//*[@id="id_email_2"]')
username.send_keys('아이디')
password=driver.find_element_by_xpath('//*[@id="id_password_3"]')
password.send_keys('패스워드')
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
driver.get("https://www.tistory.com/feed")
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
html = driver.find_element_by_class_name("list_tistory").get_attribute("innerHTML")

soup = BeautifulSoup(html.encode("utf-8"),'html.parser')
urls=soup.find_all(class_="inner_desc_tit") # 내가 읽을 feed 의 URL 주소만 뽑아오기
for url in urls:
try:
driver.get(url['href'])
driver.implicitly_wait(30) # 페이지가 로딩하는 걸 기다리기 위해서
driver.find_element_by_class_name("wrap_btn").click()
except:
print(url['href'] + " 이 페이지는 오류 입니다.")

print("Job END ... ")
driver.close()

준비물 : python 은 기본,  chromedriver 이건 아래 링크를 참고해서 설치하시면 될 듯...  그리고는 늘 켜져 있는 컴퓨터가 필요한데, 그걸 대신 하는 방법은 rasberry pi 을 이용하는 것도 한가지 방법일 듯...


 


말은 필요 없을 듯 하고, 스크립트 작성해서 그냥 실행하시면 끝...   다만 간혹 중간에 클릭이 되지 않는 페이지 들이 발생하고 있는데, 이건 아직...  나중에 알게 되면 수정해서 다시 업데이트를 진행하는 것으로 해야겠다.


 


크롬 드라이버 설치는 아래 링크를 참고하시길...


 


https://chromedriver.chromium.org/downloads



 


ChromeDriver - WebDriver for Chrome - Downloads


Current Releases If you are using Chrome version 93, please download ChromeDriver 93.0.4577.15 If you are using Chrome version 92, please download ChromeDriver 92.0.4515.107 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 For


chromedriver.chromium.org




 


이걸 작성하면서 참고한 페이지


https://yobbicorgi.tistory.com/21



 


[python] Selenium을 이용한 티스토리 로그인 & 게시글 자동 작성


이번에는 Selenium과 크롬 웹드라이버('chromedriver')를 이용해 자동으로 티스토리에 로그인을 하고, 간단한 게시글을 작성하는 코드를 짜보고자 한다. 우선 자신이 사용하고 있는 크롬 버전과 맞는 c


yobbicorgi.tistory.com




 


이 페이지를 참고하면서 얻은 것은 내가 만든 스크립트가 로봇으로 걸리지 않는다는 것이다.  어떻게 구현하다 보니 로봇으로 인식이 되어 로봇이 아님을 인증해 주어야 하는 그림 캡쳐가 나오던데... 이분의 스크립트는 그런게 없었다.


 





오늘의 이야기

매일 처럼 쏟아지는 feed 에 댓글을 달아보자 (노노~ 찾아 오는 이가 없는 나의 블로그에 방문객 유인을 위한 방책으로) 자동 댓글 달기를 해 보기로 했다.


# coding=utf-8

import ssl
import sqlite3
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import os.path
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
from selenium.webdriver.remote.webelement import WebElement
from datetime import datetime
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.common.keys import Keys

conn = sqlite3.connect("test.sqlite", isolation_level=None)
rs = conn.cursor()
# 한번 갔던 글을 더 작성을 하지 않도록 하기 위해서 저장하기
rs.execute("CREATE TABLE IF NOT EXISTS urlInfo \
(id integer PRIMARY KEY, urlName text, writeDate text)")

path = "C:\\Users\\nari4\\AppData\\Local\\Programs\Python\\Python37\\chromedriver.exe"
driver = webdriver.Chrome(path)

driver.implicitly_wait(2)
# 티스토리 접속
driver.get('https://www.tistory.com/')
# 계정 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="kakaoHead"]/div/div[3]/div/a').click()
driver.find_element_by_xpath('//*[@id="cMain"]/div/div/div/a[1]/span[2]').click()
time.sleep(1)
# 로그인
username=driver.find_element_by_xpath('//*[@id="id_email_2"]')
username.send_keys('카카오ID')
password=driver.find_element_by_xpath('//*[@id="id_password_3"]')
password.send_keys('비밀번호')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
time.sleep(1)
# 로그인이 되면 feed 로 이동
driver.get("https://www.tistory.com/feed")
time.sleep(1)
html = driver.find_element_by_class_name("list_tistory").get_attribute("innerHTML")

# 내가 읽어야 하는 feed 목록을 추려본다.
# 다만, 아직은 전체가 다 나오지는 않는다. 이유는 좀 더 찾아 보는 것으로 해야겠다.
soup = BeautifulSoup(html.encode("utf-8"),'html.parser')
urls=soup.find_all(class_="inner_desc_tit")
for url in urls:
urlPath = url['href']
urlStr = urlPath.split('//')[1]
print(urlStr)
#이미 다녀간 곳인지 확인
rs.execute(''' select count(*) from urlInfo
where urlName = "{0}" '''.format(urlStr))
# 이미 다녀간 곳이면 패스
if (rs.fetchone()[0] == 1):
print(urlPath + ' 이미 작성한 경로 입니다.')
else:
# 그렇지 않다면 작성하기
print(urlPath + ' 작성중... ')
nId = urlStr.split('/')[1]
driver.get(urlPath)
driver.implicitly_wait(30)
comments = driver.find_element_by_name("comment")
comments.send_keys("포스팅 잘 읽고 갑니다. 좋은글 감사합니다. 제 블로그에도 방문 부탁 드립니다.")
print(nId)
# 버튼을 클릭하고 싶지만, 버튼이 한가지가 아닌 것 같아서 스크립트 실행으로 대신함.
# 21.09.01 스크립트 실행은 안되는 경우가 발생 됨 다시 버튼 클릭으로 수정
#driver.execute_script('addComment(this, {0}); return false;'.format(nId))
commentsBtn = driver.find_element_by_class_name("btn")
commentsBtn.click();
rs.execute(''' insert into urlInfo (urlName, writeDate)
values ("{0}", "{1}") '''.format(urlStr,
datetime.today().strftime(
"%Y%m%d%H%M%S")))
print("next .....")

rs.close()
print("Job END ... ")
driver.close()

실행한 결과는 아래 그림 처럼 feed 작성글에 자동으로 댓글을 작성해 준다.


 


 




 


관리자님들께서 불평을 하지 않으신다면 ... 이렇게 댓글 쓰기를 마무리 해 본다.


 


ps. 2021.09.01 스크립트 실행중 오류가 있는 것 같아서 수정함.  수정한 부분은 아래 내용임.


        # 21.09.01 스크립트 실행은 안되는 경우가 발생 됨 다시 버튼 클릭으로 수정
#driver.execute_script('addComment(this, {0}); return false;'.format(nId))
try:
commentsBtn = driver.find_element_by_class_name("btn")
commentsBtn.click();
except:
try:
commentsBtn = driver.find_element_by_class_name("btn_enter")
commentsBtn.click();
except:
commentsBtn = driver.find_element_by_class_name("btn_register")
commentsBtn.click();

그런데 실제 적용해서 운영을 하다보니... 버튼 class 가 btn , btn_enter, btn_register 등등 여러개가 발견 되었다.


그래서 일단은 다시 수정했다.





오늘의 이야기


#스하리1000명프로젝트

스치니들!
내가 만든 이 앱은, 내 폰에 오는 알림 중에서 중요한 키워드가 있는 경우
등록해둔 친구에게 자동으로 전달해주는 앱이야 📲

예를 들어, 카드 결제 알림을 와이프나 자녀에게 보내주거나
이번 달 지출을 달력처럼 확인할 수도 있어!

앱을 함께 쓰려면 친구도 설치 & 로그인해줘야 해.
그래야 친구 목록에서 서로 선택할 수 있으니까~
서로 써보고 불편한 점 있으면 알려줘 🙏

👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기

매일 처럼 쏟아지는 feed 에 댓글을 달아보자 (노노~ 찾아 오는 이가 없는 나의 블로그에 방문객 유인을 위한 방책으로) 자동 댓글 달기를 해 보기로 했다.


# coding=utf-8

import ssl
import sqlite3
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import os.path
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
from selenium.webdriver.remote.webelement import WebElement
from datetime import datetime
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.common.keys import Keys

conn = sqlite3.connect("test.sqlite", isolation_level=None)
rs = conn.cursor()
# 한번 갔던 글을 더 작성을 하지 않도록 하기 위해서 저장하기
rs.execute("CREATE TABLE IF NOT EXISTS urlInfo \
(id integer PRIMARY KEY, urlName text, writeDate text)")

path = "C:\\Users\\nari4\\AppData\\Local\\Programs\Python\\Python37\\chromedriver.exe"
driver = webdriver.Chrome(path)

driver.implicitly_wait(2)
# 티스토리 접속
driver.get('https://www.tistory.com/')
# 계정 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="kakaoHead"]/div/div[3]/div/a').click()
driver.find_element_by_xpath('//*[@id="cMain"]/div/div/div/a[1]/span[2]').click()
time.sleep(1)
# 로그인
username=driver.find_element_by_xpath('//*[@id="id_email_2"]')
username.send_keys('카카오ID')
password=driver.find_element_by_xpath('//*[@id="id_password_3"]')
password.send_keys('비밀번호')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
time.sleep(1)
# 로그인이 되면 feed 로 이동
driver.get("https://www.tistory.com/feed")
time.sleep(1)
html = driver.find_element_by_class_name("list_tistory").get_attribute("innerHTML")

# 내가 읽어야 하는 feed 목록을 추려본다.
# 다만, 아직은 전체가 다 나오지는 않는다. 이유는 좀 더 찾아 보는 것으로 해야겠다.
soup = BeautifulSoup(html.encode("utf-8"),'html.parser')
urls=soup.find_all(class_="inner_desc_tit")
for url in urls:
urlPath = url['href']
urlStr = urlPath.split('//')[1]
print(urlStr)
#이미 다녀간 곳인지 확인
rs.execute(''' select count(*) from urlInfo
where urlName = "{0}" '''.format(urlStr))
# 이미 다녀간 곳이면 패스
if (rs.fetchone()[0] == 1):
print(urlPath + ' 이미 작성한 경로 입니다.')
else:
# 그렇지 않다면 작성하기
print(urlPath + ' 작성중... ')
nId = urlStr.split('/')[1]
driver.get(urlPath)
driver.implicitly_wait(30)
comments = driver.find_element_by_name("comment")
comments.send_keys("포스팅 잘 읽고 갑니다. 좋은글 감사합니다. 제 블로그에도 방문 부탁 드립니다.")
print(nId)
# 버튼을 클릭하고 싶지만, 버튼이 한가지가 아닌 것 같아서 스크립트 실행으로 대신함.
# 21.09.01 스크립트 실행은 안되는 경우가 발생 됨 다시 버튼 클릭으로 수정
#driver.execute_script('addComment(this, {0}); return false;'.format(nId))
commentsBtn = driver.find_element_by_class_name("btn")
commentsBtn.click();
rs.execute(''' insert into urlInfo (urlName, writeDate)
values ("{0}", "{1}") '''.format(urlStr,
datetime.today().strftime(
"%Y%m%d%H%M%S")))
print("next .....")

rs.close()
print("Job END ... ")
driver.close()

실행한 결과는 아래 그림 처럼 feed 작성글에 자동으로 댓글을 작성해 준다.


 


 




 


관리자님들께서 불평을 하지 않으신다면 ... 이렇게 댓글 쓰기를 마무리 해 본다.


 


ps. 2021.09.01 스크립트 실행중 오류가 있는 것 같아서 수정함.  수정한 부분은 아래 내용임.


        # 21.09.01 스크립트 실행은 안되는 경우가 발생 됨 다시 버튼 클릭으로 수정
#driver.execute_script('addComment(this, {0}); return false;'.format(nId))
try:
commentsBtn = driver.find_element_by_class_name("btn")
commentsBtn.click();
except:
try:
commentsBtn = driver.find_element_by_class_name("btn_enter")
commentsBtn.click();
except:
commentsBtn = driver.find_element_by_class_name("btn_register")
commentsBtn.click();

그런데 실제 적용해서 운영을 하다보니... 버튼 class 가 btn , btn_enter, btn_register 등등 여러개가 발견 되었다.


그래서 일단은 다시 수정했다.  그런데 운영을 하다 보니... 항의글이 발생한다... 자신의 블로그가 저품질이 될 수 있다는 것이다. 이유인 것은 블로그에 대기시간이 너무 짧은면 그것도 저품질 대상이 된다는 것이다.  그래서 당분간 이 기능은 운영하지 않기로 했다.





오늘의 이야기

앱을 구현 하다 보면 알림을 보여 주어야 하는 경우가 있게 된다. 그럴때 마다 쉽게 했던 방식은 Toast 알림을 이용하는 방식으로 구현하는 것이였다.


 


 



Toast 알림 예시


Toast 의 경우의 위 영상에서 20초 이후 구간에 보이는 화면 하단에 잠시 나오는 알림창이다.  코드 구현은 다음과 같이...


                Toast.makeText(context.getApplicationContext(), context.getString(R.string.msgUpdateCompleted), Toast.LENGTH_SHORT).show();

파라미터로 넣어주어야 하는 것은 context, 문자열, Toast의 길이 이렇게 3가지가 전달 되면 구현이 가능 하다. 


 


 


다음은 Snackbar 인데, 이것은 알림 나왔다가 사라는지는 구현도 가능하겠지만, action 을 넣어 주면 버튼 클릭이 끝나면 동작을 마무리 하도록 구현해 볼 수 있다.


 


 



Snackbar 알림 예시


위 영상의 예시처럼 화면에 알림을 띄워주고 사용자가 click 을 할 때 까지 기다리는 동작을 구현해 볼 수 있다.


코드 구현은 다음과 같이 해 볼 수 있다.


        Snackbar.make(
((Activity) context).findViewById(android.R.id.content),
context.getString(mainTextStringId),
Snackbar.LENGTH_INDEFINITE).setAction(context.getString(actionStringId), listener).show();

첫번째 파라미터는 알림을 담을 content 인데, android.R.id.content 는 안드로이드가 제공하고 있는 일반적인 content 을 담을 수 있는 것이락 생각하면 쉬을 것 같다. 다음은 화면에 보여줄 문자열이고, 그 다음은 action 을 위한 버튼에서 보여줄 문자, 마지막으로는 해당 action 을 클릭했을 때 처리할 action listener 을 넘겨 주면 된다. 


 


이것으로 알림 방법에 대해 간략하게 알아보았다.


 





오늘의 이야기


#스하리1000명프로젝트,
Đôi khi thật khó để nói chuyện với người lao động nước ngoài phải không?
Tôi đã tạo một ứng dụng đơn giản có ích! Bạn viết bằng ngôn ngữ của bạn và những người khác nhìn thấy nó bằng ngôn ngữ của họ.
Nó tự động dịch dựa trên cài đặt.
Siêu tiện dụng để trò chuyện dễ dàng. Hãy xem khi bạn có cơ hội!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기

나의 블로그를 찾아주는 사람이 없는 관계로 다가... 다른 사람들의 글을 읽고 댓글을 달아겠다.


그전에 먼저 그들을 글을 읽고 공감(?)을 클릭해 본다. 매일 처럼...


물론 글을 다 잘 읽고 잘 달아 주면 좋겠지만, 그들에게 힘을 보태주기 위해서 난 오늘도 자동화를 해 보기로 했다.


스크립트 중간에 sleep 이 들어가는 것은 아무래도 페이지가 다 로드 되기 전에 다음 action 을 하게 되면 스크립트 오류가 발생하기 때문이다.  그래서 중간  중간에 그런 걸 막기 위해서...


# coding=utf-8

import ssl
from bs4 import BeautifulSoup
from selenium import webdriver
import time

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

path = "C:\\Users\\nari4\\AppData\\Local\\Programs\Python\\Python37\\chromedriver.exe"
driver = webdriver.Chrome(path)
driver.implicitly_wait(2)
# 티스토리 접속
driver.get('https://www.tistory.com/')
# 계정 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="kakaoHead"]/div/div[3]/div/a').click()
driver.find_element_by_xpath('//*[@id="cMain"]/div/div/div/a[1]/span[2]').click()
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
# 로그인
username=driver.find_element_by_xpath('//*[@id="id_email_2"]')
username.send_keys('아이디')
password=driver.find_element_by_xpath('//*[@id="id_password_3"]')
password.send_keys('패스워드')
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
driver.get("https://www.tistory.com/feed")
time.sleep(1) # 페이지가 로딩하는 걸 기다리기 위해서
html = driver.find_element_by_class_name("list_tistory").get_attribute("innerHTML")

soup = BeautifulSoup(html.encode("utf-8"),'html.parser')
urls=soup.find_all(class_="inner_desc_tit") # 내가 읽을 feed 의 URL 주소만 뽑아오기
for url in urls:
try:
driver.get(url['href'])
driver.implicitly_wait(30) # 페이지가 로딩하는 걸 기다리기 위해서
driver.find_element_by_class_name("wrap_btn").click()
except:
print(url['href'] + " 이 페이지는 오류 입니다.")

print("Job END ... ")
driver.close()

준비물 : python 은 기본,  chromedriver 이건 아래 링크를 참고해서 설치하시면 될 듯...  그리고는 늘 켜져 있는 컴퓨터가 필요한데, 그걸 대신 하는 방법은 rasberry pi 을 이용하는 것도 한가지 방법일 듯...


말은 필요 없을 듯 하고, 스크립트 작성해서 그냥 실행하시면 끝...   다만 간혹 중간에 클릭이 되지 않는 페이지 들이 발생하고 있는데, 이건 아직...  나중에 알게 되면 수정해서 다시 업데이트를 진행하는 것으로 해야겠다.


 


크롬 드라이버 설치는 아래 링크를 참고하시길...


 


https://chromedriver.chromium.org/downloads



 


ChromeDriver - WebDriver for Chrome - Downloads


Current Releases If you are using Chrome version 93, please download ChromeDriver 93.0.4577.15 If you are using Chrome version 92, please download ChromeDriver 92.0.4515.107 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 For


chromedriver.chromium.org




 


이걸 작성하면서 참고한 페이지


https://yobbicorgi.tistory.com/21



 


[python] Selenium을 이용한 티스토리 로그인 & 게시글 자동 작성


이번에는 Selenium과 크롬 웹드라이버('chromedriver')를 이용해 자동으로 티스토리에 로그인을 하고, 간단한 게시글을 작성하는 코드를 짜보고자 한다. 우선 자신이 사용하고 있는 크롬 버전과 맞는 c


yobbicorgi.tistory.com




 


이 페이지를 참고하면서 얻은 것은 내가 만든 스크립트가 로봇으로 걸리지 않는다는 것이다.  어떻게 구현하다 보니 로봇으로 인식이 되어 로봇이 아님을 인증해 주어야 하는 그림 캡쳐가 나오던데... 이분의 스크립트는 그런게 없었다.


 





오늘의 이야기

python 을 배우면서 해보고 싶었던 RPA 자동화 이게 그 RPA 의 밑거름이 되길 바라며...


다른 사이트들은 자동화을 할 수 없으나, tistory 는 가능해 보인다.  그래서 이 소스가 마중물이 되어 그 꿈을 실현해 볼 수 있기를...


#
#
import requests
client_id = "be43b5c087b8e5575b04e86f1973286e"
seckey = "be43b5c087b8e5..................89f03000fbc8983c7915"
callback_url = "http://autoposting.tistory.com"
getUrl = 'https://www.tistory.com/oauth/authorize?client_id={0}&redirect_uri={1}&response_type=code&state=someValue'
getUrl = getUrl.format(client_id, callback_url)
#res = requests.get(getUrl, verify=False)
print(getUrl)

# 등록시 입력 값
code = "421872a45b631..........................38780a493025b71908"
token_url="https://www.tistory.com/oauth/access_token?client_id={0}&client_secret={1}&redirect_uri={2}&code={3}&grant_type=authorization_code".format(client_id, seckey, callback_url, code)
#res = requests.get(token_url, verify=False)
#access_token = res.text.split("=")[1]
#print(access_token)
access_token = 'be7ca24dd08ad5...............................0e355a4da0ee119d'

getList = 'https://www.tistory.com/apis/post/list?access_token={0}&output={1}&blogName={2}&page={3}'.format(access_token, 'xml', 'autoposting', 1)
res = requests.get(getList, verify=False)
print(res.text)

 


코드 중간에 .... 으로 가린것은 일종의 프라이버시 이므로 사용자의 값을 찾아서 해야됨.


 





오늘의 이야기

다음 회차 로또 번호 분석 결과 및 추천 조합입니다. **최종 분석 결과** **1. 라운드별 증가 간격** - 1192회차: [6, 7, 13, 3, 1] - 1193회차: [3, 7, 3, 5, 4] - 1194회차: [10, 2, 9, 9, 4]...