paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonのipaddressモジュールでワイルドカードマスクをワンライナー計算

ipcalc関連でもう一件。

私は今の職場ではCentOSのipcalcを使っていますがRedhat系のipcalcはワイルドカードの出力は出来ません。

丸暗記も大切ですがミスを防ぐにはコンピュータにやってもらうほうがいいですよね。

ここはpythonの出番です。
シェルから呼び出してディストリビューションを問わずワンライナーで計算してもらいましょう。

ipaddressモジュール

その名の通りIPアドレスを計算してくれます。
使ったことありませんがIPv6にも対応しています。

pythonと一緒に標準でインストールされています。

よく使う関数

NW機器用の設計で使うのが多いんじゃないでしょうか。 ルーティング、ACL等ですね。

IPv4Interface関数がネットワークマスク、ワイルドカードマスク計算を賄ってくれます。

masashi@DESKTOP-N095TND:~$ python3
Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ipaddress
>>>
>>> print(ipaddress.IPv4Interface('192.168.1.10/24'))
192.168.1.10/24
>>> print(ipaddress.IPv4Interface('192.168.1.10/24').network)
192.168.1.0/24
>>> print(ipaddress.IPv4Interface('192.168.1.10/24').with_hostmask)
192.168.1.10/0.0.0.255

実行

ワンライナーでやってみます。

環境

今回はwslのubuntu & python3です。

masashi@DESKTOP-N095TND:~$ lsb_release -a ; uname -a ; python3 --version
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic
Linux DESKTOP-N095TND 4.4.0-17763-Microsoft #864-Microsoft Thu Nov 07 15:22:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
Python 3.6.9

IPアドレス、ネットワークマスク、ワイルドカードマスクを出力しましょう。

結果

こんな感じ。
長くてすみませんが、ワンライナーです。

masashi@DESKTOP-N095TND:~$ echo 192.168.1.10/24 | python3 -c "import sys,ipaddress ; IP = ipaddress.IPv4Interface(sys.stdin.read()[:-1]) ; print('H: {}\nN: {}\nW: {}\n---'.format(IP, IP.network, IP.with_hostmask))"
H: 192.168.1.10/24
N: 192.168.1.0/24
W: 192.168.1.10/0.0.0.255
---

一気に確認できるのはいいですね。

解説

sysのインポート

echoで出力した結果を読ませます。
sys.stdin.readを行うためです。

sys.stdin.readのあとの[:-1]

echoの出力ままstdinで入力すると改行コードが付いてくるので末尾を削除するためです。

ipaddress.NetmaskValueError: '24\n' is not a valid netmask

複数のネットワークを計算したい

shellのwhile readで複数の計算も可能です。
python内でループさせたかったのですが
pythonだけだとどうにも上手く出来ませんでした。

IPアドレスはプライベートアドレスの中から適当にサブネットを割り当てました。

ファイルから

ファイル

masashi@DESKTOP-N095TND:~$ cat subnet
10.0.1.10/21
172.16.20.200/25
192.168.1.10/24
masashi@DESKTOP-N095TND:~$ cat subnet | while read line ; do echo $line | python3 -c "import sys,ipaddress ; IP = ipaddress.IPv4Interface(sys.stdin.read()[:-1]) ; print('H: {}\nN: {}\nW: {}\n---'.format(IP, IP.network, IP.with_hostmask))" ; done
H: 10.0.1.10/21
N: 10.0.0.0/21
W: 10.0.1.10/0.0.7.255
---
H: 172.16.20.200/25
N: 172.16.20.128/25
W: 172.16.20.200/0.0.0.127
---
H: 192.168.1.10/24
N: 192.168.1.0/24
W: 192.168.1.10/0.0.0.255
---
ヒアドキュメントから
masashi@DESKTOP-N095TND:~$ while read line ; do echo $line | python3 -c "import sys,ipaddress ; IP = ipaddress.IPv4Interface(sys.stdin.read()[:-1]) ; print('H: {}\nN: {}\nW: {}\n---'.format(IP, IP.network, IP.with_hostmask))" ; done << EOF
> 10.0.1.10/21
> 172.16.20.200/25
> 192.168.1.10/24
> EOF
H: 10.0.1.10/21
N: 10.0.0.0/21
W: 10.0.1.10/0.0.7.255
---
H: 172.16.20.200/25
N: 172.16.20.128/25
W: 172.16.20.200/0.0.0.127
---
H: 192.168.1.10/24
N: 192.168.1.0/24
W: 192.168.1.10/0.0.0.255
---

