제목 그대로입니다. 구글시트에 기입한 키워드에 대응되는 지문을 돌려주는 자동봇입니다. 결과 지문 툿은 기본적으로 공개 범위가 팔로워 전용으로 설정되어 있습니다.

해당 자동봇 코드는 지인의 요청으로 만들어졌으며, 마스토돈 플랫폼을 사용하는 자캐커뮤에 사용되는 걸 상정하였습니다. 키워드를 사용하는 것들(예: 상시 조사, 뽑기, 주사위 굴림 등)을 위한 기능으로 사용하기 좋습니다. 자캐커뮤 외의 용도로 사용하셔도 괜찮습니다. 단, 타인에게 해가 가지 않는 상식적인 선 내에서 사용해주세요.

만일 추가적인 기능을 원하신다면 @[email protected]로 연락해주세요! 그러나 반응이 느릴 수 있습니다. 서버 호스팅 및 구축 관련 문의는 저부터 잘 알지 못하여 받지 못 합니다…. 연합 탐라에 외치면 저보다 더 잘 아시는 분들이 도와주실 것입니다….

해당 안내 문서에 이미 안내된 사항 관련 질문에는 반응하지 않습니다. 참고해주세요! 또한, 해당 문서의 내용을 숙지하지 않아 생기는 모든 불상사에는 책임을 지지 않습니다!

masto_search_bot.py

requirements.txt

#!/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

Untitled

해당 파일을 사용하려면 약간의 자동봇, 파이썬 관련 지식이 필요합니다.