2012-02-24
flickrに大量画像ファイルを転送
フリーでflickrのページ配られているuploadは 1000個のファイルをuploadできなかったので pythonで
googleでググってパクッた。python2.7で動いた。3000個のファイルを扱った。
必要な物
pythonのPackage flickrapi
flickrのAPI KEY <〓取得は全て英語でflickr servicesから取得
API_KEY、API_SECRETがある
from __future__ import with_statement
import sys
import os
import threading
import time
import re
import flickrapi
API_KEY = '*********************************'
API_SECRET = '**********************''
PAT_EXT = re.compile(r'\.(jpg|jpeg|avi)', re.I)
pict_dir = '.'
class UploadWorker(threading.Thread):
"""
"""
def __init__(self, flickr, files, lock, name=None, args=(), kwargs={}):
"""コンストラクタ"""
super(UploadWorker, self).__init__()
self.flickr = flickr
self.files = files
self.lock = lock
def _pop_file(self):
"""
"""
with self.lock:
try:
f = self.files.pop()
except IndexError:
f = None
return f
def run(self):
"""
"""
while True:
f = self._pop_file()
if f is None:
break
print "[%s] Upload start: %s" % (self.getName(), f)
try:
self.flickr.upload(os.path.join(pict_dir, f), is_public=0, is_family=0, is_friend=0,tags="****")
except:
print "[%s] Failed... Skip" % self.getName()
else:
print "[%s] OK: %s" % (self.getName(), f)
def init_flickr():
"""Initialize and authenticate FlickrAPI"""
flickr = flickrapi.FlickrAPI(API_KEY, API_SECRET)
(token, frob) = flickr.get_token_part_one(perms='write')
if not token: raw_input("Press ENTER after you authorized this program")
flickr.get_token_part_two((token, frob))
return flickr
def main():
"""
"""
# 画像ディレクトリ設定
global pict_dir
if len(sys.argv) > 1:
pict_dir = sys.argv[1]
# 画像ファイル名取得
files = [f for f in os.listdir(pict_dir) if not f.startswith('.') and PAT_EXT.search(f)]
if len(files) == 0:
print "No files in the directory."
sys.exit()
print "File num: %s" % len(files)
# Flickr API 初期化 & 認証
flickr = init_flickr()
# アップロード
lock = threading.Lock()
workers = []
for i in xrange(5):
w = UploadWorker(flickr, files, lock)
workers.append(w)
w.start()
# 処理終了待ち
for w in workers:
w.join()
print 'Done.'
def _test():
import doctest
doctest.testmod()
if __name__ == '__main__':
main()
セ記事を書く
セコメントをする