週末文書

とりあえず、まぁ、週末です。

トレンドに応じたWikipediaページを投稿するTwitter BotをHerokuでデプロイ

なんとか作った「相づちくん」Twitter Bot実質的にBANされてしまいました。しかし、せっかく作ったTwitterと Herokuのアカウントを放っておくのももったいないので、お手軽Botを作って走らせてみました。

続きを読む

自動返信Twitter Bot「相づちくん」、実質的にBANされるの巻

2日前にメンションされたら肯定的相づちを返信するTwitter Botを作成しました。

やっていることは単純で、

  1. tweepyのストリーミングAPIで自分をメンションするツイートを待つ。
  2. メンションを受信したら、そレに対して相づち(ファイルに記録された語句をランダムに選択)をリプライする(元のメンション・ツイートのidを使って、tweepyのupdate_status()をコールする)

というだけです。簡単なコードなのですが、これで相づちを返すTwitter Botを簡単に作ることができました。

ところが、今朝、テストのために Bot宛にメンション・ツイートを送るのに使ったアカウントをチェックしたら、Botからのリプライが全て非表示になっていました。Botのアカウントで見ると、普通にリプライしています。ところが、返信先やその他のアカウントでは、Botの返信ツイートが表示されません。

PCの場合は完全に表示されないので何がおきたかわかりませんでしたが、iPhoneで見てみたら、Botのリプライに対して「このツイートは表示できません。詳細はこちら」というTwitterからのメッセージが付加されていました。

理由はよくわからないのですが、 Botからの自動応答機能は(確かに危ない感じもするので)認められていないんだろうと解釈し、あきらめて他の機能を作ってみることにしました。

「相づちくん」のTwitter Bot化

今週のできごと

週明け一週間は夏休みということになっています。妻の実家のある仙台に行こうと思っていたのですが、コロナの状況から「来ないほうがいい」となりました。ちょうど、妻が腰を痛めたということも重なりまして、家で静かに暮らすことになりそうです。

「相づちくん」のTwitter Bot

WebアプリとしてHerokuでデプロイした「相づちくん」をTwitter Bot化してみました。手順としてはだいたい、下記の流れで行いました。

Twitterのdeveloper登録とAPIキー、トークンの入手

  • こちらの記事「Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報 - Qiitaを参考にして、developer登録を行いました。
  • 上記の記事は2019年8月時点と書かれてますが、最初の開発目的を選択する部分以外はほとんど同内容の登録画面でした。
  • Webで登録した後、APIの使用目的についての追加質問のメールが来ましたが、記事にかかれているものと同じ内容の質問でした。
  • 英語なので多少面倒くさいですが、DeepLを使って機械翻訳して回答することで問題ありませんでした。
  • 一点迷ったのは、developer.twitter.comにログインする際のアカウントです。ついつい、普段自分がTwitterを見るために使っているアカウントでログインしそうになりました。しかし、APIを使って投稿する先はBOT用のアカウントにしたいので、急いでTwitter上にアカウントを新規作成し、そのアカウントでdeveloperにログインしました。

メンションされたら相づちを返信するTwitter Botプログラムの作成

  • pythonで TwitterAPIを使う際には、tweepyというコンポーネントを使うことが多いようです。
  • tweepyを使用例の記事は多数ありますが、いくつか見ながらコードを書き、疑問点をまた調べるということを繰り返したところ、結局、こちらの記事Tweepyで雑にTwitter botを作ってみた - Qiitaと同じことをやろうとしていることに気づき、この記事のコードを大いに参考にさせてもらいました。
    • この記事では、3件のコード例の最後のものが、TwitterのStream APIを使った「特定の文字列に反応するbotを作る」というケースになっています。ただ、この記事が書かれた時点とTwitterのStream APIの仕様が変わっていて、このコード例のままだとプログラムが動きません。(必ず、error code 404のエラーとなってしまいます)
    • 具体的には、下記に引用したコード例一番最後の行のuserstream機能が廃止となっているため機能しません。
