twitter botでmentionにreplyするほか

今考えているものが、TwitterBotとしてリリースするのが良いだろうということで、本体の前にヤックシェービング的にTwitterBotのほうを実装した。
というか、自分へのmentionに応答するBotが見つからなかったので作らざるおえなかった。

https://github.com/MichinariNukazawa/twitter_bot_mock




参考については以下の通り。



https://twitter.com/DaisyTestBot01
tweepyのサンプルが最初に動いたので採用した。
アプリ認証などは手動でした。

retweetやfavoをするのに使うメソッドは、apiのメソッド一覧を見ると載ってる。
http://docs.tweepy.org/en/v3.5.0/api.html


# mentionへのreply

全文はgithub参照。
statusオブジェクトに規定の要素が入っているので、それでmentionを判定する。
replyは、APIを使ってreply先としてmention元を指定したツイートを投げる。

```
         # ** retweet and reply when mention ("@" tweet)
        for user_mention in status.entities['user_mentions']:
            #print("receive mention: {0} {1}".format(status.user.screen_name, str(datetime.datetime.today())))
            #pp.pprint(user_mention)

            if str(status.user.screen_name) == client_info["screen_name"]:
                # exclude self mention.
                pass
            else:
                #print("receive mention: " + str(datetime.datetime.today()))
                # ** reply
                try:
                    tweet = "@{0} Hello!\n {1}".format(status.user.screen_name, str(datetime.datetime.today()))
                    api.update_status(status=tweet, in_reply_to_status_id=status.id)
                except TweepError as err:
                    pp.pprint(err)
                    #return False

```

# その他


途中で出たエラー。
```
    raise TweepError(error_msg, resp, api_code=api_error_code)
tweepy.error.TweepError: [{'code': 226, 'message': "This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later."}]
```


```
MN@daisy-bell:twitter_bot/$ python3 reply_bot.py
receive mention: 2018-04-21 22:38:07.842412
receive mention: 2018-04-21 22:38:08.467460
TweepError([{'code': 327, 'message': 'You have already retweeted this Tweet.'}],)
receive mention: 2018-04-21 22:38:08.962691
receive mention: 2018-04-21 22:38:09.624403
receive mention: 2018-04-21 22:38:11.172642
TweepError([{'code': 327, 'message': 'You have already retweeted this Tweet.'}],)

~
receive mention: 2018-04-21 22:38:14.510356
receive mention: 2018-04-21 22:38:15.128921
receive mention: 2018-04-21 22:38:15.829066
TweepError([{'code': 327, 'message': 'You have already retweeted this Tweet.'}],)
receive mention: 2018-04-21 22:38:16.467772
receive mention: 2018-04-21 22:38:17.081724
TweepError([{'code': 327, 'message': 'You have already retweeted this Tweet.'}],)
receive mention: 2018-04-21 22:38:17.602246
TweepError([{'code': 226, 'message': "This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later."}],)

~
receive mention: 2018-04-21 22:38:19.886857
TweepError([{'code': 326, 'message': 'To protect our users from spam and other malicious activity, this account is temporarily locked. Please log in to https://twitter.com to unlock your account.'}],)

```

エラーそのものは単なる正常なTwitterのBot対策のアカウントロック。
Botを作っているのだから当然、開発中はコーディングミスで引っかかる。同じ内容のツイートを連続でしてしまったり。
今回の場合は、自分からのreplyに含まれている自分への”@付きツイート”をリツイートして無限ループに陥り、連続ツイートあたりでロックされた。

ロックされたら手作業で解除する。解除は簡単にできる。

で、tweepyはエラーを例外で投げ上げる。ネットワークアクセスの結果の失敗を例外で上げるのは個人的にはどうかと思うのだけれど、tweepyは便利なので、単にラップすることにした。
```
                 # ** retweet
                try:
                    api.retweet(status.id)
                except TweepError as err:
                    pp.pprint(err)

```

こういう場合もある。
```
receive mention: 2018-04-21 22:42:40.612219
receive mention: 2018-04-21 22:42:40.946000
TweepError([{'code': 226, 'message': "This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later."}],)
```

pixivpyラッパー・スクリプト(tagベース)

書きました。
tagベースでサーチしてダウンロードします。

