UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Twitter API を利用して自動リツィートを行う方法

POST statuses/retweet/:id

認証済みユーザーが特定のIDのツィートに対してリツィートを行う。

成功時にはリツィートしたツィートの情報がJSON形式でリスポンスとして返却される。 もしリツィート済みのツィートに対して実行した場合は無視される。もしツィート数の制限に引っかかった場合エラー403が帰ってくる。

アクセスポイント

https://api.twitter.com/1.1/statuses/retweet/:id.json パラメータ

説明 必須か?
id 対象とするツィートのID 35264262412
trim_user 返り値のJSONにユーザー情報(user)を含むか false ×

実行例

Pythonを利用してTwitter APIでの自動リツィートを体験してみましょう。

今回使うモジュールはこれです。

https://github.com/sixohsix/twitter

retweet_test.py

from twitter import *

# ここにあなたの取得したアクセストークンを入れてください。

_conf = {"accessToken":"4552442054-Hywvjhq5jh45gq345jh904jh045j0cbrg","accessTokenSecret":"G

y5ykq45jh0wj45kq45jh0w9690h4wj0I","consumerKey":"Uugj954jh04jh425j0upiCXH","consumerSecret":"y6kdiUgVDFejv5bh94hj024jhj24059hj2-4hb-2948jh29-5u"}

# ここにリツィートしたいツィートのIDを指定してください。

id = "795827926524514304"

t = Twitter(auth=OAuth(conf["accessToken"],conf["accessTokenSecret"],conf["consumerKey"],conf["consumerSecret"]))

t.statuses.retweet(_id=id)

成功するとこのようにリツィートしたアカウントのプロフィールがJSON形式で返却されます。

{'favorite_count': 0, 'lang': 'ja', 'geo': None, 'retweet_count': 25, 'place': None, 'is_quote_status': False, 'contributors': None, 'in_reply_to_user_id': None, 'id_str': '795828337390166017', 'truncated': False, 'in_reply_to_status_id_str': None, 'retweeted_status': {'favorite_count': 42, 'lang': 'ja', 'geo': None, 'retweet_count': 25, 'place': None, 'is_quote_status': False, 'contributors': None, 'in_reply_to_user_id': None, 'truncated': False, 'text': 'Python→3ヶ月で動かなくなる\nJavascript→3週間で動かなくなる\nJava→30億のデバイスで走る', 'in_reply_to_status_id_str': None, 'retweeted': True, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'in_reply_to_status_id': None, 'favorited': False, 'id_str': '795793230692392960', 'id': 795793230692392960, 'entities': {'user_mentions': [], 'hashtags': [], 'symbols': [], 'urls': []}, 'user': {'profile_image_url': 'http://pbs.twimg.com/profile_images/795462982704644096/vAQCLgxv_normal.jpg', 'profile_background_tile': False, 'profile_sidebar_fill_color': 'DDEEF6', 'default_profile_image': False, 'url': 'https://t.co/Z74eWzecBQ', 'translator_type': 'none', 'lang': 'ja', 'profile_link_color': '1DA1F2', 'screen_name': 'kivantium', 'created_at': 'Mon Nov 29 08:25:33 +0000 2010', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'time_zone': 'Tokyo', 'protected': False, 'follow_request_sent': False, 'profile_background_color': 'C0DEED', 'utc_offset': 32400, 'has_extended_profile': False, 'is_translator': False, 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/220937353/1473712272', 'id_str': '220937353', 'contributors_enabled': False, 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'followers_count': 1541, 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/795462982704644096/vAQCLgxv_normal.jpg', 'description': '「お前だけが何もしてないからだよ」', 'profile_use_background_image': True, 'notifications': False, 'name': '川奈?清', 'default_profile': True, 'friends_count': 338, 'statuses_count': 49346, 'following': True, 'location': '', 'id': 220937353, 'profile_sidebar_border_color': 'C0DEED', 'entities': {'description': {'urls': []}, 'url': {'urls': [{'display_url': 'kivantium.net', 'expanded_url': 'https://kivantium.net', 'url': 'https://t.co/Z74eWzecBQ', 'indices': [0, 23]}]}}, 'profile_text_color': '333333', 'favourites_count': 3526, 'is_translation_enabled': False, 'geo_enabled': False, 'verified': False, 'listed_count': 78}, 'coordinates': None, 'created_at': 'Tue Nov 08 01:01:05 +0000 2016', 'source': '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>'}, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'in_reply_to_status_id': None, 'favorited': False, 'text': 'RT @kivantium: Python→3ヶ月で動かなくなる\nJavascript→3週間で動かなくなる\nJava→30億のデバイス<e3><81><a7>走る', 'id': 795828337390166017, 'entities': {'user_mentions': [{'screen_name': 'kivantium', 'id_str': '220937353', 'id': 220937353, 'indices': [3, 13], 'name': '川奈?清'}], 'hashtags': [], 'symbols': [], 'urls': []}, 'user': {'profile_image_url': 'http://pbs.twimg.com/profile_images/795563283793121280/v_oBynNg_normal.png', 'profile_background_tile': True, 'profile_sidebar_fill_color': '000000', 'default_profile_image': False, 'url': 'https://t.co/9QgMiiRTIS', 'translator_type': 'none', 'lang': 'ja', 'profile_link_color': '0084B4', 'screen_name': 'mochizuki_ichir', 'created_at': 'Mon Dec 14 02:14:51 +0000 2015', 'profile_background_image_url_https': 'https://pbs.twimg.com/profile_background_images/795566647528419328/BCyObqhJ.png', 'time_zone': None, 'protected': False, 'follow_request_sent': False, 'profile_background_color': 'C0DEED', 'utc_offset': None, 'has_extended_profile': False, 'is_translator': False, 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/4552442054/1478512236', 'id_str': '4552442054', 'contributors_enabled': False, 'profile_background_image_url': 'http://pbs.twimg.com/profile_background_images/795566647528419328/BCyObqhJ.png', 'followers_count': 343, 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/795563283793121280/v_oBynNg_normal.png', 'description': 'プログラマー兼大学生 HTML5/CSS/PHP/JavaScript(Node.js,React)/Python/Scala  ブログやってます\nhttps://t.co/9QgMij9uAq\nhttps://t.co/L9Ib0k1mLv', 'profile_use_background_image': True, 'notifications': False, 'name': '望月++', 'default_profile': False, 'friends_count': 302, 'statuses_count': 575, 'following': False, 'location': '', 'id': 4552442054, 'profile_sidebar_border_color': '000000', 'entities': {'description': {'urls': [{'display_url': 'mochizuki4.hatenablog.com', 'expanded_url': 'http://mochizuki4.hatenablog.com', 'url': 'https://t.co/9QgMij9uAq', 'indices': [74, 97]}, {'display_url': 'github.com/mochizuki-ichi…', 'expanded_url': 'https://github.com/mochizuki-ichiro', 'url': 'https://t.co/L9Ib0k1mLv', 'indices': [98, 121]}]}, 'url': {'urls': [{'display_url': 'mochizuki4.hatenablog.com', 'expanded_url': 'http://mochizuki4.hatenablog.com', 'url': 'https://t.co/9QgMiiRTIS', 'indices': [0, 23]}]}}, 'profile_text_color': '000000', 'favourites_count': 166, 'is_translation_enabled': False, 'geo_enabled': False, 'verified': False, 'listed_count': 1}, 'retweeted': True, 'coordinates': None, 'created_at': 'Tue Nov 08 03:20:36 +0000 2016', 'source': '<a href="https://www.utali.net" rel="nofollow">Utali.net</a>'}

WEBクライアントに戻って確認してみると・・・

f:id:mochizuki_p:20161108122748p:plain

このようにちゃんとリツィートされています!

注意点

APIを利用した自動リツィートを過剰に行うとすぐにアカウントが凍結されてしまいます。1日のリツィート数は多くとも100程度にとどめておく、また短い間に連続してフォローを実行しないなどの注意が必要です