stream.userstream()
    • この行を次のようなfilter機能を使った記述に改める必要があります
stream.filter(track = ["受信したいツイートに含まれる文字列(キーワードや\
BotのTwitterアカウント名など”])
  • 結果として、Botのアカウントにメンションすると、肯定的な相づちを返答してくる、というプログラムができました。
  • このバージョンをHerokuにデプロイすることも考えたのですが、もう少し機能を追加してからにしようと考えています。
続きを読む

my first Flask app: 相づちくん(その2 SPA/チャットUI化の巻)

先週、Flaskを使った初めてのチャットボットWebアプリケーション「相づちくん」を作成しました。

ただ、このバージョンはフォームを使って入出力を行うものなので、入力するたびに画面全体が書き換わってしまって、チャットっぽさがまったくありません。

ここはやはり、入出力を連続して表示するSPA(Single Page Application)を行いチャット風画面作りを目指したいと思いました。そこで、webで発見したチャット用のUIをフロントエンドとして使って、チャットUI版の「相づちくん」を作成しました。

f:id:medihen:20210814205235p:plain
SPA版「相づちくん」の画面(chatux使用)
続きを読む

SSR(Server Side Rendering)におけるレンダリングとは

SPA(Single Page Appliation)のアーキテクチャが飲み込みずらくて、あれこれ調べたところ、Client Side Rendering(SPA)・SSR・SSG を整理してみた - 7839と言う記事を発見しました。

この記事は大変わかりやすい図で整理してくれていて、SPAでのサーバとブラウザの動作、それらの間で流れるデータなどを飲み込むことが(一応)できました。

この記事では、SPAの他に、SSR(Server Side Rendering)とSSG(Serve Side Generator)というアーキテクチャについても紹介しています。

ここで引っ掛かったのが、SSRにおけるRenderingという言葉です。元記事中、SPAについても「CSR(Client Side Rendering)とほぼ同意語」と書いていて、ここにもRenderingが出てきます。

では、ここで言うRenderingとは何か?

続きを読む

my first Flask app: 相づちくん

FlaskのTutorialを一通り追ったので、tutorialのアプリケーションを参考にして、Webアプリを一個作ってみることにしました。

とりあえずは、以前作っておいた「とにかく肯定的なあいづちを返す」人工無脳=相づちくんをFlaskでWeb化してみます。

f:id:medihen:20210723152943p:plain
Flaskのアイコン

作業は下の順番で進めることにしました。

  • 1. hello worldを表示
  • 2. 入力された文をそのまま表示
  • 3. 「とにかく肯定的なあいづちを返す」人工無能との結合
    • Webアプリのプログラム中で読み込むファイルをどこに置くか
  • 4. 連続して入出力結果を表示するチャット的な表示
  • 5. デザインを改善(Bootstrapを利用してみる)

なかなか迂遠ですが、Flaskも初めてなら、人工無脳的Webアプリ(つまりチャット的Webアプリ)というものをどう作るのかプログラミングレベルで考えたこともないので、ステップ・バイ・ステップでいくことにします。しかし、そのステップ分けが妥当かどうかも判断つかないレベルなので、う〜むという感じですが。

続きを読む

Flask Tutorialの冒頭"Application Setup"の例が動かないで弱った話

Python用軽量WebフレームワークであるFlaskのチュートリアルをやっています。

チュートリアルの一番最初の”Applicaton Setup”という章にHello, World的なアプリケーションを動かす例が載っているのですが、これが動かず、少々焦りました。

f:id:medihen:20210723152943p:plain
Flaskのアイコン

この例ではflaskrというチュートリアルディレクトリを作ったあと、その中にアプリケーションを定義して生成する__init__.pyというファイルを作ると書かれています。このファイルをパラメータにしてFlaskを起動して、ブラウザで http://127.0.0.1:5000/hello にアクセスすると、”Hello, World!”と表示される、というシンプルな例です。

ところが、書かれている通りに__iniit__.pyを作成してflaskを起動しても、404 Not Foundエラーが出て、Hello, Worldが表示されません。

続きを読む