python2系だとこんな感じ

wslにはpython2系がインストールされていなかったのでipaddressモジュール含めインストールしました。

masashi@DESKTOP-N095TND:~$ python --version
Python 2.7.17

2系の場合はshell経由で渡すとstr型で受け取ってエラーになります。
unicode型に変換します。

ipaddress.AddressValueError: '192.168.1.10/24' (len 15 != 4) is not permitted as an IPv4 address. Did you pass in a bytes (str in Python 2) instead of a unicode object?
masashi@DESKTOP-N095TND:~$ echo 192.168.1.10/24 | python -c "import sys,ipaddress ; IP = ipaddress.IPv4Interface(unicode(sys.stdin.read()[:-1])) ; print 'H: {}\nN: {}\nW: {}\n---'.format(IP, IP.network, IP.with_hostmask) "
H: 192.168.1.10/24
N: 192.168.1.0/24
W: 192.168.1.10/0.0.0.255
---

2系でもOKですね。

むすび

という訳でワンライナーワイルドカード計算でした。
bashpythonの併用は反則な気もしますが
なるべく楽する必要がありますのでご容赦ください。

本当はスクリプト作って記事を書こうとしていましたが
ワンライナーを思い付いたので気軽に計算できますね。
(でも長いか...)


本当は長すぎるので改行したかったのですが、
いつもワンライナーでやっているので改行がうまくいかずそのまま載せてしまいました。

改行がうまくいったら再度投稿したいと思います。

参考サイト

distributionによるipcalcコマンドの違い

twitterでipcalcコマンドの話題が流れてきました。

しかし私の知っている出力と違う。

tweetの画像はCygwinのipcalc結果らしいのですが、
そういえばRedhat系のipcalcしか使ったこと無いので
distributionで違うのかなと思い
今回Redhat系とDebian系を調べてみることにしました。

もちろんエンジニアなら自宅に両環境ありますよね!

Redhat

CentOSのipcalcはサブネット計算でたまに使っています。
(NWエンジニアなら基本は丸暗記ですよ)

環境

以前pppの検証で使ったCentOSで確認。

[vagrant@ppp-server ~]$ cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
[vagrant@ppp-server ~]$ uname -a
Linux ppp-server 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
バージョン

バージョンが確認できるオプション(-v, --version)がありませんね。

[vagrant@ppp-server ~]$ ipcalc --usage
Usage: ipcalc [-c46bhmnps?] [-c|--check] [-4|--ipv4] [-6|--ipv6] [-b|--broadcast] [-h|--hostname] [-m|--netmask]
        [-n|--network] [-p|--prefix] [-s|--silent] [-?|--help] [--usage]
出力

Redhat系のipcalcはオプションをつけないと計算してくれません。

-mnbをよく使います。
また、wildcard maskは計算してくれないんですよね。

[vagrant@ppp-server ~]$ ipcalc -mnb 192.168.0.10/24
NETMASK=255.255.255.0
BROADCAST=192.168.0.255
NETWORK=192.168.0.0
その他確認
  • manページ

https://linux.die.net/man/1/ipcalc

  • which
[vagrant@ppp-server ~]$ which ipcalc
/usr/bin/ipcalc
  • file
[vagrant@ppp-server ~]$ file /usr/bin/ipcalc
/usr/bin/ipcalc: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=87aa0b7dc72e30ec9233e381985bd24aac78de3c, stripped

