제목 그대로입니다. 구글시트에 기입한 키워드에 대응되는 지문을 돌려주는 자동봇입니다. 결과 지문 툿은 기본적으로 공개 범위가 팔로워 전용으로 설정되어 있습니다.
해당 자동봇 코드는 지인의 요청으로 만들어졌으며, 마스토돈 플랫폼을 사용하는 자캐커뮤에 사용되는 걸 상정하였습니다. 키워드를 사용하는 것들(예: 상시 조사, 뽑기, 주사위 굴림 등)을 위한 기능으로 사용하기 좋습니다. 자캐커뮤 외의 용도로 사용하셔도 괜찮습니다. 단, 타인에게 해가 가지 않는 상식적인 선 내에서 사용해주세요.
만일 추가적인 기능을 원하신다면 @[email protected]로 연락해주세요! 그러나 반응이 느릴 수 있습니다. 서버 호스팅 및 구축 관련 문의는 저부터 잘 알지 못하여 받지 못 합니다…. 연합 탐라에 외치면 저보다 더 잘 아시는 분들이 도와주실 것입니다….
해당 안내 문서에 이미 안내된 사항 관련 질문에는 반응하지 않습니다. 참고해주세요! 또한, 해당 문서의 내용을 숙지하지 않아 생기는 모든 불상사에는 책임을 지지 않습니다!
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from mastodon import Mastodon
from mastodon.streaming import StreamListener
import re
from oauth2client.service_account import ServiceAccountCredentials
import gspread
# 구글시트 세팅
scope = ["<https://spreadsheets.google.com/feeds>",
"<https://www.googleapis.com/auth/spreadsheets>",
"<https://www.googleapis.com/auth/drive.file>",
"<https://www.googleapis.com/auth/drive>"]
creds = ServiceAccountCredentials.from_json_keyfile_name("api 키 json 파일명(확장명인 .json까지 붙여서)", scope)
gc = gspread.authorize(creds)
sh = gc.open_by_url('시트 url')
search = sh.worksheet("조사")
# 구글시트 세팅 끝
# 마스토돈 계정 세팅
BASE = '자동봇이 지내는 서버의 url'
m = Mastodon(
client_id="클라이언트 키",
client_secret="클라이언트 비밀키",
access_token="액세스 토큰",
api_base_url=BASE
)
print('성공적으로 로그인 되었습니다.')
# 마스토동 계정 세팅 끝
CLEANR = re.compile('<.*?>')
def cleanhtml(raw_html):
cleantext = re.sub(CLEANR, '', raw_html)
return cleantext
class Listener(StreamListener):
def on_notification(self, notification):
if notification['type'] == 'mention':
got = cleanhtml(notification['status']['content'])
if got.__contains__('[') is False or got.__contains__(']') is False:
pass
else:
keyword = got[got.find('[')+1:got.find(']')]
try:
look = search.find(keyword, in_column=1, case_sensitive=True).row
result = search.get(f"R{look}C2:R{look}C5", value_render_option="UNFORMATTED_VALUE")[0]
if result[1] is True:
try:
if result[2] is True:
try:
m.status_post(f"@{notification['status']['account']['acct']} {result[3]}", in_reply_to_id= notification['status']['id'], visibility='private')
except:
print(f'방문된 후의 지문이 별도로 기입되어 있지 않습니다. 해당 키워드의 조사 후 지문을 기입해주세요: {keyword}')
m.status_post(f"@{notification['status']['account']['acct']} {result[0]}", in_reply_to_id= notification['status']['id'], visibility='private')
return
else:
m.status_post(f"@{notification['status']['account']['acct']} {result[0]}", in_reply_to_id= notification['status']['id'], visibility='private')
search.update_cell(look, 4, 'TRUE')
except Exception as e:
print(f'체크 관련 오류 발생: {e}')
else:
m.status_post(f"@{notification['status']['account']['acct']} {result[0]}", in_reply_to_id= notification['status']['id'], visibility='private')
except AttributeError:
m.status_post(f"@{notification['status']['account']['acct']} [{keyword}]는(은) 존재하지 않는 키워드입니다.\\n만일 오류라고 판단되는 경우 운영진, 혹은 봇의 관리자에게 연락을 주세요.", in_reply_to_id=result, visibility='private')
def main():
m.stream_user(Listener())
if __name__ == '__main__':
main()
이 자동봇은 기본적으로 대괄호[]로 감싸여진 단어만 키워드로 인식합니다. (예: 시트에 기입한 키워드가 ‘도서관’일 경우, ‘도서관’이 포함된 멘션에는 반응하지 않으며 [도서관]이 포함된 멘션에만 답장)
연동 시트(사본을 만들어서 편집해주세요)
https://docs.google.com/spreadsheets/d/1KIFPlormALqbaepogS1UlsCHH8XcJ5QVoEy_D8Wpa1k/edit?usp=drive_link
해당 파일을 사용하려면 약간의 자동봇, 파이썬 관련 지식이 필요합니다.