Rapsberry piとSQSでtweetスイッチを作る - 完成編 -

前回プロトタイプを作成し、まとめで
>・tweetをする／しないの選択処理
・tweet失敗時の再送処理
ができていないので、最低限やっておきたい。

と書いていた部分を追加し、tweetスイッチとして完成させる。

前回の基本編はこちら
[Rapsberry piとSQSでtweetスイッチを作る](http://qiita.com/gacha-ru/items/305c462ba5d6a3ed0a8a)

今回書いた部分含めスクリプトはgithubにおいておきました。
https://github.com/gacha-ru/tweet_switch

# 追加した機能
以下3つを新たに追加した。
## 送信側：140文字制限をつける
送信スクリプトに文字数チェックを追加

注意した所は日本語の文字数カウント。
utf-8でdecodeしカウントすることで、日本語の文字と英字の混合でもカウントができるようにした。
実行結果は以下のようになる(OK時のメッセージが冗長な感じがしてきた…)

```OK
$ python sqs_send_queue.py Pythonぱいそんそん
文字数：12 Check OK!!!
evil_tweet へ Pythonぱいそんそん をいれました
```

```NG
$ python sqs_send_queue.py "家のつるべは潰れぬつるべ、隣のつるべは潰れるつるべ
ブスバスガイド　バスガス爆発
国語熟語述語主語
打者　走者　勝者　走者一掃
あのアイヌの女のぬう布の名は何？あの布は名のない布なの
ある日昼ニヒルなあひるヒルにひるんだ
歌唄いが来て歌唄えと言うが　歌唄いくらい歌うまければ歌唄うが
歌唄いくらい歌うまくないので歌唄わぬ"
文字数：160 Check NG!!!
140字まで!!こまめに吐き出してこう( ｰ`дｰ´)ｷﾘｯ
```

![sqs_send_queue_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/38286/b75cd080-971c-d8f2-b565-c92a81ef1d0a.gif "sqs_send_queue_demo.gif")


## 受信側：tweet失敗時の再送処理
twitter APIでのエラーコードは[こちら](https://dev.twitter.com/overview/api/response-codes)
送信が正常に行われなかった時は、キューの削除を行わないというだけ。
しかし、エラーによっては再送するようにしても無駄だと警告されるエラーがあるため、その場合は消す。
全部を対応し切る自信がなかったので、検証中に何回もだしたduplicateエラーの対応を…

* Code:187 Message:"Status is a duplicate"（同じ内容を既にツイートしてるよこのやろう！の意）

```tweet_switch.py
# エラーメッセージの内容を返す
def return_value_analysis(return_message, msg):
    error_value = return_message["errors"]
    error_message = error_value[0]

    # "Status is a duplicate."は同じ内容を既につぶやいていると言う事
    # メッセージを出しキューを削除
    if error_message["message"] in "Status is a duplicate.":
        duplicate_message = ('同じこといっとるでー!かえなかえな〜(^o^)/\n'
                             '消しとくねー(^-^)それなー(^_<)=★')
        print duplicate_message
        queue.delete_message(msg)
    else:
        print error_message["message"]
        print ("キューは消さずに戻しときますね")
```


## 受信側：tweetをする／しないの選択処理
前のはスイッチを押したら即tweetだった。
しかし、あくまで「保留」装置だったのでtweetをする、しないの選択ができるようにしたかった。
その為スイッチを2つつけた構成にする
![tweet_switch_base.jpg](https://qiita-image-store.s3.amazonaws.com/0/38286/d08a75c1-448b-2b38-0cf4-0db9665565f0.jpeg "tweet_switch_base.jpg")

【手順】
**Raspberry piで実行**
![tweet_switch_demo01.gif](https://qiita-image-store.s3.amazonaws.com/0/38286/763e4f5a-fbfc-6553-2ab5-b41186fa29bb.gif "tweet_switch_demo01.gif")

1. tweet_switch.pyを実行  
``` $ python tweet_switch.py```
2. Yesスイッチを押す  
``` yes ```  
3. SQSの"evil_tweet"キューにメッセージが
 * ある: "めっせーじ をtweetしますか？"を出力  
tweetするかを選択→4へ
 * ない: "ないでキュー"を出力  
1へ戻る
4. Yes os No スイッチを押す
 * Yes: メッセージをtweetする  
     * メッセージを同じ内容が既にtweetされていた場合  
``` 
同じこといっとるでー!かえなかえな〜(^o^)/  
消しとくねー(^-^)それなー(^_<)=★
```  
を表示しメッセージを削除する
     * その他のエラー  
メッセージは削除しない。（Visibility Timeout後、再取得しtweetしなおすことが可能）
 * No : メッセージを削除する
5. 1へもどる

### 2つ目のスイッチ
1つ目のスイッチと書いている内容は同じ。
押したスイッチによってreturnする内容を変えた

```
# tweetするか確認
def tweet_review():
    while True:
        time.sleep(0.01)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(15, GPIO.OUT)
        GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.output(15, False)
        no_input = GPIO.input(19)
        GPIO.output(15, not no_input)
        yes_input = GPIO.input(11)

        # メッセージ取得と同じスイッチ
        if yes_input == 0:
            GPIO.cleanup()
            return "Yes"

        #
        if no_input == 0:
            GPIO.cleanup()
            return "No"
```

# まとめ
今回時間がかかったのは2つ
・2つ目のスイッチ
　仕事帰りに秋葉原よって買おうと思っていたら、定時帰りでも店に間に合わなかった。
　が、ヨドバシカメラにも売っているのを偶然見つけて買うことができた。
　買ったのはこれです：[タクトスイッチ](http://www.yodobashi.com/%E3%82%A8%E3%83%AB%E3%83%91-ELPA-HK-TKS01H-%E3%82%BF%E3%82%AF%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-%E5%B0%8F-%E9%9B%BB%E6%B0%97%E9%96%A2%E9%80%A3%E7%94%A8%E5%93%81/pd/100000001000618818/)

・gifアニメ
　どうやってとるのかといろいろ調べた結果、[LICEcap](http://www.cockos.com/licecap/)が使いやすかったです。
　何回も撮り直してようやく載せた形のものになりました。