https://github.com/MichinariNukazawa/pixivpy_wrapper


詳しい特長はREADME.mdにて。

ダウンロード済みのものはスキップするようにしています。
切断が起こった場合、自動リトライしません。リカバリしない方針です。

実際に、使っていると途中で切れます。
```
 [114:999,   27:30] `ろーちゃん`
[114:999,   28:30] `【艦これ漫画】from bed to bed`
[114:999,   29:30] `3月`
Error: search error `艦これ`
{   'errors': {'system': {'message': 'The access token provided is invalid.'}},
    'has_error': True,
    'status': 'failure'}
end: 0 2018-04-24 01:03:15

```
スキップと、スクリプトの内部変数で開始ページを指示できるので、そこの書き換えで対応してます。
(今回、スクリプトの引数をやたら増やしても使い勝手は良くならないなと思ったので、これは内部変数です。)

引いたことのないはずのページに、時折ダウンロード済みが混じります。不思議。
```
[177:899,   27:30] `ぽいぬ`
[177:899,   28:30] `イベントお疲れ様!`
[177:899,   29:30] `温泉山風`
Notice: already exist [178:899,    0:30] `温泉山風`
[178:899,    1:30] `おさんぽいぬ`
[178:899,    2:30] `鹿島(艦隊これくしょん)`
[178:899,    3:30] `武蔵さん龍田ちゃん改二!今日の鎮

