ä»åããããã£ãããš
- ç®æšïŒChatGPT(GPT-4) ã§äžæã§ã¹ã¯ã¬ã€ãã³ã°ããã³ãŒããçæ
ããã«ã¯ã©ããããããã®ããChatGPT ã®ããŒãã«ãšãã³ããšããç¥ãããã
â»æçµçãªããã³ããã®å ¥åãšåºåã®å šæã¯æ¬ããŒãžäžéšã«è²Œãä»ããŠãŸãã
äœã£ããã®æŠèŠ
ä¿éºçµåã®ãŠã©ãŒãã³ã°ã€ãã³ãã®äŒç€Ÿå
ã®3ããŒã ã®æ©æ°é²æã® slack ãžã®èªåæçš¿ bot ãäœæããŸããã
åŠçã¯å€§ãã2ã€ã«åãããŠããŸãã
- ãŠã©ãŒãã³ã°ã€ãã³ããµã€ãããæ©æ°ãã¹ã¯ã¬ã€ãã³ã°ïŒã¹ãã·ãžã¢ããããŒã
- ã¹ãã·ã® GAS ã§æçš¿æååäœæïŒ slack ãžèªåæçš¿
ä»å ChatGPT ã§ãã£ãã®ã¯1ã®æ¹ã§ãã
2ã¯ååå幎åéå¬åã®ã³ãŒããã»ãŒãã®ãŸãŸæµçšããŸããã
éè¯ãïŒïŒïŒä»åã®ã¿ã€ãã³ã°ã§ãŠã©ãŒãã³ã°ã€ãã³ãã®ãµãŒãã¹ãµã€ããå€ããã HTML ããŸãã£ãšå€ãã1ã®ã¹ã¯ã¬ã€ãã³ã°ã³ãŒãã¯äœãçŽããå¿
èŠã ã£ãã®ã§ããã£ã¬ã³ãžã«äžåºŠè¯ããšæã ChatGPT ã䜿ã£ãŠã³ãŒãçæããŠã¿ãŸããã
ç°å¢
- ChatGPT(GPT-4)
- Mac macOS 12.5.1
äœæç©ã¹ã¯ãªãŒã³ã·ã§ãã
ã¹ãã·
slack bot
å¯Ÿå¿æé
5æ7æ¥ã®1人æ¥ã§å¯Ÿå¿ããŸããã
äœæãšããŠã¯ãå幎åã«äŒŒããã®ãäœã£ããçµéšã掻ãããä»åæåäœæãªã忥ã§è¡ããã¯ãã§ãããChatGPTãžã®æ
£ãã§1人æ¥ããããŸããã
ãããå€åä»åŸæŽã«äŒŒããããªåŠçããããªã ChatGPT ã«ä»»ãããããçãïŒåæ¥ä»¥äžã§ïŒåºæ¥ãã¯ãã§ãã
ChatGPT ã®å
¥åäžéïŒå·çæç¹ïŒ2023/05/07ïŒã§3æéã§25åïŒãã«1ååŒã£ããããŸããã
ïŒå®éã¯2åã§ãåäŸã PC ç»é¢èŠã蟌ãã§ããããªãã§èªåã§æååºãŠããã®ïŒïŒããšè峿ã£ãã®ã§ãéäžäžç·ã«ããã©ãããã®èªçæ¥ããé¢çœãååã®éããšãåäŸãšäžç·ã«éãã çµæã1åå¶éã«åŒã£ããããŸããã
ïŒChatGPT ã§åºåããããã€ã¡ãŒãžãåºãŸãåã®è©Šè¡é¯èª€æ®µéã¯ãã¡ããã¡ãã詊ããå¶éã«åŒã£ããã£ãåŸ
ã¡æéã¯äŒæ©æéã«åœãŠããããããè¯ããããããŸããã
ææ³
- ãŸããŸã倧å€ãã¡ãããšåããããã£ãããã®åæç« æžãå¿ èŠããã
- æåã¯è©Šè¡é¯èª€ããããã©ä»å ChatGPT èªäœã«æ £ããããæ¬¡ã¯ããå°ãã¹ããŒãïŒçæéã§è¡ããã¯ã
- å®éã®ããã³ããã®æäœã€ã¡ãŒãžïŒäœæïŒ
- æåã«ãããããããšã®50%ããå ¥åãããã³ããåºåãå®è¡ãããšããšã©ãŒçºçããããæåã®å ¥åã§èšãå¿ããããšããèªèã
- ããšã©ãŒå¯ŸåŠã次ã®åŠçã5%å远å ãååºåã
- 以äžç¹°ãè¿ã
- ã¿ãããªæã
åé¡ãšå¯ŸçïŒåŸãããç¥èŠïŒ
- GPT-4 ã«æ
£ãããš GPT-3 ã¯åºåã匱ãïŒäžèš GPT-4 ã®å
¥åäžéã«åŒã£ããã£ããšãã« GPT-3 ã§åãããšããããå
šäœçã«ã€ã±ãŠãªããæåŸ
éãã®åºåã«ãªããªãïŒ
- 察çâ GPT-4 ã®å ¥åæ°äžéã«éããããåŸ ã€
- ãã°ã€ã³ãå¿
èŠãªããŒãžã®ã¹ã¯ã¬ã€ãã³ã°ã¯åºæ¬ãã£ãŠãããªããããã°ã€ã³åºæ¥ãªãããšèšããã
- 察çâã¹ã¯ã¬ã€ãã³ã°ããã HTML ã DevTools ã§åãåºãããµã³ãã«ã§æ°è¡æž¡ããŠããããšå¯Ÿå¿ããŠããã
- çææ¯ã«ã³ãŒãã®ã¹ã¿ã€ã«ãã©ãã£ãšå€ãããå€ãã£ãå Žæãšã¯å
šç¶ç¡é¢ä¿ã®åŠçã远å ããŠãã¯ããªã®ã«ãçµææŽåãåããåããªããã¡ã
- 倿°åããTARGET_TEAM_NAMESãã ã£ãããTARGET_TEAMSãã ã£ãããçã ã
- 颿°å
- 䜿çšã©ã€ãã©ãª
- 颿°åæç¡ïŒåŠçãã¿æžãã ã£ããã颿°åãããïŒ
- 倿°ãäžéšã«ãŸãšããŠãããããäžã«åã蟌ãã ã
ãâ察ç1ïŒããããæå®ããããããŒã åããã¡ã€ã«åãã·ãŒãåçããšãã倿Žããå¯èœæ§ããããã®ã¯ã³ãŒãã®äžéšã«ãŸãšããŠèšèŒããŠãçã
ãâ察ç2ïŒäžã«ã³ã¡ã³ããç¶ãããåé ã®äŸé Œæãç·šéããŠåçæããããšå šäœã®æŽåã¯åããããã
- ãã°ã€ã³ç»é¢ã® HTML 㯠ChatGPT ãã¢ã¯ã»ã¹åºæ¥ãã¯ãã ããäœæ
ã埮åŠã« selector ãééããŠãã
- ã¡ãŒã«ã¢ãã¬ã¹å ¥åæ¬ã® ID ãæ£ããã¯ãsender-emailãã ãæåã®åºåã¯ãsender_emailãã ã£ã
- ãã¹ã¯ãŒãå
¥åæ¬ã® ID ãæ£ããã¯ãuser-passãã ãæåã®åºåã¯ãuser-passwordãã ã£ã
ãâ察çïŒããããæå®ããããIDããã¹ã¯ãŒãã® selector ã¯ãããã以äžãsender-email user-passãçã
- ã©ã€ãã©ãª/ããŒã«ã®ããŒãžã§ã³åé¡ã«ã¡ããã¡ããã¶ã¡åœãããåã®æå
ã® selenium ver ã¯4ã ã£ãããã©ã³ãã ã§3åãã®ã³ãŒããåã
ãâ察çïŒããŒãžã§ã³ãæå®ããããselenium 4ãçã - ããŒãžã§ã³æå®ããŠã誀åºåããããšããã
ãâ察çïŒAPI ãæå®ããããdriver.find_element_by_id çã¯äœ¿çšãããdriver.find_element(By.ID, çã䜿çšãããçã
æªè§£æ±ºåé¡
- çææ¯ã«ã³ãŒããããã¯ãå€ããã¡ãå€ãããš python çã«ã¯ã€ã³ãã³ããçŽãã®ãæéãã³ãŒããããã¯æåçãäžããããŸããªããããã¹ãã¯ã³ãŒããããã¯ã§ãçã¯ãããã確å®ã§ã¯ãªãã
ãâæ«å®å¯ŸçïŒå°ãäžã®ãXXX 颿°ã®é ããæžããŠããšèšããšæ°æã¡ã³ãŒããããã¯åããŠãããããïŒã³ããããããã - æç€ºããŠãã®ã«æªèæ
®ãªã³ãŒããããŸãŒã«åºåãããããheadless ã¢ãŒãæããªãã·ã§ã³ãããã©ã«ãã¯headlessã¢ãŒããªããããšèšã£ãŠãã®ã«ãåºåæ¯ã«ããŸã«ãããã©ã«ããªã³ããªãããå€ãããã
ãâæ«å®å¯ŸçïŒç¹ã«ãªãããæ°ã«ããä»ã®åŠç远å ããŠããæåŸã®åºåã§åžæã®ãããã©ã«ããªããã«ãªã£ãŠãããŠããã
ã³ã
- ç¶ãã®åºåã¯ãã€ã¥ããã§ OKãæåã¯äžå¯§ã«ãç¶ããæžããŠãã ããããšæžããŠãããã
- å®è¡æãšã©ãŒçºçããããšã©ãŒããã¹ã貌ãä»ããã ãã§ OKãæåã¯äžå¯§ã«ããšã©ãŒçºçã<å®éã®ãšã©ãŒããã¹ã>ããšæžããŠãããã
æçµçãªããã³ãã
泚ïŒå
¥åããã¹ãåºåããã¹ãã©ã¡ããåºæ¬ã¯ã³ããã§ãããã¹ãã·ã® ID çã¯ãXXXãã«çœ®ãæããŠãŸãã
泚ïŒå
¥åããã¹ãã¯è©Šè¡é¯èª€ïŒç¶ãè¶³ãç¶ãè¶³ãããçµæã§æªæŽçãªã®ã§ãå¿
èŠæ¡ä»¶ã§ã¯ãããã©å忡件ã§ã¯ãªãããã§ãïŒ=ãã£ãšæŽçãçãåºæ¥ãããïŒ
å ¥å
以äžã®æ¡ä»¶ãæºããã³ãŒãã python ã§äœæãé¡ãããŸãã
ã³ãŒãã¯ã€ã³ãã³ãã«æ³šæããŠã³ãŒããããã¯ã§åºåãé¡ãããŸãã
â ããããããš
ãŠã©ãŒãã³ã°ã€ãã³ãã®ããŒã 察æã©ã³ãã³ã°ã®ç¹å®3ããŒã ã®ãé äœãããŒã åãç·æ©æ°ã®å¹³åãgoogle ã¹ãã¬ããã·ãŒãã«ä¿åããã
â æ¡ä»¶
ã»äœ¿çšã©ã€ãã©ãª/ããŒã«
ãã»selenium 4
ããã»driver.find_element_by_id çã¯äœ¿çšããã
ãããdriver.find_element(By.ID, çã䜿çšãã
ãã»webdriver
ããwebdriver.Chrome()ã®executable_pathåŒæ°ã¯äœ¿çšããªãã
ããServiceãªããžã§ã¯ãã䜿çšããã
ãã»webdriver-manager
ããhttps://pypi.org/project/webdriver-manager/
ãã»Google Sheets API
ããã»èªèšŒæ
å ±ã¯åãå Žæã« credentials.json ãšããŠä¿åãããŠãã
ããã»service_account.Credentials.from_service_account_file ã®åŒæ°ã¯2ã€
ã»ç¹å®3ããŒã ã®ããŒã å
ãã»ãACCESS_Aããå«ãŸããããŒã ã
ããå®éã¯ããåéãACCESS_AãçååŸã«å¥ã®ããã¹ããå«ãŸããå¯èœæ§ãã
ãã»ãACCESS_Bããå«ãŸããããŒã
ãã»ãACCESS_Cããå«ãŸããããŒã
ã»èµ·ååŒæ°ã§ãªãã·ã§ã³
ãã»headless ã¢ãŒãæããªãã·ã§ã³ã
ãã»ããã©ã«ãã¯headlessã¢ãŒããªãã
ã»ã³ãŒãã¯ãã¿æžãã§ã¯ãªãé©åã«é¢æ°å
ã»ããŒã åããã¡ã€ã«åãã·ãŒãåçããšãã倿Žããå¯èœæ§ããããã®ã¯ã³ãŒãã®äžéšã«ãŸãšããŠèšèŒ
ã»IDãšãã¹ã¯ãŒã㯠login_info.json ã«èšèŒããããããèªã¿èŸŒãããã«ããŠãã ãã
ã»credentials.json ã login_info.json ã®ããŒã«ã«ãã¡ã€ã«ã¯ cron ã§å®è¡ã§ããããã« æ¬ã¹ã¯ãªããã® PATH ãèµ·ç¹ã«ããŠãã¡ã€ã«ãéããããã«ããŠãã ãã
ã»ç¹å®ããŒã ãèŠã€ãã£ãæç¹ã®ã¹ã¯ãªãŒã³ã·ã§ãããååŸ
ã»ãŸãã¢ã¯ã»ã¹ãã URL ã¯
ãhttps://pepup.life/campaign/XXXX/ranking?mode=team&page=1
ãã ãããã°ã€ã³ãå¿
èŠãªã®ã§
ãhttps://pepup.life/users/sign_in
ãã«èªåçã«ãªãã€ã¬ã¯ããããã
ããã°ã€ã³å®äºåŸã¯
ãhttps://pepup.life/campaign/XXXX/ranking?mode=team&page=1
ãã«èªåçã«é·ç§»ããã
ããã®åŸé 次以äžã®ããã« URL ã倿Žãå·¡åããã
ãhttps://pepup.life/campaign/XXXX/ranking?mode=team&page=2
ãhttps://pepup.life/campaign/XXXX/ranking?mode=team&page=3
ã»ãšã©ãŒåŠç
ãã»ã©ã³ãã³ã°ã® table ã¿ã°ã® tr ã¿ã°ã空ã ã£ããããéèšäžããå«ãŸããããã¹ãã衚瀺ãããå Žåã¯ããã§çµäºããã®æšãšã©ãŒåºåããŠã
â ãã°ã€ã³ããŒãžã® selector
IDããã¹ã¯ãŒãããã°ã€ã³ãã¿ã³ããããã以äžã
sender-email
user-pass
<input type="submit" name="commit" value="ãã°ã€ã³" class="btn btn-default btn btn-primary btn-block" data-disable-with="ãã°ã€ã³">
â ååŸããããŒã¿
ã»ã©ã³ãã³ã°ã® table ã¿ã°ã
3åãããå·Šãããé äœãããããŒã åãããç·æ©æ°ã®å¹³åãã
1ããŒãž30äœãŸã§èšèŒããããäœããŒãžãŸã§ãããã¯åãããªãã
1ã€ã®é äœåã® tr ã¿ã°äŸã¯ä»¥äžã
ãããã®HTMLã selector ãšããŠããŠãã ããã
<table>
<tbody>
<tr class="table-row head"><td style="text-align: right;">é äœ</td><td style="text-align: left;">ããŒã å</td><td style="text-align: right;">ç·æ©æ°ã®å¹³å</td></tr>
<tr class="table-row"><td style="text-align: right;"><span class="num-value">768</span><span class="gray">äœ</span></td><td style="text-align: left;">ACCESS_A</td><td style="text-align: right;"><span class="num-value">61715</span><span class="gray">æ©</span></td></tr>
â ä¿åå
https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit
ã·ãŒãåïŒãŠãªãã³ã°
A1ã»ã«ïŒãé äœããšããããã¹ã
B1ã»ã«ïŒãããŒã åããšããããã¹ã
C1ã»ã«ïŒãç·æ©æ°ã®å¹³åããšããããã¹ã
D1ã»ã«ïŒãURLããšããããã¹ã
A2ã»ã«ïŒACCESS_A ããŒã ã®é äœ
B2ã»ã«ïŒãACCESS_Aããšããããã¹ã
C2ã»ã«ïŒãACCESS_A ããŒã ã®ç·æ©æ°ã®å¹³åããšããæ°å€
D2ã»ã«ïŒACCESS_A ããŒã ã® URL
A3ã»ã«ïŒACCESS_B ããŒã ã®é äœ
B3ã»ã«ïŒãACCESS_Bããšããããã¹ã
C3ã»ã«ïŒãACCESS_B ããŒã ã®ç·æ©æ°ã®å¹³åããšããæ°å€
D3ã»ã«ïŒACCESS_B ããŒã ã® URL
A4ã»ã«ïŒACCESS_C ããŒã ã®é äœ
B4ã»ã«ïŒãACCESS_Cããšããããã¹ã
C4ã»ã«ïŒãACCESS_C ããŒã ã®ç·æ©æ°ã®å¹³åããšããæ°å€
D4ã»ã«ïŒACCESS_C ããŒã ã® URL
åºå
以äžã®ã³ãŒããã確èªãã ãããæ¡ä»¶ã«åãããŠã³ãŒããäœæããŸããã
import json
import os
import sys
from pathlib import Path
from google.oauth2 import service_account
from googleapiclient.discovery import build
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
# èšå®
TARGET_TEAM_NAMES = ["ACCESS_A", "ACCESS_B", "ACCESS_C"]
SPREADSHEET_ID = "XXXX"
SHEET_NAME = "ãŠãªãã³ã°"
HEADLESS = "--headless" in sys.argv
# Google APIèªèšŒ
CREDENTIALS_PATH = Path(__file__).resolve().parent / "credentials.json"
SCOPES = ["https://www.googleapis.com/auth/spreadsheets"]
creds = service_account.Credentials.from_service_account_file(str(CREDENTIALS_PATH), scopes=SCOPES)
# ãã°ã€ã³æ
å ±ååŸ
LOGIN_INFO_PATH = Path(__file__).resolve().parent / "login_info.json"
with open(LOGIN_INFO_PATH, "r") as f:
login_info = json.load(f)
def init_driver(headless):
options = webdriver.ChromeOptions()
if headless:
options.add_argument("--headless")
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
return driver
def login(driver, email, password):
driver.get("https://pepup.life/users/sign_in")
driver.find_element(By.ID, "sender-email").send_keys(email)
driver.find_element(By.ID, "user-pass").send_keys(password)
driver.find_element(By.XPATH, '//input[@type="submit" and @value="ãã°ã€ã³"]').click()
def find_target_teams(driver):
found_teams = []
page = 1
while True:
driver.get(f"https://pepup.life/campaign/XXXX/ranking?mode=team&page={page}")
table_rows = driver.find_elements(By.CSS_SELECTOR, "table tr.table-row")
if not table_rows or "éèšäž" in table_rows[0].text:
print("éèšäžãŸãã¯ç©ºã®ããŒãžãèŠã€ãããŸãããçµäºããŸãã")
break
for row in table_rows:
team_name = row.find_element(By.CSS_SELECTOR, "td:nth-child(2)").text
for target_team_name in TARGET_TEAM_NAMES:
if target_team_name in team_name:
rank = row.find_element(By.CSS_SELECTOR, "td:nth-child(1) span.num-value").text
avg_steps = row.find_element(By.CSS_SELECTOR, "td:nth-child(3) span.num-value").text
found_teams.append((rank, team_name, avg_steps, driver.current_url))
driver.save_screenshot(f"{target_team_name}_screenshot.png")
TARGET_TEAM_NAMES.remove(target_team_name)
break
if not TARGET_TEAM_NAMES:
return found_teams
page += 1
def save_to_sheet(teams_data):
service = build("sheets", "v4", credentials=creds)
for i, team_data in enumerate(teams_data, start=2):
range_ = f"{SHEET_NAME}!A{i}:D{i}"
values = [list(team_data)]
body = {"values": values}
service.spreadsheets().values().update(
spreadsheetId=SPREADSHEET_ID,
range=range_,
valueInputOption="USER_ENTERED",
body=body,
).execute()
def main():
driver = init_driver(HEADLESS)
login(driver, login_info["email"], login_info["password"])
found_teams = find_target_teams(driver)
if found_teams:
save_to_sheet(found_teams)
driver.quit()
if __name__ == "__main__":
main()
ãã®ã³ãŒãã¯ãæå®ãããæ¡ä»¶ã«åŸã£ãŠç¹å®ã®ããŒã ãæ¢ããèŠã€ãã£ãããŒã ã®æ
å ±ãGoogleã¹ãã¬ããã·ãŒãã«ä¿åããŸãã
æåŸã«
ãã®èšäºèªäœã ChatGPT ããã«æŽåœ¢ããŠããããŸããïœ
äœæãç®æ¡æžãã§èšãããããšãªããæžãããããè¯ãæãã«æ¬èªã«çŽããŠããããã
æ¬èªéšåã®ã¿ã€ã鿰岿žããããïŒ
䟿å©ã¯äŸ¿å©ã
æ¬èšäºã®ããã³ããæç²
ãã®ãã£ããã§çæããã³ãŒãã Qiita ã«èšäºåãããã§ãã
https://qiita.com/naohikowatanabe
ã®æäœã§ qiita èšäºã®äœæäœæãé¡ãã
markdown 圢åŒã§èšèŒããå
šãŠã®åºåã®ãã¬ãŒã³ããã¹ãããŸãšããŠäžã€ã®ã³ãŒããããã¯ã§åºåããŠã
èšäºã¿ã€ãã«ïŒChatGPT(GPT-4) ã§äžæã§ã¹ã¯ã¬ã€ãã³ã°ããã³ãŒããçæåºæ¥ãã®ã§ææ³ãšã³ã
å
容ã¯ä»¥äžãå«ããŠãã ããã
â ä»åããããã£ãããš
ã»ChatGPT(GPT-4) ã§äžæã§ã¹ã¯ã¬ã€ãã³ã°ããã³ãŒããçæ
â äœã£ããã®æŠèŠ
ã»ä¿éºçµåã®ãŠã©ãŒãã³ã°ã€ãã³ãã®äŒç€Ÿå
ã®3ããŒã ã®æ©æ°é²æã® slack ãžã®èªåæçš¿ bot
ãã»åŠçã¯å€§ãã2ã€
ããã»1. ããµã€ãã®ã¹ã¯ã¬ã€ãã³ã°ïŒã¹ãã·ãžã¢ããããŒãã
ããã»2. ã¹ãã·ã® GAS ã§æçš¿æååäœæïŒ slack ãžæçš¿
ãã»ä»å ChatGPT ã§ãã£ãã®ã¯1ã®æ¹ã2ã¯ååå幎åéå¬åã®ã³ãŒããã»ãŒãã®ãŸãŸæµçšã
ãã»éè¯ãïŒïŒïŒä»åã®ã¿ã€ãã³ã°ã§ãŠã©ãŒãã³ã°ã€ãã³ãã®éå¶ãå€ããã
ãããµã€ãããŸãã£ãšå€ãã£ãã®ã§1ã®ã¹ã¯ã¬ã€ãã³ã°ã³ãŒãã¯äœãçŽããå¿
èŠã ã£ãã