バイナリファイルですね。

パッケージを確認しましたが出ませんでした。
専用のパッケージではない様です。

[vagrant@ppp-server ~]$ rpm -qa | grep ipcalc
[vagrant@ppp-server ~]$ 

何かのUtilityとして含まれているんですかね。

Authorのアドレスにredhat.comと入っているので
Redhat系OSには最初から組み込まれているのかもしれませんね。

Debian

環境

いつものサブ機ubuntuに入れます。

masashi@PC-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic
masashi@PC-ubuntu:~$ uname -a
Linux PC-ubuntu 4.15.0-72-generic #81-Ubuntu SMP Tue Nov 26 12:20:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

aptからインストールします。

バージョン
masashi@PC-ubuntu:~$ ipcalc --version
0.41
出力

オプションなしでNW関連の値をいろいろ計算してくれます。 おまけに2進数表記まで。

masashi@PC-ubuntu:~$ ipcalc 192.168.0.10/24
Address:   192.168.0.10         11000000.10101000.00000000. 00001010
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

しかもカラー出力してくれます。

f:id:paloma69:20200126190512p:plain

Cygwinはこっちのパッケージを使っているようですね。

その他確認
  • manページ

Debianのだけど

https://manpages.debian.org/jessie/ipcalc/ipcalc.1.en.html

  • which
masashi@PC-ubuntu:~$ which ipcalc
/usr/bin/ipcalc
  • file
masashi@PC-ubuntu:~$ file /usr/bin/ipcalc
/usr/bin/ipcalc: Perl script text executable

Debian系はPerl製のようです。
Redhat版とは完全に別物ですね。

こっちはdebパッケージとして入ってますね。

masashi@PC-ubuntu:~$ dpkg -l | grep ipcalc
ii  ipcalc                                     0.41-5                                              all
     parameter calculator for IPv4 addresses

まとめ

ipcalcはRedhat系とDebian系で使い勝手は変わりませんが、
結局別のコマンドだということがわかりました。

同じコマンド名でdistributionによって中身が違うパターンというのは珍しいと思います。

分派というわけではなさそうですが、
なぜ同じコマンド名になったのか面白いので追ってみたいですね。

放置していたWordPressを久しぶりに使おうと思ったらドメイン変更する羽目になった

一昨年作って放置してしまったWordPressですが、
放置しすぎてドメインも失効してしまってました。

paloma69.hatenablog.com

paloma69.hatenablog.com

年も明けたしまたやるかなあと思ったらドメインを変更する羽目になりました。

ドメインが登録されていた

昨年9月にドメインの期限が来ていてブログの更新も止まっていたので放っておいたのですが、
いざ再取得しようとしたらすでに別の人が登録してしまったようです。

幸い自分の遊び用のブログでユーザも皆無なので痛手はないのですが、
アクセスできないのでブログをメンテするにはドメインを変えないといけません。

ドメイン再取得

名前は同じでトップレベルドメインだけ変えました。
お名前ドットコムを使っています。

.com → .net

WordPress内のURLを変更

WordPress触ったことあるなら経験すると思いますが、
WordPressはDB内にURLを格納していてドメインを変えるとアクセスできなくなります。

厳密にはトップページのレイアウトが表示されなかったり、ログインとか記事を見ようとすると
DB内のURLを参照してしまいリダイレクトが失敗します。
(FQDNだけではなくホスト部をIPにしていてサーバのIPを変更した場合でも同じ)

本番稼働中のDBいじるぜ!

章のタイトルだけ見たらダメな無計画エンジニアみたいになっていますが、
URL部分を置換するだけです。

DBいじる前に一応snapshotとっておきます。

変更方法は

  • wp-config.phpにrelocateフラグをたてて変更
  • phpMyAdminから変更
  • SQLで直接変更
  • その他ツール

等があります。

  • relocateフラグ -> 動かなくて失敗
  • phpMyAdmin -> インストールしていないのでNG
  • SQLを直接変更するのは非推奨(いろんな型で連携されて格納されてるらしい)