```
 
タグが1つのときと2つ以上のときに、微妙にマッチルールを変えるifを入れてあるのですが、正直いらなかったかなと思っています。

画像と別に書き出されるJSONっぽいものはあくまでJSONっぽいものなので、読み込み時にJSONパーサに渡す前にひと手間必要です。この小ネタ、ローカルファイルをキャッシュや読み込み無しで追記するだけで良いので、ネットワーク越しに使うのでなければ結構有効なテクニックだと勝手に思っています。

一冊200円のフォトブックで書体見本誌を刷ってみた


フォトブックが一冊200円から印刷できるサービスがあります。
これにRuneAMNの書体見本誌を画像にしたものを写真の代わりに流し込めば、書体見本誌が安く印刷できるのではと踏んだ次第。






印刷会社はこちら。
https://netprint.co.jp/photobook/

# 変換

最初はimagemagickのconvertコマンドで一括書き出しを試してみたのですが、
`convert -alpha Remove -density 100 -quality 90 -colorspace rgb book_of_RuneAMN_Pro_Fonts.pdf book.jpg`
フォントのラスタライズに横線のスレが出てしまい、仕方なくGimpで手作業しました。


GimpでのPDFインポートの際に、dpiを大きめに取ると、ピクセル数の大きいjpg画像が得られます。
A5印刷を前提に作った現行なので、印刷会社の文庫サイズに近づけようとすると、推奨とサイズが微妙に違いますが、少し超えるピクセル数にしておけば、良いように縮小してくれるだろうということで。
一枚ずつエクスポートはつらすぎるので、下記プラグインで一括書き出ししています。
https://github.com/khalim19/gimp-plugin-export-layers


# フォトブック編集

>フラッシュプラグインが必要とか出てきて作れない!
flashが必要とのことなので入れたのですが、編集アプリが実用にならず。
`sudo apt-get install flashplugin-installer`

最終的に、スマホで
https://netprint.co.jp/app
を使いました。

フォトブックはページ数固定なので、それに合わせる必要があります。
ページ分割(4枚で1ページなど)が使えるようなので

見本誌のページ割当メモ:
24pとあるが、一枚が表紙で、表紙+1~22 (裏表紙はなし)画像31枚中 書体 21枚 + freeedntionまとめ一枚
Free 6枚

 1:割当表
2~5: 4ページ分のFree版
  Free版表紙
  Free版集合
  Serif
  PixelArtic(片方のみ )
6: Pro版表紙
7~21: Pro版書体 15枚
22:奥付

# 注文 

というわけで、注文はスマホアプリからできます。

# 刷り上がったもの

ページの重ね合わせ位置のずれが気になりますが、そういうものだと思うので、概ね満足です。
できれば次は光沢で刷りたい。

















RENAULT LIGHT10 購入した際に一緒に揃えたもの

RENAULT LIGHT10 購入した際に一緒に揃えたものです。

自転車を使うにあたって、自転車以外にもいろいろ必要なあるものがあります。
これまで自宅に自転車はなかったので、必要なものは全部、1からそろえました。
ヘルメット、ライト、ベル、空気入れ、鍵x2、輪行バッグを買いました。

なお、自転車の組み立てに必要な工具は自転車に付属しています。

ライトとベルを付けたところ




空気入れ

最終的に英式でよかったのですが、購入時にバルブ種類がわからなかったので3種対応のものを買いました。

 

 


ライト 

USB充電より電池式のほうがよかったのですが、これがコンパクトで見た目もよかったのでこれにしました。
そこそこ十分に明るいです。










ベル

 格好良くてコンパクトだったので、最初からついているものから付け替えました。色も自転車に合ってます。



ヘルメット

ヘルメットは自転車に詳しい友人複数人におすすめされました。また、かならず店舗で試着して買うようにともアドバイスをもらいました。
しかし結局、店頭には合うサイズがなく、店頭のサイズ違い品から予想で買うしかなかったです。(届いて合わせてみるまで、合うかどうかちょっと不安だった)日本人の頭の形状に合うやつだから、とこれをおすすめされたのもあって、これを買いました。



鍵はこれとあと、100均でもうひとつ買いました。
金属製の鍵を買うと、自転車本体とぶつかるとお互い削れてしまうので、はずしたら自転車のハンドルにかけたりせず、バッグに仕舞う必要があります。



 

輪行バッグ 

 購入したこれにぎりぎり入りました。20インチ自転車を持ち運ぶ人は少ないのか、16インチよりずっと選択肢は狭いです。
思ったよりたたんだサイズが大きかったですが(漕ぎ出しなど立ち漕ぎで足にぶつかることがある)、それ以外はよかったです。















まとめ


ライトは(反射板がついてきますが)あったほうがよいです。

ベルはついてくるので必要ないです。(でも付け替えました)

空気入れはママチャリと同じ普通の英式が使えます

サドル下のプラスチックキャップは折りたたんだ際の足になるので残しておく必要があります。
本体の折りたたみ部分のプラスチックカバーも、残しておくと開くのを抑えることができます。抑えることはできますが、ある程度は開いてしまい、ロックはありません。


今後は、おいおい予備のチューブと修理工具を揃えていく必要があります。

RENAULT LIGHT10 購入 開封編

RENAULT LIGHT10

 RENAULT LIGHT10 を購入 しました。Web上にあまり開封写真等の詳細がなかったので残しておきます。

 開封






モノが大きいためか、知らない運送会社でおくられてきた。


封のホチキスも大きい







封切り







折り返し部分が格好いいです。

ペダル。反射板が標準でついているのが友達と自分には高評価でした


小さなベルもついてる

わたしはさらに小さなものに付け替えましたが良い音がしました








折り返し部分のプラスチック製固定具。たぶん残しておいてしまう時は使う




フォトレビュー

組み立てながらで撮った写真などです。

折りたたみ状態での接地プラスチックカバー。これも残しておいて使う。






ホイール。カバーがついている。

購入前に詳しい人に「カバーついてないやつは油がズボンにつき、巻き込みでズボンが破れるので専用のタイを買うのだ」と脅されて(?)いたのだけれど、結果的に不要だった。









前面の反射板が、ライトの代わり(?)に点いている。



必要最低限な感じのスタンド。プラスチックカバーは外したし外れてしまう



変速機





 タイヤ






反射板




バルブ(空気入れ口)

公式サイトに事前情報がなかったので友達とアレコレ推理しながら購入しましたが、結論は、ママチャリと同じ普通の英式バルブでした。




自宅の玄関に畳まず入れたところ。

逆向きだと収まらないので自宅玄関には微妙に収まってないですが。もちろん折りたためば問題なく収まります。




続いて、購入に前後して揃えていった、ライト等の周辺機器です。

TIGORA(ティゴラ)のトレッキング シューズ

 TIGORA(ティゴラ)の トレッキング シューズを買いました。 メインの靴がアシックスウォーキングで街歩き用なのですが、これまではこれで高尾山などの軽い山も登っていました。 今回、靴底があまりに摩耗したこともあってアシックスウォーキングを買い替えたのですが、ついでに消耗が激...