あさぶろ日記

note のほうに書いている記事を保管しているだけです。

Twitter のほうにも note の記事が自動で連携されるようにしてみた話。

以前、「Twitter の API を使ってみたいと思ったけど何故か SMS が受信できなくて困った!」という記事を書きました。

要約すると、このような感じでした。

Twitter の API を使ってみたい。それにはどうやら申請が必要のようだ。

まず、Twitter アカウントに電話番号を追加しないといけない。それで、アカウントが開発者用として認証される。さらに申請理由を送って「なんで API 使いたいの?」というやりとりを経て承認を得る必要がある。そうして晴れて「あなたが API を使うためのキーはこれですよ」という情報が得られる。らしい。

しかし私は、最初の「電話番号の追加」の段階で、携帯電話に SMS が届かなくて立ち止まっている。

この記事を書いた時は、もう諦めて適当に SNS の話をして誤魔化してみたんですが、先日ふと思い出したように、夜中「ちょっとまた電話番号を追加してみるか。どうせダメなんだろうけれど」と思ってやってみた。

すると、普通に SMS が届いた。

今まで何度送っても音沙汰なかったくせに・・えっ?

今まで何度やってもダメだったので諦めていたけれど、ある時ひょっこり出来るようになってました。

ちなみに、Twitter アカウントや手持ちのデバイスの設定を変えたりしていない。本当に、突然、出来るようになった。いったい何が起こったの・・?

まぁそういうわけで何はともあれこれで実装ができそう。で、コツコツ時間を見つけて、現在、とりあえずは形になる感じのものは作れました。あとでちょっとコードも載せます。

ちなみに、巷に溢れていた情報では、API を使うための申請が結構めんどくさいとのことだったが、私が体験したものだと、ちょっとそれとは異なっていたように思う。現在は、大分フローが変わっているのかもしれない。

いきなり英語の申請文は書かされることはなく、どうやらデフォルトでは、限定的な機能でよければそのまま API は使えるようだった。ただ、その機能を広げるためには、結局は、英文で長々と書く必要があった。なので、フォーム上で、拙い中学レベルの英語でダラダラと申請理由を記載して送信してみた。「申請から承認までには数日かかることも・・」みたいなことも聞いたことがあったが、実際は、フォーム送信した後、即座に「認証したよ!」というリアクションがあって、もう API は使えるようになっていた。はっや・・。

ざっくり言うとこの「Elevated」でないと、使いたい API が使えなかった。

(デフォルトでは「Essential」)本題

とにかく、無事に(無事か?)アカウントも認証されて API が使えるようになったので、こんな感じの設計で作りました。

処理概要

例のごとく、依然として全く慣れない Pythonで。前回作った note からはてなブログに同期させるスクリプトに対して、処理を追加する形にしてます。

1.note の記事情報をAPI で抽出
2.note の情報(1.)を Excel ファイルに出力
3.はてなブログの記事を API で抽出
4.抽出した note (1.)を繰り返し処理
 4-1.はてな(3.)にも存在すれば更新
 4-2.はてな(3.)に存在しない場合は新規
5.Wikipedia から「今日は何の日?」を取得
6.今日の出来事等をランダム抽出してツイート
7.最新記事があれば宣伝するツイート

(1. ~ 4-2. は既に実装済み。※下記の記事参照。なので、今回は、5. 以降の太字部分を実装)

せっかく Twitter やるなら遊んでみたくて、Wikipedia からも「今日は何の日」情報を引っ張ってきた。なんか bot 的なものを作ろうと思っていたので、ツイートにリアルタイム性があったほうが良いかなと思って。ただ、後述するが、微妙に苦戦する部分もあった。主に「誰の誕生日?」という情報を取得する部分。

コード説明

まず、上記処理概要の 1.~4-2. までのコードは割愛。前回から微妙に修正している部分もありますが、今回の記事はあくまで Twitter(あとWikipedia)の API を使う内容が主なので。


「今日は何の日」情報を取得する関数