というわけで私は4の
「Search and Replace for WordPress Databases Script」ツールを使いました。

変換ツール

サイトからダウンロードします。
DB弄れるツールなのでダウンロードするには自身の承諾がいります。

登録するとダウンロード用のメールが飛んできます。
解凍してWordPressと同じディレクトリに置くだけ。
Ver3.1.0でした。

ディレクトリにアクセスすると画面が開きます。
あとはブラウザから置換出来ます。

こんな感じ。
DBアクセスの値は勝手に取ってくるみたいです。(管理厳重にしないと危ないね)

f:id:paloma69:20200123232527j:plain

実行前にテストできます。

  • dry run
    • 実行せずに結果のみ表示
  • live run
    • 実行

live run後5秒ほどで置換が完了しました。

アクセスしてみます。

f:id:paloma69:20200123232905p:plain

アクセスOKですね!
TLS証明書も新しいの発行しなきゃ。

作業後はディレクトリごと削除を忘れずに。

$ rm -rf Search-Replace-DB-master

ドメインは大切に

失効した誰にも使われなさそうなドメインを再度使おうとしても上手くいかないもんですね。
私の場合は間が空いてしまったこともありますが。

作業についてだいぶ端折って振り返りましたが、

  1. ドメイン変更にあたり新規発行
  2. 新しいゾーンの設定
  3. ネームサーバの再設定
  4. 仮想マシンのsnapshot取得
  5. データベース置換
  6. アクセス確認

と意外と面倒な手順を踏んでしまいました。

完全に捨てるつもりのドメインでなければチェックはちゃんとした方がいいですね。

もちろん取得後に気に入らないからと変更するのも大変なわけです。
イカす名前を思いつくよう普段からいけてる生活を送りたいものですね。(勉強もね)

参考サイト

json型と辞書型って何が違うの?

ちょっと前の話

APIjsonをPOSTするときありますよね。
私はknowledgeの記事か何かをPythonを使ってAPIから更新しようとしました。

こんな中身(例)

article = {
    'title': 'タイトルだよ',
    'text': '中身だよ'
    }

が、詳細は忘れてしまいましたがエラーでPOSTできませんでした。
stackoverflowかなにかで調べたらjson.dumpしろとあったので試したところ上手くいきました。

何が違うの?

私はpythonをよく使いますがpythonの辞書型とjsonって書き方同じですよね。
何をエラーになることがあるんでしょうか。

という訳でちょっと調べました。

検証環境

WSLのubuntu18です。

masashi@DESKTOP-N095TND:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic
masashi@DESKTOP-N095TND:~$ uname -a
Linux DESKTOP-N095TND 4.4.0-17763-Microsoft #864-Microsoft Thu Nov 07 15:22:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
masashi@DESKTOP-N095TND:~$ python3 --version
Python 3.6.9

結果は一発で出た

type関数で一発でした。

  • 変数
>>> type(article)
<class 'dict'>
>>> type(json.dumps(article))
<class 'str'>
  • 辞書型: そのまま辞書型
  • json型: 文字列

だったんですね。
辞書型データをPOSTしようとしてこけたってことですね。

dump, loadで変換する

厳密にはdumpsとloadsです。
dump, loadはファイルを読み込むとき使う?って感じです。

jsonの関数で辞書型と文字列の行き来が出来るみたいです。
特定の値を取りたいときは辞書型にしないと取れませんね。
(findで頑張れば無理くりで取れそうですが)

  • dumps: 辞書型 → 文字列

ヘルプ

    dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
        Serialize ``obj`` to a JSON formatted ``str``.
  • loads: 文字列 → 辞書型

ヘルプ

    loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
        Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
        containing a JSON document) to a Python object.

dumpsだとエラーになりますが、
json型をloadsすれば辞書型になり値が取れます。

