目的
にゃーんしたいときににゃーんとツイートしたい
にゃーんボタン1号
ボタンが押されると現在時間とともにツイート.
スマホやAppleWatchで使えてとても便利
問題点
投稿文が にゃーん August 24, 2017 at 03:45AM
のようになってしまい,1分以内だと投稿の重複により投稿できない.にゃーんを連投したい時もあり困る.
にゃーんボタン2号
家にラズパイがあるのでそいつに仕事してもらいたい
練習として,IFTTTでWebhookしてみる
IFTTTでWebhook飛ばすアプレットと受け取るアプレットを作ってみた.
IFTTTでWebhookのSettingを開くとこんな感じでPOSTするといいよみたいなURLが表示されるのでそれをそのまま使えばよかった.Webhookめっちゃ便利
curlの入力例も表示される
Webhook飛ばすやつ
Webhook受け取るやつ
2号もいい感じに動く.あとは飛ばす方をラズパイにお願いするだけ.
にゃーんボタン3号
ラズパイと言えばPythonらしいのでPythonをつかうことにした
import wiringpi as pi ,time,requests,datetime
SW_PIN = 15 # スイッチがつながってるピン番号
url='https://maker.ifttt.com/trigger/python1/with/key/******'
swi=0
pi.wiringPiSetupGpio()
pi.pinMode(SW_PIN,pi.INPUT)
pi.pullUpDnControl(SW_PIN,pi.PUD_DOWN)
while True:
if(pi.digitalRead(SW_PIN)==pi.HIGH):
if(swi==0):
print("Switch ON")
str = datetime.datetime.now().strftime('%H:%M:%S')
payload = {'value1':str}
requests.post(url,data=payload)
swi=1
else:
print("Switch OFF")
swi=0
time.sleep(0.01)
swi
にスイッチのオンオフを保持し,0→1になった時に時刻を取ってきてwebhook先に飛ばす.
payload = {'value1':str}
requests.post(url,data=payload)
とすることで時刻データを飛ばすことができる.
ボタンを押すと投稿
問題点
POSTの送信に時間がかかってしまい,送信中は連打してもにゃーんしてくれない.もっと連打したい
にゃーんボタン4号
送信部だけスレッド化して非同期にしたい.
調べたらPythonにサブスレッドを作る機能があったけどよくわからないのでバックグラウンドで送信部だけ動かすことにしたら解決してしまった.
送信部を nyaan.py
に分け,os.system('sudo python3 nyaan.py &')
に書き換えるだけで解決してしまった.
これでにゃーんボタンを連打しても最短1秒間隔でにゃーんすることができる.理想的だ.
問題点
毎にゃーんごとに sudo python3 nyaan.py &
を実行することになるのでちょっと残念.
コンパイルしておきたいけど眠いからまた今度やる.
にゃーんボタン5号
連打の機運が高まってしまったのでミリ秒表示に対応する.
今までの仕様では1秒に1ツイートが限界だった(ツイートの重複)
now = datetime.datetime.now()
str = now.strftime('%H:%M:%S.') + "%03d" % (now.microsecond // 1000)
むずかしいぷろぐらみんぐよくわかんないから http://shohu.hatenablog.com/entry/20081117/1226936130 ここをそのままうつした.
結果
理論的には1秒に1000連打しても問題なくツイートできる.
にゃーんボタン6号
あれからいろいろあってマルチスレッドになったりスピーカーから音が出るようになった
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading,tweepy,datetime,kjfsm4,wiringpi as pi,time
import pygame.mixer
SW_PIN = 14
swi=0
pi.wiringPiSetupGpio()
pi.pinMode(SW_PIN,pi.INPUT)
pi.pullUpDnControl(SW_PIN,pi.PUD_DOWN)
auth = tweepy.OAuthHandler(kjfsm4.consumer_key,kjfsm4.consumer_secret)
auth.set_access_token(kjfsm4.access_token,kjfsm4.access_secret)
api = tweepy.API(auth)
pygame.mixer.init()
pygame.mixer.music.load('nyan.mp3')
def tweet():
pygame.mixer.music.play(1)
print("tweet")
now = datetime.datetime.now()
str = now.strftime('%H:%M:%S.') + "%03d" % (now.microsecond // 1000)
print (str)
str = 'にゃーん '+str
api.update_status(str)
while True:
if(pi.digitalRead(SW_PIN)==pi.HIGH):
if(swi==0):
th_me = threading.Thread(target=tweet,name="th_me")
th_me.start()
swi=1
else:
swi=0
time.sleep(0.01)