mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages
※2018年9月15日より非力な環境でサーバを運用しているため、各ページの表示に時間がかかる場合があります。ご了承ください。(改良の予定あり)

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Python - Twitter ツイートで画像添付(OAuth のみで)!

[ sns, プログラミング ] [ OAuth, Python, Twitter ]

こんばんは。

以前、 Python で Twitter 用の PiPI ライブラリを使用せず、 OAuth のみでツイートする方法方法を紹介しました。

但し、画像は添付できない仕様でした。

今回は、画像も添付できるよう仕様を変更しました。

0. 前提条件

  • LMDE 3 (Linux Mint Debian Edition 3; 64bit) での作業を想定。
  • Python 3.7.0 での作業を想定。
  • 複数の Twitter アカウントを使い分けることを想定。
  • 当方は他のバージョンとの共存環境であり、 python3.7, pip3.7 で 3.7 系を使用するようにしている。(適宜、置き換えて考えること)

1. ライブラリのインストール

OAuth, YAML を使用するので、対応のライブラリをインストールしておく。

1
2
$ sudo pip3.7 install requests_oauthlib
$ sudo pip3.7 install PyYAML

2. Twitter キー情報ファイルの作成

Twitter API キー情報を “twitter.yml” というファイルに YAML 型式で記載しておく。

twitter.yml
1
2
3
4
5
6
7
8
9
10
account_1:
  cons_key: AAAAAAAAAAAAAAAAAAAAAAAAA
  cons_sec: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  accs_key: CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  accs_sec: DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
account_2:
  cons_key: EEEEEEEEEEEEEEEEEEEEEEEEE
  cons_sec: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  accs_key: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
  accs_sec: HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

3. Python スクリプトの作成

  • 前述の “twitter.yml” から API キー情報を取得してツイートする。
  • 例外処理を入れているが、実際には、 Exception を詳細に指定しないことは非推奨あることに留意。
  • Shebang ストリング(1行目)では、フルパスでコマンド指定している。(当方の慣習
  • Twitter アカウントが1個のみなら、 YAML ファイルを作成せず、定数で設定してもよいだろう。
tweet_v2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#! /usr/local/bin/python3.7
"""
date          name         version
2017.11.10    mk-mode.com  1.00 新規作成
2018.08.05    mk-mode.com  1.01 画像ツイート昨日を追加

Copyright(C) 2017-2018 mk-mode.com All Rights Reserved.
"""
from requests_oauthlib import OAuth1Session
import json
import sys
import traceback
import yaml


class Tweet:
    """ Tweet class """
    YML       = "twitter.yml"
    URL_UPD   = "https://api.twitter.com/1.1/statuses/update.json"
    URL_MEDIA = "https://upload.twitter.com/1.1/media/upload.json"

    def __init__(self):
        self.ac   = sys.argv[1]
        self.text = sys.argv[2].replace("\\n", "\n")
        self.media_paths = sys.argv[3:] if len(sys.argv) > 3 else []
        with open(self.YML) as f:
            self.yml = yaml.load(f)

    def exec(self):
        """ Execution """
        try:
            if not(self.ac in self.yml):
                print("'{}' could not be found!".format(self.ac))
                sys.exit(0)
            print("[{}]".format(self.ac, self.text))
            status_code, res_json = self.__tweet()
            if status_code == 200:
                print("TWEET-ID:", res_json["id_str"])
            else:
                print("!ERROR! STATUS-CODE: ", status_code)
        except Exception as e:
            raise

    def __tweet(self):
        """ Tweet """
        try:
            oa = OAuth1Session(
               self.yml[self.ac]["cons_key"],
               self.yml[self.ac]["cons_sec"],
               self.yml[self.ac]["accs_key"],
               self.yml[self.ac]["accs_sec"]
            )
            if self.media_paths == []:
                res = oa.post(self.URL_UPD, params = {"status": self.text})
            else:
                media_ids = []
                for m in self.media_paths:
                    files = {"media" : open(m, 'rb')}
                    res_m = oa.post(self.URL_MEDIA, files = files)
                    if res_m.status_code != 200:
                        return [res_m.status_code, json.loads(res_m.text)]
                    media_ids.append(
                        json.loads(res_m.text)["media_id_string"]
                    )
                res = oa.post(
                    self.URL_UPD,
                    params = {
                        "status": self.text,
                        "media_ids": ",".join(media_ids)
                    }
                )
            return [res.status_code, json.loads(res.text)]
        except Exception as e:
            raise


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("USAGE: ./tweet.py SCREEN-NAME TWEET-TEXT [MEDIA-PATH ...]")
        sys.exit(0)
    try:
        Tweet().exec()
    except Exception as e:
        traceback.print_exc()
        sys.exit(1)

4. Python スクリプトの実行

まず、実行権限を付与しておく。

1
$ sudo chmod +x tweet_v2.py

そして、アカウント名とツイート文、更に、画像を添付したい場合は続けて画像ファイルのパス(複数あればスペースで区切る)を引数に指定して実行する。

  • ツイート文に半角スペースが含まれる場合はシングル/ダブルクォーテーションでくくること。
  • 改行は \n で行うこと。
1
2
3
4
5
$ ./tweet_v2.py account_1 "これは Python 3.7 によるツイートテストです。\nこれは Python 3.7 によるツイートテストです。" /path/to/image_1.png /path/to/image_2.png
[account_1]
これは Python 3.7 によるツイートテストです。
これは Python 3.7 によるツイートテストです。
(TWEET-ID: 1026048555562098688)

あらゆる局面で活用できるでしょう。

以上

Comments