>>> json.dumps(article)['title'] # 辞書 → json
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string indices must be integers
>>>
>>> json.loads(json.dumps(article))['title'] # json → 辞書
'タイトルだよ'
>>>

なるほどねー

むすび

何となく使っていたjsonですが、整理したことで実態がわかりました。
(検証としては薄っぺらーいですが)

最近APIは可読性の観点でxmlよりjsonが主流になっていると思うので
これからバンバン使っていきたいです。

参考サイト

json --- JSON エンコーダおよびデコーダ — Python 3.8.1 ドキュメント

gitのローカルリポジトリ最新化をやってみる

ubuntuとwin10のノートPCで自分用のツールをいろいろ作ってるんですが、
年末の帰省時にノートPCを持っていって映画情報投稿ツールをアップデートしました。

しかしデスクトップubuntuのローカルリポジトリは古いままです。
家ではデスクトップの方を使いたいのでリポジトリを最新化しないといけません。

いつもcloneかpushしかしないのですが、最新化はどうやればいいんでしょうか?

pullでいけそう

gitってたくさんコマンドがあってややこしいですが、
いろいろググるとpullで最新化できるようです。
pullはfetch + mergeをやっている様ですね。

ちょっとpullをやってみましょう。

  • 今の
masashi@PC-ubuntu:~/movietweet$ ls -la
合計 52
drwxr-xr-x  4 masashi masashi  4096 1019 21:51 .
drwxr-xr-x 47 masashi masashi 16384  114 22:08 ..
drwxr-xr-x  3 masashi masashi  4096 1019 21:53 .git
-rw-r--r--  1 masashi masashi    13  94 23:15 .gitignore
-rw-r--r--  1 masashi masashi  1407  94 23:18 README.md
drwxr-xr-x  2 masashi masashi  4096  97 23:17 __pycache__
-rw-r--r--  1 masashi masashi   202  94 23:16 configure.py
-rw-r--r--  1 masashi masashi   355 1019 21:51 posttw.py
-rw-r--r--  1 masashi masashi   180  94 23:16 requests.txt
-rw-r--r--  1 masashi masashi   567  94 23:16 twmovieinfo.sh

最新のはaccess tokenのファイル切り出しとmovie getのファイルを作成しています。

  • pullしてみる
masashi@PC-ubuntu:~/movietweet$ git pull origin master
fatal: not a git repository (or any of the parent directories): .git

エラーですね。
メッセージをググります。

初期設定とリモートリポジトリの設定

ユーザの設定とリモートリポジトリを設定します。
(以前やったような気もするが)

masashi@PC-ubuntu:~/movietweet$ git config --global user.name "Masashi XXXX"
masashi@PC-ubuntu:~/movietweet$ git config --global user.email "xxxxx@gmail.com"
  • init
masashi@PC-ubuntu:~/movietweet$ git init
Initialized empty Git repository in /home/masashi/movietweet/.git/
masashi@PC-ubuntu:~/movietweet$ git remote add origin https://github.com/masashi69/movietweet.git

もう一度

masashi@PC-ubuntu:~/movietweet$ git pull origin master
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 12 (delta 2), reused 11 (delta 1), pack-reused 0
Unpacking objects: 100% (12/12), done.
From https://github.com/masashi69/movietweet
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
error: The following untracked working tree files would be overwritten by merge:
        .gitignore
        README.md
        posttw.py
        requests.txt
        twmovieinfo.sh
Please move or remove them before you merge.
Aborting

ファイルを消せって出てますね。
上書きしてくれないのかな?
とりあえず消します。

masashi@PC-ubuntu:~/movietweet$ rm .gitignore README.md posttw.py requests.txt twmovieinfo.sh
masashi@PC-ubuntu:~/movietweet$ ls -l
合計 8
drwxr-xr-x 2 masashi masashi 4096  97 23:17 __pycache__
-rw-r--r-- 1 masashi masashi  202  94 23:16 configure.py

再々チャレンジ

masashi@PC-ubuntu:~/movietweet$ git pull origin master
From https://github.com/masashi69/movietweet
 * branch            master     -> FETCH_HEAD
