0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで【バケたん】をシミュレートするbot

Last updated at Posted at 2021-12-23

【バケたん】の機能をソフトでシミュレートし結果をtweetするbot-> <[@6thSensor](https://twitter.com/6thSensor/status/1473609420387282947?s=20)>
をフォローすると、下記コードのテスト運用を確認できる。
(ここで示すコードはバケたんの動作原理をguessするもので完全にシミュレートするものではない。)

###【バケたん】とは?
【バケたん】とは「お化け探知機」という玩具の略称で、その原理は↓こちらのサイトが詳しい。
https://www.j-dowsing.com/goods/baketan/

お化けだけでなく地震の予知にも使っている人が大勢いるようだ。お化けの場合は調べたい場所でボタンを押し、青なら良いスピリッツが、赤ならお化けがいるということになるらしい。
ボタンを押さなくても10分ごとに自動でチェックしているらしく、ときどき、赤や青に点滅したり、BEEPしたりする。

 上のサイトによると「サイコロを、8回振り、特定の数字に偏りが出ると赤、ランダムに全ての目が出れば、青が光る様に作られています。」ということなので、賽(さい)の目を0-5にし、サイコロを8個にしたものをPythonで書いてみた。
 本家「ばけたん」の場合は近くにないとき点滅してもわからないが、ソフトばけたんの場合はタイムスタンプが残るので、あとでいつ反応したかがわかる。

###ランダムネスとは?

 ランダムネスの究極の定義はグレゴリー・チャイティンによってなされたそうだが<[チャイティン](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%81%E3%83%A3%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3)>、圧縮できるほどランダムネスの率が低く、圧縮率が低いほどランダムであると、ここでは強引に解釈させていただく。
 そこで、ここではランダムに生成した数値をgzip関数で圧縮して、そのデータサイズが小さいほどランダムでない、つまり、"珍しい"ということになり、お化けや地震の発生可能性が高いと警告することにした。

gzipの結果で圧縮率=非ランダムネスを測るのはいささか乱暴だが、とりあえず、それらしく動くことをここでは優先した。

下のコードで、
'consumer_key'
'consumer_secret'
'access_token_key'
'access_token_secret'

のところは、それぞれ、twitterのデベロッパーポータルから、https://developer.twitter.com/en/portal/dashboard
keyとsecretを取得して書き換える。

(以下のコードでは乱数生成は10分ごとではなく、60秒ごとになっている)

###ソフトばけたんのコード
import gzip
import sys
import os
import random
import datetime
#import winsound
import time
import threading

import tweepy

consumer_key = 'consumer_key'
consumer_secret = 'consumer_secre'
access_token_key = 'access_token_key'
access_token_secret = 'access_token_secret'

def worker():
    nw = str(datetime.datetime.now())
  
    s_in = ""
    for n in range(8):
        s_in += str(random.randint(0, 5))
    ss = bytes(s_in, encoding='utf-8', errors='replace')
    s_out = gzip.compress(ss)
    b = sys.getsizeof(s_out)
    #  56 < b < 61
    #print(nw[2:19]," ", b, s_in)
    if b < 59:
        col = "黄色"
        if b < 58:
            col = "赤"
        #twt = nw[2:19] + " " + str(b) + " " + s_in
        twt = nw[2:19] + " " + col
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token_key, access_token_secret)
        api = tweepy.API(auth)
        api.update_status(twt)
        #winsound.Beep(800,1000) 
    time.sleep(1)

#thanks to
#https://qiita.com/montblanc18/items/05715730d99d450fd0d3

def scheduler(interval, f, wait = True):
    base_time = time.time()
    next_time = 0
    while True:
        t = threading.Thread(target = f)
        t.start()
        if wait:
            t.join()
        next_time = ((base_time - time.time()) % interval) or interval
        time.sleep(next_time)

tnow = str(datetime.datetime.now())
print(tnow[2:19])
scheduler(60, worker, False)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?