Python - Twitter ツイート(OAuth のみで)!
Updated:
Python 3 で OAuth ライブラリのみを使用してツイートする方法についての記録です。
(ツイート自体は単純な処理のため、 Twitter 用ライブラリを使用するほどでもない)
0. 前提条件
- LMDE 2 (Linux Mint Debian Edition 2; 64bit) での作業を想定。
- Python 3.6.3 での作業を想定。
- 複数の Twitter アカウントを使い分けることを想定。
- 当方は他のバージョンとの共存環境であり、
python3.6
,pip3.6
で 3.6 系を使用するようにしている。(適宜、置き換えて考えること)
1. ライブラリのインストール
OAuth, YAML を使用するので、対応のライブラリをインストールしておく。
$ sudo pip3.6 install requests_oauthlib
$ sudo pip3.6 install PyYAML
2. Twitter キー情報ファイルの作成
Twitter API キー情報を “twitter.yml” というファイルに YAML 型式で記載しておく。
File: 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 ファイルを作成せず、定数で設定してもよいだろう。
File: tweet.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
#! /usr/local/bin/python3.6
"""
Twitter tweet with OAuth only.
date name version
2017.11.10 mk-mode 1.00 Created.
Copyright(C) 2017 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"
def __init__(self):
self.ac = sys.argv[1]
self.text = sys.argv[2].replace("\\n", "\n")
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("[{}]\n{}".format(self.ac, self.text))
status_code, res_json = self.__tweet()
if status_code == 200:
print("(TWEET-ID: {})".format(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"]
)
res = oa.post(self.URL_UPD, params = {"status": self.text})
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")
sys.exit(0)
try:
Tweet().exec()
except Exception as e:
traceback.print_exc()
sys.exit(1)
4. Python スクリプトの実行
まず、実行権限を付与しておく。
$ sudo chmod +x tweet.py
そして、アカウント名とツイート文を引数に指定して実行する。
- ツイート文に半角スペースが含まれる場合はシングル/ダブルクォーテーションでくくること。
- 改行は
\n
で行うこと。
$ ./tweet.py account_1 "これは Python 3.6 によるツイートテストです。\nこれは Python 3.6 によるツイートテストです。"
[account_1]
これは Python 3.6 によるツイートテストです。
これは Python 3.6 によるツイートテストです。
(TWEET-ID: 931026450605522944)
あらゆる局面で活用できるでしょう。
(第3引数で添付画像を指定するようにしてもよいだろう)
以上
Comments