masashi@PC-ubuntu:~/movietweet$ ls -la
合計 60
drwxr-xr-x  4 masashi masashi  4096  114 22:22 .
drwxr-xr-x 47 masashi masashi 16384  114 22:17 ..
drwxr-xr-x  8 masashi masashi  4096  114 22:22 .git
-rw-rw-r--  1 masashi masashi    13  114 22:22 .gitignore
-rwxrwxr-x  1 masashi masashi  1660  114 22:22 README.md
drwxr-xr-x  2 masashi masashi  4096  97 23:17 __pycache__
-rw-r--r--  1 masashi masashi   202  94 23:16 configure.py
-rw-rw-r--  1 masashi masashi   344  114 22:22 gettw.py
-rw-rw-r--  1 masashi masashi   332  114 22:22 posttw.py
-rw-rw-r--  1 masashi masashi   180  114 22:22 requests.txt
-rwxrwxr-x  1 masashi masashi   381  114 22:22 tweetapi.py
-rw-rw-r--  1 masashi masashi   567  114 22:22 twmovieinfo.sh

出来ました!
gettw.pyとtweetapi.pyファイルが新たにできていますね。
しかし日付が今日になっている…やり方として合っているのだろうか…

とりあえず目的は果たせました

日付の動きは確認するとして一応最新化はできたかな?

自分用のツールなのでコード書くのも私一人ですが、
PCを分ける使い方をしている場合は便利ですね。

ますますデスクトップとノートの使い分けが進みそうです。

作るのも使うのも1人なんで毎回マスターブランチ直更新なんですが、
ブランチ切ってマージする、という日は来るんでしょうか。

参考サイト

リポジトリ

今年の目標 2020

今年も開幕したので技術系の目標をここに立てます。
去年も立てた気がしますが残ってなかったので、こういうところに書いておくのが一番ですね。

今年の目標

  1. 資格を取る
  2. ホームラボ用サーバを買う
  3. Webサービスを公開する

詳細

資格を取る

ずっと昔に取ったCCNAを失効してから技術系の資格は取ってこなかったのですが、そろそろなにか取りたいですね。
NW系だと面白くないのでLPICとかPythonとかの他ジャンルを攻めてみようと思います。
余裕があれば情報処理系もですかね。

ホームラボ用サーバを買う

これは2年前から言ってるのでさっさと買えば完了です。
環境の構想も固まっているので本当に買うだけです。
なのになかなかポチれない...

Webサーバを公開する

公開という点ではWordpress構築済みなのですが、
以前の中古車検索APIを使ったwebサービスを作ってみようと思います。
できれば広告を貼って幾らかでも収入を作ってみるのが真のゴールですね。

むすび

今ぱっと思い付くのはこんな感じです。
文字に起こしてみると意外とあっさりしてしまいました。

細かく上げるとキリがないし、
言いながら途中で個別にやりたいことが出てきたりするので
以外とこれぐらいがちょうどいいかもしれませんね。

今年もたくさんのコードとインフラを作れることを願うばかりです。

映画視聴ロガーを使って今年見た映画を振り返る

以前作った映画情報のツイッター投稿ツールですが、
ツイッターを自分用の簡単な映画DBとして使わせてもらっています。

paloma69.hatenablog.com

DBというからには必要な情報が抜き出せないといけませんよね。

APIの練習がてら投稿した情報を抜き出したいと思います。

環境

ノートPCのWSL ubuntuです。

PS C:\Users\masashi> wsl lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic
PS C:\Users\masashi> wsl pip3 list --format=columns | findstr tweepy
tweepy              3.8.0

抜き出しツールの処理

  1. 期間を指定する
    • 今回の記事に間に合わなかったのでスキップします。
  2. 本文を取得する
  3. 本文からタイトルのみ抽出する
  4. 投稿した日付とタイトルを出力

使用API