def get_today_event():
    # Wikipedia API で本日の日付の出来事などを取得
    d = datetime.now()
    dt = d.strftime("%Y-%m-%d %H:%M:%S")
    wiki_wiki = wikipediaapi.Wikipedia('ja')
    page_py = wiki_wiki.page(str(d.month) + "月" + str(d.day) +"日")
    # ランダムで出来事や誕生日を抽出
    l_idx = [0, 1]
    x = random.choice(l_idx)
    if x == 0:
        txt_event = page_py.sections[x].text
        msg_event = "という出来事があった日"
    elif x == 1:
        txt_event = page_py.sections[x].sections[0].text
        msg_event = "という方の誕生日"
    else:
        txt_event = None
        msg_event = None

    if txt_event != None:
        l_event = txt_event.split('\n')
        y = random.randint(0,len(l_event)-1)
        event = l_event[y]
        uri = urllib.parse.quote('https://ja.wikipedia.org/wiki/{}月{}日'.format(d.month, d.day), safe='/:')
    msg = "現在の時刻は「" + str(dt) +"」です。"
    if msg_event != None:
        msg += "\n\nそして本日は「" + event + "」" + msg_event + "です。\n" + uri
    return (msg)

(解説)
上の処理概要で言うところの 5. と6. の部分の実装。

本当にもうただ遊んでみたくて。現在時刻をツイートするくらいで十分かと思ったんだけど、せっかく自動でやるなら、その日はどんな日かということもつぶやかせてみようと思った。

で、Wikipedia も API があったのでそれを使用。流れとしては Wiki からその日のページを取得(wiki_wiki.page(XXX)という部分)して、そこから件数分ランダムで抜き出してツイートさせる。

当初は「できごと」だけを想定していたのだけれど、せっかくなので「有名人の誕生日」も取ってみた。だけど、「できごと」と「誕生日」とでオブジェクトの構造が違うのね・・。「誕生日」のほうは、実際の Wiki のページを見ると分かるが、実は「人物」と「人物以外(動物など)」というコンテンツに分かれているみたい。なので、オブジェクトの sections というプロパティも入れ子になっていた。

で、最終的に変数 msg に、つぶやく対象の文字列を突っ込んでます。

どうでもいいけど、Python って switch文が無いのね・・。知らなかった。

ツイートする関数

def post_tweet(consumer_key, consumer_secret, access_token, access_token_secret, msg):
    # Twitterオブジェクトの生成
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    # ツイートを投稿
    api.update_status(msg)

(解説)
処理概要で 7. の実装です。

今回の記事のメインイベント。のはずだけど、コード量はこれだけ。何とも簡単に出来るんですね。。

ちなみに、Twitter の API を使うことができるライブラリは幾つかあるみたいだったが、今回私は、tweepy というものを利用してみた。API でツイートするために必要なキー(consumer_key, consumer_secret, access_token, access_token_secret)を受け取ってオブジェクト内にセット。そうしたら、update_status() というメソッドを使ってツイート。ここでは、変数 msg にセットされた文字列をつぶやくようにしている。

もちろんツイート以外にも、このライブラリを使えば色々なことができるらしい。Twitter 内の他のアカウントのツイートやタイムラインを取ってきたり、検索して自動でフォローしたりとか、やりようによっては結構自由にいけそう。

ただ、個人的には今のところこれくらいしか使う予定なし。

※これらのソースコードにより生じた如何なる損害についても、一切の責任は負いかねますので、あらかじめご了承ください。


感想

と、上記のような形で、一応自力で、note ⇒  Excelはてな ⇒ Twitter といった形で自動的に連動させる仕組みは構築できた。

具体的なケースとしては、まずは、note で何かしら記事を書く。その後、このスクリプトが実行された時点で、一度全ての記事データがExcelファイルとしてバックアップ保存され、最新記事は、はてなブログにも同期される。それから最新記事を Twitter 上で宣伝する。もし最新記事が無くても、現在時刻と、その日あった歴史上の出来事か有名人の誕生日だけでもツイートする。といった流れ。

こう見ると、本当に誰にとっても何の役にも立たないような機能。自分の自分による自分のための機能ですみません。

ちなみに、今回のこのスクリプトは、bat ファイル化して、私が趣味用に使っている Windows PC上のタスクスケジューラに組み込んでみた。トリガーは、このPCが起動されて私のアカウントでサインインしたタイミングにしている。したがって、Twitter がつぶやかれているということは、恐らくその時点では私は生きていたということになります・・。

そんな生存確認 Twitter アカウントはこちら。
https://twitter.com/asaburosan