tweepyのAPIを使用します。

  • user_timeline
    • 自分がツイートしたタイムラインを取得します。
    • pager系の処理をしないと最大200件までしか取れません。
    • 今回は200で足りました。

user_timelineで帰ってくる値から以下の2つを使います。

  • created_at

    • 投稿日時です。
    • 取得時nativeのUTCで認識されてしまうので、手動で9時間足してJSTにします。
      • 下手に変換するより手動が一番簡単でした
  • text

    • ツイート本文です。
    • タイトルを「」で囲っているので中身をfindすれば抜き出せますね。

コード

  • gettwmovie.py

やってることは簡単で、
自分のツイートからラベルが自ツール(tweet movieinfo)経由の投稿のみを抜き出して、
上記のcreated_atとtextの内容の処理を行っています。

import tweepy
import sys
import datetime
import configure

Consumer_Key=configure.CK
Consumer_Secret=configure.CS
Access_Token=configure.AT
Access_Secret=configure.AS

auth = tweepy.OAuthHandler(Consumer_Key, Consumer_Secret)
auth.set_access_token(Access_Token, Access_Secret)
api = tweepy.API(auth)

for info in api.user_timeline(count=200):
    if 'tweet movieinfo' in info.source:
        Posted = info.created_at + datetime.timedelta(hours=9)
        Text = info.text[info.text.find('「')+1:info.text.find('」')]
        print(Posted, Text)
    else:
        pass

実行

仮想環境作らなかったのでpython3叩きます。

masashi@DESKTOP-N095TND:~/movietweet$ python3 gettwmovie.py
2019-12-22 00:18:49 American Honey
2019-12-14 22:48:18 The Founder
2019-12-07 23:07:18 The Mule
2019-11-30 23:08:27 Atomic Blonde
2019-11-23 23:33:41 The Intouchables
2019-11-16 23:48:43 Burnt
2019-11-03 20:56:47 The November Man
2019-10-27 22:44:18 Batman
2019-10-19 21:55:43 The Internship
2019-10-14 23:09:54 Killing Them Softly
2019-10-06 20:31:38 American Hustle
2019-09-22 22:44:56 How to Talk to Girls at Parties
2019-09-14 23:20:55 Ali G Indahouse
2019-09-07 23:17:29 Dazed and Confused
2019-08-31 23:59:58 City of Tiny Lights
2019-08-24 23:40:27 Smoke
2019-08-24 16:39:12 Pulp Fiction # 練習ツイート
2019-08-24 16:35:48 APIからツイート # 練習ツイート
2019-08-22 16:34:45 APIからツイート # 練習ツイート

取れましたね!
下の3件は練習のツイートなのでSmokeからAmerican Honeyまで16件見ました。
毎週1本ペースで見ていますが、こう見ると意外と少なく感じますね。

Smoke, Atomic Blonde, The Founderあたりが面白く印象に残っています。

投稿ツールは昨年秋に作ったので本当はもっと見ているのですが
全部編は別のブログにでも書こうと思います。

振り返るといいながらタイトルを取ってきただけで終わってしまいましたが
収集ツールもできたことですし、来年は4半期か半年ごとに見た映画の棚卸ししたいですね。

今回のツールもGithubリポジトリに入れるつもりですが、
投稿ツールと同じAPI Keyまわりの処理書いてるので別ファイルに外だししたほうが良さそうです。

参考サイト

Python datetime 日付の計算、文字列変換をする方法 strftime, strptime【決定版】 - Qiita


おまけ 2019振り返り

本記事で今年は30本書くことができました。
(大みそかに間に合ってよかったです)

週一ペースの50本を目指していたのですが、
何か作業した結果を残そうとするとなかなか難しいですね。

でも自宅でもコードを書く癖や、ラボの環境が少しずつ出来たりと
プログラミング関係の進捗がちょっとですが確認できる年でした。

本業はNWインフラ屋なので、ドキュメントやconfig作りにもっとpythonを活用していきたいです。

来年もよろしくお願いします。